112 lines
2.3 KiB
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)
|
|
}
|