From a230a58a1d6d11d50846c6f788d3c04a42f2c6ce Mon Sep 17 00:00:00 2001 From: Xe Iaso Date: Thu, 3 Apr 2025 18:24:10 -0400 Subject: [PATCH] cmd/anubis: add --extract-resources flag to extract static assets to the filesystem (#216) Signed-off-by: Xe Iaso --- cmd/anubis/main.go | 40 ++++++++++++++++++++++++++++++++++++++++ docs/docs/CHANGELOG.md | 1 + 2 files changed, 41 insertions(+) diff --git a/cmd/anubis/main.go b/cmd/anubis/main.go index 560a261..59adc67 100644 --- a/cmd/anubis/main.go +++ b/cmd/anubis/main.go @@ -5,9 +5,11 @@ import ( "context" "crypto/ed25519" "crypto/rand" + "embed" "encoding/hex" "flag" "fmt" + "io/fs" "log" "log/slog" "net" @@ -16,6 +18,7 @@ import ( "net/url" "os" "os/signal" + "path/filepath" "regexp" "strconv" "strings" @@ -28,6 +31,7 @@ import ( libanubis "github.com/TecharoHQ/anubis/lib" botPolicy "github.com/TecharoHQ/anubis/lib/policy" "github.com/TecharoHQ/anubis/lib/policy/config" + "github.com/TecharoHQ/anubis/web" "github.com/facebookgo/flagenv" "github.com/prometheus/client_golang/prometheus/promhttp" ) @@ -50,6 +54,8 @@ var ( healthcheck = flag.Bool("healthcheck", false, "run a health check against Anubis") useRemoteAddress = flag.Bool("use-remote-address", false, "read the client's IP address from the network request, useful for debugging and running Anubis on bare metal") debugBenchmarkJS = flag.Bool("debug-benchmark-js", false, "respond to every request with a challenge for benchmarking hashrate") + + extractResources = flag.String("extract-resources", "", "if set, extract the static resources to the specified folder") ) func keyFromHex(value string) (ed25519.PrivateKey, error) { @@ -172,6 +178,14 @@ func main() { return } + if *extractResources != "" { + if err := extractEmbedFS(web.Static, "static", *extractResources); err != nil { + log.Fatal(err) + } + fmt.Printf("Extracted embedded static files to %s\n", *extractResources) + return + } + rp, err := makeReverseProxy(*target) if err != nil { log.Fatalf("can't make reverse proxy: %v", err) @@ -314,3 +328,29 @@ func metricsServer(ctx context.Context, done func()) { log.Fatal(err) } } + +func extractEmbedFS(fsys embed.FS, root string, destDir string) error { + return fs.WalkDir(fsys, root, func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + + relPath, err := filepath.Rel(root, path) + if err != nil { + return err + } + + destPath := filepath.Join(destDir, relPath) + + if d.IsDir() { + return os.MkdirAll(destPath, 0o700) + } + + data, err := fs.ReadFile(fsys, path) + if err != nil { + return err + } + + return os.WriteFile(destPath, data, 0o644) + }) +} diff --git a/docs/docs/CHANGELOG.md b/docs/docs/CHANGELOG.md index 2527946..b22894e 100644 --- a/docs/docs/CHANGELOG.md +++ b/docs/docs/CHANGELOG.md @@ -36,6 +36,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added `zizmor` for GitHub Actions static analysis - Fixed most `zizmor` findings - Enabled Dependabot +- Added an `--extract-resources` flag to extract static resources to a local folder. ## v1.15.1