package main import ( "context" "log" "net/http" "os" "os/signal" "syscall" "time" "gontrol/src/logger" "gontrol/src/server/database" "gontrol/src/server/webapp" "gontrol/src/server/websocket" ) func main() { tmpl, err := webapp.ParseTemplates() if err != nil { log.Fatalf("Parse templates: %v", err) } db := database.InitSQLiteDB("/tmp/gontrol_agents.db") defer db.Close() if err := logger.InitDB("/tmp/gontrol_logs.db"); err != nil { log.Fatalf("Init log db: %v", err) } defer logger.CloseDB() app := &webapp.App{Tmpl: tmpl, DB: db} srv := &http.Server { Addr: ":3333", Handler: webapp.BuildRouter(app), ReadTimeout: 5 * time.Second, WriteTimeout: 10 * time.Second, } go func() { log.Println("Web server is running on port :3333") if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("Listen: %v", err) } }() go func() { logLine := "Websocket server is running on port :5555" log.Println(logLine) websocketServer := websocketserver.Server() if err := websocketServer.ListenAndServe(); err != http.ErrServerClosed { log.Fatalf("Websocket server failed: %s", err) } err := logger.InsertLog(logger.Info, logLine) if err != nil { log.Println("Error inserting log:", err) } }() stop := make(chan os.Signal, 1) signal.Notify(stop, os.Interrupt, syscall.SIGTERM) <-stop ctx, cancel := context.WithTimeout(context.Background(), 10 * time.Second) defer cancel() _ = srv.Shutdown(ctx) }