diff options
| author | Xe Iaso <me@xeiaso.net> | 2025-04-03 18:24:10 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-03 18:24:10 -0400 |
| commit | a230a58a1d6d11d50846c6f788d3c04a42f2c6ce (patch) | |
| tree | 9aebad76fc9736379e77061c4974454273d9eb6b /cmd | |
| parent | 0bcc0a24295015e121b8820affebda9a5e1b3f18 (diff) | |
| download | anubis-a230a58a1d6d11d50846c6f788d3c04a42f2c6ce.tar.xz anubis-a230a58a1d6d11d50846c6f788d3c04a42f2c6ce.zip | |
cmd/anubis: add --extract-resources flag to extract static assets to the filesystem (#216)
Signed-off-by: Xe Iaso <me@xeiaso.net>
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/anubis/main.go | 40 |
1 files changed, 40 insertions, 0 deletions
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) + }) +} |
