func main() { flag.Usage = func() { fmt.Fprint(os.Stderr, usage) flag.PrintDefaults() os.Exit(2) } var staticPath = flag.String("static", "", "Path to override built-in index.html") var vaultPath = flag.String("vaultpath", "diskrecord.json", "Path to the the disk vault") var addr = flag.String("addr", "localhost:8080", "Server and port separated by :") var certPath = flag.String("cert", "", "Path of TLS certificate in PEM format") var keyPath = flag.String("key", "", "Path of TLS private key in PEM format") var caPath = flag.String("ca", "", "Path of TLS CA for client authentication (optional)") flag.Parse() if *vaultPath == "" || *addr == "" || *certPath == "" || *keyPath == "" { fmt.Fprint(os.Stderr, usage) flag.PrintDefaults() os.Exit(2) } if err := core.Init(*vaultPath); err != nil { log.Fatalf(err.Error()) } runtime.GOMAXPROCS(runtime.NumCPU()) // The core package is not safe to be shared across goroutines so // this supervisor goroutine reads requests from the process // channel and dispatches them to core for processes. process := make(chan userRequest) go func() { for { req := <-process if f, ok := functions[req.rt]; ok { r, err := f(req.in) if err == nil { req.resp <- r } else { log.Printf("http.main failed: %s: %s", req.rt, err) } } else { log.Printf("http.main: request=%s function is not supported", req.rt) } // Note that if an error occurs no message is sent down // the channel and then channel is closed. The // queueRequest function will see this as indication of an // error. close(req.resp) } }() s, l, err := NewServer(process, *staticPath, *addr, *certPath, *keyPath, *caPath) if err != nil { log.Fatalf("Error starting redoctober server: %s\n", err) } s.Serve(*l) }
func main() { flag.Usage = func() { fmt.Fprint(os.Stderr, "main usage dump\n") fmt.Fprint(os.Stderr, usage) flag.PrintDefaults() os.Exit(2) } var staticPath = flag.String("static", "", "Path to override built-in index.html") var vaultPath = flag.String("vaultpath", "diskrecord.json", "Path to the the disk vault") var addr = flag.String("addr", "localhost:8081", "Server and port separated by :") var useSystemdSocket = flag.Bool("systemdfds", false, "Use systemd socket activation to listen on a file. Useful for binding privileged sockets.") var certsPathString = flag.String("certs", "", "Path(s) of TLS certificate in PEM format, comma-separated") var keysPathString = flag.String("keys", "", "Path(s) of TLS private key in PEM format, comma-separated, must me in the same order as the certs") var caPath = flag.String("ca", "", "Path of TLS CA for client authentication (optional)") var hcKey = flag.String("hckey", "", "Hipchat API Key") var hcRoom = flag.String("hcroom", "", "Hipchat Room Id") var hcHost = flag.String("hchost", "", "Hipchat Url Base (ex: hipchat.com)") var roHost = flag.String("rohost", "", "RedOctober Url Base (ex: localhost:8081)") flag.Parse() if *vaultPath == "" || *certsPathString == "" || *keysPathString == "" || (*addr == "" && *useSystemdSocket == false) { fmt.Fprint(os.Stderr, usage) flag.PrintDefaults() os.Exit(2) } certPaths := strings.Split(*certsPathString, ",") keyPaths := strings.Split(*keysPathString, ",") if err := core.Init(*vaultPath, *hcKey, *hcRoom, *hcHost, *roHost); err != nil { log.Fatalf(err.Error()) } runtime.GOMAXPROCS(runtime.NumCPU()) // The core package is not safe to be shared across goroutines so // this supervisor goroutine reads requests from the process // channel and dispatches them to core for processes. process := make(chan userRequest) go func() { for { req := <-process if f, ok := functions[req.rt]; ok { r, err := f(req.in) if err == nil { req.resp <- r } else { log.Printf("http.main failed: %s: %s", req.rt, err) } } else { log.Printf("http.main: request=%s function is not supported", req.rt) } // Note that if an error occurs no message is sent down // the channel and then channel is closed. The // queueRequest function will see this as indication of an // error. close(req.resp) } }() s, l, err := NewServer(process, *staticPath, *addr, *caPath, certPaths, keyPaths, *useSystemdSocket) if err != nil { log.Fatalf("Error starting redoctober server: %s\n", err) } s.Serve(l) }