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/Dockerfile b/Dockerfile index cbbc3be..374c10e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,51 +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 .#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 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 - - -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/README.md b/README.md index ed010a7..ae000d4 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,20 +28,30 @@ - [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) -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 @@ -116,12 +127,13 @@ 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="}} ``` + 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 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 +#### 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 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 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..f374f9a 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 executable") + 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/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 } 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/docker/entrypoint.sh b/docker/entrypoint.sh index da4871f..6d94e6c 100644 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -1,13 +1,12 @@ #!/bin/sh set -e -# Function to display usage information 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" @@ -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,21 +22,20 @@ 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 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 "$@" + exec /app/server -plugin /app/plugins -wexec ./app/worker "$@" ;; "--help"|"-h"|"help") usage 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/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; } 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..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,13 +22,18 @@ const ( ) type Message struct { - Async bool `json:"async"` - Executor string `json:"executor"` - 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"` } type ScriptResult struct { @@ -70,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 3010d83..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,21 +41,18 @@ 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) } - log.Info("WASM executor initialized") - return &PodmanExecutor{ ConnText: connText, store: store, @@ -69,7 +65,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() @@ -82,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") @@ -94,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") @@ -111,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() @@ -146,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") @@ -162,14 +166,14 @@ 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 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 @@ -321,7 +325,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 +341,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 +359,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 { @@ -372,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/executor/wasm_executor.go b/executor/wasm_executor.go index 5892bba..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" @@ -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, @@ -74,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))) @@ -141,13 +139,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) 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..7bfd5a6 100644 --- a/flake.nix +++ b/flake.nix @@ -8,8 +8,8 @@ outputs = { self, nixpkgs }: let - version = "0.9.0"; - vendorHash = "sha256-Jer/ADurA+BwvAuuTjEycJNExBnobEs72ccQMmOqV1k="; + version = "1.0.0"; + vendorHash = "sha256-LzsCivkWwbgESrUDEsGzIg8CabpoV5ot2tl75qizvfI="; mkPlugin = pkgs: name: path: @@ -34,13 +34,12 @@ 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"; in rec { default = server; @@ -53,14 +52,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 { @@ -68,64 +73,6 @@ 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}"); - - 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) - ''; - }; - }; - 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 "" ( @@ -136,7 +83,12 @@ server.wait_for_open_port(2379) 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 +105,25 @@ server.wait_for_open_port(2379) in { "x86_64-linux" = mkApps "x86_64-linux"; - "aarch64-linux" = mkApps "aarch64-linux"; + "aarch64-linux" = mkApps "aarch64-linux"; + }; + + # Tests + 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 + { + etcd = mkTest ./nix/tests/etcd.nix; + file = mkTest ./nix/tests/file.nix; }; devShells.x86_64-linux.default = @@ -196,6 +166,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/go.mod b/go.mod index de57ab0..3636a61 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/bytecodealliance/wasmtime-go/v49 v49.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..50becb4 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,26 +28,20 @@ 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= -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= 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 5360750..79b0541 100644 --- a/justfile +++ b/justfile @@ -1,5 +1,15 @@ -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 + +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 80098b9..865a832 100644 --- a/nix/modules/default.nix +++ b/nix/modules/default.nix @@ -10,9 +10,20 @@ let cfg = config.services.msgscript; pluginDir = pkgs.symlinkJoin { - name = "msgscript-server-plugins"; + name = "msgscript-worker-plugins"; 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}") workerEnvironment) + ); + + dataDir = "/var/lib/msgscript"; in { options.services.msgscript = { @@ -20,7 +31,7 @@ in etcdEndpoints = mkOption { type = types.listOf types.str; - default = [ "http://127.0.0.1:2379" ]; + default = [ ]; description = mdDoc "Etcd endpoints to connect to"; }; @@ -45,28 +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"; - }; - - 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"; @@ -79,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; @@ -90,6 +96,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,16 +118,21 @@ 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 ${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}" + + lib.optionalString (cfg.natsUrl != "") " -natsurl ${cfg.natsUrl}"; 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: @@ -122,7 +141,8 @@ in RestrictAddressFamilies = [ "AF_INET" "AF_INET6" - ]; + ] + ++ lib.optionals cfg.enablePodman [ "AF_UNIX" ]; RestrictNamespaces = !config.boot.isContainer; RestrictRealtime = true; RestrictSUIDSGID = true; @@ -165,12 +185,18 @@ in msgscript = { inherit (cfg) group; isSystemUser = true; - home = cfg.dataDir; + home = dataDir; }; }; users.groups = mkIf (cfg.group == "msgscript") { msgscript = { }; }; + + systemd.tmpfiles.rules = [ + "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/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/etcd.nix b/nix/tests/etcd.nix new file mode 100644 index 0000000..061b0b9 --- /dev/null +++ b/nix/tests/etcd.nix @@ -0,0 +1,111 @@ +{ + pkgs, + modules, + overlays, +}: + +let + inherit (import ./fixtures.nix { inherit pkgs; }) + helloLua + pathLua + wasmLua + wasm + helloImage + podmanLua + ; +in +pkgs.testers.runNixOSTest { + name = "msgscript-test-etcd"; + + node.pkgsReadOnly = false; + nodes.server = + { + config, + pkgs, + lib, + ... + }: + { + imports = [ + modules + ]; + + nixpkgs.overlays = overlays ++ [ + (prev: final: { + msgscript-worker = final.msgscript-worker.override { + withWasm = true; + withPodman = 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"; + enablePodman = true; + 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 + ]; + + 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("etcd.service") + server.wait_for_open_port(2379) + + 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") + + server.wait_for_unit("podman.socket") + server.succeed("podman load < ${helloImage}") + server.succeed("podman image exists localhost/hello:latest") + + 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/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