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)
	}
}