Improve flag usage, check for required env vars

Switch to a custom FlagSet and add a nicer usage message.

Check for the required CHAOS_CONTROL_LOGIN and CHAOS_CONTROL_PASSWORD
environment variables and exit with an error if neither is set. The
usage string also mentions that both must be set.
This commit is contained in:
James O'Gorman
2020-11-28 15:53:47 +00:00
parent cab8f1f626
commit 16d476249d

View File

@@ -2,6 +2,7 @@ package main
import (
"flag"
"fmt"
"net"
"net/http"
"os"
@@ -109,6 +110,24 @@ func loggingMiddleware(log zerolog.Logger) func(next http.Handler) http.Handler
}
}
func usage(fs *flag.FlagSet) func() {
return func() {
o := fs.Output()
fmt.Fprintf(o, "Usage:\n %s ", os.Args[0])
fs.VisitAll(func(f *flag.Flag) {
s := fmt.Sprintf(" [-%s", f.Name)
if arg, _ := flag.UnquoteUsage(f); len(arg) > 0 {
s += " " + arg
}
s += "]"
fmt.Fprint(o, s)
})
fmt.Fprint(o, "\n\nOptions:\n")
fs.PrintDefaults()
fmt.Fprint(o, "\nThe environment variables CHAOS_CONTROL_LOGIN and CHAOS_CONTROL_PASSWORD must be set.\n")
}
}
func setupLogger(level, output string) zerolog.Logger {
ll, err := zerolog.ParseLevel(level)
if err != nil {
@@ -126,19 +145,34 @@ func setupLogger(level, output string) zerolog.Logger {
}
func main() {
fs := flag.NewFlagSet(os.Args[0], flag.ExitOnError)
fs.Usage = usage(fs)
var (
listen = flag.String("listen", ":8080", "listen `address`")
logLevel = flag.String("log.level", "info", "log `level`")
logOutput = flag.String("log.output", "json", "log output style (json, console)")
listen = fs.String("listen", ":8080", "listen `address`")
logLevel = fs.String("log.level", "info", "log `level`")
logOutput = fs.String("log.output", "json", "log output `style` (json, console)")
)
flag.Parse()
fs.Parse(os.Args[1:])
log := setupLogger(*logLevel, *logOutput)
var (
controlLogin = os.Getenv("CHAOS_CONTROL_LOGIN")
controlPassword = os.Getenv("CHAOS_CONTROL_PASSWORD")
)
switch {
case controlLogin == "" && controlPassword == "":
log.Fatal().Msg("CHAOS_CONTROL_LOGIN and CHAOS_CONTROL_PASSWORD must be set in the environment")
case controlLogin == "":
log.Fatal().Msg("CHAOS_CONTROL_LOGIN is not set")
case controlPassword == "":
log.Fatal().Msg("CHAOS_CONTROL_PASSWORD is not set")
}
collector := broadbandCollector{
API: chaos.New(chaos.Auth{
ControlLogin: os.Getenv("CHAOS_CONTROL_LOGIN"),
ControlPassword: os.Getenv("CHAOS_CONTROL_PASSWORD"),
ControlLogin: controlLogin,
ControlPassword: controlPassword,
}),
log: log,
}