package main import ( "chromagies/src/api" "chromagies/src/config" "chromagies/src/database" "chromagies/src/profiler" "fmt" "log" "net/http" "os" "os/signal" "syscall" "time" "github.com/julienschmidt/httprouter" ) var router *httprouter.Router var logFile *os.File func main() { startTime := time.Now() log.SetOutput(os.Stdout) log.Println("============================================================") log.Println("Starting server...") go handleStopSignal() initConfig() startLogger() database.Init() initRouter() var conf config.Server = (config.GetConfig()).Server var readyTime time.Duration = time.Duration(time.Since(startTime).Microseconds()) profiler.Register("Startup", 1, "µs") profiler.Add("Startup", readyTime) log.Printf("Server ready in %d microseconds\n", readyTime) http.ListenAndServe(fmt.Sprintf("%s:%d", conf.IP, conf.Port), router) stopServer() } func startLogger() { var conf config.Logger = (config.GetConfig()).Logger if conf.Output != "" { var err error logFile, err = os.OpenFile(conf.Output, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666) if err != nil { log.Printf("Output file \"%s\" un-openable : %s", conf.Output, err) return } log.Printf("Switching logs to output file \"%s\"\nStopping to log in the console", conf.Output) log.SetOutput(logFile) log.Println("============================================================") log.Printf("Hi there ! Server is starting...") } } func initConfig() { var err error err = config.ReadConfigFile() if err != nil { err = config.CreateConfigFile() if err == nil { err = config.ReadConfigFile() } } if err != nil { log.Fatalln("Cannot read/write config file !") } } func initRouter() { router = httprouter.New() // routeur.NotFoundHandler = TODO api.Init(router) router.ServeFiles("/static/*filepath", http.Dir("./static/")) } func handleStopSignal() { sigs := make(chan os.Signal, 1) signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) <-sigs close(sigs) fmt.Println() stopServer() } func stopServer() { log.Println("Stopping server...") // Close everything if logFile != nil { log.Println("Closing log file, giving back log output to console") logFile.Close() log.SetOutput(os.Stdout) } log.Println("Server stopped") os.Exit(0) }