From 9ee4db4da5bcee4a18dcc855e2f415b8659852b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Bariteau?= Date: Fri, 11 Sep 2026 15:55:49 -0400 Subject: [PATCH 01/18] split out the executor running the script into a new binary By splitting the executor out of the main server binary. It's possible to apply better permissions on it. It also fixes the os.Chdir() issue with the Lua executor that could allow 2 different scripts to write at the same place. By default the worker doesn't a PATH variable set. This is were the -wenv switch comes in as it allows to write a file containing all the environment variables the worker should have. - Binary created under cmd/worker - Reworked NixOS module to compensate - Add integration tests using runNixosTest - Fix missing folders not being created by the NixOS module - The module doesn't set -etcdurl and -nats if not needed - flake: Package set is now created by a function so it will be equal accross the different architectures. --- .gitignore | 1 + cmd/server/http.go | 2 +- cmd/server/http_scripts.go | 8 +- cmd/server/main.go | 88 +++++--------- cmd/server/messages.go | 6 +- cmd/server/reply.go | 10 +- cmd/worker/main.go | 220 ++++++++++++++++++++++++++++++++++ examples/worker_playload.json | 1 + executor/executor.go | 7 +- executor/worker.go | 97 +++++++++++++++ flake.lock | 6 +- flake.nix | 101 ++++++---------- justfile | 10 +- nix/modules/default.nix | 35 ++++-- nix/pkgs/server.nix | 19 --- nix/pkgs/worker.nix | 40 +++++++ nix/tests/default.nix | 9 ++ nix/tests/etcd.nix | 48 ++++++++ nix/tests/lua-file.nix | 54 +++++++++ nix/tests/minimal.nix | 39 ++++++ nix/tests/path.lua | 12 ++ store/store.go | 4 +- 22 files changed, 641 insertions(+), 176 deletions(-) create mode 100644 cmd/worker/main.go create mode 100644 examples/worker_playload.json create mode 100644 executor/worker.go create mode 100644 nix/pkgs/worker.nix create mode 100644 nix/tests/default.nix create mode 100644 nix/tests/etcd.nix create mode 100644 nix/tests/lua-file.nix create mode 100644 nix/tests/minimal.nix create mode 100644 nix/tests/path.lua diff --git a/.gitignore b/.gitignore index e2b34e2..567f919 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,4 @@ go.work.sum result *.wasm /all_plugins +/worker diff --git a/cmd/server/http.go b/cmd/server/http.go index f5ba7d1..37059df 100644 --- a/cmd/server/http.go +++ b/cmd/server/http.go @@ -173,7 +173,7 @@ func (fh *functionHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { natsSpan.SetStatus(codes.Ok, "") natsSpan.End() - rep := new(Reply) + rep := new(executor.Reply) err = json.Unmarshal(response.Data, rep) if err != nil { span.RecordError(err) diff --git a/cmd/server/http_scripts.go b/cmd/server/http_scripts.go index d517307..6724885 100644 --- a/cmd/server/http_scripts.go +++ b/cmd/server/http_scripts.go @@ -9,6 +9,8 @@ import ( "github.com/gorilla/mux" "github.com/nats-io/nats.go" + + "github.com/numkem/msgscript/executor" ) func (fh *functionHandler) ListScripts(w http.ResponseWriter, r *http.Request) { @@ -22,7 +24,7 @@ func (fh *functionHandler) ListScripts(w http.ResponseWriter, r *http.Request) { return } - rep := &Reply{} + rep := &executor.Reply{} err = json.Unmarshal(response.Data, rep) if err != nil { returnError(w, err) @@ -56,7 +58,7 @@ func (fh *functionHandler) ListNamesForScript(w http.ResponseWriter, r *http.Req return } - rep := &Reply{} + rep := &executor.Reply{} err = json.Unmarshal(response.Data, rep) if err != nil { returnError(w, err) @@ -103,7 +105,7 @@ func (fh *functionHandler) InfoForNamedScript(w http.ResponseWriter, r *http.Req return } - rep := &Reply{} + rep := &executor.Reply{} err = json.Unmarshal(response.Data, rep) if err != nil { returnError(w, err) diff --git a/cmd/server/main.go b/cmd/server/main.go index 50006eb..8204111 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -8,7 +8,6 @@ import ( "os" "os/signal" "strings" - "sync" "syscall" "time" @@ -25,12 +24,11 @@ import ( "github.com/numkem/msgscript" "github.com/numkem/msgscript/executor" msgplugin "github.com/numkem/msgscript/plugins" - "github.com/numkem/msgscript/script" msgstore "github.com/numkem/msgscript/store" ) var version = "dev" -var mainTracer = otel.Tracer("msgscript.main") +var mainTracer = otel.Tracer("msgscript") func main() { // Parse command-line flags @@ -39,9 +37,11 @@ func main() { natsURL := flag.String("natsurl", "", "URL of NATS server") logLevel := flag.String("log", "info", "Logging level (debug, info, warn, error)") httpPort := flag.Int("port", DEFAULT_HTTP_PORT, "HTTP port to bind to") - pluginDir := flag.String("plugin", "", "Plugin directory") + luaPluginDir := flag.String("plugin", "", "Plugin directory") libraryDir := flag.String("library", "", "Library directory") scriptDir := flag.String("script", ".", "Script directory") + workerExecutablePath := flag.String("wexec", "./worker", "Path to the worker executoable") + workerEnvironmentPath := flag.String("wenv", "", "Path to a file containing environment variables for the worker") flag.Parse() notifyContext, stop := signal.NotifyContext(context.Background(), syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) @@ -58,6 +58,8 @@ func main() { log.SetLevel(log.DebugLevel) } + log.Infof("using worker at %s", *workerExecutablePath) + if os.Getenv("TELEMETRY_TRACES") != "" { log.WithField("kind", "traces").Info("Starting telemetry") @@ -116,8 +118,8 @@ func main() { // Initialize ScriptExecutor var plugins []msgplugin.PreloadFunc - if *pluginDir != "" { - plugins, err = msgplugin.ReadPluginDir(*pluginDir) + if *luaPluginDir != "" { + plugins, err = msgplugin.ReadPluginDir(*luaPluginDir) if err != nil { log.Fatalf("failed to read plugins: %v", err) } @@ -220,61 +222,33 @@ func main() { span.SetAttributes(attribute.String("reply.mode", "sync")) } - cctx, getScriptsSpan := mainTracer.Start(ctx, "nats.handle_message.get_scripts", trace.WithAttributes( - attribute.String("script.Name", m.Subject), - attribute.String("script.URL", m.URL), - )) - - scripts, err := scriptStore.GetScripts(cctx, m.Subject) + wctx, spawnWorkerSpan := mainTracer.Start(ctx, "nats.handle_message.run_scripts") + + msgRep, err := executor.SpawnWorker(wctx, *workerExecutablePath, *workerEnvironmentPath, executor.WorkerInput{ + NatsURL: *natsURL, + ScriptStore: &executor.WorkerInputScriptStore{ + BackendName: *backendName, + EtcdURL: *etcdURL, + ScriptDirectory: *scriptDir, + LibraryDirectory: *libraryDir, + }, + LuaExecutor: &executor.WorkerInputLuaExecutor{ + PluginDir: *luaPluginDir, + }, + Message: m, + }) if err != nil { - log.WithError(err).WithField("subject", m.Subject).Error("failed to get scripts for subject") - span.RecordError(err) - span.SetStatus(codes.Error, "Failed to get scripts") - - replyWithError(nc, fmt.Errorf("failed to get scripts for subject: %v", err), msg.Reply) + spawnWorkerSpan.RecordError(err) + spawnWorkerSpan.SetStatus(codes.Error, "failed") + spawnWorkerSpan.End() + log.WithError(err).Error("worker caught error") return } - getScriptsSpan.SetStatus(codes.Ok, fmt.Sprintf("found %d scripts", len(scripts))) - getScriptsSpan.End() - - _, executeScriptsSpan := mainTracer.Start(ctx, "nats.handle_message.run_scripts") - defer executeScriptsSpan.End() - - var wg sync.WaitGroup - allResults := make(chan *executor.ScriptResult, len(scripts)) - for _, scr := range scripts { - wg.Add(1) - - go func(ctx context.Context, msg *executor.Message, script *script.Script) { - defer wg.Done() - - // Pass the context with trace info to the executor - exec, err := executor.ExecutorByName(scr.Executor, executors) - if err != nil { - executeScriptsSpan.RecordError(err) - executeScriptsSpan.SetStatus(codes.Error, "Failed to get executor") - log.WithError(err).Error("failed to get executor for script") - - allResults <- &executor.ScriptResult{Error: fmt.Sprintf("failed to get executor for script: %v", err)} - return - } - - allResults <- exec.HandleMessage(ctx, m, scr) - }(ctx, m, scr) - } - wg.Wait() - close(allResults) + spawnWorkerSpan.SetStatus(codes.Ok, "worker spawned") + spawnWorkerSpan.End() - _, parseReplySpan := mainTracer.Start(ctx, "nats.handle_message.parse_replies") - msgRep := new(Reply) - for res := range allResults { - if res.IsHTML { - msgRep.HTML = true - } - - msgRep.Results = append(msgRep.Results, res) - } + _, parseReplySpan := mainTracer.Start(ctx, "nats.handle_message.parse_scripts_results") parseReplySpan.SetAttributes(attribute.Int("responses", len(msgRep.Results))) parseReplySpan.SetStatus(codes.Ok, "responses parsed") parseReplySpan.End() @@ -289,7 +263,7 @@ func main() { return } - log.WithField("subject", msg.Subject).Debugf("finished running %d scripts", len(scripts)) + log.WithField("subject", msg.Subject).Debugf("finished running %d scripts", len(msgRep.Results)) span.SetStatus(codes.Ok, "Message handled") }) if err != nil { diff --git a/cmd/server/messages.go b/cmd/server/messages.go index fb7c52a..272a193 100644 --- a/cmd/server/messages.go +++ b/cmd/server/messages.go @@ -32,7 +32,7 @@ func replyWithSubjectList(ctx context.Context, nc *nats.Conn, scriptStore store. return } - replyMessage(nc, &executor.Message{}, replySubject, &Reply{ + replyMessage(nc, &executor.Message{}, replySubject, &executor.Reply{ Results: []*executor.ScriptResult{ { Code: http.StatusOK, @@ -70,7 +70,7 @@ func replyWithNamesForSubject(ctx context.Context, nc *nats.Conn, scriptStore st return } - replyMessage(nc, &executor.Message{}, replySubject, &Reply{ + replyMessage(nc, &executor.Message{}, replySubject, &executor.Reply{ Results: []*executor.ScriptResult{ { Code: http.StatusOK, @@ -110,7 +110,7 @@ func replyWithNamedScriptInfo(ctx context.Context, nc *nats.Conn, scriptStore st script.Executor = executor.EXECUTOR_LUA_NAME } - replyMessage(nc, &executor.Message{}, replySubject, &Reply{ + replyMessage(nc, &executor.Message{}, replySubject, &executor.Reply{ Results: []*executor.ScriptResult{ { Code: http.StatusOK, diff --git a/cmd/server/reply.go b/cmd/server/reply.go index d649498..8a76530 100644 --- a/cmd/server/reply.go +++ b/cmd/server/reply.go @@ -10,13 +10,7 @@ import ( "github.com/numkem/msgscript/executor" ) -type Reply struct { - Results []*executor.ScriptResult `json:"script_result"` - HTML bool `json:"is_html"` - Error string `json:"error,omitempty"` -} - -func replyMessage(nc *nats.Conn, msg *executor.Message, replySubject string, rep *Reply) error { +func replyMessage(nc *nats.Conn, msg *executor.Message, replySubject string, rep *executor.Reply) error { fields := log.Fields{ "Subject": msg.Subject, "URL": msg.URL, @@ -46,7 +40,7 @@ func replyMessage(nc *nats.Conn, msg *executor.Message, replySubject string, rep } func replyWithError(nc *nats.Conn, resErr error, replySubject string) { - payload, err := json.Marshal(&Reply{Error: resErr.Error()}) + payload, err := json.Marshal(&executor.Reply{Error: resErr.Error()}) if err != nil { log.Errorf("failed to serialize script reply to JSON: %v", err) } diff --git a/cmd/worker/main.go b/cmd/worker/main.go new file mode 100644 index 0000000..8eb10ba --- /dev/null +++ b/cmd/worker/main.go @@ -0,0 +1,220 @@ +package main + +import ( + "context" + "encoding/json" + "flag" + "fmt" + "os" + "os/signal" + "sync" + "syscall" + + "github.com/nats-io/nats.go" + log "github.com/sirupsen/logrus" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/trace" + + "github.com/numkem/msgscript/executor" + "github.com/numkem/msgscript/script" + "github.com/numkem/msgscript/store" + "github.com/numkem/msgscript/plugins" +) + +var mainTracer = otel.Tracer("msgscript.worker.main") + +func main() { + debug := flag.Bool("v", false, "Enable debug logging") + flag.Parse() + + if *debug || os.Getenv("DEBUG") != "" { + log.SetLevel(log.DebugLevel) + } + + notifyContext, stop := signal.NotifyContext(context.Background(), syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) + defer stop() + + // Start a span for the worker itself + ctx, span := mainTracer.Start(notifyContext, "worker", + trace.WithSpanKind(trace.SpanKindServer), + ) + defer span.End() + + input, err := parseInput(ctx) + if err != nil { + span.SetStatus(codes.Error, err.Error()) + replyWithError(fmt.Errorf("failed to parse input: %v", err)) + os.Exit(1) + } + + // Init ScriptStore + scriptStore, err := store.StoreByName(input.ScriptStore.BackendName, input.ScriptStore.EtcdURL, input.ScriptStore.ScriptDirectory, input.ScriptStore.LibraryDirectory) + if err != nil { + replyWithError(fmt.Errorf("failed to initialize script store: %v", err)) + os.Exit(10) + } + + _, natsConnectSpan := mainTracer.Start(ctx, "worker.nats_connect", trace.WithAttributes( + attribute.String("nats.URL", input.NatsURL), + )) + + // Connect to NATS + nc, err := nats.Connect(input.NatsURL) + if err != nil { + replyWithError(fmt.Errorf("Failed to connect to NATS: %v", err), natsConnectSpan) + os.Exit(20) + } + defer nc.Close() + + natsConnectSpan.SetStatus(codes.Ok, "connected to NATS") + natsConnectSpan.End() + + _, luaPluginLoadSpan := mainTracer.Start(ctx, "worker.load_lua_plugins") + + // Init executors + luaPlugins, err := plugins.ReadPluginDir(input.LuaExecutor.PluginDir) + if err != nil { + replyWithError(fmt.Errorf("failed to read lua plugin directory %s: %v", input.LuaExecutor.PluginDir, err), luaPluginLoadSpan) + os.Exit(30) + } + + luaPluginLoadSpan.SetStatus(codes.Ok, "plugins loaded") + luaPluginLoadSpan.End() + + executors := executor.StartAllExecutors(ctx, scriptStore, luaPlugins, nc) + + cctx, getScriptsSpan := mainTracer.Start(ctx, "worker.get_scripts", trace.WithAttributes( + attribute.String("script.Name", input.Message.Subject), + attribute.String("script.URL", input.Message.URL), + )) + + scripts, err := scriptStore.GetScripts(cctx, input.Message.Subject) + if err != nil { + replyWithError(fmt.Errorf("failed to get scripts for subject %s: %v", input.Message.Subject, err)) + os.Exit(355) + } + + getScriptsSpan.SetStatus(codes.Ok, fmt.Sprintf("found %d scripts", len(scripts))) + getScriptsSpan.End() + + ectx, executeScriptsSpan := mainTracer.Start(ctx, "worker.run_scripts") + + var wg sync.WaitGroup + allResults := make(chan *executor.ScriptResult, len(scripts)) + for name, scr := range scripts { + wg.Add(1) + + go func(ctx context.Context, msg *executor.Message, script *script.Script) { + defer wg.Done() + + _, sspan := mainTracer.Start(ectx, fmt.Sprintf("worker.run_script.%s", name), trace.WithAttributes( + attribute.String("Name", scr.Name), + attribute.String("Subject", scr.Subject), + attribute.Bool("isHTML", scr.HTML), + attribute.Int("Nb libraries", len(scr.LibKeys)), + )) + defer sspan.End() + + if err != nil { + sspan.RecordError(err) + sspan.SetStatus(codes.Error, "Failed to get executor") + log.WithError(err).Error("failed to get executor for script") + + allResults <- &executor.ScriptResult{Error: fmt.Sprintf("failed to get executor for script: %v", err)} + return + } + + // Executor field is optional but it defaults to Lua + if scr.Executor == "" { + scr.Executor = executor.EXECUTOR_LUA_NAME + } + + exec, ok := executors[scr.Executor] + if !ok { + allResults <- &executor.ScriptResult{ + Error: fmt.Sprintf("executor named %s doesn't exists", scr.Executor), + } + return + } + res := exec.HandleMessage(ctx, input.Message, scr) + if log.GetLevel() == log.DebugLevel { + log.Errorf("script: %+v", res) + } + + sspan.SetStatus(codes.Ok, "script executed") + + allResults <- res + }(ctx, input.Message, scr) + } + wg.Wait() + + close(allResults) + + executeScriptsSpan.SetStatus(codes.Ok, "script executed") + executeScriptsSpan.SetAttributes(attribute.Int("Nb script executed", len(allResults))) + executeScriptsSpan.End() + + _, parseReplySpan := mainTracer.Start(ctx, "worker.parse_replies") + msgRep := new(executor.Reply) + for res := range allResults { + if res.IsHTML { + msgRep.HTML = true + } + + msgRep.Results = append(msgRep.Results, res) + } + parseReplySpan.SetAttributes(attribute.Int("responses", len(msgRep.Results))) + parseReplySpan.SetStatus(codes.Ok, "responses parsed") + parseReplySpan.End() + + // Write to stderr since stdout is dedicated to be read + if log.GetLevel() == log.DebugLevel { + log.Errorf("WorkerOutput: %+v", msgRep) + } + + // Processsing done, write the Reply to stdout + err = json.NewEncoder(os.Stdout).Encode(&executor.WorkerOutput{ + Reply: msgRep, + }) + if err != nil { + replyWithError(err) + } + + span.SetStatus(codes.Ok, "Worker is done") +} + +func parseInput(ctx context.Context) (*executor.WorkerInput, error) { + _, inputParseSpan := mainTracer.Start(ctx, "worker.parse_input") + defer inputParseSpan.End() + + // Read input data from stdin + input := &executor.WorkerInput{} + + err := json.NewDecoder(os.Stdin).Decode(input) + if err != nil { + inputParseSpan.SetStatus(codes.Error, err.Error()) + return nil, fmt.Errorf("failed to parse input from stdin: %v", err) + } + + inputParseSpan.SetStatus(codes.Ok, "input parsed") + return input, nil +} + +func replyWithError(err error, spans ...trace.Span) { + log.Error(err) + + for _, span := range spans { + span.RecordError(err) + span.SetStatus(codes.Error, "failed") + span.End() + } + + e := json.NewEncoder(os.Stdout).Encode(&executor.WorkerOutput{ + Error: err, + }) + if e != nil { + log.WithError(e).Error("failed write error reply") + } +} diff --git a/examples/worker_playload.json b/examples/worker_playload.json new file mode 100644 index 0000000..61bc6e8 --- /dev/null +++ b/examples/worker_playload.json @@ -0,0 +1 @@ +{"nats_url":"localhost:4222","script_store":{"backend_name":"file","etcd_url":"localhost:2379","script_directory":"./examples/","library_directory":"./examples/libs"},"lua_executor":{"plugin_dir":""},"messsage":{"async":false,"method":"GET","payload":"","raw":false,"subject":"funcs.hello","url":""}} diff --git a/executor/executor.go b/executor/executor.go index e967c61..986c8d0 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -22,7 +22,6 @@ const ( type Message struct { Async bool `json:"async"` - Executor string `json:"executor"` Method string `json:"method"` Payload []byte `json:"payload"` Raw bool `json:"raw"` @@ -30,6 +29,12 @@ type Message struct { URL string `json:"url"` } +type Reply struct { + Results []*ScriptResult `json:"script_result"` + HTML bool `json:"is_html"` + Error string `json:"error,omitempty"` +} + type ScriptResult struct { Code int `json:"http_code"` Error string `json:"error"` diff --git a/executor/worker.go b/executor/worker.go new file mode 100644 index 0000000..98a7bdc --- /dev/null +++ b/executor/worker.go @@ -0,0 +1,97 @@ +package executor + +import ( + "bufio" + "context" + "encoding/json" + "fmt" + "os" + "os/exec" +) + +type WorkerInput struct { + NatsURL string `json:"nats_url"` + ScriptStore *WorkerInputScriptStore `json:"script_store"` + LuaExecutor *WorkerInputLuaExecutor `json:"lua_executor"` + Message *Message `json:"messsage"` +} + +type WorkerInputScriptStore struct { + BackendName string `json:"backend_name"` + EtcdURL string `json:"etcd_url"` + ScriptDirectory string `json:"script_directory"` + LibraryDirectory string `json:"library_directory"` +} + +type WorkerInputLuaExecutor struct { + PluginDir string `json:"plugin_dir"` +} + +type WorkerOutput struct { + Error error `json:"error"` + Reply *Reply `json:"reply"` +} + +func SpawnWorker(ctx context.Context, workerPath string, envPath string, input WorkerInput) (*Reply, error) { + w := exec.CommandContext(ctx, workerPath) + + if envPath != "" { + f, err := os.Open(envPath) + if err != nil { + return nil, fmt.Errorf("failed to read worker environment file %s: %v", envPath, err) + } + + scanner := bufio.NewScanner(f) + for scanner.Scan() { + w.Env = append(w.Env, scanner.Text()) + } + if err := scanner.Err(); err != nil { + return nil, fmt.Errorf("failed to scan environment file %s: %v", envPath, err) + } + } + + w.Env = append(w.Env, fmt.Sprintf("DEBUG=%s", os.Getenv("DEBUG"))) // Propagate the DEBUG flag + w.Stderr = os.Stderr + + // Open a pipe to the process' STDIN and STDOUT + stdin, err := w.StdinPipe() + if err != nil { + return nil, fmt.Errorf("failed to open stdin for the process") + } + + stdout, err := w.StdoutPipe() + if err != nil { + return nil, fmt.Errorf("failed to open stdout for the process") + } + defer stdout.Close() + + err = w.Start() + if err != nil { + return nil, fmt.Errorf("failed to start worker: %v", err) + } + + // Read the output of the process + err = json.NewEncoder(stdin).Encode(input) + if err != nil { + return nil, fmt.Errorf("failed to write worker input to buffer: %v", err) + } + stdin.Close() // Close it so the worker knows it's got everything + + output := new(WorkerOutput) + err = json.NewDecoder(stdout).Decode(output) + if err != nil { + err = fmt.Errorf("failed to read output from worker: %v", err) + } + + // Check the worker itself didn't run into error. This doesn't check of errors from the script executed + if output.Error != nil { + err = fmt.Errorf("worker ran into error: %v", err) + } + + err = w.Wait() + if err != nil { + return nil, fmt.Errorf("failed to wait for process: %v", err) + } + + return output.Reply, err +} diff --git a/flake.lock b/flake.lock index 6367799..80b4e53 100644 --- a/flake.lock +++ b/flake.lock @@ -2,11 +2,11 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 1782467914, - "narHash": "sha256-pGvFkM8N0xEkIIXDe5YYfbEAvHrk4IxBrjB/x8OomhE=", + "lastModified": 1788881743, + "narHash": "sha256-2V9GZGvPfrNzxFozhI9dcqV+c3QdA8YZrvAAzqEB+dI=", "owner": "nixos", "repo": "nixpkgs", - "rev": "e73de5be04e0eff4190a1432b946d469c794e7b4", + "rev": "d6524aaca2ff07876657ae2b323f24be4874944b", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 3ebb075..4ced8dc 100644 --- a/flake.nix +++ b/flake.nix @@ -8,7 +8,7 @@ outputs = { self, nixpkgs }: let - version = "0.9.0"; + version = "1.0.0"; vendorHash = "sha256-Jer/ADurA+BwvAuuTjEycJNExBnobEs72ccQMmOqV1k="; mkPlugin = @@ -34,13 +34,20 @@ cp ${name}.so $out/ ''; }; - in - { - packages.x86_64-linux = + + mkPackages = + system: let - pkgs = import nixpkgs { system = "x86_64-linux"; }; + pkgs = import nixpkgs { inherit system; }; lib = pkgs.lib; - system = "x86_64-linux"; + + mkTest = + testFile: + import testFile { + inherit pkgs; + modules = self.nixosModules.default; + overlays = [ self.overlays.default ]; + }; in rec { default = server; @@ -53,14 +60,20 @@ inherit version vendorHash; }; + worker = pkgs.callPackage ./nix/pkgs/worker.nix { + inherit version vendorHash; + }; + runServer = pkgs.writeScript "msgscript" '' #!/usr/bin/env bash - ${self.packages.${system}.server}/bin/msgscript -plugin ${allPlugins}/ $@ + ${self.packages.${system}.server}/bin/msgscript -plugin ${allPlugins}/ -wexec ${self.packages.${system}.worker}/bin/worker $@ ''; runCli = pkgs.writeScript "msgscriptcli" '' #!/usr/bin/env bash - ${self.packages.${system}.cli}/bin/msgscriptcli -plugin ${allPlugins}/ $@ + ${self.packages.${system}.cli}/bin/msgscriptcli -plugin ${allPlugins}/ -wexec ${ + system.packages.${system}.worker + }/bin/worker $@ ''; allPlugins = pkgs.symlinkJoin { @@ -78,65 +91,17 @@ in lib.genAttrs pluginDirs (name: mkPlugin pkgs name "${self}/plugins/${name}"); - test = pkgs.testers.runNixOSTest { - inherit system; - name = "msgscript"; - nodes.machine = {...}: { - imports = [ - self.modules.default - ]; - - nixpks.overlays = [ self.overlays.default ]; - - services = { - etcd.enable = true; - - msgscrit.enable = true; - }; - }; - - skipLint = true; - - testScript = '' -import json -import sys - -start_all() - -server.wait_for_open_port(2379) - ''; - }; + # Tests + test-minimal = mkTest ./nix/tests/minimal.nix; + test-etcd = mkTest ./nix/tests/etcd.nix; + test-lua-file = mkTest ./nix/tests/lua-file.nix; }; - packages.aarch64-linux = - let - pkgs = import nixpkgs { system = "aarch64-linux"; }; - lib = pkgs.lib; - in - rec { - cli = pkgs.callPackage ./nix/pkgs/cli.nix { - inherit version vendorHash; - }; - server = pkgs.callPackage ./nix/pkgs/server.nix { - inherit version vendorHash; - }; - default = server; - - allPlugins = pkgs.symlinkJoin { - name = "msgscript-all-plugins"; - paths = lib.attrValues plugins; - }; - - plugins = - let - pluginDirs = lib.remove "" ( - lib.mapAttrsToList (name: kind: if kind == "directory" then name else "") ( - builtins.readDir "${self}/plugins/" - ) - ); - in - lib.genAttrs pluginDirs (name: mkPlugin pkgs name "${self}/plugins/${name}"); - }; - + in + { + packages = { + "x86_64-linux" = mkPackages "x86_64-linux"; + "aarch64-linux" = mkPackages "aarch64-linux"; + }; apps = let mkApps = system: { @@ -153,7 +118,7 @@ server.wait_for_open_port(2379) in { "x86_64-linux" = mkApps "x86_64-linux"; - "aarch64-linux" = mkApps "aarch64-linux"; + "aarch64-linux" = mkApps "aarch64-linux"; }; devShells.x86_64-linux.default = @@ -196,6 +161,8 @@ server.wait_for_open_port(2379) overlays.default = final: prev: { msgscript-cli = self.packages.${final.system}.cli; msgscript-server = self.packages.${final.system}.server; + msgscript-worker = self.packages.${final.system}.worker; + msgscript-plugins = self.packages.${final.system}.plugins; }; nixosModules.default = import ./nix/modules/default.nix; diff --git a/justfile b/justfile index 5360750..51f03b7 100644 --- a/justfile +++ b/justfile @@ -1,5 +1,11 @@ -test-etcd: - DEBUG=1 go run ./cmd/server/ -library ../msgscript-scripts/libs -script ../msgscript-scripts/ -backend etcd -etcdurl localhost:2379 -natsurl localhost:4222 +run-etcd: worker + DEBUG=1 go run ./cmd/server/ -library ./examples/libs -script ./examples/ -backend etcd -etcdurl localhost:2379 -natsurl localhost:4222 + +run: worker + DEBUG=1 go run ./cmd/server/ -library ./examples/libs -script ./examples/ all-plugins: nix build .#allPlugins -o all_plugins + +worker: + go build ./cmd/worker diff --git a/nix/modules/default.nix b/nix/modules/default.nix index 80098b9..59d425c 100644 --- a/nix/modules/default.nix +++ b/nix/modules/default.nix @@ -13,6 +13,10 @@ let name = "msgscript-server-plugins"; paths = cfg.plugins; }; + + workerEnvFile = pkgs.writeText "msgscript-worker.env" ( + lib.strings.join "\n" (lib.mapAttrsToList (k: v: "${k}=${toString v}") cfg.workerEnvironment) + ); in { options.services.msgscript = { @@ -20,7 +24,7 @@ in etcdEndpoints = mkOption { type = types.listOf types.str; - default = [ "http://127.0.0.1:2379" ]; + default = [ ]; description = mdDoc "Etcd endpoints to connect to"; }; @@ -61,12 +65,6 @@ in default = "${cfg.dataDir}/libs"; }; - extraPathPackages = mkOption { - type = types.listOf types.package; - description = "List of extra packages to add to the PATH of the service. Useful when using cmd.exec() in lua"; - default = [ ]; - }; - user = mkOption { type = types.str; default = "msgscript"; @@ -90,6 +88,14 @@ in default = "localhost:4317"; description = "OpenTelemetry collector endpoint URL."; }; + + workerEnvironment = mkOption { + type = types.attrsOf types.str; + default = { + PATH = lib.makeBinPath [ pkgs.coreutils ]; + }; + description = "Environment variables passed to the worker"; + }; }; config = mkIf cfg.enable { @@ -104,10 +110,13 @@ in OTEL_ENDPOINT = cfg.otelEndpoint; }); - path = cfg.extraPathPackages; - serviceConfig = { - ExecStart = "${pkgs.msgscript-server}/bin/msgscript -backend ${cfg.backend} -etcdurl ${lib.concatStringsSep "," cfg.etcdEndpoints} -natsurl ${cfg.natsUrl} -plugin ${pluginDir} -script ${cfg.scriptDir} -library ${cfg.libraryDir}"; + ExecStart = + "${pkgs.msgscript-server}/bin/msgscript -backend ${cfg.backend} -plugin ${pluginDir} -script ${cfg.scriptDir} -library ${cfg.libraryDir} -wexec ${pkgs.msgscript-worker}/bin/worker -wenv ${workerEnvFile}" + + lib.optionalString ( + (lib.length cfg.etcdEndpoints) > 0 + ) " -etcdurl ${lib.concatStringsSep "," cfg.etcdEndpoints}" + + lib.optionalString (cfg.natsUrl != "") " -natsurl ${cfg.natsUrl}"; User = cfg.user; Group = cfg.group; @@ -172,5 +181,11 @@ in users.groups = mkIf (cfg.group == "msgscript") { msgscript = { }; }; + + systemd.tmpfiles.rules = [ + "d ${cfg.dataDir} 0775 ${cfg.user} ${cfg.group} -" + "d ${cfg.dataDir}/libs 0775 ${cfg.user} ${cfg.group} -" + "d ${cfg.dataDir}/scripts 0775 ${cfg.user} ${cfg.group} -" + ]; }; } diff --git a/nix/pkgs/server.nix b/nix/pkgs/server.nix index 725ed28..6b406de 100644 --- a/nix/pkgs/server.nix +++ b/nix/pkgs/server.nix @@ -1,14 +1,7 @@ { - lib, buildGoModule, - btrfs-progs, - gpgme, - pkg-config, - wasmtime, vendorHash, version, - withPodman ? false, - withWasm ? false, }: buildGoModule { @@ -19,23 +12,11 @@ buildGoModule { subPackages = [ "cmd/server" ]; - nativeBuildInputs = [ ] ++ (lib.optionals withPodman [ pkg-config ]); - - buildInputs = - [ ] - ++ (lib.optionals withWasm [ wasmtime.dev ]) - ++ (lib.optionals withPodman [ - btrfs-progs - gpgme - ]); - ldflags = [ "-X" "main.version=${version}" ]; - tags = [ ] ++ (lib.optionals withWasm [ "wasmtime" ]) ++ (lib.optionals withPodman [ "podman" ]); - doCheck = false; # Requires networking, will just timeout postInstall = '' diff --git a/nix/pkgs/worker.nix b/nix/pkgs/worker.nix new file mode 100644 index 0000000..b7abdac --- /dev/null +++ b/nix/pkgs/worker.nix @@ -0,0 +1,40 @@ +{ + lib, + buildGoModule, + btrfs-progs, + gpgme, + pkg-config, + wasmtime, + vendorHash, + version, + withPodman ? false, + withWasm ? false, +}: + +buildGoModule { + pname = "msgscript-worker"; + inherit version vendorHash; + + src = ../..; + + subPackages = [ "cmd/worker" ]; + + nativeBuildInputs = [ ] ++ (lib.optionals withPodman [ pkg-config ]); + + buildInputs = + [ ] + ++ (lib.optionals withWasm [ wasmtime.dev ]) + ++ (lib.optionals withPodman [ + btrfs-progs + gpgme + ]); + + ldflags = [ + "-X" + "main.version=${version}" + ]; + + tags = [ ] ++ (lib.optionals withWasm [ "wasmtime" ]) ++ (lib.optionals withPodman [ "podman" ]); + + doCheck = false; # Requires networking, will just timeout +} diff --git a/nix/tests/default.nix b/nix/tests/default.nix new file mode 100644 index 0000000..d919bb1 --- /dev/null +++ b/nix/tests/default.nix @@ -0,0 +1,9 @@ +{ + pkgs, + modules, + overlays, +}: + +{ + minimal-test = import ./minimal.nix { inherit pkgs modules overlays; }; +} diff --git a/nix/tests/etcd.nix b/nix/tests/etcd.nix new file mode 100644 index 0000000..d709a67 --- /dev/null +++ b/nix/tests/etcd.nix @@ -0,0 +1,48 @@ +{ + pkgs, + modules, + overlays, +}: + +pkgs.testers.runNixOSTest { + name = "minimal-test"; + + node.pkgsReadOnly = false; + nodes.server = { ... }: { + imports = [ + modules + ]; + + nixpkgs.overlays = overlays; + + services = { + etcd.enable = true; + nats.enable = true; + + msgscript = { + enable = true; + etcdEndpoints = [ "http://127.0.0.1:2379" ]; + natsUrl = "localhost:4222"; + }; + }; + }; + + skipLint = true; + + testScript = '' + start_all() + + server.wait_for_unit("default.target") + + def print_command(cmd): + output = server.succeed(cmd) + print(output) + + print_command("journalctl -u msgscript") + print_command("systemctl status msgscript") + + server.wait_for_open_port(2379) + server.wait_for_open_port(4222) + server.wait_for_open_port(7643) + ''; +} diff --git a/nix/tests/lua-file.nix b/nix/tests/lua-file.nix new file mode 100644 index 0000000..460eef5 --- /dev/null +++ b/nix/tests/lua-file.nix @@ -0,0 +1,54 @@ +{ + pkgs, + modules, + overlays, +}: + +let + helloLua = pkgs.writeText "hello.lua" (builtins.readFile ./../../examples/hello.lua); + pathLua = pkgs.writeText "path.lua" (builtins.readFile ./path.lua); +in +pkgs.testers.runNixOSTest { + name = "minimal-test"; + + node.pkgsReadOnly = false; + nodes.server = { pkgs, lib, ... }: { + imports = [ + modules + ]; + + nixpkgs.overlays = overlays; + + services.msgscript = { + enable = true; + plugins = with pkgs.msgscript-plugins; [ gopher-lua-libs ]; + workerEnvironment = { + PATH = lib.makeBinPath [ + pkgs.busybox # For sh + pkgs.hello + ]; + }; + }; + + environment.systemPackages = with pkgs; [ jq gnugrep coreutils ]; + }; + + skipLint = true; + + testScript = '' + start_all() + + # Setup script files + server.copy_from_host("${helloLua}", "/var/lib/msgscript/scripts/hello.lua") + server.copy_from_host("${pathLua}", "/var/lib/msgscript/scripts/path.lua") + + server.wait_for_unit("msgscript.service") + server.wait_for_open_port(7643) + + with subtest("simple lua script"): + server.succeed("curl -s http://127.0.0.1:7643/funcs.hello | jq -r '.[0].payload' | base64 -d | grep funcs.hello") + + with subtest("lua script with PATH change"): + server.succeed("curl -s http://127.0.0.1:7643/funcs.path | jq -r '.[0].payload' | base64 -d | grep 'Hello'") + ''; +} diff --git a/nix/tests/minimal.nix b/nix/tests/minimal.nix new file mode 100644 index 0000000..5b2a625 --- /dev/null +++ b/nix/tests/minimal.nix @@ -0,0 +1,39 @@ +{ + pkgs, + modules, + overlays, +}: + +pkgs.testers.runNixOSTest { + name = "minimal-test"; + + node.pkgsReadOnly = false; + nodes.server = { ... }: { + imports = [ + modules + ]; + + nixpkgs.overlays = overlays; + + services = { + msgscript.enable = true; + }; + }; + + skipLint = true; + + testScript = '' + start_all() + + server.wait_for_unit("default.target") + + def print_command(cmd): + output = server.succeed(cmd) + print(output) + + print_command("journalctl -u msgscript") + print_command("systemctl status msgscript") + + server.wait_for_open_port(7643) + ''; +} diff --git a/nix/tests/path.lua b/nix/tests/path.lua new file mode 100644 index 0000000..eb766af --- /dev/null +++ b/nix/tests/path.lua @@ -0,0 +1,12 @@ +--* subject: funcs.path +--* name: path +local cmd = require("cmd") + +function OnMessage(_, _) + local result, err = cmd.exec("hello") + if err ~= nil then + return string.format("error: %s", err) + end + + return result.stdout +end diff --git a/store/store.go b/store/store.go index 7443d5a..15ba71f 100644 --- a/store/store.go +++ b/store/store.go @@ -71,7 +71,7 @@ func StoreByName(name, etcdEndpoints, scriptDir, libraryDir string) (ScriptStore nbScripts++ } } - log.Infof("loaded %d scripts from %s", nbScripts, scriptDir) + log.Debugf("loaded %d scripts from %s", nbScripts, scriptDir) if libraryDir != "" { // Read libraries from the library directory @@ -85,7 +85,7 @@ func StoreByName(name, etcdEndpoints, scriptDir, libraryDir string) (ScriptStore scriptStore.AddLibrary(context.Background(), library.Content, library.Name) nbLibraries++ } - log.Infof("loaded %d libraries from %s", nbLibraries, libraryDir) + log.Debugf("loaded %d libraries from %s", nbLibraries, libraryDir) } return scriptStore, nil From 2042e545e4032d30a39b864ff8c51f533e9e2e62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Bariteau?= Date: Tue, 13 Oct 2026 16:23:38 -0400 Subject: [PATCH 02/18] typo --- cmd/server/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/server/main.go b/cmd/server/main.go index 8204111..f374f9a 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -40,7 +40,7 @@ func main() { luaPluginDir := flag.String("plugin", "", "Plugin directory") libraryDir := flag.String("library", "", "Library directory") scriptDir := flag.String("script", ".", "Script directory") - workerExecutablePath := flag.String("wexec", "./worker", "Path to the worker executoable") + workerExecutablePath := flag.String("wexec", "./worker", "Path to the worker executable") workerEnvironmentPath := flag.String("wenv", "", "Path to a file containing environment variables for the worker") flag.Parse() From 5f2bc315759cc51e73c668779a07464af8b8b00a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Bariteau?= Date: Tue, 13 Oct 2026 16:23:46 -0400 Subject: [PATCH 03/18] fix executors so that stdin contains the payload --- executor/podman_executor.go | 9 +++------ executor/wasm_executor.go | 16 +++++++++++++++- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/executor/podman_executor.go b/executor/podman_executor.go index 3010d83..1b2964f 100644 --- a/executor/podman_executor.go +++ b/executor/podman_executor.go @@ -69,7 +69,6 @@ func (pe *PodmanExecutor) HandleMessage(ctx context.Context, msg *Message, scr * attribute.String("subject", msg.Subject), attribute.String("script.name", scr.Name), attribute.String("method", msg.Method), - attribute.Int("payload_size", len(msg.Payload)), ), ) defer span.End() @@ -162,7 +161,7 @@ func (pe *PodmanExecutor) executeInContainer(ctx context.Context, fields log.Fie spec := specgen.NewSpecGenerator(cfg.Image, false) spec.Command = cfg.Command spec.Name = containerName - spec.Env = map[string]string{"SUBJECT": msg.Subject, "URL": msg.URL, "PAYLOAD": string(msg.Payload), "METHOD": msg.Method} + spec.Env = map[string]string{"SUBJECT": msg.Subject, "URL": msg.URL, "METHOD": msg.Method} spec.Mounts = cfg.Mounts spec.User = cfg.User spec.Groups = cfg.Groups @@ -321,7 +320,7 @@ func (pe *PodmanExecutor) executeInContainer(ctx context.Context, fields log.Fie span.SetStatus(codes.Error, "Failed to read stdout") return nil, fmt.Errorf("failed to read stdout file %s: %w", stdout.Name(), err) } - readStdoutSpan.SetAttributes(attribute.Int("stdout_size", len(resStdout))) + readStdoutSpan.SetAttributes(attribute.Int("result.stdout.size", len(resStdout))) readStdoutSpan.SetStatus(codes.Ok, "") readStdoutSpan.End() @@ -337,7 +336,7 @@ func (pe *PodmanExecutor) executeInContainer(ctx context.Context, fields log.Fie return nil, fmt.Errorf("failed to read stderr file %s: %w", stderr.Name(), err) } readStderrSpan.SetAttributes( - attribute.Int("stderr_size", len(resStderr)), + attribute.Int("stderr.size", len(resStderr)), attribute.Bool("has_stderr", len(resStderr) > 0), ) readStderrSpan.SetStatus(codes.Ok, "") @@ -355,8 +354,6 @@ func (pe *PodmanExecutor) executeInContainer(ctx context.Context, fields log.Fie span.SetAttributes( attribute.Int("result.exit_code", int(exitCode)), - attribute.Int("result.stdout_size", len(resStdout)), - attribute.Int("result.stderr_size", len(resStderr)), ) if exitCode == 0 && len(resStderr) == 0 { diff --git a/executor/wasm_executor.go b/executor/wasm_executor.go index 5892bba..fb1ac9f 100644 --- a/executor/wasm_executor.go +++ b/executor/wasm_executor.go @@ -141,13 +141,27 @@ func (we *WasmExecutor) HandleMessage(ctx context.Context, msg *Message, scr *sc wasiConfig := wasmtime.NewWasiConfig() wasiConfig.SetStdoutFile(stdoutFile.Name()) wasiConfig.SetStderrFile(stderrFile.Name()) - wasiConfig.SetEnv([]string{"SUBJECT", "PAYLOAD", "METHOD", "URL"}, []string{msg.Subject, string(msg.Payload), msg.Method, msg.URL}) + wasiConfig.SetEnv([]string{"SUBJECT", "METHOD", "URL"}, []string{msg.Subject, msg.Method, msg.URL}) span.SetAttributes( attribute.String("wasm.env.subject", msg.Subject), attribute.String("wasm.env.method", msg.Method), attribute.String("wasm.env.url", msg.URL), ) + // Create a temp file that will contain the payload + payloadFile, err := os.CreateTemp("", "wasm-stdin") + if err != nil { + return ScriptResultWithError(fmt.Errorf("failed to create temp payload file: %v", err)) + } + defer payloadFile.Close() + defer os.Remove(payloadFile.Name()) + + _, err = payloadFile.Write(msg.Payload) + if err != nil { + return ScriptResultWithError(fmt.Errorf("failed to write to temp file %s: %v", payloadFile.Name(), err)) + } + + wasiConfig.SetStdinFile(payloadFile.Name()) store := wasmtime.NewStore(engine) store.SetWasi(wasiConfig) From fd952b9385536cfadda1189690a8c1c23a6a566a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Bariteau?= Date: Tue, 13 Oct 2026 16:24:04 -0400 Subject: [PATCH 04/18] update README --- README.md | 240 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 182 insertions(+), 58 deletions(-) diff --git a/README.md b/README.md index ed010a7..7e4cd02 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ - [Docker container](#docker-container) - [NixOS service](#nixos-service) - [Building it](#building-it) + - [Worker tags](#worker-tags) - [Clustering](#clustering) - [Adding Scripts](#adding-scripts) - [Command line flags](#command-line-flags) @@ -27,14 +28,24 @@ - [dev](#dev) - [devhttp](#devhttp) - [Command line options](#command-line-options) - - [Server options](#server-options) -- [Executors](#executors) - - [Lua](#lua) - - [Plugin system](#plugin-system) - - [Libraries](#libraries) - - [Web "framework" library](#web-framework-library) - - [WASM](#wasm) - - [Podman](#podman) +- [Worker](#worker) + - [Executors](#executors) + - [Lua](#lua) + - [Inputs](#inputs) + - [Normal mode](#normal-mode) + - [Web Mode](#web-mode) + - [Outputs](#outputs) + - [Normal Mode](#normal-mode) + - [Web Mode](#web-mode-1) + - [Plugin system](#plugin-system) + - [Libraries](#libraries) + - [Web "framework" library](#web-framework-library) + - [WASM](#wasm) + - [Inputs](#inputs-1) + - [Outputs](#outputs-1) + - [Podman](#podman) + - [Inputs](#inputs-2) + - [Outputs](#outputs-2) - [Contributing](#contributing) - [Support](#support) @@ -122,6 +133,7 @@ In **HTTP** mode: it will return the following JSON document: ``` json {"calculate":{"http_code":0,"error":"","http_headers":{},"is_html":false,"payload":"SGkhIEknbSBlbmNvZGVkIQo="}} ``` + Each keys at the root level is named after the `name` field of the script. The value is a table with the following keys: - `http_code`: The HTTP status code. It defaults to 200 - `error`: If the script returns an error, it will be set here @@ -129,14 +141,14 @@ Each keys at the root level is named after the `name` field of the script. The v - `is_html`: Whether the response is HTML - `payload`: The payload of the message. It is base64 encoded -In **HTTP+HTML** mode: you can return 3 different values: +In HTTP+HTML mode, you can return 3 different values: - The HTML as a string - The HTTP code (200 is missing) - The HTTP headers (empty if missing) ## HTTP handler -If you have a application that cannot reach nats by itself (say a webhook), it's possible to use the included HTTP handler. +If you have a application that cannot reach NATS by itself (say a Web Hook), it's possible to use the included HTTP handler. The server listens to port 7643 by default (it can be changed through the command line). You can push messages by doing a POST request to `http://serverIP:7643/` where the `` is any subjects that you have scripts registered to it. @@ -150,7 +162,7 @@ curl -X POST -d 'John' http://127.0.0.1:7643/http.hello Some endpoints exists to see the content of the store. These endpoints are meant to be used with a browser. -- `/_/` shows the README.md file converted to HTML +- `/_/` shows the `README.md` file converted to HTML - `/_/list` shows a list of the current subjects - `/_/subject/{subject}` list the scripts associated to a subject by name - `/_/info/{subject}/{name}` shows information about a script including the source @@ -171,11 +183,45 @@ It takes either `server` or `cli` as a first parameter. You can enable it in your NixOS configuration using the provided module (once included from either the flake or importing the module using something like `niv` or manually): +Below is an example usage of the module with etcd and external NATS. ```nix -services.msgscript.enable = true; +{ pkgs, lib, ... }: +let + msgscriptFlake = builtins.getFlake "github:numkem/msgscript"; +in +{ + imports = [ + msgscriptFlake.nixosModules.default + ]; + + services.msgscript = { + enable = true; + backend = "etcd"; + enableTelemetry = true; + otelEndpoint = "127.0.0.1:4317"; + etcdEndpoints = [ + "http://127.0.0.1:2379" + ]; + natsUrl = "nats://127.0.0.1:4222"; + plugins = with msgscriptFlake.packages."x86_64-linux".plugins; [ + db + httpscrape + gopher-lua-libs + vault + ]; + workerEnvironment = { + PATH = lib.makeBinPath [ + pkgs.busybox + pkgs.bash + pkgs.curl + pkgs.iputils + ]; + }; + }; +} ``` - The options are defined in the [nix/modules/default.nix](nix/modules/default.nix) file. +The options are defined in the [nix/modules/default.nix](nix/modules/default.nix) file. ### Building it @@ -184,11 +230,19 @@ Being a standalone Go binary, you can build each of the binaries like so: # Clone the msgscript repository git clone https://github.com/numkem/msgscript.git cd msgscript - go build ./cmd/server # Generates the server binary go build ./cmd/cli # Generates the CLI binary + go build ./cmd/server # Generates the server binary + go build ./cmd/worker # Generates the worker binary ``` -It requires the btrfs headers (podman), gpgme (podman) and wastime (wasm) as dependancies. +#### Worker tags + +It optionally requires the btrfs headers (podman), gpgme (podman) and wasmtime (wasm) as dependencies to build the worker code with full support for all each executor. + +Example: +``` sh +go build cmd/worker -tags "wasmtime podman" +``` ## Clustering @@ -216,63 +270,62 @@ The `cli` binary helps with managing the scripts in the message store and for he #### Commands - add Add a script to the backend by reading the provided lua file - completion Generate the autocompletion script for the specified shell - dev Executes the script locally like how the server would - devhttp Starts a webserver that will run only to receive request from this script - help Help about any command - lib library related commands - list list all the scripts registered in the store - rm Remove an existing script + `add` Add a script to the backend by reading the provided lua file + `completion` Generate the auto-completion script for the specified shell + `dev` Executes the script locally like how the server would + `devhttp` Starts a web server that will run only to receive request from this script + `help` Help about any command + `lib` library related commands + `list` list all the scripts registered in the store + `rm` Remove an existing script The commands that manages scripts (add, list, rm) are not really useful when using the file base store. #### dev -Useful for developing scripts that aren't http based (webhooks). +Useful for developing scripts that aren't HTTP based (web hooks). First argument is the script in question. It will return the script's output. #### devhttp -Useful for developing scripts that are http based (webhooks). +Useful for developing scripts that are HTTP based (web hooks). First argument is the script in question. You can then reach your script at `http://localhost:7634//`. The script is reloaded from the store on every HTTP request so you don't have to restart the command each time. #### Command line options -Flags: - -b, --backend string The name of the backend to use to manipulate the scripts (default "etcd") - -e, --etcdurls string Endpoints to connect to etcd (default "localhost:2379") - -x, --executor string Which executor to use. Either lua or wasm (default "lua") - -h, --help help for msgscript - -L, --log string set the logger to this log level (default "info") - -u, --natsurl string NATS url to reach (default "nats://localhost:4222") +| Flag | Default | Example | Description | +|-------------|------------------|---------------------------|--------------------------------------------------------------------------| +| `-backend` | `file` | `etcd` | Backend used for the script storage | +| `-etcdurls` | `localhost:2379` | `etcd-master:2379` | URL of the etcd server | +| `-help` | | | Show help | +| `-library` | (empty) | `./libs` | Directory that contains lua Libraries. Only used with the file backend | +| `-log` | `info` | `warning` | Log level to use (debug, info, warn, error) | +| `-natsurl` | (empty) | `nats://192.168.0.4:4222` | URL for the nats server. If not provided, a built-in one will be used. | +| `-plugin` | (empty) | `./plugins` | Lua plugin directory to load them from. Only used with the file backend | +| `-port` | `7643` | `8888` | HTTP port to bind to | +| `-script` | (empty) | `./scripts` | Directory that contains the scripts. Only used with the file backend | +| `-wenv` | (empty) | `./worker.env` | Path to a file containing environment variables for the worker. Ex: PATH | +| `-wexec` | `./worker` | `./worker-with-podman` | Path to the worker executable | -### Server options +## Worker -You can download the binary from the release page. There are 2 binaries available: `server` and `cli`. The server is what most people will want. The `cli` is only useful when paired with the `etcd` backend. +Whenever a script is run, Msgscript spawns a process from `cmd/worker` which will run the script and return the result through NATS. -The server has the following options: -- `-backend`: The backend to use. Currently supports `etcd` or `file`. `file` is the default. -- `-etcdurl`: The URL of the etcd server. It can be multiple through a comma separated list. -- `-library`: The path to a library directory. It has no defaults. It can be an absolute path or a relative path. -- `-log`: The log level to use. The options are: `debug`, `info`, `warn`, `error`. It defaults to `info`. -- `-natsurl`: The URL of the NATS server. -- `-plugin`: The path to the plugin directory. It has no defaults. It can be an absolute path or a relative path. -- `-port`: The port to listen on. It defaults to 7643. -- `-script`: The path to a script directory. It defaults to the current working directory. It can be an absolute path or a relative path. +### Executors -## Executors +Msgscript has support for multiple executors, namely what runs the code in the scripts. -Msgscript supports many different executors or more simply, a way to execute a script. The following shows how to use them. +* Lua is the fastest and the smallest. It's meant to be the primary choice as it doesn't need anything else to run. +* WASM requires a built binary specifically for the WASM (not WASI) runtime. The `examples/wasm` folder contains a C and Go workable example. +* Podman runs a container and cleans up afterwards. -### Lua +#### Lua This is the default executor. When writing Lua scripts for msgscript, you have access to additional built-in modules: - - `etcd`: Read/Write/Update/Delete keys in etcd [source](lua/etcd.go) - `http`: For making HTTP requests [source](https://github.com/cjoudrey/gluahttp) - `json`: For JSON parsing and generation [source](https://github.com/layeh/gopher-json) @@ -280,7 +333,7 @@ When writing Lua scripts for msgscript, you have access to additional built-in m - `nats`: For publishing messages back to NATS [source](lua/nats.go) - `re`: Regular expression library [source](https://github.com/yuin/gluare) -these can be included using the built-in `require()` Lua function. +These can be included using the built-in `require()` Lua function. The following example shows how to deserialize a JSON payload: ``` lua @@ -299,11 +352,47 @@ end Some examples scripts are provided in the `examples` folder. -#### Plugin system +##### Inputs + +###### Normal mode + +Msgscript for a function called `OnMessage`. This function doesn't have to be a `global` but it can optionally be. The function will receive 2 parameters: + +| Suggested name | Description | +|----------------|------------------------------------------------------------------------------------| +| `subject` | Contains the actual subject as a string name on NATS. Can be ignored by using `_`. | +| `payload` | Contains the payload from the NATS message. | + +The names of the variables are a suggestions and only the order matters. They can be ignored (`_`) or have any names supported by Lua. + +###### Web Mode + +Msgscript will call a function named after the HTTP verb used capitalized (ex: GET, POST, PUT, DELETE). This function doesn't have to be a `global` but it can optionally be. The function will receive 2 parameters: + +* The request URL with the msgscript part stripped. Ex: `/foo/bar/1`. +* The payload sent in the HTTP request. + +##### Outputs + +###### Normal Mode + +Everything returned from the function is sent back as the response. + +###### Web Mode + +The function called can return up to 3 variables: + +| Description | Default | Example | +|--------------------------|---------|------------------------------------------|--------------------------------------------------------------| +| The body of the response | (empty) | | `

