|
@@ -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)
|
|
|
+ })
|
|
|
+}
|