From 0232a5c4f4f878f9d99c0bc069ab88f33d33d98d Mon Sep 17 00:00:00 2001 From: Samuel Lorch Date: Thu, 2 Mar 2023 23:00:22 +0100 Subject: [PATCH] add -apply flag, add webserver --- api/apply.go | 23 +++++++++++++++++++++ api/main.go | 48 +++++++++++++++++++++++++++++++++++--------- pkg/server/server.go | 32 +++++++++++++++++++++++++++++ 3 files changed, 93 insertions(+), 10 deletions(-) create mode 100644 api/apply.go create mode 100644 pkg/server/server.go diff --git a/api/apply.go b/api/apply.go new file mode 100644 index 0000000..4d1ede7 --- /dev/null +++ b/api/apply.go @@ -0,0 +1,23 @@ +package main + +import ( + "fmt" + + "golang.org/x/exp/slog" + "nfsense.net/nfsense/pkg/definitions" + "nfsense.net/nfsense/pkg/nftables" +) + +func apply(conf *definitions.Config) error { + fileContent, err := nftables.GenerateNfTablesFile(*conf) + if err != nil { + return fmt.Errorf("Generating nftables file %w", err) + } + + err = nftables.ApplyNfTablesFile(fileContent) + if err != nil { + return fmt.Errorf("Applying nftables %w", err) + } + slog.Info("Wrote nftables File!") + return nil +} diff --git a/api/main.go b/api/main.go index b0b4b88..2bda165 100644 --- a/api/main.go +++ b/api/main.go @@ -1,29 +1,57 @@ package main import ( + "context" + "flag" + "os" + "os/signal" + "syscall" + "time" + "golang.org/x/exp/slog" - "nfsense.net/nfsense/pkg/nftables" + "nfsense.net/nfsense/pkg/server" ) func main() { + applyPtr := flag.Bool("apply", false, "apply config and stop") + flag.Parse() + slog.Info("Starting...") + conf, err := LoadConfiguration("config.json") if err != nil { slog.Error("Loading Config", err) return } + slog.Info("Config Loaded", "config", conf) - fileContent, err := nftables.GenerateNfTablesFile(*conf) - if err != nil { - slog.Error("Generating nftables file", err) + if *applyPtr { + slog.Info("Applying Config...") + err := apply(conf) + if err != nil { + slog.Error("Applying Config", err) + return + } + slog.Info("Config Applied, Exiting...") return } - err = nftables.ApplyNfTablesFile(fileContent) - if err != nil { - slog.Error("Applying nftables", err) - return - } - slog.Info("Wrote nftables File!") + slog.Info("Starting Webserver...") + server.StartWebserver(conf) + + slog.Info("Ready") + + // Handle Exit Signal + sigChan := make(chan os.Signal, 1) + signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) + <-sigChan + slog.Info("Got Signal, Exiting...") + + shutdownCtx, shutdownRelease := context.WithTimeout(context.Background(), 10*time.Second) + defer shutdownRelease() + + server.ShutdownWebserver(shutdownCtx) + + slog.Info("Done") } diff --git a/pkg/server/server.go b/pkg/server/server.go new file mode 100644 index 0000000..79ac5ec --- /dev/null +++ b/pkg/server/server.go @@ -0,0 +1,32 @@ +package server + +import ( + "context" + "errors" + "fmt" + "net/http" + + "golang.org/x/exp/slog" + + "nfsense.net/nfsense/pkg/definitions" +) + +var server http.Server + +func StartWebserver(conf *definitions.Config) { + server.Addr = ":8080" + go func() { + if err := server.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) { + slog.Error("Webserver error", err) + } + slog.Info("Webserver Stopped") + }() +} + +func ShutdownWebserver(ctx context.Context) error { + err := server.Shutdown(ctx) + if err != nil { + return fmt.Errorf("Shutting down: %w", err) + } + return nil +}