Hello world!

/body>` | +| HTTP code | `200` | `404`, `500`, `302`... | +| Headers | `{}` | `{ "Content-Type": "application/json" }` | + +##### Plugin system While there is already a lot of modules added to the Lua execution environment, it is possible to add more using the included plugin system. -An example [plugin](plugins/hello/main.go) is available. The plugins can be loaded using the `--plugin` flag for both the server and cli. +An example [plugin](plugins/hello/main.go) is available. The plugins can be loaded using the `-plugin` flag for both the server and cli. Example using the hello plugin: @@ -319,7 +408,7 @@ end Plugins currently included in this repository: -* `scrape`: An http parser [source](https://github.com/felipejfc/gluahttpscrape) +* `scrape`: An HTTP parser [source](https://github.com/felipejfc/gluahttpscrape) * `db`: SQL access to MySQL, SQLite and PostgreSQL [source](https://github.com/tengattack/gluasql) * `gopher-lua-libs`: Various modules from the [gopher-lua-libs](https://github.com/vadv/gopher-lua-libs): * `cmd` @@ -332,7 +421,7 @@ Plugins currently included in this repository: **NOTE:** The plugin file needs to have the `.so` extension. -#### Libraries +##### Libraries Libraries are Lua files that gets prepended to the script that needs to be run. These libraries can be used within other scripts using the `require` header like this: @@ -344,7 +433,7 @@ In this case, it will load the library named `foo` and prepend it to the running Some example libraries are available [here](examples/libs). -#### Web "framework" library +##### Web "framework" library The [web.lua](examples/libs/web.lua) library contains a very simple web framework. It's used in the example below: @@ -379,10 +468,10 @@ end) While not extensive, these examples shows how to use the library. Namely: -- The function handling the endpoint returns 4 values: the mustache template, the data for the template, the HTTP code and HTTP headers +- The function handling the endpoint returns 4 values: the [mustache](https://mustache.github.io) template, the data for the template, the HTTP code and HTTP headers - If the template is either empty (`""`) or nil, it will be assumed that it's returning a JSON document. The `Content-Type` will be set as such. -### WASM +#### WASM Binaires compiled targetting WASM can be used. Some examples are provided in the `examples/wasm` directory. @@ -397,9 +486,26 @@ The format required in the store looks like this: The import parts are `subject`, `name` which are common with all other executors. The `executor` key needs to be set to `wasm`. The content is the path to the WASM executable. -### Podman +##### Inputs + +The following environment variables will be set for when the WASM binary is launched: + +| Variable | Example | Description | +|-----------|----------------|-------------------------------------------------------------------------| +| `SUBJECT` | `app.wasmtest` | The subject of the script | +| `METHOD` | `GET` | When called through the web interface, the HTTP method will be set here | +| `URL` | `/foo/bar/1` | When called through the web, remaining URL will be put here | + +stdin will contain the payload of the message. -The format requires in the store looks like this: +##### Outputs + +* stderr will be read for errors, if it's not empty the execution will be seen as failed +* stdout will be returned as-is in the message response's payload + +#### Podman + +The format for the script stored in the store is of a JSON. ``` --* subject: funcs.hello @@ -413,10 +519,28 @@ The format requires in the store looks like this: Like for WASM, it takes the same important keys. The content of the file can be: | Key | Description | -|:-------------|:---------------------------------------------------------------------------| +|--------------|----------------------------------------------------------------------------| +| `command` | The command to use to start the container | +| `group` | The group running the container | | `image` | Container image name | | `mounts` | List of mounts in the same format you would write them on the command line | | `privileged` | true/false if the container should run with more permissions | +| `user` | The user running the container | + +##### Inputs + +The following environment variables will be set for when the WASM binary is launched: + +| Variable | Example | Description | +|-----------|------------------|-------------------------------------------------------------------------| +| `SUBJECT` | `app.podmantest` | The subject of the script | +| `METHOD` | `GET` | When called through the web interface, the HTTP method will be set here | +| `URL` | `/foo/bar/1` | When called through the web, remaining URL will be put here | + +##### Outputs + +* stderr will be read for errors, if it's not empty the execution will be seen as failed +* stdout will be returned as-is in the message response's payload ## Contributing From 3b48e711ecf6850cbf7b4a7c90d57bef39ebf261 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Bariteau?= Date: Tue, 13 Oct 2026 16:32:45 -0400 Subject: [PATCH 05/18] README: change description --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7e4cd02..e288e6c 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ -TLDR: msgscript is what you could call a poor man's Lambda-like function/application server. It can run functions and even some small web based applications. +TLDR: msgscript is a fast self-hosted application server in Go. It listens to events either as NATS messages or HTTP webhooks and executes scripts (lua, WASM or podman containers). ## Features @@ -127,9 +127,9 @@ Just like in HTTP mode, the function executed will have the same name as the HTT The function is expected to return a string. If it does not, the server will log a warning: `Script returned no response`. -In **NATS** mode: it will return the string as-is. +In NATS mode: it will return the string as-is. -In **HTTP** mode: it will return the following JSON document: +In HTTP mode: it will return the following JSON document: ``` json {"calculate":{"http_code":0,"error":"","http_headers":{},"is_html":false,"payload":"SGkhIEknbSBlbmNvZGVkIQo="}} ``` From 6f06a849540999f5f69e7211fae8e778d8949640 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Bariteau?= Date: Wed, 14 Oct 2026 10:34:16 -0400 Subject: [PATCH 06/18] add integration test for lua with etcd --- flake.nix | 4 ++- nix/tests/lua-etcd.nix | 78 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 nix/tests/lua-etcd.nix diff --git a/flake.nix b/flake.nix index 4ced8dc..a38db78 100644 --- a/flake.nix +++ b/flake.nix @@ -93,8 +93,10 @@ # Tests test-minimal = mkTest ./nix/tests/minimal.nix; - test-etcd = mkTest ./nix/tests/etcd.nix; test-lua-file = mkTest ./nix/tests/lua-file.nix; + + test-etcd = mkTest ./nix/tests/etcd.nix; + test-lua-etcd = mkTest ./nix/tests/lua-etcd.nix; }; in { diff --git a/nix/tests/lua-etcd.nix b/nix/tests/lua-etcd.nix new file mode 100644 index 0000000..6786e46 --- /dev/null +++ b/nix/tests/lua-etcd.nix @@ -0,0 +1,78 @@ +{ + pkgs, + modules, + overlays, +}: + +let + helloLua = pkgs.writeText "hello.lua" (builtins.readFile ./../../examples/hello.lua); + pathLua = pkgs.writeText "path.lua" (builtins.readFile ./path.lua); +in +pkgs.testers.runNixOSTest { + name = "minimal-test"; + + node.pkgsReadOnly = false; + nodes.server = + { + config, + pkgs, + lib, + ... + }: + { + imports = [ + modules + ]; + + nixpkgs.overlays = overlays; + + services.etcd = { + enable = true; + listenClientUrls = [ "http://127.0.0.1:2379" ]; + listenPeerUrls = [ "http://127.0.0.1:2380" ]; + initialCluster = [ "${config.services.etcd.name}=http://127.0.0.1:2380" ]; + initialClusterState = "new"; + }; + + services.msgscript = { + enable = true; + backend = "etcd"; + etcdEndpoints = [ "http://127.0.0.1:2379" ]; + plugins = with pkgs.msgscript-plugins; [ gopher-lua-libs ]; + workerEnvironment = { + PATH = lib.makeBinPath [ + pkgs.busybox # For sh + pkgs.hello + ]; + }; + }; + + environment.systemPackages = with pkgs; [ + jq + gnugrep + coreutils + msgscript-cli + ]; + }; + + testScript = '' + start_all() + + # Setup script files + server.copy_from_host("${helloLua}", "/var/lib/msgscript/scripts/hello.lua") + server.copy_from_host("${pathLua}", "/var/lib/msgscript/scripts/path.lua") + + server.wait_for_unit("etcd.service") + + server.succeed("msgscriptcli add /var/lib/msgscript/scripts/hello.lua") + server.succeed("msgscriptcli add /var/lib/msgscript/scripts/path.lua") + + server.wait_for_unit("msgscript.service") + + with subtest("simple lua script"): + server.succeed("curl -s http://127.0.0.1:7643/funcs.hello | jq -r '.[0].payload' | base64 -d | grep funcs.hello") + + with subtest("lua script with PATH change"): + server.succeed("curl -s http://127.0.0.1:7643/funcs.path | jq -r '.[0].payload' | base64 -d | grep 'Hello'") + ''; +} From c4e42a07fa792dbc8abdc3c7c6c859d9c75de3ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Bariteau?= Date: Wed, 14 Oct 2026 10:34:33 -0400 Subject: [PATCH 07/18] fix Message struct change --- cmd/cli/cmd_dev.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/cli/cmd_dev.go b/cmd/cli/cmd_dev.go index 1a13d76..e53affb 100644 --- a/cmd/cli/cmd_dev.go +++ b/cmd/cli/cmd_dev.go @@ -27,6 +27,7 @@ func init() { devCmd.PersistentFlags().StringP("input", "i", "", "Path to or actual payload to send to the function") devCmd.PersistentFlags().StringP("library", "l", "", "Path to a folder containing libraries to load for the function") devCmd.PersistentFlags().StringP("pluginDir", "p", "", "Path to a folder with plugins") + devCmd.PersistentFlags().StringP("executor", "e", executor.EXECUTOR_LUA_NAME, "Executor to use for the script") devCmd.MarkFlagRequired("subject") devCmd.MarkFlagRequired("name") @@ -110,11 +111,10 @@ func devCmdRun(cmd *cobra.Command, args []string) { m := &executor.Message{ Payload: payload, Subject: subject, - Executor: cmd.Flag("executor").Value.String(), } executors := executor.StartAllExecutors(cmd.Context(), store, plugins, nil) - exec, err := executor.ExecutorByName(m.Executor, executors) + exec, err := executor.ExecutorByName(cmd.Flag("executor").Value.String(), executors) if err != nil { cmd.PrintErrf("failed to get executor for message: %v", err) return From 94003d97293bd6091d960c606f6cf43b8c12df03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Bariteau?= Date: Wed, 14 Oct 2026 13:07:38 -0400 Subject: [PATCH 08/18] remove useless log --- executor/podman_executor.go | 2 -- executor/wasm_executor.go | 2 -- 2 files changed, 4 deletions(-) diff --git a/executor/podman_executor.go b/executor/podman_executor.go index 1b2964f..9ebb9c3 100644 --- a/executor/podman_executor.go +++ b/executor/podman_executor.go @@ -55,8 +55,6 @@ func NewPodmanExecutor(ctx context.Context, store msgstore.ScriptStore) (*Podman return nil, fmt.Errorf("failed to connect to the podman socket: %w", err) } - log.Info("WASM executor initialized") - return &PodmanExecutor{ ConnText: connText, store: store, diff --git a/executor/wasm_executor.go b/executor/wasm_executor.go index fb1ac9f..98a15c8 100644 --- a/executor/wasm_executor.go +++ b/executor/wasm_executor.go @@ -34,8 +34,6 @@ type WasmExecutor struct { func NewWasmExecutor(c context.Context, store msgstore.ScriptStore, plugins []msgplugins.PreloadFunc, nc *nats.Conn) Executor { ctx, cancelFunc := context.WithCancel(c) - log.Info("WASM executor initialized") - return &WasmExecutor{ cancelFunc: cancelFunc, ctx: ctx, From 0054e7c7d55f7d87dcaf95eba48e53ef673d675b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Bariteau?= Date: Wed, 14 Oct 2026 13:07:50 -0400 Subject: [PATCH 09/18] cleanup --- examples/wasm/c/Makefile | 2 +- examples/wasm/c/wasm.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/wasm/c/Makefile b/examples/wasm/c/Makefile index 3c27f80..6fd1637 100644 --- a/examples/wasm/c/Makefile +++ b/examples/wasm/c/Makefile @@ -1,2 +1,2 @@ all: - emcc wasm.c -o c.wasm -s STANDALONE_WASM=1 + emcc wasm.c -o c.wasm -sSTANDALONE_WASM diff --git a/examples/wasm/c/wasm.c b/examples/wasm/c/wasm.c index 0a658c2..723367e 100644 --- a/examples/wasm/c/wasm.c +++ b/examples/wasm/c/wasm.c @@ -1,6 +1,6 @@ #include -#include int main() { printf("Hello from C!"); + return 0; } From d2c50014651abef652f02f24cfcb39eba4708270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Bariteau?= Date: Wed, 14 Oct 2026 13:08:13 -0400 Subject: [PATCH 10/18] fix readme wording --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e288e6c..ae000d4 100644 --- a/README.md +++ b/README.md @@ -318,7 +318,7 @@ Whenever a script is run, Msgscript spawns a process from `cmd/worker` which wil Msgscript has support for multiple executors, namely what runs the code in the scripts. * Lua is the fastest and the smallest. It's meant to be the primary choice as it doesn't need anything else to run. -* WASM requires a built binary specifically for the WASM (not WASI) runtime. The `examples/wasm` folder contains a C and Go workable example. +* WASM requires a built binary specifically for the WASI runtime (internally it uses [wasmtime](https://github.com/bytecodealliance/wasmtime-go/)). The `examples/wasm` folder contains a C and Go workable example. * Podman runs a container and cleans up afterwards. #### Lua From 06bfaf32994e6c81384057324b668859280194c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Bariteau?= Date: Wed, 14 Oct 2026 13:09:02 -0400 Subject: [PATCH 11/18] move test in flake to under .#checks --- flake.nix | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/flake.nix b/flake.nix index a38db78..85b7b3a 100644 --- a/flake.nix +++ b/flake.nix @@ -40,14 +40,6 @@ let pkgs = import nixpkgs { inherit system; }; lib = pkgs.lib; - - mkTest = - testFile: - import testFile { - inherit pkgs; - modules = self.nixosModules.default; - overlays = [ self.overlays.default ]; - }; in rec { default = server; @@ -90,13 +82,6 @@ ); in lib.genAttrs pluginDirs (name: mkPlugin pkgs name "${self}/plugins/${name}"); - - # Tests - test-minimal = mkTest ./nix/tests/minimal.nix; - test-lua-file = mkTest ./nix/tests/lua-file.nix; - - test-etcd = mkTest ./nix/tests/etcd.nix; - test-lua-etcd = mkTest ./nix/tests/lua-etcd.nix; }; in { @@ -123,6 +108,28 @@ "aarch64-linux" = mkApps "aarch64-linux"; }; + checks.x86_64-linux = + let + pkgs = import nixpkgs { system = "x86_64-linux"; }; + + mkTest = + testFile: + import testFile { + inherit pkgs; + modules = self.nixosModules.default; + overlays = [ self.overlays.default ]; + }; + in + { + # Tests + test-minimal = mkTest ./nix/tests/minimal.nix; + test-lua-file = mkTest ./nix/tests/lua-file.nix; + + test-etcd = mkTest ./nix/tests/etcd.nix; + test-lua-etcd = mkTest ./nix/tests/lua-etcd.nix; + test-wasm-etcd = mkTest ./nix/tests/wasm.nix; + }; + devShells.x86_64-linux.default = let pkgs = import nixpkgs { system = "x86_64-linux"; }; From 8a9cfd1d66b49ee253fc76e77a6b1ccf878ec535 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Bariteau?= Date: Wed, 14 Oct 2026 13:09:19 -0400 Subject: [PATCH 12/18] add wasm test --- nix/tests/wasm.nix | 95 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 nix/tests/wasm.nix diff --git a/nix/tests/wasm.nix b/nix/tests/wasm.nix new file mode 100644 index 0000000..d116ba5 --- /dev/null +++ b/nix/tests/wasm.nix @@ -0,0 +1,95 @@ +{ + pkgs, + modules, + overlays, +}: + +let + wasmLua = pkgs.writeText "wasm.lua" '' + --* subject: funcs.wasm + --* name: wasm + --* html: true + --* executor: wasm + /var/lib/msgscript/scripts/c.wasm + ''; + + wasm = pkgs.stdenv.mkDerivation { + name = "msgscript-wasm-c-example"; + + buildInputs = [ pkgs.emscripten ]; + + src = ../../examples/wasm/c; + + installPhase = '' + mkdir -p $out/bin + cp c.wasm $out/bin/c.wasm + ''; + }; +in +pkgs.testers.runNixOSTest { + name = "minimal-test"; + + node.pkgsReadOnly = false; + nodes.server = + { + config, + pkgs, + lib, + ... + }: + { + imports = [ + modules + ]; + + nixpkgs.overlays = overlays ++ [ + (prev: final: { + msgscript-worker = final.msgscript-worker.override { withWasm = true; }; + }) + ]; + + services.etcd = { + enable = true; + listenClientUrls = [ "http://127.0.0.1:2379" ]; + listenPeerUrls = [ "http://127.0.0.1:2380" ]; + initialCluster = [ "${config.services.etcd.name}=http://127.0.0.1:2380" ]; + initialClusterState = "new"; + }; + + services.msgscript = { + enable = true; + backend = "etcd"; + etcdEndpoints = [ "http://127.0.0.1:2379" ]; + workerEnvironment = { + PATH = lib.makeBinPath [ + pkgs.busybox # For sh + pkgs.hello + ]; + }; + }; + + environment.systemPackages = with pkgs; [ + jq + gnugrep + coreutils + msgscript-cli + ]; + }; + + testScript = '' + start_all() + + # Setup script files + server.copy_from_host("${wasmLua}", "/var/lib/msgscript/scripts/wasm.lua") + server.copy_from_host("${wasm}/bin/c.wasm", "/var/lib/msgscript/scripts/c.wasm") + + server.wait_for_unit("etcd.service") + + server.succeed("msgscriptcli add /var/lib/msgscript/scripts/wasm.lua") + + server.wait_for_unit("msgscript.service") + + with subtest("wasm based script"): + server.succeed("curl -s http://127.0.0.1:7643/funcs.wasm | jq -r '.[0].payload' | base64 -d | grep Hello") + ''; +} From 2de734b789ffd69423e181d0449b1490cab80ffb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Bariteau?= Date: Thu, 15 Oct 2026 13:30:50 -0400 Subject: [PATCH 13/18] test support for podman - Unify the tests into a single file per backend - Shared fixtures are in fixtures.nix - Add username/password/policy for pulls in the json - Fixes on the podman executor itself - Properly set XDG_RUNTIME_DIR/HOME on the service - Podman executor will use the podman root socket by default - Update podman Go bindings to latest version --- examples/podman/hello-world.lua | 4 +- executor/executor.go | 23 +- executor/podman_executor.go | 51 ++- flake.nix | 12 +- go.mod | 219 ++++++------ go.sum | 598 ++++++++++++++------------------ justfile | 4 + nix/modules/default.nix | 61 ++-- nix/tests/default.nix | 9 - nix/tests/etcd.nix | 107 ++++-- nix/tests/file.nix | 85 +++++ nix/tests/fixtures.nix | 45 +++ nix/tests/lua-etcd.nix | 78 ----- nix/tests/lua-file.nix | 54 --- nix/tests/minimal.nix | 39 --- nix/tests/wasm.nix | 95 ----- 16 files changed, 656 insertions(+), 828 deletions(-) delete mode 100644 nix/tests/default.nix create mode 100644 nix/tests/file.nix create mode 100644 nix/tests/fixtures.nix delete mode 100644 nix/tests/lua-etcd.nix delete mode 100644 nix/tests/lua-file.nix delete mode 100644 nix/tests/minimal.nix delete mode 100644 nix/tests/wasm.nix diff --git a/examples/podman/hello-world.lua b/examples/podman/hello-world.lua index 23bef07..d02c95c 100644 --- a/examples/podman/hello-world.lua +++ b/examples/podman/hello-world.lua @@ -1,6 +1,6 @@ ---* subject: funcs.hello +--* subject: funcs.podmanhello --* name: podman --* executor: podman { - "image": "hello-world" + "image": "quay.io/podman/hello" } diff --git a/executor/executor.go b/executor/executor.go index 986c8d0..f756b4c 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -7,6 +7,7 @@ import ( "time" "github.com/nats-io/nats.go" + log "github.com/sirupsen/logrus" "github.com/numkem/msgscript/plugins" "github.com/numkem/msgscript/script" @@ -21,18 +22,18 @@ const ( ) type Message struct { - Async bool `json:"async"` - Method string `json:"method"` - Payload []byte `json:"payload"` - Raw bool `json:"raw"` - Subject string `json:"subject"` - URL string `json:"url"` + Async bool `json:"async"` + Method string `json:"method"` + Payload []byte `json:"payload"` + Raw bool `json:"raw"` + Subject string `json:"subject"` + URL string `json:"url"` } type Reply struct { Results []*ScriptResult `json:"script_result"` - HTML bool `json:"is_html"` - Error string `json:"error,omitempty"` + HTML bool `json:"is_html"` + Error string `json:"error,omitempty"` } type ScriptResult struct { @@ -75,10 +76,12 @@ func StartAllExecutors(ctx context.Context, scriptStore store.ScriptStore, plugi executors[EXECUTOR_WASM_NAME] = NewWasmExecutor(ctx, scriptStore, nil, nil) podmanExec, err := NewPodmanExecutor(ctx, scriptStore) - if err != nil { + if err == nil { + executors[EXECUTOR_PODMAN_NAME] = podmanExec + } else { + log.Errorf("Failed to start podman executor: %v", err) podmanExec = nil } - executors[EXECUTOR_PODMAN_NAME] = podmanExec return executors } diff --git a/executor/podman_executor.go b/executor/podman_executor.go index 9ebb9c3..d627723 100644 --- a/executor/podman_executor.go +++ b/executor/podman_executor.go @@ -10,10 +10,6 @@ import ( "os" "sync" - "github.com/containers/podman/v5/pkg/bindings" - "github.com/containers/podman/v5/pkg/bindings/containers" - "github.com/containers/podman/v5/pkg/bindings/images" - "github.com/containers/podman/v5/pkg/specgen" "github.com/google/uuid" spec "github.com/opencontainers/runtime-spec/specs-go" log "github.com/sirupsen/logrus" @@ -21,9 +17,12 @@ import ( "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/trace" + "go.podman.io/podman/v6/pkg/bindings" + "go.podman.io/podman/v6/pkg/bindings/containers" + "go.podman.io/podman/v6/pkg/bindings/images" + "go.podman.io/podman/v6/pkg/specgen" "github.com/numkem/msgscript/script" - scriptLib "github.com/numkem/msgscript/script" msgstore "github.com/numkem/msgscript/store" ) @@ -42,15 +41,14 @@ type containerConfiguration struct { Privileged bool `json:"privileged"` User string `json:"user"` Groups []string `json:"groups"` + Username string `json:"username"` + Password string `json:"password"` + PullPolicy string `json:"pull_policy"` } func NewPodmanExecutor(ctx context.Context, store msgstore.ScriptStore) (*PodmanExecutor, error) { - // Get Podman socket location - sock_dir := os.Getenv("XDG_RUNTIME_DIR") - socket := "unix:" + sock_dir + "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/podman/podman.sock" - // Connect to Podman socket - connText, err := bindings.NewConnection(ctx, socket) + connText, err := bindings.NewConnection(ctx, "unix:/run/podman/podman.sock") if err != nil { return nil, fmt.Errorf("failed to connect to the podman socket: %w", err) } @@ -79,7 +77,7 @@ func (pe *PodmanExecutor) HandleMessage(ctx context.Context, msg *Message, scr * fields["name"] = scr.Name _, parseSpan := podmanTracer.Start(ctx, "podman.parse_script") - scr, err := scriptLib.ReadString(string(scr.Content)) + scr, err := script.ReadString(string(scr.Content)) if err != nil { parseSpan.RecordError(err) parseSpan.SetStatus(codes.Error, "Failed to parse script") @@ -91,7 +89,7 @@ func (pe *PodmanExecutor) HandleMessage(ctx context.Context, msg *Message, scr * parseSpan.SetStatus(codes.Ok, "") parseSpan.End() - res, err := pe.executeInContainer(ctx, fields, scr, msg) + res, err := pe.executeContainer(ctx, fields, scr, msg) if err != nil { span.RecordError(err) span.SetStatus(codes.Error, "Failed to execute container") @@ -108,7 +106,7 @@ func (pe *PodmanExecutor) HandleMessage(ctx context.Context, msg *Message, scr * return res } -func (pe *PodmanExecutor) executeInContainer(ctx context.Context, fields log.Fields, scr *scriptLib.Script, msg *Message) (*ScriptResult, error) { +func (pe *PodmanExecutor) executeContainer(ctx context.Context, fields log.Fields, scr *script.Script, msg *Message) (*ScriptResult, error) { ctx, span := podmanTracer.Start(ctx, "podman.execute_container") defer span.End() @@ -143,7 +141,16 @@ func (pe *PodmanExecutor) executeInContainer(ctx context.Context, fields log.Fie attribute.String("container.image", cfg.Image), ), ) - _, err = images.Pull(pe.ConnText, cfg.Image, nil) + + pullPolicy := cfg.PullPolicy + if pullPolicy == "" { + pullPolicy = "missing" + } + _, err = images.Pull(pe.ConnText, cfg.Image, &images.PullOptions{ + Username: &cfg.Username, + Password: &cfg.Password, + Policy: &pullPolicy, + }) if err != nil { pullSpan.RecordError(err) pullSpan.SetStatus(codes.Error, "Failed to pull image") @@ -164,9 +171,9 @@ func (pe *PodmanExecutor) executeInContainer(ctx context.Context, fields log.Fie spec.User = cfg.User spec.Groups = cfg.Groups spec.Privileged = &cfg.Privileged - spec.Stdin = boolPtr(true) - spec.Terminal = boolPtr(true) - spec.Remove = boolPtr(true) + spec.Stdin = new(true) + spec.Terminal = new(true) + spec.Remove = new(true) fields["ctnName"] = containerName @@ -367,16 +374,8 @@ func (pe *PodmanExecutor) Stop() { // Go through each running container and kill them pe.containers.Range(func(key, value any) bool { containers.Kill(pe.ConnText, value.(string), &containers.KillOptions{ - Signal: stringPtr("SIGKILL"), + Signal: new("SIGKILL"), }) return true }) } - -func stringPtr(s string) *string { - return &s -} - -func boolPtr(b bool) *bool { - return &b -} diff --git a/flake.nix b/flake.nix index 85b7b3a..ec6cc9e 100644 --- a/flake.nix +++ b/flake.nix @@ -9,7 +9,7 @@ { self, nixpkgs }: let version = "1.0.0"; - vendorHash = "sha256-Jer/ADurA+BwvAuuTjEycJNExBnobEs72ccQMmOqV1k="; + vendorHash = "sha256-BN4okB9GMrh/nb+wRLp6w6GEPQAZ6KEwrz2LMH0eOh4="; mkPlugin = pkgs: name: path: @@ -108,6 +108,7 @@ "aarch64-linux" = mkApps "aarch64-linux"; }; + # Tests checks.x86_64-linux = let pkgs = import nixpkgs { system = "x86_64-linux"; }; @@ -121,13 +122,8 @@ }; in { - # Tests - test-minimal = mkTest ./nix/tests/minimal.nix; - test-lua-file = mkTest ./nix/tests/lua-file.nix; - - test-etcd = mkTest ./nix/tests/etcd.nix; - test-lua-etcd = mkTest ./nix/tests/lua-etcd.nix; - test-wasm-etcd = mkTest ./nix/tests/wasm.nix; + etcd = mkTest ./nix/tests/etcd.nix; + file = mkTest ./nix/tests/file.nix; }; devShells.x86_64-linux.default = diff --git a/go.mod b/go.mod index de57ab0..5e4506a 100644 --- a/go.mod +++ b/go.mod @@ -1,15 +1,14 @@ module github.com/numkem/msgscript -go 1.24.4 +go 1.26.0 replace github.com/openbao/openbao/api v1.12.2 => github.com/hashicorp/vault/api v1.12.2 require ( github.com/bytecodealliance/wasmtime-go/v37 v37.0.0 github.com/cjoudrey/gluahttp v0.0.0-20201111170219-25003d9adfa9 - github.com/containers/podman/v5 v5.5.2 github.com/felipejfc/gluahttpscrape v0.0.0-20170525191632-10580c4a38f9 - github.com/fsnotify/fsnotify v1.9.0 + github.com/fsnotify/fsnotify v1.10.1 github.com/gomarkdown/markdown v0.0.0-20260217112301-37c66b85d6ab github.com/google/uuid v1.6.0 github.com/gorilla/mux v1.8.1 @@ -18,187 +17,181 @@ require ( github.com/nats-io/nats-server/v2 v2.10.24 github.com/nats-io/nats.go v1.37.0 github.com/openbao/openbao/api v1.12.2 - github.com/opencontainers/runtime-spec v1.2.1 - github.com/sirupsen/logrus v1.9.3 - github.com/spf13/cobra v1.9.1 - github.com/stretchr/testify v1.11.1 + github.com/opencontainers/runtime-spec v1.3.0 + github.com/sirupsen/logrus v1.10.2 + github.com/spf13/cobra v1.10.2 + github.com/stretchr/testify v1.12.1 github.com/tengattack/gluasql v0.0.0-20240325124313-344b155b513c github.com/vadv/gopher-lua-libs v0.5.0 github.com/yuin/gluare v0.0.0-20170607022532-d7c94f1a80ed github.com/yuin/gopher-lua v1.1.1 go.etcd.io/etcd/client/v3 v3.5.15 - go.opentelemetry.io/otel v1.38.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 + go.opentelemetry.io/otel v1.44.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.38.0 - go.opentelemetry.io/otel/sdk v1.38.0 - go.opentelemetry.io/otel/trace v1.38.0 - golang.org/x/net v0.39.0 - google.golang.org/grpc v1.71.0 + go.opentelemetry.io/otel/sdk v1.44.0 + go.opentelemetry.io/otel/trace v1.44.0 + go.podman.io/podman/v6 v6.1.4 + golang.org/x/net v0.59.0 + google.golang.org/grpc v1.82.1 layeh.com/gopher-lfs v0.0.0-20201124131141-d5fb28581d14 ) require ( - dario.cat/mergo v1.0.1 // indirect - filippo.io/edwards25519 v1.1.0 // indirect + cyphar.com/go-pathrs v0.2.5 // indirect + dario.cat/mergo v1.0.2 // indirect + filippo.io/edwards25519 v1.2.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect - github.com/BurntSushi/toml v1.5.0 // indirect + github.com/BurntSushi/toml v1.6.0 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/Microsoft/hcsshim v0.12.9 // indirect + github.com/ProtonMail/go-crypto v1.4.1 // indirect github.com/VividCortex/ewma v1.2.0 // indirect github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect - github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/cbroglie/mustache v1.0.1 // indirect github.com/cenkalti/backoff/v3 v3.2.2 // indirect - github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chzyer/readline v1.5.1 // indirect - github.com/containerd/cgroups/v3 v3.0.5 // indirect + github.com/clipperhouse/uax29/v2 v2.7.0 // indirect + github.com/cloudflare/circl v1.6.3 // indirect github.com/containerd/errdefs v1.0.0 // indirect github.com/containerd/errdefs/pkg v0.3.0 // indirect github.com/containerd/log v0.1.0 // indirect - github.com/containerd/platforms v1.0.0-rc.1 // indirect - github.com/containerd/stargz-snapshotter/estargz v0.16.3 // indirect - github.com/containerd/typeurl/v2 v2.2.3 // indirect - github.com/containers/buildah v1.40.1 // indirect - github.com/containers/common v0.63.1 // indirect - github.com/containers/image/v5 v5.35.0 // indirect + github.com/containerd/platforms v1.0.0-rc.4 // indirect + github.com/containerd/stargz-snapshotter/estargz v0.18.2 // indirect + github.com/containerd/typeurl/v2 v2.3.0 // indirect github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01 // indirect - github.com/containers/ocicrypt v1.2.1 // indirect - github.com/containers/psgo v1.9.0 // indirect - github.com/containers/storage v1.58.0 // indirect + github.com/containers/ocicrypt v1.3.2 // indirect + github.com/containers/psgo v1.10.0 // indirect github.com/coreos/go-semver v0.3.0 // indirect - github.com/coreos/go-systemd/v22 v22.5.1-0.20231103132048-7d375ecc2b09 // indirect + github.com/coreos/go-systemd/v22 v22.7.0 // indirect github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467 // indirect - github.com/cyphar/filepath-securejoin v0.4.1 // indirect - github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/cyphar/filepath-securejoin v0.7.0 // indirect github.com/disiqueira/gotree/v3 v3.0.2 // indirect github.com/distribution/reference v0.6.0 // indirect github.com/docker/distribution v2.8.3+incompatible // indirect - github.com/docker/docker v28.1.1+incompatible // indirect - github.com/docker/docker-credential-helpers v0.9.3 // indirect - github.com/docker/go-connections v0.5.0 // indirect + github.com/docker/docker-credential-helpers v0.9.8 // indirect + github.com/docker/go-connections v0.8.1 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/go-jose/go-jose/v3 v3.0.3 // indirect - github.com/go-jose/go-jose/v4 v4.0.5 // indirect + github.com/fsouza/go-dockerclient v1.13.2 // indirect + github.com/go-jose/go-jose/v3 v3.0.5 // indirect + github.com/go-jose/go-jose/v4 v4.1.4 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-openapi/analysis v0.23.0 // indirect - github.com/go-openapi/errors v0.22.1 // indirect - github.com/go-openapi/jsonpointer v0.21.0 // indirect - github.com/go-openapi/jsonreference v0.21.0 // indirect - github.com/go-openapi/loads v0.22.0 // indirect - github.com/go-openapi/runtime v0.28.0 // indirect - github.com/go-openapi/spec v0.21.0 // indirect - github.com/go-openapi/strfmt v0.23.0 // indirect - github.com/go-openapi/swag v0.23.1 // indirect - github.com/go-openapi/validate v0.24.0 // indirect - github.com/go-sql-driver/mysql v1.9.1 // indirect - github.com/godbus/dbus/v5 v5.1.1-0.20241109141217-c266b19b28e9 // indirect + github.com/go-sql-driver/mysql v1.9.3 // indirect + github.com/go-test/deep v1.1.1 // indirect + github.com/godbus/dbus/v5 v5.2.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/google/go-containerregistry v0.20.3 // indirect + github.com/google/go-containerregistry v0.21.6 // indirect github.com/google/go-intervals v0.0.2 // indirect github.com/gorilla/schema v1.4.1 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-retryablehttp v0.7.7 // indirect + github.com/hashicorp/go-retryablehttp v0.7.8 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect - github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7 // indirect + github.com/hashicorp/go-secure-stdlib/parseutil v0.2.0 // indirect github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect - github.com/hashicorp/go-sockaddr v1.0.2 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hashicorp/go-sockaddr v1.0.7 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/hashicorp/hcl v1.0.1-vault-7 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jinzhu/copier v0.4.0 // indirect - github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/junhsieh/goexamples v0.0.0-20210908032526-acdd3160140b // indirect - github.com/kevinburke/ssh_config v1.2.0 // indirect - github.com/klauspost/compress v1.18.0 // indirect + github.com/kevinburke/ssh_config v1.5.0 // indirect + github.com/klauspost/compress v1.19.1 // indirect github.com/klauspost/pgzip v1.2.6 // indirect github.com/kr/fs v0.1.0 // indirect - github.com/letsencrypt/boulder v0.0.0-20240620165639-de9c06129bec // indirect - github.com/mailru/easyjson v0.9.0 // indirect github.com/manifoldco/promptui v0.9.0 // indirect - github.com/mattn/go-runewidth v0.0.16 // indirect - github.com/mattn/go-sqlite3 v1.14.28 // indirect - github.com/miekg/pkcs11 v1.1.1 // indirect + github.com/mattn/go-runewidth v0.0.27 // indirect + github.com/mattn/go-sqlite3 v1.14.49 // indirect + github.com/miekg/pkcs11 v1.1.2 // indirect github.com/minio/highwayhash v1.0.3 // indirect - github.com/mistifyio/go-zfs/v3 v3.0.1 // indirect + github.com/mistifyio/go-zfs/v4 v4.0.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/moby/buildkit v0.31.2 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect + github.com/moby/go-archive v0.3.0 // indirect + github.com/moby/moby/api v1.55.0 // indirect + github.com/moby/moby/client v0.5.1 // indirect + github.com/moby/patternmatcher v0.6.1 // indirect github.com/moby/sys/capability v0.4.0 // indirect + github.com/moby/sys/devices v0.1.0 // indirect github.com/moby/sys/mountinfo v0.7.2 // indirect - github.com/moby/sys/user v0.4.0 // indirect + github.com/moby/sys/sequential v0.7.0 // indirect + github.com/moby/sys/user v0.4.1 // indirect github.com/moby/sys/userns v0.1.0 // indirect github.com/moby/term v0.5.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/morikuni/aec v1.0.0 // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/nats-io/jwt/v2 v2.7.3 // indirect github.com/nats-io/nkeys v0.4.9 // indirect github.com/nats-io/nuid v1.0.1 // indirect github.com/nxadm/tail v1.4.11 // indirect - github.com/oklog/ulid v1.3.1 // indirect - github.com/opencontainers/cgroups v0.0.1 // indirect + github.com/opencontainers/cgroups v0.0.8 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.1 // indirect - github.com/opencontainers/runc v1.2.6 // indirect - github.com/opencontainers/runtime-tools v0.9.1-0.20250303011046-260e151b8552 // indirect - github.com/opencontainers/selinux v1.12.0 // indirect - github.com/ostreedev/ostree-go v0.0.0-20210805093236-719684c64e4f // indirect + github.com/opencontainers/runtime-tools v0.9.1-0.20260316125833-8a4db579f5c8 // indirect + github.com/opencontainers/selinux v1.15.1 // indirect + github.com/openshift/imagebuilder v1.2.21 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/pkg/sftp v1.13.9 // indirect - github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/proglottis/gpgme v0.1.4 // indirect - github.com/rivo/uniseg v0.4.7 // indirect + github.com/pkg/sftp v1.13.11 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/proglottis/gpgme v0.1.6 // indirect github.com/ryanuber/go-glob v1.0.0 // indirect - github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect - github.com/sigstore/fulcio v1.6.6 // indirect - github.com/sigstore/protobuf-specs v0.4.1 // indirect - github.com/sigstore/rekor v1.3.10 // indirect - github.com/sigstore/sigstore v1.9.3 // indirect - github.com/skeema/knownhosts v1.3.1 // indirect - github.com/smallstep/pkcs7 v0.1.1 // indirect - github.com/spf13/pflag v1.0.6 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.11.0 // indirect + github.com/sigstore/fulcio v1.8.7 // indirect + github.com/sigstore/protobuf-specs v0.5.1 // indirect + github.com/sigstore/sigstore v1.10.8 // indirect + github.com/skeema/knownhosts v1.3.2 // indirect + github.com/smallstep/pkcs7 v0.2.1 // indirect + github.com/spf13/pflag v1.0.10 // indirect github.com/stefanberger/go-pkcs11uri v0.0.0-20230803200340-78284954bff6 // indirect - github.com/sylabs/sif/v2 v2.21.1 // indirect - github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 // indirect - github.com/tchap/go-patricia/v2 v2.3.2 // indirect - github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 // indirect - github.com/ulikunitz/xz v0.5.12 // indirect - github.com/vbatts/tar-split v0.12.1 // indirect - github.com/vbauerster/mpb/v8 v8.9.3 // indirect + github.com/sylabs/sif/v2 v2.24.1 // indirect + github.com/tchap/go-patricia/v2 v2.3.3 // indirect + github.com/ulikunitz/xz v0.5.16 // indirect + github.com/vbatts/tar-split v0.12.3 // indirect + github.com/vbauerster/cupwriter v0.0.4 // indirect + github.com/vbauerster/mpb/v8 v8.14.0 // indirect + github.com/vishvananda/netlink v1.3.1 // indirect + github.com/vishvananda/netns v0.0.5 // indirect github.com/yhat/scrape v0.0.0-20161128144610-24b7890b0945 // indirect + github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect github.com/yuin/gluamapper v0.0.0-20150323120927-d836955830e7 // indirect go.etcd.io/etcd/api/v3 v3.5.15 // indirect go.etcd.io/etcd/client/pkg/v3 v3.5.15 // indirect - go.mongodb.org/mongo-driver v1.14.0 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 // indirect - go.opentelemetry.io/otel/metric v1.38.0 // indirect - go.opentelemetry.io/proto/otlp v1.4.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 // indirect + go.opentelemetry.io/otel/metric v1.44.0 // indirect + go.opentelemetry.io/proto/otlp v1.10.0 // indirect + go.podman.io/buildah v1.45.2 // indirect + go.podman.io/common v0.69.2 // indirect + go.podman.io/image/v5 v5.41.2 // indirect + go.podman.io/storage v1.64.2 // indirect go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.38.0 // indirect - golang.org/x/sync v0.14.0 // indirect - golang.org/x/sys v0.35.0 // indirect - golang.org/x/term v0.32.0 // indirect - golang.org/x/text v0.25.0 // indirect - golang.org/x/time v0.11.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4 // indirect - google.golang.org/protobuf v1.36.6 // indirect + go.uber.org/zap v1.28.0 // indirect + go.yaml.in/yaml/v2 v2.4.4 // indirect + go.yaml.in/yaml/v3 v3.0.5 // indirect + golang.org/x/crypto v0.57.0 // indirect + golang.org/x/sync v0.23.0 // indirect + golang.org/x/sys v0.48.0 // indirect + golang.org/x/telemetry v0.0.0-20260811182544-a038080d80e5 // indirect + golang.org/x/term v0.46.0 // indirect + golang.org/x/text v0.42.0 // indirect + golang.org/x/time v0.15.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa // indirect + google.golang.org/protobuf v1.36.11 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect layeh.com/gopher-luar v1.0.11 // indirect - sigs.k8s.io/yaml v1.4.0 // indirect - tags.cncf.io/container-device-interface v1.0.1 // indirect + sigs.k8s.io/yaml v1.6.0 // indirect + tags.cncf.io/container-device-interface v1.1.0 // indirect ) diff --git a/go.sum b/go.sum index c28a1b7..b330ad9 100644 --- a/go.sum +++ b/go.sum @@ -1,20 +1,22 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= -dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= -filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -github.com/14rcole/gopopulate v0.0.0-20180821133914-b175b219e774 h1:SCbEWT58NSt7d2mcFdvxC9uyrdcTfvBbPLThhkDmXzg= -github.com/14rcole/gopopulate v0.0.0-20180821133914-b175b219e774/go.mod h1:6/0dYRLLXyJjbkIPeeGyoJ/eKOSI0eU6eTlCBYibgd0= +cyphar.com/go-pathrs v0.2.5 h1:SnX9FBvnoyn3lUs1dkMgZ52bAETpirNu3FTRh5HlRik= +cyphar.com/go-pathrs v0.2.5/go.mod h1:y8f1EMG7r+hCuFf/rXsKqMJrJAUoADZGNh5/vZPKcGc= +dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= +dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= +filippo.io/edwards25519 v1.2.0 h1:crnVqOiS4jqYleHd9vaKZ+HKtHfllngJIiOpNpoJsjo= +filippo.io/edwards25519 v1.2.0/go.mod h1:xzAOLCNug/yB62zG1bQ8uziwrIqIuxhctzJT18Q77mc= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= -github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk= +github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/Masterminds/semver/v3 v3.5.0 h1:kQceYJfbupGfZOKZQg0kou0DgAKhzDg2NZPAwZ/2OOE= +github.com/Masterminds/semver/v3 v3.5.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/Microsoft/hcsshim v0.12.9 h1:2zJy5KA+l0loz1HzEGqyNnjd3fyZA31ZBCGKacp6lLg= -github.com/Microsoft/hcsshim v0.12.9/go.mod h1:fJ0gkFAna6ukt0bLdKB8djt4XIJhF/vEPuoIWYVvZ8Y= +github.com/ProtonMail/go-crypto v1.4.1 h1:9RfcZHqEQUvP8RzecWEUafnZVtEvrBVL9BiF67IQOfM= +github.com/ProtonMail/go-crypto v1.4.1/go.mod h1:e1OaTyu5SYVrO9gKOEhTc+5UcXtTUa+P3uLudwcgPqo= github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= @@ -26,15 +28,10 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= -github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-sdk-go v1.34.0/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bytecodealliance/wasmtime-go/v37 v37.0.0 h1:DPjdn2V3JhXHMoZ2ymRqGK+y1bDyr9wgpyYCvhjMky8= @@ -43,9 +40,8 @@ github.com/cbroglie/mustache v1.0.1 h1:ivMg8MguXq/rrz2eu3tw6g3b16+PQhoTn6EZAhst2 github.com/cbroglie/mustache v1.0.1/go.mod h1:R/RUa+SobQ14qkP4jtx5Vke5sDytONDQXNLPY/PO69g= github.com/cenkalti/backoff/v3 v3.2.2 h1:cfUAAO3yvKMYKPrvhDuHSwQnhZNk/RMHKdZqKTxfm6M= github.com/cenkalti/backoff/v3 v3.2.2/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= -github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= -github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -63,49 +59,39 @@ github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/cjoudrey/gluahttp v0.0.0-20201111170219-25003d9adfa9 h1:rdWOzitWlNYeUsXmz+IQfa9NkGEq3gA/qQ3mOEqBU6o= github.com/cjoudrey/gluahttp v0.0.0-20201111170219-25003d9adfa9/go.mod h1:X97UjDTXp+7bayQSFZk2hPvCTmTZIicUjZQRtkwgAKY= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/containerd/cgroups/v3 v3.0.5 h1:44na7Ud+VwyE7LIoJ8JTNQOa549a8543BmzaJHo6Bzo= -github.com/containerd/cgroups/v3 v3.0.5/go.mod h1:SA5DLYnXO8pTGYiAHXz94qvLQTKfVM5GEVisn4jpins= +github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk= +github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= +github.com/cloudflare/circl v1.6.3 h1:9GPOhQGF9MCYUeXyMYlqTR6a5gTrgR/fBLXvUgtVcg8= +github.com/cloudflare/circl v1.6.3/go.mod h1:2eXP6Qfat4O/Yhh8BznvKnJ+uzEoTQ6jVKJRn81BiS4= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/containerd/platforms v1.0.0-rc.1 h1:83KIq4yy1erSRgOVHNk1HYdPvzdJ5CnsWaRoJX4C41E= -github.com/containerd/platforms v1.0.0-rc.1/go.mod h1:J71L7B+aiM5SdIEqmd9wp6THLVRzJGXfNuWCZCllLA4= -github.com/containerd/stargz-snapshotter/estargz v0.16.3 h1:7evrXtoh1mSbGj/pfRccTampEyKpjpOnS3CyiV1Ebr8= -github.com/containerd/stargz-snapshotter/estargz v0.16.3/go.mod h1:uyr4BfYfOj3G9WBVE8cOlQmXAbPN9VEQpBBeJIuOipU= -github.com/containerd/typeurl/v2 v2.2.3 h1:yNA/94zxWdvYACdYO8zofhrTVuQY73fFU1y++dYSw40= -github.com/containerd/typeurl/v2 v2.2.3/go.mod h1:95ljDnPfD3bAbDJRugOiShd/DlAAsxGtUBhJxIn7SCk= -github.com/containers/buildah v1.40.1 h1:RW+Fbelwblzg1mJfKfyGZPS4Nbc5QtT866fJ9pYFtYo= -github.com/containers/buildah v1.40.1/go.mod h1:1UCQBc3LZrT4u5R/u7igGgUQxeDlJmn/OyYDQ9mumFk= -github.com/containers/common v0.63.1 h1:6g02gbW34PaRVH4Heb2Pk11x0SdbQ+8AfeKKeQGqYBE= -github.com/containers/common v0.63.1/go.mod h1:+3GCotSqNdIqM3sPs152VvW7m5+Mg8Kk+PExT3G9hZw= -github.com/containers/image/v5 v5.35.0 h1:T1OeyWp3GjObt47bchwD9cqiaAm/u4O4R9hIWdrdrP8= -github.com/containers/image/v5 v5.35.0/go.mod h1:8vTsgb+1gKcBL7cnjyNOInhJQfTUQjJoO2WWkKDoebM= +github.com/containerd/platforms v1.0.0-rc.4 h1:M42JrUT4zfZTqtkUwkr0GzmUWbfyO5VO0Q5b3op97T4= +github.com/containerd/platforms v1.0.0-rc.4/go.mod h1:lKlMXyLybmBedS/JJm11uDofzI8L2v0J2ZbYvNsbq1A= +github.com/containerd/stargz-snapshotter/estargz v0.18.2 h1:yXkZFYIzz3eoLwlTUZKz2iQ4MrckBxJjkmD16ynUTrw= +github.com/containerd/stargz-snapshotter/estargz v0.18.2/go.mod h1:XyVU5tcJ3PRpkA9XS2T5us6Eg35yM0214Y+wvrZTBrY= +github.com/containerd/typeurl/v2 v2.3.0 h1:HZHPhRWo5XMy3QGQoPrUzbW/2ckwjfweHmOwlkIrPAQ= +github.com/containerd/typeurl/v2 v2.3.0/go.mod h1:Qk+PAdUYArVj41TnGi6rJ+48RF0PkcTc4i/taoBcK0w= github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01 h1:Qzk5C6cYglewc+UyGf6lc8Mj2UaPTHy/iF2De0/77CA= github.com/containers/libtrust v0.0.0-20230121012942-c1716e8a8d01/go.mod h1:9rfv8iPl1ZP7aqh9YA68wnZv2NUDbXdcdPHVz0pFbPY= -github.com/containers/ocicrypt v1.2.1 h1:0qIOTT9DoYwcKmxSt8QJt+VzMY18onl9jUXsxpVhSmM= -github.com/containers/ocicrypt v1.2.1/go.mod h1:aD0AAqfMp0MtwqWgHM1bUwe1anx0VazI108CRrSKINQ= -github.com/containers/podman/v5 v5.5.2 h1:H9C6hRs+Aa9g5x/wApHoVqT0fxFr0DH0tgs1h1/ktHc= -github.com/containers/podman/v5 v5.5.2/go.mod h1:mxncFv2XqD6ZlXZnBk4JpGmQfkx1+k7KyuBTy1d4Xfc= -github.com/containers/psgo v1.9.0 h1:eJ74jzSaCHnWt26OlKZROSyUyRcGDf+gYBdXnxrMW4g= -github.com/containers/psgo v1.9.0/go.mod h1:0YoluUm43Mz2UnBIh1P+6V6NWcbpTL5uRtXyOcH0B5A= -github.com/containers/storage v1.58.0 h1:Q7SyyCCjqgT3wYNgRNIL8o/wUS92heIj2/cc8Sewvcc= -github.com/containers/storage v1.58.0/go.mod h1:w7Jl6oG+OpeLGLzlLyOZPkmUso40kjpzgrHUk5tyBlo= +github.com/containers/ocicrypt v1.3.2 h1:MuqHSfiPpGzoAQdgDSX85FgixSgIm9mSDXTLTgugY5E= +github.com/containers/ocicrypt v1.3.2/go.mod h1:ntBZabYG0rlvstB/1rK/ba2laaU5EHE0pD5ioHoPTq4= +github.com/containers/psgo v1.10.0 h1:r9cEzAMVRtC0sw4ayIPjbd9EgF9pPaTCqKgDHhS0D/8= +github.com/containers/psgo v1.10.0/go.mod h1:e44fw+1A7eJH1y0eWAo3P7sjfftXDlfF4AY498h+svQ= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd/v22 v22.5.1-0.20231103132048-7d375ecc2b09 h1:OoRAFlvDGCUqDLampLQjk0yeeSGdF9zzst/3G9IkBbc= -github.com/coreos/go-systemd/v22 v22.5.1-0.20231103132048-7d375ecc2b09/go.mod h1:m2r/smMKsKwgMSAoFKHaa68ImdCSNuKE1MxvQ64xuCQ= +github.com/coreos/go-systemd/v22 v22.7.0 h1:LAEzFkke61DFROc7zNLX/WA2i5J8gYqe0rSj9KI28KA= +github.com/coreos/go-systemd/v22 v22.7.0/go.mod h1:xNUYtjHu2EDXbsxz1i41wouACIwT7Ybq9o0BQhMwD0w= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= -github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= -github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s= +github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467 h1:uX1JmpONuD549D73r6cgnxyUu18Zb7yHAy5AYU0Pm4Q= github.com/cyberphone/json-canonicalization v0.0.0-20241213102144-19d51d7fe467/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw= -github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s= -github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= +github.com/cyphar/filepath-securejoin v0.7.0 h1:s0Y3ITPy6sQn5xt54DuYvTF8hu134ooYLUb58DX/HjE= +github.com/cyphar/filepath-securejoin v0.7.0/go.mod h1:ymLGms/u3BYaviIiuKFnUx8EkQEZeK6cInNoAPJA3o4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -114,18 +100,14 @@ github.com/disiqueira/gotree/v3 v3.0.2 h1:ik5iuLQQoufZBNPY518dXhiO5056hyNBIK9lWh github.com/disiqueira/gotree/v3 v3.0.2/go.mod h1:ZuyjE4+mUQZlbpkI24AmruZKhg3VHEgPLDY8Qk+uUu8= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/cli v28.0.4+incompatible h1:pBJSJeNd9QeIWPjRcV91RVJihd/TXB77q1ef64XEu4A= -github.com/docker/cli v28.0.4+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v29.6.2+incompatible h1:/bjePvcbbFTnRrMfWJBY7AjfICdsiLVgHn6LwTVOcqw= +github.com/docker/cli v29.6.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v28.1.1+incompatible h1:49M11BFLsVO1gxY9UX9p/zwkE/rswggs8AdFmXQw51I= -github.com/docker/docker v28.1.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.9.3 h1:gAm/VtF9wgqJMoxzT3Gj5p4AqIjCBS4wrsOh9yRqcz8= -github.com/docker/docker-credential-helpers v0.9.3/go.mod h1:x+4Gbw9aGmChi3qTLZj8Dfn0TD20M/fuWy0E5+WDeCo= -github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= -github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= -github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= -github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/docker-credential-helpers v0.9.8 h1:bIREROb7So6PRlq6KTtdS9MPEjC29OQRkFNlvK2OX8Q= +github.com/docker/docker-credential-helpers v0.9.8/go.mod h1:v1S+hepowrQXITkEfw6o4+BMbGot02wiKpzWhGUZK6c= +github.com/docker/go-connections v0.8.1 h1:JibmG5hULs5qXSr/cp/w3Pw5fZuStt4MOHMUExb29/M= +github.com/docker/go-connections v0.8.1/go.mod h1:no1qkHdjq7kLMGUXYAduOhYPSJxxvgWBh7ogVvptn3Q= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dolthub/go-mysql-server v0.14.1-0.20230203234751-35092f80aa59 h1:puVbTWGX6h0pdi6J8n6dilweYk7jU8LElfw8yBxLHEk= @@ -133,24 +115,22 @@ github.com/dolthub/go-mysql-server v0.14.1-0.20230203234751-35092f80aa59/go.mod github.com/dolthub/vitess v0.0.0-20230201234433-864c7d109df8 h1:h1DBe5+9JIArCVsBV14fA+RHDXWY8ynUheDL5ZVPOTg= github.com/dolthub/vitess v0.0.0-20230201234433-864c7d109df8/go.mod h1:oVFIBdqMFEkt4Xz2fzFJBNtzKhDEjwdCF0dzde39iKs= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= -github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/fatih/color v1.19.0 h1:Zp3PiM21/9Ld6FzSKyL5c/BULoe/ONr9KlbYVOfG8+w= +github.com/fatih/color v1.19.0/go.mod h1:zNk67I0ZUT1bEGsSGyCZYZNrHuTkJJB+r6Q9VuMi0LE= github.com/felipejfc/gluahttpscrape v0.0.0-20170525191632-10580c4a38f9 h1:kIlnHosQDt7Pardfrxd5tC+b0i8Vo8OJS+0xPOZ08yw= github.com/felipejfc/gluahttpscrape v0.0.0-20170525191632-10580c4a38f9/go.mod h1:jR+jijGPRico00IRrqZ0O9TEtexL0F/bTDNQ1TBPAD4= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= -github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/go-jose/go-jose/v3 v3.0.3 h1:fFKWeig/irsp7XD2zBxvnmA/XaRWp5V3CBsZXJF7G7k= -github.com/go-jose/go-jose/v3 v3.0.3/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= -github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE= -github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA= +github.com/fsnotify/fsnotify v1.10.1 h1:b0/UzAf9yR5rhf3RPm9gf3ehBPpf0oZKIjtpKrx59Ho= +github.com/fsnotify/fsnotify v1.10.1/go.mod h1:TLheqan6HD6GBK6PrDWyDPBaEV8LspOxvPSjC+bVfgo= +github.com/fsouza/go-dockerclient v1.13.2 h1:u+jAOuR9TZ3PAx2pdHA+ALt1ZZhS8Qx+A4d964IqXtw= +github.com/fsouza/go-dockerclient v1.13.2/go.mod h1:SJu2b0vfcF8sbsWs9VVG03iEjsogvo7JADvsi2wVYAI= +github.com/go-jose/go-jose/v3 v3.0.5 h1:BLLJWbC4nMZOfuPVxoZIxeYsn6Nl2r1fITaJ78UQlVQ= +github.com/go-jose/go-jose/v3 v3.0.5/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= +github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= +github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo= @@ -164,29 +144,9 @@ github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU= -github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo= -github.com/go-openapi/errors v0.22.1 h1:kslMRRnK7NCb/CvR1q1VWuEQCEIsBGn5GgKD9e+HYhU= -github.com/go-openapi/errors v0.22.1/go.mod h1:+n/5UdIqdVnLIJ6Q9Se8HNGUXYaY6CN8ImWzfi/Gzp0= -github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= -github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= -github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= -github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= -github.com/go-openapi/loads v0.22.0 h1:ECPGd4jX1U6NApCGG1We+uEozOAvXvJSF4nnwHZ8Aco= -github.com/go-openapi/loads v0.22.0/go.mod h1:yLsaTCS92mnSAZX5WWoxszLj0u+Ojl+Zs5Stn1oF+rs= -github.com/go-openapi/runtime v0.28.0 h1:gpPPmWSNGo214l6n8hzdXYhPuJcGtziTOgUpvsFWGIQ= -github.com/go-openapi/runtime v0.28.0/go.mod h1:QN7OzcS+XuYmkQLw05akXk0jRH/eZ3kb18+1KwW9gyc= -github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= -github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= -github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c= -github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4= -github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU= -github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0= -github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58= -github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.9.1 h1:FrjNGn/BsJQjVRuSa8CBrM5BWA9BWoXXat3KrtSb/iI= -github.com/go-sql-driver/mysql v1.9.1/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= +github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo= +github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= @@ -194,17 +154,11 @@ github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/gocraft/dbr/v2 v2.7.2 h1:ccUxMuz6RdZvD7VPhMRRMSS/ECF3gytPhPtcavjktHk= github.com/gocraft/dbr/v2 v2.7.2/go.mod h1:5bCqyIXO5fYn3jEp/L06QF4K1siFdhxChMjdNu6YJrg= -github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.1.1-0.20241109141217-c266b19b28e9 h1:Kzr9J0S0V2PRxiX6B6xw1kWjzsIyjLO2Ibi4fNTaYBM= -github.com/godbus/dbus/v5 v5.1.1-0.20241109141217-c266b19b28e9/go.mod h1:3AAv2+hPq5rdnr5txxxRwiGjPXamgoIHgz9FPBfOp3c= +github.com/godbus/dbus/v5 v5.2.2 h1:TUR3TgtSVDmjiXOgAAyaZbYmIeP3DPkld3jgKGV8mXQ= +github.com/godbus/dbus/v5 v5.2.2/go.mod h1:3AAv2+hPq5rdnr5txxxRwiGjPXamgoIHgz9FPBfOp3c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= -github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -213,7 +167,6 @@ github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:x github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= @@ -222,26 +175,22 @@ github.com/gomarkdown/markdown v0.0.0-20260217112301-37c66b85d6ab h1:VYNivV7P8IR github.com/gomarkdown/markdown v0.0.0-20260217112301-37c66b85d6ab/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= github.com/google/flatbuffers v2.0.6+incompatible h1:XHFReMv7nFFusa+CEokzWbzaYocKXI6C7hdU5Kgh9Lw= github.com/google/flatbuffers v2.0.6+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -github.com/google/go-containerregistry v0.20.3 h1:oNx7IdTI936V8CQRveCjaxOiegWwvM7kqkbXTpyiovI= -github.com/google/go-containerregistry v0.20.3/go.mod h1:w00pIgBRDVUDFM6bq+Qx8lwNWK+cxgCuX1vd3PIBDNI= +github.com/google/go-containerregistry v0.21.6 h1:T+yqQIlJXKrM98Om4DlW3GoWQAmhZuLMwoDOvVrtiUM= +github.com/google/go-containerregistry v0.21.6/go.mod h1:U7MMSBIJynke2MVQrQk19NP9k/uQsGz/h0amIFSHMbo= github.com/google/go-intervals v0.0.2 h1:FGrVEiUnTRKR8yE04qzXYaJMtnIYqobR5QbblK3ixcM= github.com/google/go-intervals v0.0.2/go.mod h1:MkaR3LNRfeKLPmqgJYs4E66z5InYjmCjbbr4TQlcT6Y= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8= -github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/pprof v0.0.0-20260402051712-545e8a4df936 h1:EwtI+Al+DeppwYX2oXJCETMO23COyaKGP6fHVpkpWpg= +github.com/google/pprof v0.0.0-20260402051712-545e8a4df936/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -249,8 +198,8 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/schema v1.4.1 h1:jUg5hUjCSDZpNGLuXQOgIWGdlgrIdYvgQ0wZtdK1M3E= github.com/gorilla/schema v1.4.1/go.mod h1:Dg5SSm5PV60mhF2NFaTV1xuYYj8tV8NOPRo4FggUMnM= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 h1:VNqngBF40hVlDloBruUehVYC3ArSgIyScOAyMRqBxRg= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1/go.mod h1:RBRO7fro65R6tjKzYgLAFo0t1QEXY1Dp+i/bvpRiqiQ= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 h1:5VipnvEpbqr2gA2VbM+nYVbkIF28c5ZQfqCBQ5g2xfk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0/go.mod h1:Hyl3n6Twe1hvtd9XUXDec4pTvgMSEixRuQKPTMH2bNs= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -258,24 +207,22 @@ github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9n github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= -github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= +github.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48= +github.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3iS0jrZ7LvzFGFmuKbw= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7 h1:UpiO20jno/eV1eVZcxqWnUohyKRe1g8FPV/xH1s/2qs= -github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7/go.mod h1:QmrqtbKuxxSWTN3ETMPuB+VtEiBJ/A9XhoYGv8E1uD8= -github.com/hashicorp/go-secure-stdlib/strutil v0.1.1/go.mod h1:gKOamz3EwoIoJq7mlMIRBpVTAUn8qPCrEclOKKWhD3U= +github.com/hashicorp/go-secure-stdlib/parseutil v0.2.0 h1:U+kC2dOhMFQctRfhK0gRctKAPTloZdMU5ZJxaesJ/VM= +github.com/hashicorp/go-secure-stdlib/parseutil v0.2.0/go.mod h1:Ll013mhdmsVDuoIXVfBtvgGJsXDYkTw1kooNcoCXuE0= github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9CdjCtrXrXGuOpxEA7Ts= github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4= -github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/hashicorp/go-sockaddr v1.0.7 h1:G+pTkSO01HpR5qCxg7lxfsFEZaG+C0VssTy/9dbT+Fw= +github.com/hashicorp/go-sockaddr v1.0.7/go.mod h1:FZQbEYa1pxkQ7WLpyXJ6cbjpT8q0YgQaK/JakXqGyWw= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/hcl v1.0.1-vault-7 h1:ag5OxFVy3QYTFTJODRzTKVZ6xvdfLLCA1cy/Y6xGI0I= +github.com/hashicorp/hcl v1.0.1-vault-7/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= github.com/hashicorp/vault/api v1.12.2 h1:7YkCTE5Ni90TcmYHDBExdt4WGJxhpzaHqR6uGbQb/rE= github.com/hashicorp/vault/api v1.12.2/go.mod h1:LSGf1NGT1BnvFFnKVtnvcaLBM2Lz+gJdpL6HUYed8KE= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= @@ -285,10 +232,6 @@ github.com/jedib0t/go-pretty/v6 v6.5.9/go.mod h1:zbn98qrYlh95FIhwwsbIip0LYpwSG8S github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= -github.com/jmhodges/clock v1.2.0 h1:eq4kys+NI0PLngzaHEe7AmPT90XMGIEySD1JfV1PDIs= -github.com/jmhodges/clock v1.2.0/go.mod h1:qKjhA7x7u/lQpPB1XAqX1b1lCI/w3/fNuYpI/ZjLynI= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -299,12 +242,12 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/junhsieh/goexamples v0.0.0-20210908032526-acdd3160140b h1:9HQYGbaDnuRLMuM//SZVkZJ43ANmMStSAQAx4aQX3II= github.com/junhsieh/goexamples v0.0.0-20210908032526-acdd3160140b/go.mod h1:JNqB8Da6SnlJvmZusESDfgqUkJXO6+/a1by1etsVJ2M= -github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= -github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kevinburke/ssh_config v1.5.0 h1:3cPZmE54xb5j3G5xQCjSvokqNwU2uW+3ry1+PRLSPpA= +github.com/kevinburke/ssh_config v1.5.0/go.mod h1:q2RIzfka+BXARoNexmF9gkxEX7DmvbW9P4hIVx2Kg4M= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/compress v1.19.1 h1:VsB4HPswih7mmZ8WleSFQ75c/Ui1M4trX5oAsJnhSlk= +github.com/klauspost/compress v1.19.1/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -323,57 +266,58 @@ github.com/layeh/gopher-json v0.0.0-20201124131017-552bb3c4c3bf h1:bg6J/5S/AeTz7 github.com/layeh/gopher-json v0.0.0-20201124131017-552bb3c4c3bf/go.mod h1:E/q28EyUVBgBQnONAVPIdwvEsv4Ve0vaCA9JWim4+3I= github.com/lestrrat-go/strftime v1.0.4 h1:T1Rb9EPkAhgxKqbcMIPguPq8glqXTA1koF8n9BHElA8= github.com/lestrrat-go/strftime v1.0.4/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR76fd03sz+Qz4g= -github.com/letsencrypt/boulder v0.0.0-20240620165639-de9c06129bec h1:2tTW6cDth2TSgRbAhD7yjZzTQmcN25sDRPEeinR51yQ= -github.com/letsencrypt/boulder v0.0.0-20240620165639-de9c06129bec/go.mod h1:TmwEoGCwIti7BCeJ9hescZgRtatxRE+A72pCoPfmcfk= github.com/lib/pq v1.7.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= -github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= -github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.27 h1:Feg/Oou5zI/wnpgDF6omIU0OokC9GxLC/WRknhVlIR0= +github.com/mattn/go-runewidth v0.0.27/go.mod h1:3qAiGCV4Koz/yuveO58qUefmUTRm8r0IGEXZ9jeHp/8= github.com/mattn/go-sqlite3 v1.14.3/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= -github.com/mattn/go-sqlite3 v1.14.28 h1:ThEiQrnbtumT+QMknw63Befp/ce/nUPgBPMlRFEum7A= -github.com/mattn/go-sqlite3 v1.14.28/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/mattn/go-sqlite3 v1.14.49 h1:B8jBHC3xhxZgxztrgruTuLucebnULQnx4W7cF7SAE9w= +github.com/mattn/go-sqlite3 v1.14.49/go.mod h1:6JTjA44L93a0QCyJef5YvlPoKXntQPjzWv5gtm9sB6w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= -github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/miekg/pkcs11 v1.1.2 h1:/VxmeAX5qU6Q3EwafypogwWbYryHFmF2RpkJmw3m4MQ= +github.com/miekg/pkcs11 v1.1.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q= github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= -github.com/mistifyio/go-zfs/v3 v3.0.1 h1:YaoXgBePoMA12+S1u/ddkv+QqxcfiZK4prI6HPnkFiU= -github.com/mistifyio/go-zfs/v3 v3.0.1/go.mod h1:CzVgeB0RvF2EGzQnytKVvVSDwmKJXxkOTUGbNrTja/k= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mistifyio/go-zfs/v4 v4.0.0 h1:sU0+5dX45tdDK5xNZ3HBi95nxUc48FS92qbIZEvpAg4= +github.com/mistifyio/go-zfs/v4 v4.0.0/go.mod h1:weotFtXTHvBwhr9Mv96KYnDkTPBOHFUbm9cBmQpesL0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/hashstructure v1.1.0 h1:P6P1hdjqAAknpY/M1CGipelZgp+4y9ja9kmUZPXP+H0= github.com/mitchellh/hashstructure v1.1.0/go.mod h1:xUDAozZz0Wmdiufv0uyhnHkUTN6/6d8ulp4AwfLKrmA= github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/moby/buildkit v0.31.2 h1:UsaoSa0z45ycj+8DqWwmiXKnszDSNvv3wYPGLVtcEKE= +github.com/moby/buildkit v0.31.2/go.mod h1:q1QO35x5YryiXLONScL2IybwMIziz6Rq3FBznz8fmGc= github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= -github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw= -github.com/moby/sys/atomicwriter v0.1.0/go.mod h1:Ul8oqv2ZMNHOceF643P6FKPXeCmYtlQMvpizfsSoaWs= +github.com/moby/go-archive v0.3.0 h1:nos4BtzzUIqB406BgQnWGMI4qib9BZ8XUHU+ucv/n1c= +github.com/moby/go-archive v0.3.0/go.mod h1:Npdv43fFqlhZW7Xo8fbm3ZMYFvAGNviUPqX21VERbcE= +github.com/moby/moby/api v1.55.0 h1:2/sexvQyqIWS8pRSCFddBfpW2qE7vR7FCL+vN8pxwMc= +github.com/moby/moby/api v1.55.0/go.mod h1:+RQ6wluLwtYaTd1WnPLykIDPekkuyD/ROWQClE83pzs= +github.com/moby/moby/client v0.5.1 h1:tYNaJno4c0HXz12y5BiqEDy0rVTYkWzI26lGvnTMiJw= +github.com/moby/moby/client v0.5.1/go.mod h1:odLstlZ6uSnfvAgVxMpvgmb8SUdd+siH2T0GBuxVAlM= +github.com/moby/patternmatcher v0.6.1 h1:qlhtafmr6kgMIJjKJMDmMWq7WLkKIo23hsrpR3x084U= +github.com/moby/patternmatcher v0.6.1/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= github.com/moby/sys/capability v0.4.0 h1:4D4mI6KlNtWMCM1Z/K0i7RV1FkX+DBDHKVJpCndZoHk= github.com/moby/sys/capability v0.4.0/go.mod h1:4g9IK291rVkms3LKCDOoYlnV8xKwoDTpIrNEE35Wq0I= +github.com/moby/sys/devices v0.1.0 h1:uaMrDm1U3h0AwUDNWeT5lBV40v0eayt+VuukRbYn5K4= +github.com/moby/sys/devices v0.1.0/go.mod h1:nIV6AO7t0DY2ObAm1GfL4AX9mBRqzxzHwGfvNCR9lfI= github.com/moby/sys/mountinfo v0.7.2 h1:1shs6aH5s4o5H2zQLn796ADW1wMrIwHsyJ2v9KouLrg= github.com/moby/sys/mountinfo v0.7.2/go.mod h1:1YOa8w8Ih7uW0wALDUgT1dTTSBrZ+HiBLGws92L2RU4= -github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU= -github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko= -github.com/moby/sys/user v0.4.0 h1:jhcMKit7SA80hivmFJcbB1vqmw//wU61Zdui2eQXuMs= -github.com/moby/sys/user v0.4.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs= +github.com/moby/sys/sequential v0.7.0 h1:ASQNGNROJSuOO6LL6bPHbKvuZu6NU8P4ldPWk31zj/8= +github.com/moby/sys/sequential v0.7.0/go.mod h1:NfSTAp6V3fw4tmkD62PEcOKeZKquXT8VKCkf7aVR79o= +github.com/moby/sys/user v0.4.1 h1:RgjRlaDKi/Xmyrz4t8lyzXT6v2ooFeO/7xtchmhVWE0= +github.com/moby/sys/user v0.4.1/go.mod h1:E9QsW5WRe1kUAf7kW8hXKwu1uhsZEAdPLYHYSDudF4Y= github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ= @@ -383,13 +327,10 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/montanaflynn/stats v0.6.3/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nats-io/jwt/v2 v2.7.3 h1:6bNPK+FXgBeAqdj4cYQ0F8ViHRbi7woQLq4W29nUAzE= @@ -404,140 +345,120 @@ github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= -github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/oliveagle/jsonpath v0.0.0-20180606110733-2e52cf6e6852 h1:Yl0tPBa8QPjGmesFh1D0rDy+q1Twx6FyU7VWHi8wZbI= github.com/oliveagle/jsonpath v0.0.0-20180606110733-2e52cf6e6852/go.mod h1:eqOVx5Vwu4gd2mmMZvVZsgIqNSaW3xxRThUJ0k/TPk4= -github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus= -github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8= -github.com/onsi/gomega v1.37.0 h1:CdEG8g0S133B4OswTDC/5XPSzE1OeP29QOioj2PID2Y= -github.com/onsi/gomega v1.37.0/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0= -github.com/opencontainers/cgroups v0.0.1 h1:MXjMkkFpKv6kpuirUa4USFBas573sSAY082B4CiHEVA= -github.com/opencontainers/cgroups v0.0.1/go.mod h1:s8lktyhlGUqM7OSRL5P7eAW6Wb+kWPNvt4qvVfzA5vs= +github.com/onsi/ginkgo/v2 v2.33.0 h1:C8gBA6Uc2ZEubiV+SXiu5tZnMTwEmXHgkJwGozKtZf8= +github.com/onsi/ginkgo/v2 v2.33.0/go.mod h1:+aXOY+vzZ5mu2iI2HpTZUPmM//oQfsNFX6gU9kNcA44= +github.com/onsi/gomega v1.44.0 h1:eAiGl3Pw5jz5GQdDff0BcxYpAX1JxW8xD7mFUuwNfZQ= +github.com/onsi/gomega v1.44.0/go.mod h1:e/C2HwaZ1DhvjzXXuFhcR7hY7Sh9pl7MmoWKEjzwcdA= +github.com/opencontainers/cgroups v0.0.8 h1:dQZyCsB73ggKJUzNl4FLbpvArrLv1tLOjMYPHswdUrI= +github.com/opencontainers/cgroups v0.0.8/go.mod h1:hPBRvnBhLZueEN0eJyozMeM3HeFGYlZW9KnO//px6G4= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= -github.com/opencontainers/runc v1.2.6 h1:P7Hqg40bsMvQGCS4S7DJYhUZOISMLJOB2iGX5COWiPk= -github.com/opencontainers/runc v1.2.6/go.mod h1:dOQeFo29xZKBNeRBI0B19mJtfHv68YgCTh1X+YphA+4= -github.com/opencontainers/runtime-spec v1.2.1 h1:S4k4ryNgEpxW1dzyqffOmhI1BHYcjzU8lpJfSlR0xww= -github.com/opencontainers/runtime-spec v1.2.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-tools v0.9.1-0.20250303011046-260e151b8552 h1:CkXngT0nixZqQUPDVfwVs3GiuhfTqCMk0V+OoHpxIvA= -github.com/opencontainers/runtime-tools v0.9.1-0.20250303011046-260e151b8552/go.mod h1:T487Kf80NeF2i0OyVXHiylg217e0buz8pQsa0T791RA= -github.com/opencontainers/selinux v1.12.0 h1:6n5JV4Cf+4y0KNXW48TLj5DwfXpvWlxXplUkdTrmPb8= -github.com/opencontainers/selinux v1.12.0/go.mod h1:BTPX+bjVbWGXw7ZZWUbdENt8w0htPSrlgOOysQaU62U= -github.com/ostreedev/ostree-go v0.0.0-20210805093236-719684c64e4f h1:/UDgs8FGMqwnHagNDPGOlts35QkhAZ8by3DR7nMih7M= -github.com/ostreedev/ostree-go v0.0.0-20210805093236-719684c64e4f/go.mod h1:J6OG6YJVEWopen4avK3VNQSnALmmjvniMmni/YFYAwc= +github.com/opencontainers/runtime-spec v1.3.0 h1:YZupQUdctfhpZy3TM39nN9Ika5CBWT5diQ8ibYCRkxg= +github.com/opencontainers/runtime-spec v1.3.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.9.1-0.20260316125833-8a4db579f5c8 h1:2NAWFjN0PmdIe3XojVL9wf3lJ1//VqAgc7MOSYHQslE= +github.com/opencontainers/runtime-tools v0.9.1-0.20260316125833-8a4db579f5c8/go.mod h1:DKDEfzxvRkoQ6n9TGhxQgg2IM1lY4aM0eaQP4e3oElw= +github.com/opencontainers/selinux v1.15.1 h1:ERxeh5caJvCzNAKdI8WQbJmB1LDTn4BuaAg8wihLBpA= +github.com/opencontainers/selinux v1.15.1/go.mod h1:LenyElirjUHszfxrjuFqC85HIeXZKumHcKMQtnaDlQQ= +github.com/openshift/imagebuilder v1.2.21 h1:XX0tZVznWTxzYevvNVZ/0eeTzmgY6cfcT4/xjs5ToyU= +github.com/openshift/imagebuilder v1.2.21/go.mod h1:+L09sXUQ0RPdCU1tmzKrfBhqMlYvZtaA3MHb7aTjVU8= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.9 h1:4NGkvGudBL7GteO3m6qnaQ4pC0Kvf0onSVc9gR3EWBw= -github.com/pkg/sftp v1.13.9/go.mod h1:OBN7bVXdstkFFN/gdnHPUb5TE8eb8G1Rp9wCItqjkkA= +github.com/pkg/sftp v1.13.11 h1:0N92SLTB8JqASJB14ZLHHzFnBV8mG9zw4K7jghEFWuE= +github.com/pkg/sftp v1.13.11/go.mod h1:uNkH9roSXglNJqM+glJJi+TQXQUm0fXFWqCFmT8hsN0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/proglottis/gpgme v0.1.4 h1:3nE7YNA70o2aLjcg63tXMOhPD7bplfE5CBdV+hLAm2M= -github.com/proglottis/gpgme v0.1.4/go.mod h1:5LoXMgpE4bttgwwdv9bLs/vwqv3qV7F4glEEZ7mRKrM= +github.com/proglottis/gpgme v0.1.6 h1:8WpQ8VWggLdxkuTnW+sZ1r1t92XBNd8GZNDhQ4Rz+98= +github.com/proglottis/gpgme v0.1.6/go.mod h1:5LoXMgpE4bttgwwdv9bLs/vwqv3qV7F4glEEZ7mRKrM= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.21.1 h1:DOvXXTqVzvkIewV/CDPFdejpMCGeMcbGCQ8YOmu+Ibk= -github.com/prometheus/client_golang v1.21.1/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= -github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= -github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= -github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= -github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= -github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 h1:PKK9DyHxif4LZo+uQSgXNqs0jj5+xZwwfKHgph2lxBw= -github.com/santhosh-tekuri/jsonschema/v6 v6.0.1/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= -github.com/sebdah/goldie/v2 v2.5.5 h1:rx1mwF95RxZ3/83sdS4Yp7t2C5TCokvWP4TBRbAyEWY= -github.com/sebdah/goldie/v2 v2.5.5/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI= -github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= -github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= -github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= -github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= -github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/sigstore/fulcio v1.6.6 h1:XaMYX6TNT+8n7Npe8D94nyZ7/ERjEsNGFC+REdi/wzw= -github.com/sigstore/fulcio v1.6.6/go.mod h1:BhQ22lwaebDgIxVBEYOOqLRcN5+xOV+C9bh/GUXRhOk= -github.com/sigstore/protobuf-specs v0.4.1 h1:5SsMqZbdkcO/DNHudaxuCUEjj6x29tS2Xby1BxGU7Zc= -github.com/sigstore/protobuf-specs v0.4.1/go.mod h1:+gXR+38nIa2oEupqDdzg4qSBT0Os+sP7oYv6alWewWc= -github.com/sigstore/rekor v1.3.10 h1:/mSvRo4MZ/59ECIlARhyykAlQlkmeAQpvBPlmJtZOCU= -github.com/sigstore/rekor v1.3.10/go.mod h1:JvryKJ40O0XA48MdzYUPu0y4fyvqt0C4iSY7ri9iu3A= -github.com/sigstore/sigstore v1.9.3 h1:y2qlTj+vh+Or3ictKuR3JUFawZPdDxAjrWkeFhon0OQ= -github.com/sigstore/sigstore v1.9.3/go.mod h1:VwYkiw0G0dRtwL25KSs04hCyVFF6CYMd/qvNeYrl7EQ= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= +github.com/sebdah/goldie/v2 v2.8.0 h1:dZb9wR8q5++oplmEiJT+U/5KyotVD+HNGCAc5gNr8rc= +github.com/sebdah/goldie/v2 v2.8.0/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI= +github.com/secure-systems-lab/go-securesystemslib v0.11.0 h1:iuCR9kcMFD4QurdKrGvPLoKZLv9YvwPYVr0473BdtFs= +github.com/secure-systems-lab/go-securesystemslib v0.11.0/go.mod h1:+PMOTjUGwHj2vcZ+TFKlb1tXRbrdWE1LYDT5i9JC80Q= +github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw= +github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= +github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= +github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= +github.com/sigstore/fulcio v1.8.7 h1:d7QJQxukgXarqPCT9uDNeyzt1Bbt/biw58/VfOnwI/o= +github.com/sigstore/fulcio v1.8.7/go.mod h1:7fX+QyigZxRGKTgHvTfOfxwwniCDxK02PVloHy5/vg4= +github.com/sigstore/protobuf-specs v0.5.1 h1:/5OPaNuolRJmQfeZLayJGFXMpsRJEdgC6ah1/+7Px7U= +github.com/sigstore/protobuf-specs v0.5.1/go.mod h1:DRBzpFuE+LnvQMN10/dU6nBeKwVLGEQ6o2FovN2Rats= +github.com/sigstore/sigstore v1.10.8 h1:1Mgkxvkw4AXMfIP1DOjc6kw0GkUgA8pGVpveN/EfOq4= +github.com/sigstore/sigstore v1.10.8/go.mod h1:f9+B/4iaYimvUkySyb2mvc73n3RLqNn24grHZM/ET8M= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnBY8= -github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY= -github.com/smallstep/pkcs7 v0.1.1 h1:x+rPdt2W088V9Vkjho4KtoggyktZJlMduZAtRHm68LU= -github.com/smallstep/pkcs7 v0.1.1/go.mod h1:dL6j5AIz9GHjVEBTXtW+QliALcgM19RtXaTeyxI+AfA= -github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= -github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= -github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= -github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/sirupsen/logrus v1.10.2 h1:G2SED73/qrAu6YwbdxOD6peLkCBI3z7L+ykJFTXJBBo= +github.com/sirupsen/logrus v1.10.2/go.mod h1:SLEg8TqYulVKKfIGHldVp2K2aYz2DKSVBq4g/H5bR7Q= +github.com/skeema/knownhosts v1.3.2 h1:EDL9mgf4NzwMXCTfaxSD/o/a5fxDw/xL9nkU28JjdBg= +github.com/skeema/knownhosts v1.3.2/go.mod h1:bEg3iQAuw+jyiw+484wwFJoKSLwcfd7fqRy+N0QTiow= +github.com/smallstep/pkcs7 v0.2.1 h1:6Kfzr/QizdIuB6LSv8y1LJdZ3aPSfTNhTLqAx9CTLfA= +github.com/smallstep/pkcs7 v0.2.1/go.mod h1:RcXHsMfL+BzH8tRhmrF1NkkpebKpq3JEM66cOFxanf0= +github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= +github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stefanberger/go-pkcs11uri v0.0.0-20230803200340-78284954bff6 h1:pnnLyeX7o/5aX8qUQ69P/mLojDqwda8hFOCBTmP/6hw= github.com/stefanberger/go-pkcs11uri v0.0.0-20230803200340-78284954bff6/go.mod h1:39R/xuhNgVhi+K0/zst4TLrJrVmbm6LVgl4A0+ZFS5M= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= -github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -github.com/sylabs/sif/v2 v2.21.1 h1:GZ0b5//AFAqJEChd8wHV/uSKx/l1iuGYwjR8nx+4wPI= -github.com/sylabs/sif/v2 v2.21.1/go.mod h1:YoqEGQnb5x/ItV653bawXHZJOXQaEWpGwHsSD3YePJI= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tchap/go-patricia/v2 v2.3.2 h1:xTHFutuitO2zqKAQ5rCROYgUb7Or/+IC3fts9/Yc7nM= -github.com/tchap/go-patricia/v2 v2.3.2/go.mod h1:VZRHKAb53DLaG+nA9EaYYiaEx6YztwDlLElMsnSHD4k= +github.com/stretchr/testify v1.12.1 h1:EuwCh5fleGS7H32xRwO3wRGT7DxrDhLAT6FF8MpWDWE= +github.com/stretchr/testify v1.12.1/go.mod h1:MDEgiDPPsNp5cuIrHPPCyornHKgEVbtFUmoNlxoYthg= +github.com/sylabs/sif/v2 v2.24.1 h1:OhTOfTwBaGXfbWYWXK9C6Pojma3A1bTaNJ6CEhyuKok= +github.com/sylabs/sif/v2 v2.24.1/go.mod h1:PRq9MoP0g+p0qE5ZRGrOhyVAUdHrPsAVmXHgoiW6VU0= +github.com/tchap/go-patricia/v2 v2.3.3 h1:xfNEsODumaEcCcY3gI0hYPZ/PcpVv5ju6RMAhgwZDDc= +github.com/tchap/go-patricia/v2 v2.3.3/go.mod h1:VZRHKAb53DLaG+nA9EaYYiaEx6YztwDlLElMsnSHD4k= github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog= github.com/tengattack/gluasql v0.0.0-20240325124313-344b155b513c h1:5zktAHt9I9E60EdvwBqUtqNmW9tSQ/w0PWsUsyAH50o= github.com/tengattack/gluasql v0.0.0-20240325124313-344b155b513c/go.mod h1:8cuhyINcV24UzFfH5TV+o7U6joOtX3y/YBDT53/qMxM= -github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 h1:e/5i7d4oYZ+C1wj2THlRK+oAhjeS/TRQwMfkIuet3w0= -github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399/go.mod h1:LdwHTNJT99C5fTAzDz0ud328OgXz+gierycbcIx2fRs= -github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc= -github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ulikunitz/xz v0.5.16 h1:ld6NyySjx5lowVKwJvMRLnW5nxKX/xnpSiFYZ/Lxur0= +github.com/ulikunitz/xz v0.5.16/go.mod h1:H9Rt/W6/Qj27PGauhQc6nfCDy7vHpzsOThBSaYDoEhw= github.com/vadv/gopher-lua-libs v0.5.0 h1:m0hhWia1A1U3PIRmtdHWBj88ogzuIjm6HUBmtUa0Tz4= github.com/vadv/gopher-lua-libs v0.5.0/go.mod h1:mlSOxmrjug7DwisiH7xBFnBellHobPbvAIhVeI/4SYY= -github.com/vbatts/tar-split v0.12.1 h1:CqKoORW7BUWBe7UL/iqTVvkTBOF8UvOMKOIZykxnnbo= -github.com/vbatts/tar-split v0.12.1/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA= -github.com/vbauerster/mpb/v8 v8.9.3 h1:PnMeF+sMvYv9u23l6DO6Q3+Mdj408mjLRXIzmUmU2Z8= -github.com/vbauerster/mpb/v8 v8.9.3/go.mod h1:hxS8Hz4C6ijnppDSIX6LjG8FYJSoPo9iIOcE53Zik0c= +github.com/vbatts/tar-split v0.12.3 h1:Cd46rkGXI3Td4yrVNwU8ripbxFaQbmesqhjBUUYAJSw= +github.com/vbatts/tar-split v0.12.3/go.mod h1:sQOc6OlqGCr7HkGx/IDBeKiTIvqhmj8KffNhEXG4Nq0= +github.com/vbauerster/cupwriter v0.0.4 h1:9sBPe0uXWLZuWQU5lqVbhyFlxX6c09asST/YfatFAys= +github.com/vbauerster/cupwriter v0.0.4/go.mod h1:IFyzS6Xis5dnBH/rdAhrnuzg3c+KkUqEN6yE8lhJlDw= +github.com/vbauerster/mpb/v8 v8.14.0 h1:55SR80dptMfASxIG/oCEkBXgBhxeSu4GrVsjl16oKmA= +github.com/vbauerster/mpb/v8 v8.14.0/go.mod h1:HgpQPKfcWe3kbuGGPmi+jatHreMase5C3Fp5dpdAy0Q= +github.com/vishvananda/netlink v1.3.1 h1:3AEMt62VKqz90r0tmNhog0r/PpWKmrEShJU0wJW6bV0= +github.com/vishvananda/netlink v1.3.1/go.mod h1:ARtKouGSTGchR8aMwmkzC0qiNPrrWO5JS/XMVl45+b4= +github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zdEY= +github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= @@ -546,6 +467,8 @@ github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17 github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/yhat/scrape v0.0.0-20161128144610-24b7890b0945 h1:6Ju8pZBYFTN9FaV/JvNBiIHcsgEmP4z4laciqjfjY8E= github.com/yhat/scrape v0.0.0-20161128144610-24b7890b0945/go.mod h1:4vRFPPNYllgCacoj+0FoKOjTW68rUhEfqPLiEJaK2w8= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= github.com/yuin/gluamapper v0.0.0-20150323120927-d836955830e7 h1:noHsffKZsNfU38DwcXWEPldrTjIZ8FPNKx8mYMGnqjs= github.com/yuin/gluamapper v0.0.0-20150323120927-d836955830e7/go.mod h1:bbMEM6aU1WDF1ErA5YJ0p91652pGv140gGw4Ww3RGp8= github.com/yuin/gluare v0.0.0-20170607022532-d7c94f1a80ed h1:I1vcLHWU9m30rA90rMrKPu0eD3NDA4FBlkB8WMaDyUw= @@ -564,42 +487,49 @@ go.etcd.io/etcd/client/pkg/v3 v3.5.15 h1:fo0HpWz/KlHGMCC+YejpiCmyWDEuIpnTDzpJLB5 go.etcd.io/etcd/client/pkg/v3 v3.5.15/go.mod h1:mXDI4NAOwEiszrHCb0aqfAYNCrZP4e9hRca3d1YK8EU= go.etcd.io/etcd/client/v3 v3.5.15 h1:23M0eY4Fd/inNv1ZfU3AxrbbOdW79r9V9Rl62Nm6ip4= go.etcd.io/etcd/client/v3 v3.5.15/go.mod h1:CLSJxrYjvLtHsrPKsy7LmZEE+DK2ktfd2bN4RhBMwlU= -go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80= -go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= -go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I= -go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= -go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 h1:Vh5HayB/0HHfOQA7Ctx69E/Y/DcQSMPpKANYVMQ7fBA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0/go.mod h1:cpgtDBaqD/6ok/UG0jT15/uKjAY8mRA53diogHBg3UI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.33.0 h1:wpMfgF8E1rkrT1Z6meFh1NDtownE9Ii3n3X2GJYjsaU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.33.0/go.mod h1:wAy0T/dUbs468uOlkT31xjvqQgEVXv58BRFWEgn5v/0= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0 h1:8tvICD4vSTOOsNrsI4Ljf6C+6UKvpTEH5XY3JMoyPoo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.69.0/go.mod h1:z9+yiacE0IHRqM4qFfkbt/JYlmYXgss8GY/jXoNuPJI= +go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU= +go.opentelemetry.io/otel v1.44.0/go.mod h1:BMgjTHL9WPRlRjL2oZCBTL4whCGtXch2H4BhOPIAyYc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0 h1:4YsVu3B8+3qtWYYrsUYgn0OG78pN0rnNPRGX4SbokQI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.44.0/go.mod h1:+wnlSn0mD1ADVMe3v9Z/WIaiz6q6gL2J/ejaAmdmv80= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 h1:qazEJlUOQzhCpzQpFETGby7EdqjI1wsd0W+6Gg1SCTU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0/go.mod h1:fOD2Yefuxixkx3ahVNf0O/PERb6r4OlbxfATVnYvzCo= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.38.0 h1:kJxSDN4SgWWTjG/hPp3O7LCGLcHXFlvS2/FFOrwL+SE= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.38.0/go.mod h1:mgIOzS7iZeKJdeB8/NYHrJ48fdGc71Llo5bJ1J4DWUE= -go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= -go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= -go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= -go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= -go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= -go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= -go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= -go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= -go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1jgeg= -go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY= -go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= -go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= +go.opentelemetry.io/otel/metric v1.44.0 h1:1w0gILTcHdr3YI+ixLyjemwrVnsMURbTZFrSYCdDdmc= +go.opentelemetry.io/otel/metric v1.44.0/go.mod h1:8O7hanEPBNgEMmybD3s2VBKcgWOCsA6tzHBPODAiquo= +go.opentelemetry.io/otel/sdk v1.44.0 h1:nHYwb9lK+fJPU/dnT6s7W7Z8itMWyqrnVfbheVYrZ58= +go.opentelemetry.io/otel/sdk v1.44.0/go.mod h1:Osuydd3Se74nqjAKxid74N5eC+jfEqfTegHRnq58oK0= +go.opentelemetry.io/otel/sdk/metric v1.44.0 h1:3LlKgI+VjbVsjNRFZJZAJ30WjXC5VkNRks6si09iEfI= +go.opentelemetry.io/otel/sdk/metric v1.44.0/go.mod h1:5B5pMARnXxKhltooO4xUuCBorl65a4EpnTalObqOigA= +go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk= +go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE= +go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= +go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= +go.podman.io/buildah v1.45.2 h1:nMyRiNCoIK4Ign2z1ho0HPoq7vMzP+xNYp4i4RFC37E= +go.podman.io/buildah v1.45.2/go.mod h1:cXUOsSy78r05MpwDfvdTwZPG/Ksobx87wvrFFVpekNg= +go.podman.io/common v0.69.2 h1:5ZV7xkfFTOwgf21xaqNZSqjy9G9JVG7p2bF5Tj6IVjE= +go.podman.io/common v0.69.2/go.mod h1:cQ1+nD9QcwnUGiuJHMX61SoYK5MU90NDbl0lLWmDF2s= +go.podman.io/image/v5 v5.41.2 h1:YnVaFrGLPWSBmipKfNvlOsGcBtk5bUxlPxQ+A6CS/uo= +go.podman.io/image/v5 v5.41.2/go.mod h1:T/bzxEFpdpAzyHabPmcq5K+my3wBsht22sFkFjJSKT4= +go.podman.io/podman/v6 v6.1.4 h1:2aUnBUpWTFcrQ+zHBWYeiO4GPFe8x1eGc2skZKysPvk= +go.podman.io/podman/v6 v6.1.4/go.mod h1:OkGQgqxCEO+XFo+OX+enxnJmhjr0X6YMTM1n8rqKfd8= +go.podman.io/storage v1.64.2 h1:sIBU2vsdGo2gghTF17oxw4G4gojEZkPmt0LKiZWIwqc= +go.podman.io/storage v1.64.2/go.mod h1:ft0DzCRMZs1yn0rszmLYXEEwgd7IIc66JRwSRPUDwwc= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= -go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.uber.org/zap v1.28.0 h1:IZzaP1Fv73/T/pBMLk4VutPl36uNC+OSUh3JLG3FIjo= +go.uber.org/zap v1.28.0/go.mod h1:rDLpOi171uODNm/mxFcuYWxDsqWSAVkFdX4XojSKg/Q= +go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= +go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +go.yaml.in/yaml/v3 v3.0.5 h1:N6y/pJk8buWs9NY5ERU2HSMfm+IuD/OtfdAnq6kESPw= +go.yaml.in/yaml/v3 v3.0.5/go.mod h1:HVTZu1O7/Vkt2N+BFy8Zza+lnLsABggaTM2ZpNIGuKg= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -608,14 +538,9 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/crypto v0.30.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= -golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= +golang.org/x/crypto v0.57.0 h1:3ZVCjf8Ggz7zneR/EHRVx68Ctf+2pmIMP2UFhh9cC6M= +golang.org/x/crypto v0.57.0/go.mod h1:Fdz0i5U6CoizGwLda9DttjSk6qlZo25zYNtR+ycvuZA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= @@ -623,14 +548,11 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= -golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/mod v0.41.0 h1:qJmnOUb4YB+FsEuM3HcWucdZASCPGhsX6uljO6pog0c= +golang.org/x/mod v0.41.0/go.mod h1:Ek9pY8RKWXwsWvd3rQiHYtMqkjSUV+s1Rj7j4H5Ur6o= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -638,7 +560,6 @@ golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= @@ -646,11 +567,9 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= -golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/net v0.59.0 h1:5zfYln+w5XCxwrnMMJPufRgNoXEaGxl0wo5GqPXyues= +golang.org/x/net v0.59.0/go.mod h1:2DA/G1UfVbCpQPeWTmMPGY7Cs2PkBkwu743bVX5PIVg= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -662,11 +581,9 @@ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= -golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.23.0 h1:KameEIfc1IkluZyXWLn39Wd4tURc6GbCiISGiZm2bQk= +golang.org/x/sync v0.23.0/go.mod h1:sUUOizhqBxiL6pEWpqNLUiaJn1ShEbZ6BBqskPbjZm0= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -689,19 +606,22 @@ golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= -golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.48.0 h1:bbX/i/6MgT9BVLM9RT1thmxL04yeTAhbEz4SyadbXoo= +golang.org/x/sys v0.48.0/go.mod h1:hNLxWAXmnKAxqDtdwIYC4bM9oQPEecfsnNMuSxOs3og= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= +golang.org/x/telemetry v0.0.0-20260811182544-a038080d80e5 h1:ZUSxONxc981v7AW7QUg+I9WwZzSTTJ019ENBYr5pV/Q= +golang.org/x/telemetry v0.0.0-20260811182544-a038080d80e5/go.mod h1:LVehoXe41cL5SCVQilsV7Gg6BNG+Js6P9PhSbYTIUkQ= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -709,9 +629,9 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= -golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= -golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= +golang.org/x/term v0.46.0 h1:3+OXuTbaKDgwk8jTi3aSLHRlmWqHEUDUtxnbFigO4YE= +golang.org/x/term v0.46.0/go.mod h1:+K02xbkittuwc0Am4abfA3Fc+XRGXkvBXNO88NCXPoc= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -721,16 +641,12 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= -golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= -golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= -golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +golang.org/x/text v0.42.0 h1:JbOZXgfeCPU9gacVtYliJqOhD+zhrEqK4LfdpmlUZqI= +golang.org/x/text v0.42.0/go.mod h1:ojzP1Z+2QtioaF8DTtO8K5q7JWVVYwZKenzujK0Zd0E= +golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= +golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= @@ -738,40 +654,30 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU= -golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s= +golang.org/x/tools v0.49.0 h1:3NI7VXzL9+1WZD52Dx2ttoPwD5DWrFGpl9mFZDlmisI= +golang.org/x/tools v0.49.0/go.mod h1:SJNXV9DBKT0UbdttsQjbfJlAE/q+y36++zo3uL3N0Oo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= +gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1:p31xT4yrYrSM/G4Sn2+TNUkVhFCbG9y8itM2S6Th950= -google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4 h1:iK2jbkWL86DXjEx0qiHcRE9dE4/Ahua5k6V8OWFb//c= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg= -google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= +google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa h1:Kjn0N0tCrDgiAFW+lGO4JZ3ck44CehvJQMAwj9QF0G8= +google.golang.org/genproto/googleapis/api v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:q4lMZS6kskjT5HvCPrnnypcDPVJqT/f4nfxmkE7gryY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa h1:mZHHdPZl0dbGHCflZgAq/Q468DWVFcU2whhB2KAo8fk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.82.1 h1:NnAxzGRA0677vCa4BUkOAnO5+FfQqVl9iUXeD0IqcGE= +google.golang.org/grpc v1.82.1/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -790,17 +696,15 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= layeh.com/gopher-lfs v0.0.0-20201124131141-d5fb28581d14 h1:zVPtg+IkK82eKhq+Y5gqzCLl7px+d1EWOVug19Ke8pk= layeh.com/gopher-lfs v0.0.0-20201124131141-d5fb28581d14/go.mod h1:JG6dFVLzfGNW/x2yIpMXBRllG5SzrrPniBaLWlviicE= layeh.com/gopher-luar v1.0.11 h1:8zJudpKI6HWkoh9eyyNFaTM79PY6CAPcIr6X/KTiliw= layeh.com/gopher-luar v1.0.11/go.mod h1:TPnIVCZ2RJBndm7ohXyaqfhzjlZ+OA2SZR/YwL8tECk= -sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= -tags.cncf.io/container-device-interface v1.0.1 h1:KqQDr4vIlxwfYh0Ed/uJGVgX+CHAkahrgabg6Q8GYxc= -tags.cncf.io/container-device-interface v1.0.1/go.mod h1:JojJIOeW3hNbcnOH2q0NrWNha/JuHoDZcmYxAZwb2i0= +pgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk= +pgregory.net/rapid v1.2.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= +tags.cncf.io/container-device-interface v1.1.0 h1:RnxNhxF1JOu6CJUVpetTYvrXHdxw9j9jFYgZpI+anSY= +tags.cncf.io/container-device-interface v1.1.0/go.mod h1:76Oj0Yqp9FwTx/pySDc8Bxjpg+VqXfDb50cKAXVJ34Q= diff --git a/justfile b/justfile index 51f03b7..79b0541 100644 --- a/justfile +++ b/justfile @@ -9,3 +9,7 @@ all-plugins: worker: go build ./cmd/worker + +test: + nix build .#checks.x86_64-linux.file -L --no-link + nix build .#checks.x86_64-linux.etcd -L --no-link diff --git a/nix/modules/default.nix b/nix/modules/default.nix index 59d425c..56ab46d 100644 --- a/nix/modules/default.nix +++ b/nix/modules/default.nix @@ -14,9 +14,16 @@ let paths = cfg.plugins; }; + workerEnvironment = cfg.workerEnvironment // { + XDG_RUNTIME_DIR = "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/run/msgscript"; + HOME = dataDir; + }; + workerEnvFile = pkgs.writeText "msgscript-worker.env" ( - lib.strings.join "\n" (lib.mapAttrsToList (k: v: "${k}=${toString v}") cfg.workerEnvironment) + lib.strings.join "\n" (lib.mapAttrsToList (k: v: "${k}=${toString v}") workerEnvironment) ); + + dataDir = "/var/lib/msgscript"; in { options.services.msgscript = { @@ -49,22 +56,6 @@ in description = mdDoc "Nats.io URL to connect to"; }; - dataDir = mkOption { - type = types.str; - default = "/var/lib/msgscript"; - description = mdDoc "Directory available to msgscript-server for io operation. The server owns this directory"; - }; - - scriptDir = mkOption { - type = types.str; - default = "${cfg.dataDir}/scripts"; - }; - - libraryDir = mkOption { - type = types.str; - default = "${cfg.dataDir}/libs"; - }; - user = mkOption { type = types.str; default = "msgscript"; @@ -77,6 +68,23 @@ in description = "Group under which msgscript runs."; }; + enablePodman = mkOption { + type = types.bool; + default = false; + description = lib.mdDoc '' + Enable podman for msgscript worker. + + This will only change the systemd service not the package build. + + The worker package needs to be overriden to include podman: + ``` + (prev: final: { + msgscript-worker = final.msgscript-worker.override { withPodman = yes; }; + }) + ``` + ''; + }; + enableTelemetry = mkOption { type = types.bool; default = false; @@ -112,7 +120,7 @@ in serviceConfig = { ExecStart = - "${pkgs.msgscript-server}/bin/msgscript -backend ${cfg.backend} -plugin ${pluginDir} -script ${cfg.scriptDir} -library ${cfg.libraryDir} -wexec ${pkgs.msgscript-worker}/bin/worker -wenv ${workerEnvFile}" + "${pkgs.msgscript-server}/bin/msgscript -backend ${cfg.backend} -plugin ${pluginDir} -script ${dataDir}/scripts -library ${dataDir}/libs -wexec ${pkgs.msgscript-worker}/bin/worker -wenv ${workerEnvFile}" + lib.optionalString ( (lib.length cfg.etcdEndpoints) > 0 ) " -etcdurl ${lib.concatStringsSep "," cfg.etcdEndpoints}" @@ -120,9 +128,11 @@ in User = cfg.user; Group = cfg.group; - WorkingDirectory = cfg.dataDir; - RuntimeDirectory = cfg.dataDir; + SupplementaryGroups = if cfg.enablePodman then [ "podman" ] else [ ]; Restart = "on-failure"; + RuntimeDirectory = "msgscript"; + StateDirectory = "msgscript"; + WorkingDirectory = dataDir; TimeoutSec = 15; # Security options: @@ -131,7 +141,8 @@ in RestrictAddressFamilies = [ "AF_INET" "AF_INET6" - ]; + ] + ++ lib.optionals cfg.enablePodman [ "AF_UNIX" ]; RestrictNamespaces = !config.boot.isContainer; RestrictRealtime = true; RestrictSUIDSGID = true; @@ -174,7 +185,7 @@ in msgscript = { inherit (cfg) group; isSystemUser = true; - home = cfg.dataDir; + home = dataDir; }; }; @@ -183,9 +194,9 @@ in }; systemd.tmpfiles.rules = [ - "d ${cfg.dataDir} 0775 ${cfg.user} ${cfg.group} -" - "d ${cfg.dataDir}/libs 0775 ${cfg.user} ${cfg.group} -" - "d ${cfg.dataDir}/scripts 0775 ${cfg.user} ${cfg.group} -" + "d ${dataDir} 0775 ${cfg.user} ${cfg.group} -" + "d ${dataDir}/libs 0775 ${cfg.user} ${cfg.group} -" + "d ${dataDir}/scripts 0775 ${cfg.user} ${cfg.group} -" ]; }; } diff --git a/nix/tests/default.nix b/nix/tests/default.nix deleted file mode 100644 index d919bb1..0000000 --- a/nix/tests/default.nix +++ /dev/null @@ -1,9 +0,0 @@ -{ - pkgs, - modules, - overlays, -}: - -{ - minimal-test = import ./minimal.nix { inherit pkgs modules overlays; }; -} diff --git a/nix/tests/etcd.nix b/nix/tests/etcd.nix index d709a67..061b0b9 100644 --- a/nix/tests/etcd.nix +++ b/nix/tests/etcd.nix @@ -4,45 +4,108 @@ overlays, }: +let + inherit (import ./fixtures.nix { inherit pkgs; }) + helloLua + pathLua + wasmLua + wasm + helloImage + podmanLua + ; +in pkgs.testers.runNixOSTest { - name = "minimal-test"; + name = "msgscript-test-etcd"; node.pkgsReadOnly = false; - nodes.server = { ... }: { - imports = [ - modules - ]; + nodes.server = + { + config, + pkgs, + lib, + ... + }: + { + imports = [ + modules + ]; - nixpkgs.overlays = overlays; + nixpkgs.overlays = overlays ++ [ + (prev: final: { + msgscript-worker = final.msgscript-worker.override { + withWasm = true; + withPodman = true; + }; + }) + ]; - services = { - etcd.enable = true; - nats.enable = true; + services.etcd = { + enable = true; + listenClientUrls = [ "http://127.0.0.1:2379" ]; + listenPeerUrls = [ "http://127.0.0.1:2380" ]; + initialCluster = [ "${config.services.etcd.name}=http://127.0.0.1:2380" ]; + initialClusterState = "new"; + }; - msgscript = { + services.msgscript = { enable = true; + backend = "etcd"; + enablePodman = true; etcdEndpoints = [ "http://127.0.0.1:2379" ]; - natsUrl = "localhost:4222"; + plugins = with pkgs.msgscript-plugins; [ gopher-lua-libs ]; + workerEnvironment = { + PATH = lib.makeBinPath [ + pkgs.busybox # For sh + pkgs.hello + ]; + }; }; - }; - }; - skipLint = true; + environment.systemPackages = with pkgs; [ + jq + gnugrep + coreutils + msgscript-cli + ]; + + virtualisation.podman.enable = true; + }; testScript = '' start_all() - server.wait_for_unit("default.target") + # Setup script files + server.copy_from_host("${helloLua}", "/var/lib/msgscript/scripts/hello.lua") + server.copy_from_host("${pathLua}", "/var/lib/msgscript/scripts/path.lua") + server.copy_from_host("${wasmLua}", "/var/lib/msgscript/scripts/wasm.lua") + server.copy_from_host("${wasm}/bin/c.wasm", "/var/lib/msgscript/scripts/c.wasm") + server.copy_from_host("${podmanLua}", "/var/lib/msgscript/scripts/podman.lua") + + server.wait_for_unit("etcd.service") + server.wait_for_open_port(2379) - def print_command(cmd): - output = server.succeed(cmd) - print(output) + server.succeed("msgscriptcli add /var/lib/msgscript/scripts/hello.lua") + server.succeed("msgscriptcli add /var/lib/msgscript/scripts/path.lua") + server.succeed("msgscriptcli add /var/lib/msgscript/scripts/wasm.lua") + server.succeed("msgscriptcli add /var/lib/msgscript/scripts/podman.lua") - print_command("journalctl -u msgscript") - print_command("systemctl status msgscript") + server.wait_for_unit("podman.socket") + server.succeed("podman load < ${helloImage}") + server.succeed("podman image exists localhost/hello:latest") - server.wait_for_open_port(2379) - server.wait_for_open_port(4222) + server.wait_for_unit("msgscript.service") server.wait_for_open_port(7643) + + with subtest("lua hello script"): + server.succeed("curl -s http://127.0.0.1:7643/funcs.hello | jq -r '.[0].payload' | base64 -d | grep funcs.hello") + + with subtest("lua script with PATH change"): + server.succeed("curl -s http://127.0.0.1:7643/funcs.path | jq -r '.[0].payload' | base64 -d | grep 'Hello'") + + with subtest("wasm based hello script"): + server.succeed("curl -s http://127.0.0.1:7643/funcs.wasm | jq -r '.[0].payload' | base64 -d | grep Hello") + + with subtest("podman based hello script"): + server.succeed("curl -s http://127.0.0.1:7643/funcs.podmanhello | jq -r '.[0].payload' | base64 -d | grep Hello") ''; } diff --git a/nix/tests/file.nix b/nix/tests/file.nix new file mode 100644 index 0000000..ec54e39 --- /dev/null +++ b/nix/tests/file.nix @@ -0,0 +1,85 @@ +{ + pkgs, + modules, + overlays, +}: + +let + inherit (import ./fixtures.nix { inherit pkgs; }) + helloLua + pathLua + wasmLua + wasm + helloImage + podmanLua + ; +in +pkgs.testers.runNixOSTest { + name = "msgscript-test-file"; + + node.pkgsReadOnly = false; + nodes.server = { pkgs, lib, ... }: { + imports = [ + modules + ]; + + nixpkgs.overlays = overlays ++ [ + (prev: final: { + msgscript-worker = final.msgscript-worker.override { + withWasm = true; + withPodman = true; + }; + }) + ]; + + services.msgscript = { + enable = true; + enablePodman = true; + plugins = with pkgs.msgscript-plugins; [ gopher-lua-libs ]; + workerEnvironment = { + PATH = lib.makeBinPath [ + pkgs.busybox # For sh + pkgs.hello + ]; + }; + }; + + environment.systemPackages = with pkgs; [ + jq + gnugrep + coreutils + ]; + + virtualisation.podman.enable = true; + }; + + testScript = '' + start_all() + + # Setup script files + server.copy_from_host("${helloLua}", "/var/lib/msgscript/scripts/hello.lua") + server.copy_from_host("${pathLua}", "/var/lib/msgscript/scripts/path.lua") + server.copy_from_host("${wasmLua}", "/var/lib/msgscript/scripts/wasm.lua") + server.copy_from_host("${wasm}/bin/c.wasm", "/var/lib/msgscript/scripts/c.wasm") + server.copy_from_host("${podmanLua}", "/var/lib/msgscript/scripts/podman.lua") + + server.wait_for_unit("msgscript.service") + server.wait_for_open_port(7643) + + server.wait_for_unit("podman.socket") + server.succeed("podman load < ${helloImage}") + server.succeed("podman image exists localhost/hello:latest") + + with subtest("simple lua script"): + server.succeed("curl -s http://127.0.0.1:7643/funcs.hello | jq -r '.[0].payload' | base64 -d | grep funcs.hello") + + with subtest("lua script with PATH change"): + server.succeed("curl -s http://127.0.0.1:7643/funcs.path | jq -r '.[0].payload' | base64 -d | grep 'Hello'") + + with subtest("wasm based script"): + server.succeed("curl -s http://127.0.0.1:7643/funcs.wasm | jq -r '.[0].payload' | base64 -d | grep Hello") + + with subtest("podman based hello script"): + server.succeed("curl -s http://127.0.0.1:7643/funcs.podmanhello | jq -r '.[0].payload' | base64 -d | grep Hello") + ''; +} diff --git a/nix/tests/fixtures.nix b/nix/tests/fixtures.nix new file mode 100644 index 0000000..245d913 --- /dev/null +++ b/nix/tests/fixtures.nix @@ -0,0 +1,45 @@ +{ pkgs, ... }: + +rec { + helloLua = pkgs.writeText "hello.lua" (builtins.readFile ./../../examples/hello.lua); + pathLua = pkgs.writeText "path.lua" (builtins.readFile ./path.lua); + + wasmLua = pkgs.writeText "wasm.lua" '' + --* subject: funcs.wasm + --* name: wasm + --* html: true + --* executor: wasm + /var/lib/msgscript/scripts/c.wasm + ''; + wasm = pkgs.stdenv.mkDerivation { + name = "msgscript-wasm-c-example"; + + buildInputs = [ pkgs.emscripten ]; + + src = ../../examples/wasm/c; + + installPhase = '' + mkdir -p $out/bin + cp c.wasm $out/bin/c.wasm + ''; + }; + + helloImageName = "localhost/hello"; + helloImage = pkgs.dockerTools.buildImage { + name = helloImageName; + tag = "latest"; + copyToRoot = pkgs.buildEnv { + name = "root"; + paths = [ pkgs.hello ]; + pathsToLink = [ "/bin" ]; + }; + config.Cmd = [ "/bin/hello" ]; + }; + + podmanLua = pkgs.writeText "podman.lua" '' + --* subject: funcs.podmanhello + --* name: podman + --* executor: podman + ${builtins.toJSON { image = helloImageName; }} + ''; +} diff --git a/nix/tests/lua-etcd.nix b/nix/tests/lua-etcd.nix deleted file mode 100644 index 6786e46..0000000 --- a/nix/tests/lua-etcd.nix +++ /dev/null @@ -1,78 +0,0 @@ -{ - pkgs, - modules, - overlays, -}: - -let - helloLua = pkgs.writeText "hello.lua" (builtins.readFile ./../../examples/hello.lua); - pathLua = pkgs.writeText "path.lua" (builtins.readFile ./path.lua); -in -pkgs.testers.runNixOSTest { - name = "minimal-test"; - - node.pkgsReadOnly = false; - nodes.server = - { - config, - pkgs, - lib, - ... - }: - { - imports = [ - modules - ]; - - nixpkgs.overlays = overlays; - - services.etcd = { - enable = true; - listenClientUrls = [ "http://127.0.0.1:2379" ]; - listenPeerUrls = [ "http://127.0.0.1:2380" ]; - initialCluster = [ "${config.services.etcd.name}=http://127.0.0.1:2380" ]; - initialClusterState = "new"; - }; - - services.msgscript = { - enable = true; - backend = "etcd"; - etcdEndpoints = [ "http://127.0.0.1:2379" ]; - plugins = with pkgs.msgscript-plugins; [ gopher-lua-libs ]; - workerEnvironment = { - PATH = lib.makeBinPath [ - pkgs.busybox # For sh - pkgs.hello - ]; - }; - }; - - environment.systemPackages = with pkgs; [ - jq - gnugrep - coreutils - msgscript-cli - ]; - }; - - testScript = '' - start_all() - - # Setup script files - server.copy_from_host("${helloLua}", "/var/lib/msgscript/scripts/hello.lua") - server.copy_from_host("${pathLua}", "/var/lib/msgscript/scripts/path.lua") - - server.wait_for_unit("etcd.service") - - server.succeed("msgscriptcli add /var/lib/msgscript/scripts/hello.lua") - server.succeed("msgscriptcli add /var/lib/msgscript/scripts/path.lua") - - server.wait_for_unit("msgscript.service") - - with subtest("simple lua script"): - server.succeed("curl -s http://127.0.0.1:7643/funcs.hello | jq -r '.[0].payload' | base64 -d | grep funcs.hello") - - with subtest("lua script with PATH change"): - server.succeed("curl -s http://127.0.0.1:7643/funcs.path | jq -r '.[0].payload' | base64 -d | grep 'Hello'") - ''; -} diff --git a/nix/tests/lua-file.nix b/nix/tests/lua-file.nix deleted file mode 100644 index 460eef5..0000000 --- a/nix/tests/lua-file.nix +++ /dev/null @@ -1,54 +0,0 @@ -{ - pkgs, - modules, - overlays, -}: - -let - helloLua = pkgs.writeText "hello.lua" (builtins.readFile ./../../examples/hello.lua); - pathLua = pkgs.writeText "path.lua" (builtins.readFile ./path.lua); -in -pkgs.testers.runNixOSTest { - name = "minimal-test"; - - node.pkgsReadOnly = false; - nodes.server = { pkgs, lib, ... }: { - imports = [ - modules - ]; - - nixpkgs.overlays = overlays; - - services.msgscript = { - enable = true; - plugins = with pkgs.msgscript-plugins; [ gopher-lua-libs ]; - workerEnvironment = { - PATH = lib.makeBinPath [ - pkgs.busybox # For sh - pkgs.hello - ]; - }; - }; - - environment.systemPackages = with pkgs; [ jq gnugrep coreutils ]; - }; - - skipLint = true; - - testScript = '' - start_all() - - # Setup script files - server.copy_from_host("${helloLua}", "/var/lib/msgscript/scripts/hello.lua") - server.copy_from_host("${pathLua}", "/var/lib/msgscript/scripts/path.lua") - - server.wait_for_unit("msgscript.service") - server.wait_for_open_port(7643) - - with subtest("simple lua script"): - server.succeed("curl -s http://127.0.0.1:7643/funcs.hello | jq -r '.[0].payload' | base64 -d | grep funcs.hello") - - with subtest("lua script with PATH change"): - server.succeed("curl -s http://127.0.0.1:7643/funcs.path | jq -r '.[0].payload' | base64 -d | grep 'Hello'") - ''; -} diff --git a/nix/tests/minimal.nix b/nix/tests/minimal.nix deleted file mode 100644 index 5b2a625..0000000 --- a/nix/tests/minimal.nix +++ /dev/null @@ -1,39 +0,0 @@ -{ - pkgs, - modules, - overlays, -}: - -pkgs.testers.runNixOSTest { - name = "minimal-test"; - - node.pkgsReadOnly = false; - nodes.server = { ... }: { - imports = [ - modules - ]; - - nixpkgs.overlays = overlays; - - services = { - msgscript.enable = true; - }; - }; - - skipLint = true; - - testScript = '' - start_all() - - server.wait_for_unit("default.target") - - def print_command(cmd): - output = server.succeed(cmd) - print(output) - - print_command("journalctl -u msgscript") - print_command("systemctl status msgscript") - - server.wait_for_open_port(7643) - ''; -} diff --git a/nix/tests/wasm.nix b/nix/tests/wasm.nix deleted file mode 100644 index d116ba5..0000000 --- a/nix/tests/wasm.nix +++ /dev/null @@ -1,95 +0,0 @@ -{ - pkgs, - modules, - overlays, -}: - -let - wasmLua = pkgs.writeText "wasm.lua" '' - --* subject: funcs.wasm - --* name: wasm - --* html: true - --* executor: wasm - /var/lib/msgscript/scripts/c.wasm - ''; - - wasm = pkgs.stdenv.mkDerivation { - name = "msgscript-wasm-c-example"; - - buildInputs = [ pkgs.emscripten ]; - - src = ../../examples/wasm/c; - - installPhase = '' - mkdir -p $out/bin - cp c.wasm $out/bin/c.wasm - ''; - }; -in -pkgs.testers.runNixOSTest { - name = "minimal-test"; - - node.pkgsReadOnly = false; - nodes.server = - { - config, - pkgs, - lib, - ... - }: - { - imports = [ - modules - ]; - - nixpkgs.overlays = overlays ++ [ - (prev: final: { - msgscript-worker = final.msgscript-worker.override { withWasm = true; }; - }) - ]; - - services.etcd = { - enable = true; - listenClientUrls = [ "http://127.0.0.1:2379" ]; - listenPeerUrls = [ "http://127.0.0.1:2380" ]; - initialCluster = [ "${config.services.etcd.name}=http://127.0.0.1:2380" ]; - initialClusterState = "new"; - }; - - services.msgscript = { - enable = true; - backend = "etcd"; - etcdEndpoints = [ "http://127.0.0.1:2379" ]; - workerEnvironment = { - PATH = lib.makeBinPath [ - pkgs.busybox # For sh - pkgs.hello - ]; - }; - }; - - environment.systemPackages = with pkgs; [ - jq - gnugrep - coreutils - msgscript-cli - ]; - }; - - testScript = '' - start_all() - - # Setup script files - server.copy_from_host("${wasmLua}", "/var/lib/msgscript/scripts/wasm.lua") - server.copy_from_host("${wasm}/bin/c.wasm", "/var/lib/msgscript/scripts/c.wasm") - - server.wait_for_unit("etcd.service") - - server.succeed("msgscriptcli add /var/lib/msgscript/scripts/wasm.lua") - - server.wait_for_unit("msgscript.service") - - with subtest("wasm based script"): - server.succeed("curl -s http://127.0.0.1:7643/funcs.wasm | jq -r '.[0].payload' | base64 -d | grep Hello") - ''; -} From 5e69d9bc5864e92be862a78ad6b68a465cbef4fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Bariteau?= Date: Thu, 15 Oct 2026 13:49:29 -0400 Subject: [PATCH 14/18] change name so it's consistance with the usage --- nix/modules/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nix/modules/default.nix b/nix/modules/default.nix index 56ab46d..865a832 100644 --- a/nix/modules/default.nix +++ b/nix/modules/default.nix @@ -10,7 +10,7 @@ let cfg = config.services.msgscript; pluginDir = pkgs.symlinkJoin { - name = "msgscript-server-plugins"; + name = "msgscript-worker-plugins"; paths = cfg.plugins; }; From 6bdf6bf62b6074fa3b8ddb37fc022f0c25003463 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Bariteau?= Date: Thu, 15 Oct 2026 14:02:41 -0400 Subject: [PATCH 15/18] just warn if the schema for telemetry differs https://github.com/open-telemetry/opentelemetry-go/issues/7297#issuecomment-3879901983 --- cmd/server/otel.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cmd/server/otel.go b/cmd/server/otel.go index 46e861f..a993cbf 100644 --- a/cmd/server/otel.go +++ b/cmd/server/otel.go @@ -8,6 +8,7 @@ import ( "time" "github.com/nats-io/nats.go" + log "github.com/sirupsen/logrus" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" "go.opentelemetry.io/otel/exporters/stdout/stdouttrace" @@ -124,7 +125,9 @@ func newTracerProvider(ctx context.Context) (*trace.TracerProvider, error) { semconv.ServiceVersion(version), ), ) - if err != nil { + if errors.Is(err, resource.ErrPartialResource) || errors.Is(err, resource.ErrSchemaURLConflict) { + log.Warn(err) + } else if err != nil { return nil, err } From ad396d6a3839d3a73378f2bc9f29769e74a89a3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Bariteau?= Date: Thu, 15 Oct 2026 16:29:52 -0400 Subject: [PATCH 16/18] Dockerfile: add worker --- Dockerfile | 14 +++++++++++--- docker/entrypoint.sh | 7 ++----- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Dockerfile b/Dockerfile index cbbc3be..5cc786d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,6 +19,13 @@ RUN nix \ build .#cli && \ mv /tmp/build/result /tmp/build/cli +RUN nix \ + --extra-experimental-features "nix-command flakes" \ + --option filter-syscalls false \ + --option max-jobs auto \ + build .#worker && \ + mv /tmp/build/server /tmp/build/worker + RUN nix \ --extra-experimental-features "nix-command flakes" \ --option filter-syscalls false \ @@ -29,9 +36,10 @@ RUN nix \ # Copy the Nix store closure into a directory. The Nix store closure is the # entire set of Nix store values that we need for our build. RUN mkdir /tmp/nix-store-closure -RUN cp -R $(nix-store -qR server/) /tmp/nix-store-closure -RUN cp -R $(nix-store -qR cli/) /tmp/nix-store-closure -RUN cp -R $(nix-store -qR allPlugins/) /tmp/nix-store-closure +RUN cp -R $(nix-store -qR /tmp/build/server) /tmp/nix-store-closure +RUN cp -R $(nix-store -qR /tmp/build/worker) /tmp/nix-store-closure +RUN cp -R $(nix-store -qR /tmp/build/cli) /tmp/nix-store-closure +RUN cp -R $(nix-store -qR /tmp/build/allPlugins) /tmp/nix-store-closure FROM alpine:latest diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index da4871f..023cd24 100644 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -1,7 +1,6 @@ #!/bin/sh set -e -# Function to display usage information usage() { echo "Usage: $0 [cli|server] [arguments...]" echo "" @@ -16,7 +15,6 @@ usage() { exit 1 } -# Check if at least one argument is provided if [ $# -eq 0 ]; then echo "Error: No command specified." usage @@ -24,9 +22,8 @@ fi # Get the command (first argument) COMMAND="$1" -shift # Remove the command from arguments list +shift -# Execute based on the command case "$COMMAND" in "cli") if [ $# -gt 0 ] && ([ "$1" = "dev" ] || [ "$1" = "devhttp" ]); then @@ -38,7 +35,7 @@ case "$COMMAND" in fi ;; "server") - exec /app/bin/server -plugin /app/share/plugins "$@" + exec /app/bin/server -plugin /app/share/plugins -worker ./app/bin/worker "$@" ;; "--help"|"-h"|"help") usage From d1e6042cb57b2e0d3513eaa6b7dd31057425cd3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Bariteau?= Date: Fri, 16 Oct 2026 14:47:57 -0400 Subject: [PATCH 17/18] rebuild Dockerfile using debian as base --- Dockerfile | 84 +++++++++++++++++--------------------------- docker/entrypoint.sh | 10 +++--- 2 files changed, 37 insertions(+), 57 deletions(-) diff --git a/Dockerfile b/Dockerfile index 5cc786d..374c10e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,59 +1,39 @@ -FROM nixos/nix:latest AS builder - -# Copy our source and setup our working dir. -COPY . /tmp/build -WORKDIR /tmp/build - -# Build our Nix environment -RUN nix \ - --extra-experimental-features "nix-command flakes" \ - --option filter-syscalls false \ - --option max-jobs auto \ - build .#server && \ - mv /tmp/build/result /tmp/build/server - -RUN nix \ - --extra-experimental-features "nix-command flakes" \ - --option filter-syscalls false \ - --option max-jobs auto \ - build .#cli && \ - mv /tmp/build/result /tmp/build/cli - -RUN nix \ - --extra-experimental-features "nix-command flakes" \ - --option filter-syscalls false \ - --option max-jobs auto \ - build .#worker && \ - mv /tmp/build/server /tmp/build/worker - -RUN nix \ - --extra-experimental-features "nix-command flakes" \ - --option filter-syscalls false \ - --option max-jobs auto \ - build .#allPlugins && \ - mv /tmp/build/result /tmp/build/allPlugins - -# Copy the Nix store closure into a directory. The Nix store closure is the -# entire set of Nix store values that we need for our build. -RUN mkdir /tmp/nix-store-closure -RUN cp -R $(nix-store -qR /tmp/build/server) /tmp/nix-store-closure -RUN cp -R $(nix-store -qR /tmp/build/worker) /tmp/nix-store-closure -RUN cp -R $(nix-store -qR /tmp/build/cli) /tmp/nix-store-closure -RUN cp -R $(nix-store -qR /tmp/build/allPlugins) /tmp/nix-store-closure - - -FROM alpine:latest +FROM golang:1.26-bookworm as builder + +ENV CGO_LDFLAGS="-lassuan -lgpg-error" +RUN apt-get update && \ + apt-get install -y build-essential xz-utils libgpgme-dev libbtrfs-dev libassuan-dev libgpg-error0 && \ + curl https://wasmtime.dev/install.sh -sSf | bash + +WORKDIR /build +COPY ./go.mod ./go.sum . +RUN go mod download + +ENV CGO_ENABLED=1 + +COPY --parents ./nats.go ./embed.go ./logo.webp ./README.md ./cmd ./executor ./lua ./plugins ./script ./store ./templates . +RUN go build ./cmd/cli && \ + go build ./cmd/server && \ + go build -tags "wasmtime podman" ./cmd/worker && \ + go build -buildmode=plugin -o db.so ./plugins/db && \ + go build -buildmode=plugin -o gopher-lua-libs.so ./plugins/gopher-lua-libs && \ + go build -buildmode=plugin -o hello.so ./plugins/hello && \ + go build -buildmode=plugin -o httpscrape.so ./plugins/httpscrape && \ + go build -buildmode=plugin -o vault.so ./plugins/vault + +FROM debian:bookworm-slim + +RUN curl https://wasmtime.dev/install.sh -sSf | bash WORKDIR /app +RUN mkdir -p /app/plugins COPY ./docker/entrypoint.sh /entrypoint.sh -RUN mkdir -p /app/share/plugins && chmod +x /entrypoint.sh - -COPY --from=builder /tmp/nix-store-closure /nix/store -COPY --from=builder /tmp/build/server /app -COPY --from=builder /tmp/build/cli /app -COPY --from=builder /tmp/build/allPlugins/*.so /app/share/plugins/ -RUN mv /app/bin/msgscript /app/bin/server && mv /app/bin/msgscriptcli /app/bin/cli +COPY --from=builder /build/cli /app/cli +COPY --from=builder /build/server /app/server +COPY --from=builder /build/worker /app/worker +COPY --from=builder /build/*.so /app/plugins/ +RUN chmod +x /entrypoint.sh EXPOSE 7643 diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 023cd24..6d94e6c 100644 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -5,8 +5,8 @@ usage() { echo "Usage: $0 [cli|server] [arguments...]" echo "" echo "Commands:" - echo " cli - Run the CLI application at /app/bin/cli" - echo " server - Run the server application at /app/bin/server" + echo " cli - Run the CLI" + echo " server - Run the server" echo "" echo "Examples:" echo " $0 cli --help" @@ -29,13 +29,13 @@ case "$COMMAND" in if [ $# -gt 0 ] && ([ "$1" = "dev" ] || [ "$1" = "devhttp" ]); then CLI_COMMAND="$1" shift - exec /app/bin/cli "$CLI_COMMAND" -plugin /app/share/plugins "$@" + exec /app/cli "$CLI_COMMAND" -plugin /app/plugins "$@" else - exec /app/bin/cli + exec /app/cli fi ;; "server") - exec /app/bin/server -plugin /app/share/plugins -worker ./app/bin/worker "$@" + exec /app/server -plugin /app/plugins -wexec ./app/worker "$@" ;; "--help"|"-h"|"help") usage From ad654a28ba01026a583fa4f3999d32f6088d8c40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Bariteau?= Date: Fri, 16 Oct 2026 14:48:19 -0400 Subject: [PATCH 18/18] update wastime-go/v37 -> wastime-go/v49 --- executor/wasm_executor.go | 4 ++-- flake.nix | 2 +- go.mod | 2 +- go.sum | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/executor/wasm_executor.go b/executor/wasm_executor.go index 98a15c8..33f3dae 100644 --- a/executor/wasm_executor.go +++ b/executor/wasm_executor.go @@ -10,7 +10,7 @@ import ( "os" "strings" - "github.com/bytecodealliance/wasmtime-go/v37" + "github.com/bytecodealliance/wasmtime-go/v49" "github.com/nats-io/nats.go" log "github.com/sirupsen/logrus" "go.opentelemetry.io/otel" @@ -72,7 +72,7 @@ func (we *WasmExecutor) HandleMessage(ctx context.Context, msg *Message, scr *sc readSpan.End() span.RecordError(err) span.SetStatus(codes.Error, "Failed to read WASM module") - res.Error = fmt.Sprintf("failed to read wasm module file %s: %w", scr.Content, err) + res.Error = fmt.Sprintf("failed to read wasm module file %s: %v", scr.Content, err) return res } readSpan.SetAttributes(attribute.Int("wasm.module_size", len(wasmBytes))) diff --git a/flake.nix b/flake.nix index ec6cc9e..7bfd5a6 100644 --- a/flake.nix +++ b/flake.nix @@ -9,7 +9,7 @@ { self, nixpkgs }: let version = "1.0.0"; - vendorHash = "sha256-BN4okB9GMrh/nb+wRLp6w6GEPQAZ6KEwrz2LMH0eOh4="; + vendorHash = "sha256-LzsCivkWwbgESrUDEsGzIg8CabpoV5ot2tl75qizvfI="; mkPlugin = pkgs: name: path: diff --git a/go.mod b/go.mod index 5e4506a..3636a61 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.26.0 replace github.com/openbao/openbao/api v1.12.2 => github.com/hashicorp/vault/api v1.12.2 require ( - github.com/bytecodealliance/wasmtime-go/v37 v37.0.0 + github.com/bytecodealliance/wasmtime-go/v49 v49.0.0 github.com/cjoudrey/gluahttp v0.0.0-20201111170219-25003d9adfa9 github.com/felipejfc/gluahttpscrape v0.0.0-20170525191632-10580c4a38f9 github.com/fsnotify/fsnotify v1.10.1 diff --git a/go.sum b/go.sum index b330ad9..50becb4 100644 --- a/go.sum +++ b/go.sum @@ -34,8 +34,8 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/bytecodealliance/wasmtime-go/v37 v37.0.0 h1:DPjdn2V3JhXHMoZ2ymRqGK+y1bDyr9wgpyYCvhjMky8= -github.com/bytecodealliance/wasmtime-go/v37 v37.0.0/go.mod h1:Pf1l2JCTUFMnOqDIwkjzx1qfVJ09xbaXETKgRVE4jZ0= +github.com/bytecodealliance/wasmtime-go/v49 v49.0.0 h1:kH3XJMvXKuKmFgRhhHqeYi5p/ztgJd/Trr3gU06u1fY= +github.com/bytecodealliance/wasmtime-go/v49 v49.0.0/go.mod h1:xNsU6xgZR2dw+TgPiNqppdIbtqiZskiB/X4tWPnuwCs= github.com/cbroglie/mustache v1.0.1 h1:ivMg8MguXq/rrz2eu3tw6g3b16+PQhoTn6EZAhst2mw= github.com/cbroglie/mustache v1.0.1/go.mod h1:R/RUa+SobQ14qkP4jtx5Vke5sDytONDQXNLPY/PO69g= github.com/cenkalti/backoff/v3 v3.2.2 h1:cfUAAO3yvKMYKPrvhDuHSwQnhZNk/RMHKdZqKTxfm6M=