cml04-falcon-system/injector/app/app.go

89 lines
2.0 KiB
Go
Raw Normal View History

2024-10-03 16:14:53 +02:00
package app
import (
"fmt"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"git.espin.casa/albert/cml04-falcon-system/injector/routes"
"git.espin.casa/albert/cml04-falcon-system/internal/publisher"
"git.espin.casa/albert/logger"
"github.com/julienschmidt/httprouter"
"github.com/nats-io/nats.go"
"github.com/spf13/cobra"
)
func Run(cmd *cobra.Command, args []string) {
// read flags
logLevel, _ := cmd.Flags().GetString("log-level")
httpAddr, _ := cmd.Flags().GetString("http-addr")
natsHost, _ := cmd.Flags().GetString("nats-host")
natsPort, _ := cmd.Flags().GetInt("nats-port")
// setup logger
log := logger.New(os.Stdout, logLevel)
// log fields
logFields := logger.LogFields{
"http-bind": httpAddr,
"nats_host": natsHost,
"nats_port": natsPort,
"log_level": logLevel,
}
// NATS connect
nc, err := nats.Connect(fmt.Sprintf("nats://%s:%d", natsHost, natsPort))
if err != nil {
log.Error("create nats connection failed", err, logFields)
return
}
// on close disconnects
defer nc.Close()
pub := publisher.New(nc)
// create router
router := httprouter.New()
// create routes
routes.CreateRoutes(router, pub)
// serve static files
router.ServeFiles("/assets/*filepath", http.Dir("assets"))
// create http server
server := http.Server{
Addr: httpAddr,
ReadTimeout: 5 * time.Second,
WriteTimeout: 5 * time.Second,
IdleTimeout: 5 * time.Second,
Handler: router,
}
// start the http server
go func() {
if err := server.ListenAndServeTLS("server.crt", "server.key"); err != nil {
panic(err)
}
}()
// info banner
log.Info("started cml04-falcon-handset service", logFields)
// wait signal to finish
signal := WaitSignal()
log.Info("signal received", logFields.Add(logger.LogFields{
"signal": signal,
}))
}
// WaitSignal catching exit signal
func WaitSignal() os.Signal {
ch := make(chan os.Signal, 2)
signal.Notify(
ch,
syscall.SIGINT,
syscall.SIGQUIT,
syscall.SIGTERM,
)
for {
sig := <-ch
switch sig {
case syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM:
return sig
}
}
}