import (
"context"
"flag"
- "os"
"os/signal"
"syscall"
"time"
"github.com/coreos/go-systemd/daemon"
"gopkg.in/yaml.v3"
+ "go.fuhry.dev/runtime/config_watcher"
+ "go.fuhry.dev/runtime/ephs"
"go.fuhry.dev/runtime/http"
- "go.fuhry.dev/runtime/mtls"
"go.fuhry.dev/runtime/utils/log"
)
func main() {
- mtls.SetDefaultIdentity("authproxy")
-
ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
defer cancel()
+ ephs.DefaultClientContext = ctx
+
configPath := flag.String("config", "", "YAML file to load configuration from")
flag.Parse()
server := http.NewServerWithContext(ctx)
- contents, err := os.ReadFile(*configPath)
+ watcher, err := config_watcher.Watch(ctx, *configPath)
+ if err != nil {
+ log.Default().Panic(err)
+ }
+ defer watcher.Close()
+
+ upd, err := watcher.Next()
if err != nil {
log.Default().Panic(err)
}
- err = yaml.Unmarshal(contents, server)
+ err = yaml.Unmarshal(upd.Contents, server)
if err != nil {
log.Default().Panic(err)
}
+ go (func() {
+ for {
+ upd, err := watcher.Next()
+ if err != nil {
+ return
+ }
+
+ log.Default().Notice("Config change detected, reloading server")
+
+ err = yaml.Unmarshal(upd.Contents, server)
+ if err != nil {
+ log.Default().Alertf("YAML unmarshal/hot reload failed, ignoring update: ", err)
+ continue
+ }
+ }
+ })()
+
go (func() {
if err := server.ListenAndServeTLS(); err != nil && err != http.ErrServerClosed {
log.Panic(err)