From 22dcdee87146f4ecefe1a9a9b364b1573b5d58bc Mon Sep 17 00:00:00 2001 From: Radon Rosborough Date: Sat, 3 Jul 2021 18:43:10 +0000 Subject: [PATCH] Supervisor gains proxy ability --- Makefile | 2 +- docker/admin/install.bash | 1 + docker/runtime/install.bash | 2 ++ supervisor/compile.bash | 7 +++- supervisor/src/main.go | 71 +++++++++++++++++++++++++++++++++++-- 5 files changed, 79 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index bf207e9..54898e9 100644 --- a/Makefile +++ b/Makefile @@ -162,7 +162,7 @@ server-dev: # Run and restart server for development build: frontend system supervisor # Compile all artifacts for production dev: # Compile, run, and watch all artifacts and server for development - $(MAKE_QUIETLY) -j3 frontend-dev system-dev supervisor-dev server-dev + $(MAKE_QUIETLY) -j4 frontend-dev system-dev supervisor-dev server-dev ### Application tools diff --git a/docker/admin/install.bash b/docker/admin/install.bash index 3fbaf07..5bf500a 100755 --- a/docker/admin/install.bash +++ b/docker/admin/install.bash @@ -39,6 +39,7 @@ g++ git golang htop +httpie jq less make diff --git a/docker/runtime/install.bash b/docker/runtime/install.bash index 011f226..9723f42 100755 --- a/docker/runtime/install.bash +++ b/docker/runtime/install.bash @@ -48,7 +48,9 @@ dctrl-tools bind9-dnsutils less git +golang htop +httpie jq make man diff --git a/supervisor/compile.bash b/supervisor/compile.bash index 1152696..52a124a 100755 --- a/supervisor/compile.bash +++ b/supervisor/compile.bash @@ -2,6 +2,11 @@ set -euo pipefail +function verbosely { + echo "$@" + "$@" +} + cd supervisor mkdir -p out -go build -o out/riju-supervisor ./src +verbosely go build -o out/riju-supervisor ./src diff --git a/supervisor/src/main.go b/supervisor/src/main.go index 8f61880..433e4ae 100644 --- a/supervisor/src/main.go +++ b/supervisor/src/main.go @@ -2,8 +2,75 @@ package main import ( "fmt" + "log" + "net/http" + "net/http/httputil" + "net/url" + "strings" + "sync" ) -func main() { - fmt.Println("Hello, world!") +type supervisor struct { + proxyHandler http.Handler + + reloadLock sync.Mutex + reloadInProgress bool + reloadNeeded bool +} + +func (sv *supervisor) ServeHTTP(w http.ResponseWriter, r *http.Request) { + if strings.HasPrefix(r.URL.Path, "/api/supervisor") { + if r.URL.Path == "/api/supervisor/v1/reload" { + resp := "" + sv.reloadLock.Lock() + if !sv.reloadInProgress { + sv.reloadInProgress = true + go sv.reload() + resp = "Triggered reload." + } else { + sv.reloadNeeded = true + resp = "Reload already in progress, scheduling another one." + } + sv.reloadLock.Unlock() + fmt.Fprintln(w, resp) + return + } + http.NotFound(w, r) + return + } + sv.proxyHandler.ServeHTTP(w, r) + return +} + +func (sv *supervisor) reloadWithScheduling() { + err := sv.reload() + if err != nil { + log.Printf("failed to reload: %s\n", err.Error()) + } else { + log.Println("successfully reloaded") + } + sv.reloadLock.Lock() + sv.reloadInProgress = false + if sv.reloadNeeded { + sv.reloadInProgress = true + go sv.reloadWithScheduling() + } + sv.reloadLock.Unlock() +} + +func (sv *supervisor) reload() error { + fmt.Println("starting reload") + return nil +} + +func main() { + url, err := url.Parse("http://localhost:6119") + if err != nil { + log.Fatal(err) + } + sv := &supervisor{ + proxyHandler: httputil.NewSingleHostReverseProxy(url), + } + log.Println("listening on http://0.0.0.0:80") + log.Fatalln(http.ListenAndServe("0.0.0.0:80", sv)) }