package app import ( "fmt" "net/http" "os" "os/signal" "syscall" "time" "git.espin.casa/albert/cml04-falcon-system/handset/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 } } }