From f93dd223d6a34b6371e34211c4ce6cd0448a90ca Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Sun, 8 May 2022 19:29:58 -0500 Subject: [PATCH] basic webserver --- cmd/root.go | 22 ++++++++++++++++++++-- gen_version.go | 3 +++ main.go | 3 +++ modd.conf | 6 +++++- web/server.go | 38 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 web/server.go diff --git a/cmd/root.go b/cmd/root.go index 1a53ea0..fbdbaf7 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -4,6 +4,7 @@ import ( "fmt" "os" + "git.bloy.org/mike/hasshelper/web" "github.com/spf13/cobra" "github.com/spf13/viper" "go.uber.org/zap" @@ -16,18 +17,22 @@ var rootCmd = &cobra.Command{ var logger *zap.Logger var err error if viper.GetString("deployment") == "prod" { - logger, err = zap.NewProduction() + logger, err = zap.NewProduction(zap.WithCaller(false)) } else { - logger, err = zap.NewDevelopment() + logger, err = zap.NewDevelopment(zap.WithCaller(false)) } if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } logger.Sugar().With("version", viper.GetString("version")).Info("HASSHelper startup") + exitchan := make(chan bool) + web.Run(logger, exitchan) + <-exitchan // run the main command until one of the goroutines is done }, } +// Execute will kick off cobra's processing of the root command func Execute() { viper.SetDefault("Version", "1.2.3") if err := rootCmd.Execute(); err != nil { @@ -45,4 +50,17 @@ func init() { func initConfig() { viper.AutomaticEnv() + expected_config := []string{ + "deployment", + "image_dir", + "version", + "webserver_port", + } + for _, key := range expected_config { + if !viper.IsSet(key) { + fmt.Fprintf(os.Stderr, "Missing configuration value: %s\n", key) + os.Exit(1) + } + } + fmt.Println(viper.AllSettings()) } diff --git a/gen_version.go b/gen_version.go index 3486719..933d80d 100644 --- a/gen_version.go +++ b/gen_version.go @@ -45,6 +45,9 @@ func main() { fmt.Sprintf("package %s", pkgName), "// Code generated automatically. DO NOT EDIT", "", + fmt.Sprintf( + "// %s is the generated version based on the current git revision", + varName), fmt.Sprintf("const %s = \"%s\"", varName, versionStr), } file, err := os.Create(fileName) diff --git a/main.go b/main.go index 2eeebeb..bcb3a61 100644 --- a/main.go +++ b/main.go @@ -1,3 +1,4 @@ +// Package main for the hasshelper application command package main import ( @@ -6,6 +7,8 @@ import ( ) //go:generate go run ./gen_version.go -p cmd -f cmd/git_version.go + +// main func main() { cmd.Execute() } diff --git a/modd.conf b/modd.conf index 1e8112f..a2b7bfb 100644 --- a/modd.conf +++ b/modd.conf @@ -1,10 +1,14 @@ +{ + daemon +sigterm: godoc -index -play +} .git/**/* gen_version.go { prep: go mod tidy prep: go generate } -**/*.go { +**/*.go .env { prep: go mod tidy prep: go test @dirmods prep: go build + daemon +sigterm: ./hasshelper } diff --git a/web/server.go b/web/server.go new file mode 100644 index 0000000..a066b6d --- /dev/null +++ b/web/server.go @@ -0,0 +1,38 @@ +package web + +import ( + "fmt" + "net/http" + "os" + + "github.com/spf13/viper" + "go.uber.org/zap" +) + +type configObj struct { + logger *zap.Logger + port int + imageDir string +} + +var config = configObj{} + +// Run starts up the webserver part of hasshelper. It writes to exitch if +// the webserver ends unexpectedly. Config values will be read from viper. +func Run(rootLogger *zap.Logger, exitch chan bool) { + config.logger = rootLogger.Named("web") + config.port = viper.GetInt("webserver_port") + config.imageDir = viper.GetString("image_dir") + addr := fmt.Sprintf(":%d", config.port) + http.Handle("/", http.FileServer(http.FS(os.DirFS(".")))) + var logger = config.logger.Sugar() + + logger.Infow("Webserver startup", "port", config.port) + + if err := http.ListenAndServe(addr, nil); err != nil { + logger.Errorf("Webserver fatal error: %s", err) + } else { + logger.Info("webserver shutting down") + } + exitch <- true +}