소스 검색

cmd/anubis: add --extract-resources flag to extract static assets to the filesystem (#216)

Signed-off-by: Xe Iaso <me@xeiaso.net>
Xe Iaso 2 달 전
부모
커밋
a230a58a1d
2개의 변경된 파일41개의 추가작업 그리고 0개의 파일을 삭제
  1. 40 0
      cmd/anubis/main.go
  2. 1 0
      docs/docs/CHANGELOG.md

+ 40 - 0
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)
+	})
+}

+ 1 - 0
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