Add some config through flag/env

This commit is contained in:
nemunaire 2021-05-02 22:49:51 +02:00
parent c60b4ddf73
commit d0b59cb411
6 changed files with 120 additions and 6 deletions

13
app.go
View File

@ -13,6 +13,7 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"nhooyr.io/websocket" "nhooyr.io/websocket"
"github.com/nemunaire/minifaas/config"
"github.com/nemunaire/minifaas/engine/docker" "github.com/nemunaire/minifaas/engine/docker"
"github.com/nemunaire/minifaas/ui" "github.com/nemunaire/minifaas/ui"
) )
@ -20,17 +21,20 @@ import (
type App struct { type App struct {
router *gin.Engine router *gin.Engine
srv *http.Server srv *http.Server
cfg *config.Config
} }
func NewApp() App { func NewApp(cfg *config.Config) App {
//Check rights on artifacts directory //Check rights on artifacts directory
os.MkdirAll("./artifacts", os.ModePerm) os.MkdirAll("./artifacts", os.ModePerm)
//gin.SetMode(gin.ReleaseMode) if !cfg.Dev {
gin.SetMode(gin.ReleaseMode)
}
gin.ForceConsoleColor() gin.ForceConsoleColor()
router := gin.Default() router := gin.Default()
ui.DeclareRoutes(router) ui.DeclareRoutes(router, cfg)
artifacts := http.Dir("./artifacts") artifacts := http.Dir("./artifacts")
router.GET("/artifacts/*path", func(c *gin.Context) { router.GET("/artifacts/*path", func(c *gin.Context) {
@ -123,6 +127,7 @@ func NewApp() App {
app := App{ app := App{
router: router, router: router,
cfg: cfg,
} }
return app return app
@ -130,7 +135,7 @@ func NewApp() App {
func (app *App) Start() { func (app *App) Start() {
app.srv = &http.Server{ app.srv = &http.Server{
Addr: ":8082", Addr: app.cfg.Bind,
Handler: app.router, Handler: app.router,
} }

45
config/cli.go Normal file
View File

@ -0,0 +1,45 @@
package config
import (
"flag"
)
// declareFlags registers flags for the structure Options.
func (c *Config) declareFlags() {
flag.BoolVar(&c.Dev, "dev", c.Dev, "Use ui directory instead of embedded assets")
flag.StringVar(&c.Bind, "bind", c.Bind, "Bind port/socket")
flag.StringVar(&c.ExternalURL, "externalurl", c.ExternalURL, "Begining of the URL, before the base, that should be used eg. in mails")
// Others flags are declared in some other files when they need specials configurations
}
func Consolidated() (cfg *Config, err error) {
// Define defaults options
cfg = &Config{
Bind: ":8082",
ExternalURL: "http://localhost:8082",
}
cfg.declareFlags()
// Then, overwrite that by what is present in the environment
err = cfg.FromEnv()
if err != nil {
return
}
// Finaly, command line takes precedence
err = cfg.parseCLI()
if err != nil {
return
}
return
}
// parseCLI parse the flags and treats extra args as configuration filename.
func (c *Config) parseCLI() error {
flag.Parse()
return nil
}

28
config/config.go Normal file
View File

@ -0,0 +1,28 @@
package config
import (
"flag"
"strings"
)
type Config struct {
Dev bool
Bind string
ExternalURL string
}
// parseLine treats a config line and place the read value in the variable
// declared to the corresponding flag.
func (c *Config) parseLine(line string) (err error) {
fields := strings.SplitN(line, "=", 2)
orig_key := strings.TrimSpace(fields[0])
value := strings.TrimSpace(fields[1])
key := strings.TrimPrefix(orig_key, "MINIFAAS_")
key = strings.Replace(key, "_", "-", -1)
key = strings.ToLower(key)
err = flag.Set(key, value)
return
}

21
config/env.go Normal file
View File

@ -0,0 +1,21 @@
package config
import (
"fmt"
"os"
"strings"
)
// FromEnv analyzes all the environment variables to find each one
// starting by MINIFAAS_
func (c *Config) FromEnv() error {
for _, line := range os.Environ() {
if strings.HasPrefix(line, "MINIFAAS_") {
err := c.parseLine(line)
if err != nil {
return fmt.Errorf("error in environment (%q): %w", line, err)
}
}
}
return nil
}

View File

@ -5,10 +5,17 @@ import (
"os" "os"
"os/signal" "os/signal"
"syscall" "syscall"
"github.com/nemunaire/minifaas/config"
) )
func main() { func main() {
a := NewApp() cfg, err := config.Consolidated()
if err != nil {
log.Fatal("Unable to read configuration:", err)
}
a := NewApp(cfg)
go a.Start() go a.Start()
quit := make(chan os.Signal) quit := make(chan os.Signal)

View File

@ -1,10 +1,18 @@
package ui package ui
import ( import (
"net/http"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/nemunaire/minifaas/config"
) )
func DeclareRoutes(router *gin.Engine) { func DeclareRoutes(router *gin.Engine, cfg *config.Config) {
if cfg.Dev {
Assets = http.Dir("./ui")
}
router.GET("/", serveOrReverse("/")) router.GET("/", serveOrReverse("/"))
router.GET("/favicon.ico", serveOrReverse("/favicon.ico")) router.GET("/favicon.ico", serveOrReverse("/favicon.ico"))
router.GET("/manifest.json", serveOrReverse("/manifest.json")) router.GET("/manifest.json", serveOrReverse("/manifest.json"))