Add some config through flag/env
This commit is contained in:
parent
c60b4ddf73
commit
d0b59cb411
13
app.go
13
app.go
@ -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
45
config/cli.go
Normal 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
28
config/config.go
Normal 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
21
config/env.go
Normal 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
|
||||||
|
}
|
9
main.go
9
main.go
@ -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)
|
||||||
|
10
ui/routes.go
10
ui/routes.go
@ -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"))
|
||||||
|
Reference in New Issue
Block a user