package main import ( "context" "errors" "fmt" "net/http" "os" "os/signal" "sync" "github.com/charmbracelet/log" "github.com/go-gandi/go-gandi/config" "gopkg.in/yaml.v2" ) func loadConfig(filename string) (*Config, error) { u := &Config{} yamlFile, err := os.ReadFile(filename) if err != nil { return nil, err } err = yaml.Unmarshal(yamlFile, u) if err != nil { return nil, err } return u, nil } func main() { ctx, endFn := context.WithCancel(context.Background()) domain, ok := os.LookupEnv("WATCH_DOMAIN") if !ok { log.Fatal("no domain specified") } apikey, ok := os.LookupEnv("WATCH_API") if !ok { log.Fatal("no Gandi api key") } port, ok := os.LookupEnv("WATCH_PORT") if !ok { port = "6283" } file, ok := os.LookupEnv("WATCH_FILE") if !ok { file = "./config.yaml" } debug := os.Getenv("WATCH_DEBUG") watchconf, err := loadConfig(file) if err != nil { log.Fatal(err) } conf := config.Config{ APIKey: apikey, } a := &Tilde{ debug: debug != "", domain: domain, conf: conf, } count := 0 for _, v := range watchconf.Users { err := a.Add(&v) if err != nil { log.Fatal(err, "reg", count) } count++ } count = 0 for _, v := range watchconf.Hosts { err := a.Add(&v) if err != nil { log.Fatal(err, "reg", count) } count++ } server := &http.Server{Addr: fmt.Sprintf("0.0.0.0:%v", port), Handler: a.server()} var wg sync.WaitGroup c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) go func() { <-c log.Info("trying to shutdown cleanly") endFn() err := server.Shutdown(ctx) if err != nil { log.Warn("error shutting down tilde server", "error", err) } }() wg.Add(1) go func() { err := server.ListenAndServe() if err != nil && !errors.Is(err, http.ErrServerClosed) { log.Warn(err) } wg.Done() log.Info("watch web server shutdown") }() wg.Add(1) go func() { err := a.run(ctx) if err != nil { log.Warn("error shutting down update server", "error", err) } wg.Done() log.Info("watch updater shutdown") }() log.Info("watch running") wg.Wait() log.Info("shut down") }