view cmd/gemma/main.go @ 332:394fafeb4052

Use viper as config storage (I don't like it).
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Fri, 03 Aug 2018 15:46:05 +0200
parents 21cf31a7d9e1
children 999f4f83a072
line wrap: on
line source

package main

import (
	"context"
	"fmt"
	"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/auth"
	"gemma.intevation.de/gemma/config"
	"gemma.intevation.de/gemma/controllers"
)

func prepareConnectionPool() {
	// Install connection pool
	cp, err := auth.NewConnectionPool(config.SessionStore())
	if err != nil {
		log.Fatalf("Error with session store: %v\n", err)
	}
	auth.ConnPool = cp
}

func start(cmd *cobra.Command, args []string) {

	web, err := filepath.Abs(config.Web())
	if err != nil {
		log.Fatalf("error: %v\n", err)
	}

	prepareConnectionPool()

	m := mux.NewRouter()
	controllers.BindRoutes(m)

	m.PathPrefix("/").Handler(http.FileServer(http.Dir(web)))

	addr := fmt.Sprintf("%s:%d", config.WebHost(), config.WebPort())
	log.Printf("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)
	signal.Notify(sigChan, os.Interrupt, os.Kill, syscall.SIGTERM)

	select {
	case err := <-done:
		if err != nil && err != http.ErrServerClosed {
			log.Fatalf("error: %v\n", err)
		}
	case <-sigChan:
	}

	server.Shutdown(context.Background())

	<-done

	if err := auth.ConnPool.Shutdown(); err != nil {
		log.Fatalf("error: %v\n", err)
	}
}

func main() {
	config.RootCmd.Run = start
	if err := config.RootCmd.Execute(); err != nil {
		log.Fatalln(err)
	}
}