func main() { // init(s) conf.Initialize() logger.Initialize() if err := db.Initialize(); err != nil { fmt.Fprintf(os.Stderr, "[email protected]: %v\n", err) logger.Error("[email protected]: " + err.Error()) os.Exit(1) } user.Initialize() node.Initialize() preauth.Initialize() auth.Initialize() node.InitReaper() if err := versions.Initialize(); err != nil { fmt.Fprintf(os.Stderr, "[email protected]: %v\n", err) logger.Error("[email protected]: " + err.Error()) os.Exit(1) } if err := versions.RunVersionUpdates(); err != nil { fmt.Fprintf(os.Stderr, "[email protected]: %v\n", err) logger.Error("[email protected]: " + err.Error()) os.Exit(1) } // After version updates have succeeded without error, we can push the configured version numbers into the mongo db // Note: configured version numbers are configured in conf.go but are NOT user configurable by design if err := versions.PushVersionsToDatabase(); err != nil { fmt.Fprintf(os.Stderr, "[email protected]: %v\n", err) logger.Error("[email protected]: " + err.Error()) os.Exit(1) } printLogo() conf.Print() if err := versions.Print(); err != nil { fmt.Fprintf(os.Stderr, "[email protected]: %v\n", err) logger.Error("[email protected]: " + err.Error()) os.Exit(1) } // check if necessary directories exist or created for _, path := range []string{conf.PATH_SITE, conf.PATH_DATA, conf.PATH_LOGS, conf.PATH_DATA + "/temp"} { if _, err := os.Stat(path); err != nil && os.IsNotExist(err) { if err := os.Mkdir(path, 0777); err != nil { fmt.Fprintf(os.Stderr, "ERROR: %v\n", err) logger.Error("ERROR: " + err.Error()) os.Exit(1) } } } // reload if conf.RELOAD != "" { fmt.Println("####### Reloading #######") err := reload(conf.RELOAD) if err != nil { fmt.Fprintf(os.Stderr, "ERROR: %v\n", err) logger.Error("ERROR: " + err.Error()) os.Exit(1) } fmt.Println("Done") } // setting GOMAXPROCS var procs int avail := runtime.NumCPU() if avail <= 2 { procs = 1 } else if avail == 3 { procs = 2 } else { procs = avail - 2 } fmt.Println("##### Procs #####") fmt.Printf("Number of available CPUs = %d\n", avail) if conf.GOMAXPROCS != "" { if setting, err := strconv.Atoi(conf.GOMAXPROCS); err != nil { err_msg := "ERROR: could not interpret configured GOMAXPROCS value as integer.\n" fmt.Fprintf(os.Stderr, err_msg) logger.Error("ERROR: " + err_msg) os.Exit(1) } else { procs = setting } } if procs <= avail { fmt.Printf("Running Shock server with GOMAXPROCS = %d\n\n", procs) runtime.GOMAXPROCS(procs) } else { fmt.Println("GOMAXPROCS config value is greater than available number of CPUs.") fmt.Printf("Running Shock server with GOMAXPROCS = %d\n\n", avail) runtime.GOMAXPROCS(avail) } if conf.PATH_PIDFILE != "" { f, err := os.Create(conf.PATH_PIDFILE) if err != nil { err_msg := "Could not create pid file: " + conf.PATH_PIDFILE + "\n" fmt.Fprintf(os.Stderr, err_msg) logger.Error("ERROR: " + err_msg) os.Exit(1) } defer f.Close() pid := os.Getpid() fmt.Fprintln(f, pid) fmt.Println("##### pidfile #####") fmt.Printf("pid: %d saved to file: %s\n\n", pid, conf.PATH_PIDFILE) } Address := conf.API_IP + ":" + conf.API_PORT mapRoutes() s := &http.Server{ Addr: ":" + Address, Handler: goweb.DefaultHttpHandler(), ReadTimeout: 48 * time.Hour, WriteTimeout: 48 * time.Hour, MaxHeaderBytes: 1 << 20, } c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) listener, listenErr := net.Listen("tcp", Address) if listenErr != nil { err_msg := "Could not listen - " + listenErr.Error() + "\n" fmt.Fprintf(os.Stderr, err_msg) logger.Error("ERROR: " + err_msg) os.Exit(1) } go node.Ttl.Handle() go func() { for _ = range c { // sig is a ^C, handle it // stop the HTTP server fmt.Fprintln(os.Stderr, "Stopping the server...") listener.Close() } }() fmt.Fprintf(os.Stderr, "Error in Serve: %s\n", s.Serve(listener)) }
func main() { // init(s) conf.Initialize() logger.Initialize() if err := db.Initialize(); err != nil { fmt.Fprintf(os.Stderr, "ERROR: %v\n", err) logger.Error("ERROR: " + err.Error()) os.Exit(1) } user.Initialize() node.Initialize() preauth.Initialize() auth.Initialize() // print conf printLogo() conf.Print() // check if necessary directories exist or created for _, path := range []string{conf.Conf["site-path"], conf.Conf["data-path"], conf.Conf["logs-path"], conf.Conf["data-path"] + "/temp"} { if _, err := os.Stat(path); err != nil && os.IsNotExist(err) { if err := os.Mkdir(path, 0777); err != nil { fmt.Fprintf(os.Stderr, "ERROR: %v\n", err) logger.Error("ERROR: " + err.Error()) os.Exit(1) } } } // reload if conf.RELOAD != "" { fmt.Println("####### Reloading #######") err := reload(conf.RELOAD) if err != nil { fmt.Fprintf(os.Stderr, "ERROR: %v\n", err) logger.Error("ERROR: " + err.Error()) os.Exit(1) } fmt.Println("Done") } // setting GOMAXPROCS var procs int avail := runtime.NumCPU() if avail <= 2 { procs = 1 } else if avail == 3 { procs = 2 } else { procs = avail - 2 } fmt.Println("##### Procs #####") fmt.Printf("Number of available CPUs = %d\n", avail) if conf.Conf["GOMAXPROCS"] != "" { if setting, err := strconv.Atoi(conf.Conf["GOMAXPROCS"]); err != nil { err_msg := "ERROR: could not interpret configured GOMAXPROCS value as integer.\n" fmt.Fprintf(os.Stderr, err_msg) logger.Error("ERROR: " + err_msg) os.Exit(1) } else { procs = setting } } if procs <= avail { fmt.Printf("Running Shock server with GOMAXPROCS = %d\n\n", procs) runtime.GOMAXPROCS(procs) } else { fmt.Println("GOMAXPROCS config value is greater than available number of CPUs.") fmt.Printf("Running Shock server with GOMAXPROCS = %d\n\n", avail) runtime.GOMAXPROCS(avail) } if conf.Conf["pidfile"] != "" { f, err := os.Create(conf.Conf["pidfile"]) if err != nil { err_msg := "Could not create pid file: " + conf.Conf["pidfile"] + "\n" fmt.Fprintf(os.Stderr, err_msg) logger.Error("ERROR: " + err_msg) os.Exit(1) } defer f.Close() pid := os.Getpid() fmt.Fprintln(f, pid) fmt.Println("##### pidfile #####") fmt.Printf("pid: %d saved to file: %s\n\n", pid, conf.Conf["pidfile"]) } Address := conf.Conf["api-ip"] + ":" + conf.Conf["api-port"] mapRoutes() s := &http.Server{ Addr: ":" + Address, Handler: goweb.DefaultHttpHandler(), ReadTimeout: 48 * time.Hour, WriteTimeout: 48 * time.Hour, MaxHeaderBytes: 1 << 20, } c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) listener, listenErr := net.Listen("tcp", Address) if listenErr != nil { err_msg := "Could not listen - " + listenErr.Error() + "\n" fmt.Fprintf(os.Stderr, err_msg) logger.Error("ERROR: " + err_msg) os.Exit(1) } go func() { for _ = range c { // sig is a ^C, handle it // stop the HTTP server fmt.Fprintln(os.Stderr, "Stopping the server...") listener.Close() } }() fmt.Fprintf(os.Stderr, "Error in Serve: %s\n", s.Serve(listener)) }