Initial commit for the web interface

This commit is contained in:
nemunaire 2022-10-01 19:37:12 +02:00
commit 4eea7769ff
36 changed files with 1186 additions and 0 deletions

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.Var(&c.ExternalURL, "external-url", "Public URL of the service")
flag.StringVar(&c.BaseURL, "baseurl", c.BaseURL, "URL prepended to each URL")
flag.StringVar(&c.Bind, "bind", c.Bind, "Bind port/socket")
flag.StringVar(&c.DevProxy, "dev", c.DevProxy, "Use ui directory instead of embedded assets")
// 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: "127.0.0.1:8080",
}
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
}

29
config/config.go Normal file
View file

@ -0,0 +1,29 @@
package config
import (
"flag"
"strings"
)
type Config struct {
DevProxy string
Bind string
ExternalURL URL
BaseURL 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, "REVEIL_")
key = strings.Replace(key, "_", "-", -1)
key = strings.ToLower(key)
err = flag.Set(key, value)
return
}

44
config/custom.go Normal file
View file

@ -0,0 +1,44 @@
package config
import (
"encoding/base64"
"net/url"
)
type JWTSecretKey []byte
func (i *JWTSecretKey) String() string {
return base64.StdEncoding.EncodeToString(*i)
}
func (i *JWTSecretKey) Set(value string) error {
z, err := base64.StdEncoding.DecodeString(value)
if err != nil {
return err
}
*i = z
return nil
}
type URL struct {
URL *url.URL
}
func (i *URL) String() string {
if i.URL != nil {
return i.URL.String()
} else {
return ""
}
}
func (i *URL) Set(value string) error {
u, err := url.Parse(value)
if err != nil {
return err
}
i.URL = u
return nil
}

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 REVEIL_
func (c *Config) FromEnv() error {
for _, line := range os.Environ() {
if strings.HasPrefix(line, "REVEIL_") {
err := c.parseLine(line)
if err != nil {
return fmt.Errorf("error in environment (%q): %w", line, err)
}
}
}
return nil
}