func main() { flag.Parse() if os.Geteuid() == 0 { fmt.Fprintln(os.Stderr, "Do not run the Dominator as root") os.Exit(1) } fi, err := os.Lstat(*stateDir) if err != nil { fmt.Fprintf(os.Stderr, "Cannot stat: %s\t%s\n", *stateDir, err) os.Exit(1) } if !fi.IsDir() { fmt.Fprintf(os.Stderr, "%s is not a directory\n", *stateDir) os.Exit(1) } interval := time.Duration(*minInterval) * time.Second circularBuffer := logbuf.New(*logbufLines) logger := log.New(circularBuffer, "", log.LstdFlags) mdbChannel := mdb.StartMdbDaemon(path.Join(*stateDir, "mdb"), logger) herd := herd.NewHerd(fmt.Sprintf("%s:%d", *imageServerHostname, *imageServerPortNum), logger) herd.AddHtmlWriter(circularBuffer) if err = herd.StartServer(*portNum, true); err != nil { fmt.Fprintf(os.Stderr, "Unable to create http server\t%s\n", err) os.Exit(1) } nextCycleStopTime := time.Now().Add(interval) for { select { case mdb := <-mdbChannel: herd.MdbUpdate(mdb) if *debug { showMdb(mdb) } runtime.GC() // An opportune time to take out the garbage. default: // Do work. if herd.PollNextSub() { if *debug { fmt.Print(".") } sleepTime := nextCycleStopTime.Sub(time.Now()) time.Sleep(sleepTime) nextCycleStopTime = time.Now().Add(interval) if sleepTime < 0 { // There was no time to rest. runtime.GC() // An opportune time to take out the garbage. } } } } }
func main() { flag.Parse() tricorder.RegisterFlags() circularBuffer := logbuf.New() logger := log.New(circularBuffer, "", log.LstdFlags) if err := setupserver.SetupTls(); err != nil { logger.Println(err) circularBuffer.Flush() if !*permitInsecureMode { os.Exit(1) } } rlim := syscall.Rlimit{*fdLimit, *fdLimit} if err := syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rlim); err != nil { fmt.Fprintf(os.Stderr, "Cannot set FD limit\t%s\n", err) os.Exit(1) } if os.Geteuid() == 0 { if err := setUser(*username); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } } fi, err := os.Lstat(*stateDir) if err != nil { fmt.Fprintf(os.Stderr, "Cannot stat: %s\t%s\n", *stateDir, err) os.Exit(1) } if !fi.IsDir() { fmt.Fprintf(os.Stderr, "%s is not a directory\n", *stateDir) os.Exit(1) } interval := time.Duration(*minInterval) * time.Second mdbChannel := mdbd.StartMdbDaemon(path.Join(*stateDir, *mdbFile), logger) objectServer, err := newObjectServer(path.Join(*stateDir, *objectsDir), logger) if err != nil { fmt.Fprintf(os.Stderr, "Cannot load objectcache: %s\n", err) os.Exit(1) } herd := herd.NewHerd(fmt.Sprintf("%s:%d", *imageServerHostname, *imageServerPortNum), objectServer, logger) herd.AddHtmlWriter(circularBuffer) rpcd.Setup(herd, logger) if err = herd.StartServer(*portNum, true); err != nil { fmt.Fprintf(os.Stderr, "Unable to create http server\t%s\n", err) os.Exit(1) } scanTokenChannel := make(chan bool, 1) scanTokenChannel <- true nextCycleStopTime := time.Now().Add(interval) for { select { case mdb := <-mdbChannel: herd.MdbUpdate(mdb) if *debug { showMdb(mdb) } case <-scanTokenChannel: // Scan one sub. if herd.PollNextSub() { // We've reached the end of a scan cycle. if *debug { fmt.Print(".") } go func(sleepDuration time.Duration) { time.Sleep(sleepDuration) nextCycleStopTime = time.Now().Add(interval) scanTokenChannel <- true }(nextCycleStopTime.Sub(time.Now())) } else { scanTokenChannel <- true } } } }
func main() { flag.Parse() tricorder.RegisterFlags() setupTls(*caFile, pathJoin(*certDir, *certFile), pathJoin(*certDir, *keyFile)) rlim := syscall.Rlimit{*fdLimit, *fdLimit} if err := syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rlim); err != nil { fmt.Fprintf(os.Stderr, "Cannot set FD limit\t%s\n", err) os.Exit(1) } if os.Geteuid() == 0 { if err := setUser(*username); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } } fi, err := os.Lstat(*stateDir) if err != nil { fmt.Fprintf(os.Stderr, "Cannot stat: %s\t%s\n", *stateDir, err) os.Exit(1) } if !fi.IsDir() { fmt.Fprintf(os.Stderr, "%s is not a directory\n", *stateDir) os.Exit(1) } interval := time.Duration(*minInterval) * time.Second circularBuffer := logbuf.New(*logbufLines) logger := log.New(circularBuffer, "", log.LstdFlags) mdbChannel := mdbd.StartMdbDaemon(path.Join(*stateDir, *mdbFile), logger) herd := herd.NewHerd(fmt.Sprintf("%s:%d", *imageServerHostname, *imageServerPortNum), logger) herd.AddHtmlWriter(circularBuffer) if err = herd.StartServer(*portNum, true); err != nil { fmt.Fprintf(os.Stderr, "Unable to create http server\t%s\n", err) os.Exit(1) } nextCycleStopTime := time.Now().Add(interval) for { select { case mdb := <-mdbChannel: herd.MdbUpdate(mdb) if *debug { showMdb(mdb) } runtime.GC() // An opportune time to take out the garbage. default: // Do work. if herd.PollNextSub() { if *debug { fmt.Print(".") } sleepTime := nextCycleStopTime.Sub(time.Now()) time.Sleep(sleepTime) nextCycleStopTime = time.Now().Add(interval) if sleepTime < 0 { // There was no time to rest. runtime.GC() // An opportune time to take out the garbage. } } } } }