Mercurial > gemma
view cmd/gemma/main.go @ 5711:2dd155cc95ec revive-cleanup
Fix all revive issue (w/o machine generated stuff).
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Tue, 20 Feb 2024 22:22:57 +0100 |
parents | 0cd4ff1066fe |
children |
line wrap: on
line source
// This is Free Software under GNU Affero General Public License v >= 3.0 // without warranty, see README.md and license for details. // // SPDX-License-Identifier: AGPL-3.0-or-later // License-Filename: LICENSES/AGPL-3.0.txt // // Copyright (C) 2018 by via donau // – Österreichische Wasserstraßen-Gesellschaft mbH // Software engineering by Intevation GmbH // // Author(s): // * Sascha L. Teichmann <sascha.teichmann@intevation.de> // Command gemma starts the middleware server // for waterway monitoring and management. package main import ( "context" "fmt" lg "log" "net/http" "os" "os/signal" "path/filepath" "syscall" "github.com/gorilla/mux" "github.com/rs/cors" "github.com/spf13/cobra" "gemma.intevation.de/gemma/pkg/auth" "gemma.intevation.de/gemma/pkg/config" "gemma.intevation.de/gemma/pkg/controllers" "gemma.intevation.de/gemma/pkg/geoserver" "gemma.intevation.de/gemma/pkg/imports" "gemma.intevation.de/gemma/pkg/log" "gemma.intevation.de/gemma/pkg/middleware" "gemma.intevation.de/gemma/pkg/scheduler" ) func prepareSessionStore() { // Install session store ss, err := auth.NewSessionStore(config.SessionStore()) if err != nil { log.Fatalf("Error with session store: %v\n", err) } auth.Sessions = ss } func start(_ *cobra.Command, _ []string) { if lf := config.LogFile(); lf != "" { log.SetupLog(lf, 0666) defer log.ShutdownLog() } log.SetLogLevel(config.LogLevel()) config.Ready() web, err := filepath.Abs(config.Web()) if err != nil { log.Fatalf("%v\n", err) } prepareSessionStore() // Do GeoServer setup in background. geoserver.Reconfigure(geoserver.PrepareGeoServer) // Log what's registered to the import queue and scheduler. imports.LogImportKindNames() scheduler.LogActionNames() m := mux.NewRouter() controllers.BindRoutes(m) dir := middleware.NoSniff(http.FileServer(http.Dir(web))) m.PathPrefix("/").Handler(dir) addr := fmt.Sprintf("%s:%d", config.WebHost(), config.WebPort()) log.Infof("listen on %s\n", addr) var h http.Handler if al := config.AllowedOrigins(); len(al) > 0 { c := cors.New(cors.Options{ AllowedOrigins: al, Debug: true, }) h = c.Handler(m) } else { h = m } server := http.Server{Addr: addr, Handler: h} done := make(chan error) go func() { defer close(done) done <- server.ListenAndServe() }() sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM) select { case err := <-done: if err != nil && err != http.ErrServerClosed { log.Fatalf("%v\n", err) } case <-sigChan: } server.Shutdown(context.Background()) <-done if err := auth.Sessions.Shutdown(); err != nil { log.Fatalf("%v\n", err) } } func main() { config.RootCmd.Run = start if err := config.RootCmd.Execute(); err != nil { lg.Fatalln(err) } }