From: Jeff Halter Date: Sat, 11 Jun 2022 01:04:48 +0000 (-0700) Subject: Add cmdline arg to initialize a default config X-Git-Url: https://git.r.bdr.sh/rbdr/mobius/commitdiff_plain/8796b4494547be6825004d82bf40db71524a6400 Add cmdline arg to initialize a default config --- diff --git a/Dockerfile b/Dockerfile index 86cbd63..7d93a0e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,4 +13,5 @@ COPY --from=builder /app/cmd/mobius-hotline-server/mobius/config /usr/local/var/ EXPOSE 5500 5501 +ENTRYPOINT ["/app/server"] CMD ["/app/server"] diff --git a/cmd/mobius-hotline-server/main.go b/cmd/mobius-hotline-server/main.go index 8a3135e..cf3c5a9 100644 --- a/cmd/mobius-hotline-server/main.go +++ b/cmd/mobius-hotline-server/main.go @@ -2,6 +2,7 @@ package main import ( "context" + "embed" "encoding/json" "flag" "fmt" @@ -17,6 +18,9 @@ import ( "time" ) +//go:embed mobius/config +var cfgTemplate embed.FS + const ( defaultPort = 5500 ) @@ -31,6 +35,8 @@ func main() { configDir := flag.String("config", defaultConfigPath(), "Path to config root") version := flag.Bool("version", false, "print version and exit") logLevel := flag.String("log-level", "info", "Log level") + init := flag.Bool("init", false, "Populate the config dir with default configuration") + flag.Parse() if *version { @@ -49,6 +55,20 @@ func main() { defer func() { _ = l.Sync() }() logger := l.Sugar() + if *init { + if _, err := os.Stat(*configDir + "/config.yaml"); !os.IsNotExist(err) { + logger.Fatalw("Init failed. Existing config directory found: " + *configDir) + } + + if err := os.MkdirAll(*configDir, 0750); err != nil { + logger.Fatal(err) + } + + if err := copyDir("mobius/config", *configDir); err != nil { + logger.Fatal(err) + } + } + if _, err := os.Stat(*configDir); os.IsNotExist(err) { logger.Fatalw("Configuration directory not found", "path", configDir) } @@ -125,3 +145,53 @@ func defaultConfigPath() (cfgPath string) { return cfgPath } + +// TODO: Simplify this mess. Why is it so difficult to recursively copy a directory? +func copyDir(src, dst string) error { + entries, err := cfgTemplate.ReadDir(src) + if err != nil { + return err + } + for _, dirEntry := range entries { + if dirEntry.IsDir() { + if err := os.MkdirAll(dst+"/"+dirEntry.Name(), 0777); err != nil { + panic(err) + } + subdirEntries, _ := cfgTemplate.ReadDir(src + "/" + dirEntry.Name()) + for _, subDirEntry := range subdirEntries { + f, err := os.Create(dst + "/" + dirEntry.Name() + "/" + subDirEntry.Name()) + if err != nil { + return err + } + + srcFile, err := cfgTemplate.Open(src + "/" + dirEntry.Name() + "/" + subDirEntry.Name()) + if err != nil { + return err + } + _, err = io.Copy(f, srcFile) + if err != nil { + return err + } + f.Close() + } + } else { + f, err := os.Create(dst + "/" + dirEntry.Name()) + if err != nil { + return err + } + + srcFile, err := cfgTemplate.Open(src + "/" + dirEntry.Name()) + if err != nil { + return err + } + _, err = io.Copy(f, srcFile) + if err != nil { + return err + } + f.Close() + } + + } + + return nil +}