Chromagies/main.go

112 lines
2.3 KiB
Go

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)
}