diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index a1e8aa9..5305b80 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -24,10 +24,9 @@ jobs: run: make build - name: Use golangci-lint - uses: golangci/golangci-lint-action@v6 + uses: golangci/golangci-lint-action@v9 with: - version: v1.64.6 - args: --print-issued-lines + version: v2.7.2 - name: Run tests run: make test diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 700ffd9..8304e32 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -26,3 +26,22 @@ jobs: args: release --clean env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + build-image: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - name: Log in to the Container registry + uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9 + with: + registry: "https://ghcr.io" + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push + uses: docker/build-push-action@v6 + with: + push: true + tags: ghcr.io/prbf2-tools/svctl:latest,ghcr.io/prbf2-tools/svctl:${{ github.ref_name }} diff --git a/Dockerfile b/Dockerfile index 4475a24..2f1e869 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Build stage -FROM golang:1.24.1-alpine AS builder +FROM golang:1.25.5-alpine AS builder # Install required tools for building RUN apk add --no-cache git make protoc protobuf-dev @@ -23,10 +23,10 @@ COPY main.go main.go COPY Makefile ./ # Generate code and build the daemon -RUN make build +RUN make build-linux # Runtime stage -FROM alpine:latest +FROM alpine:3.21 # Install ca-certificates for HTTPS requests and Docker CLI for Docker game servers RUN apk add ca-certificates docker-cli diff --git a/Makefile b/Makefile index 0dba590..d41b756 100644 --- a/Makefile +++ b/Makefile @@ -18,5 +18,5 @@ lint: grpc: protoc --go_out=. --go_opt=paths=source_relative \ --go-grpc_out=. --go-grpc_opt=paths=source_relative \ - svctl/svctl.proto + svctl/v1/svctl.proto diff --git a/cmd/common.go b/cmd/common.go index 4bcc60f..2f4377d 100644 --- a/cmd/common.go +++ b/cmd/common.go @@ -1,40 +1,45 @@ package cmd import ( + "fmt" + "net" "os" "path/filepath" - "github.com/sboon-gg/svctl/internal/server" + "github.com/prbf2-tools/svctl/svctl/v1" "github.com/spf13/cobra" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" ) const ( defaultSettingsPath = ".svctl" + + defaultDaemonHost = "127.0.0.1" + defaultDaemonPort = "50051" ) type serverOpts struct { - serverPath string + id string settingsPath string } func newServerOpts() *serverOpts { return &serverOpts{ - serverPath: ".", settingsPath: defaultSettingsPath, } } -func (opts *serverOpts) AddFlags(cmd *cobra.Command) { - cmd.Flags().StringVarP(&opts.serverPath, "path", "p", opts.serverPath, "Path to server directory") - cmd.Flags().StringVar(&opts.settingsPath, "settings", opts.settingsPath, "Path to settings directory") +func (opts *serverOpts) PreRunE(cmd *cobra.Command, args []string) error { + opts.id = args[0] + + return nil } -func (opts *serverOpts) Path() (string, error) { - if filepath.IsAbs(opts.serverPath) { - return opts.serverPath, nil - } +func (opts *serverOpts) AddFlags(cmd *cobra.Command) { + cmd.Flags().StringVar(&opts.settingsPath, "settings", opts.settingsPath, "Path to settings directory") - return concatWithWorkingDir(opts.serverPath) + _ = cmd.MarkFlagDirname("settings") } func (opts *serverOpts) SettingsPath() (string, error) { @@ -54,16 +59,51 @@ func concatWithWorkingDir(path string) (string, error) { return filepath.Join(wd, path), nil } -func (opts *serverOpts) Server() (*server.Server, error) { - path, err := opts.Path() - if err != nil { - return nil, err +type daemonConnOpts struct { + host string + port string +} + +func newDaemonConnOpts() *daemonConnOpts { + return &daemonConnOpts{ + host: defaultDaemonHost, + port: defaultDaemonPort, } +} - svctlPath, err := opts.SettingsPath() +func (o *daemonConnOpts) AddFlags(cmd *cobra.Command) { + cmd.Flags().StringVar(&o.host, "host", o.host, "Daemon host") + cmd.Flags().StringVar(&o.port, "port", o.port, "Daemon port") +} + +func (o *daemonConnOpts) address() string { + return net.JoinHostPort(o.host, o.port) +} + +func (o *daemonConnOpts) Client() (svctl.ServersClient, *grpc.ClientConn, error) { + conn, err := grpc.NewClient(o.address(), grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { - return nil, err + return nil, nil, fmt.Errorf("failed to connect to gRPC server at %s: %w", o.address(), err) } - return server.Open(path, svctlPath) + client := svctl.NewServersClient(conn) + + return client, conn, nil +} + +type grpcClientCmdOpts struct { + *daemonConnOpts + *serverOpts +} + +func newGrpcClientCmdOpts() *grpcClientCmdOpts { + return &grpcClientCmdOpts{ + daemonConnOpts: newDaemonConnOpts(), + serverOpts: newServerOpts(), + } +} + +func (o *grpcClientCmdOpts) AddFlags(cmd *cobra.Command) { + o.daemonConnOpts.AddFlags(cmd) + o.serverOpts.AddFlags(cmd) } diff --git a/cmd/daemon.go b/cmd/daemon.go index bcf976f..baf08ad 100644 --- a/cmd/daemon.go +++ b/cmd/daemon.go @@ -1,31 +1,24 @@ package cmd import ( - "log" + "fmt" "net" - "github.com/sboon-gg/svctl/internal/api" - "github.com/sboon-gg/svctl/internal/daemon" - "github.com/sboon-gg/svctl/svctl" + "github.com/prbf2-tools/svctl/internal/api" + "github.com/prbf2-tools/svctl/internal/daemon" + "github.com/prbf2-tools/svctl/svctl/v1" "github.com/spf13/cobra" "google.golang.org/grpc" ) -const ( - defaultDaemonHost = "127.0.0.1" - defaultDaemonPort = "50051" -) - type daemonOpts struct { - host string - port string + *daemonConnOpts configFile string } func newDaemonOpts() *daemonOpts { return &daemonOpts{ - host: defaultDaemonHost, - port: defaultDaemonPort, + daemonConnOpts: newDaemonConnOpts(), } } @@ -43,8 +36,7 @@ func daemonCmd() *cobra.Command { } func (o *daemonOpts) AddFlags(cmd *cobra.Command) { - cmd.Flags().StringVar(&o.host, "host", o.host, "Host to listen on") - cmd.Flags().StringVar(&o.port, "port", o.port, "Port to listen on") + o.daemonConnOpts.AddFlags(cmd) cmd.Flags().StringVar(&o.configFile, "config", o.configFile, "Path to the daemon config file") } @@ -56,12 +48,12 @@ func (o *daemonOpts) Run(cmd *cobra.Command, args []string) error { lis, err := net.Listen("tcp", o.address()) if err != nil { - log.Fatalf("failed to listen on address %s: %v", o.address(), err) + return fmt.Errorf("failed to listen on address %s: %w", o.address(), err) } s := grpc.NewServer() svctl.RegisterServersServer(s, api.NewDaemonServer(d)) - log.Printf("gRPC server listening at %v", lis.Addr()) + cmd.Printf("gRPC server listening at %v", lis.Addr()) go func() { <-cmd.Context().Done() @@ -69,16 +61,12 @@ func (o *daemonOpts) Run(cmd *cobra.Command, args []string) error { }() if err := s.Serve(lis); err != nil { - log.Fatalf("failed to serve: %v", err) + return fmt.Errorf("failed to serve: %w", err) } return nil } -func (o *daemonOpts) address() string { - return net.JoinHostPort(o.host, o.port) -} - func init() { rootCmd.AddCommand(daemonCmd()) } diff --git a/cmd/register.go b/cmd/register.go index 240e25d..472aae7 100644 --- a/cmd/register.go +++ b/cmd/register.go @@ -6,23 +6,23 @@ package cmd import ( "context" "fmt" + "path/filepath" "time" - "github.com/sboon-gg/svctl/svctl" + "github.com/prbf2-tools/svctl/svctl/v1" "github.com/spf13/cobra" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" ) type registerOpts struct { - *serverOpts - *daemonOpts + *grpcClientCmdOpts + localPath string + containerName string + serviceName string } func newRegisterOpts() *registerOpts { return ®isterOpts{ - serverOpts: newServerOpts(), - daemonOpts: newDaemonOpts(), + grpcClientCmdOpts: newGrpcClientCmdOpts(), } } @@ -30,9 +30,11 @@ func registerCmd() *cobra.Command { opts := newRegisterOpts() cmd := &cobra.Command{ - Use: "register", - Short: "register a new user", - RunE: opts.Run, + Use: "register ", + Short: "register a new server", + PreRunE: opts.PreRunE, + Args: cobra.ExactArgs(1), + RunE: opts.Run, } opts.AddFlags(cmd) @@ -40,35 +42,48 @@ func registerCmd() *cobra.Command { return cmd } -func (o *registerOpts) AddFlags(cmd *cobra.Command) { - o.serverOpts.AddFlags(cmd) - o.daemonOpts.AddFlags(cmd) +func (opts *registerOpts) AddFlags(cmd *cobra.Command) { + opts.grpcClientCmdOpts.AddFlags(cmd) + + cmd.Flags().StringVarP(&opts.localPath, "path", "p", "", "Path to server directory") + cmd.Flags().StringVarP(&opts.containerName, "container", "c", "", "Name of the Docker container") + cmd.Flags().StringVarP(&opts.serviceName, "service", "s", "", "Name of the systemd service") + + _ = cmd.MarkFlagDirname("path") + cmd.MarkFlagsMutuallyExclusive("path", "container", "service") + cmd.MarkFlagsOneRequired("path", "container", "service") } -func (o *registerOpts) Run(cmd *cobra.Command, args []string) error { - conn, err := grpc.NewClient(o.daemonOpts.address(), grpc.WithTransportCredentials(insecure.NewCredentials())) +func (opts *registerOpts) Run(cmd *cobra.Command, args []string) error { + c, conn, err := opts.Client() if err != nil { - return fmt.Errorf("failed to connect to gRPC server at %s: %v", o.daemonOpts.address(), err) + return err } - defer conn.Close() - c := svctl.NewServersClient(conn) + defer func() { + err := conn.Close() + if err != nil { + cmd.PrintErrf("error closing connection: %v\n", err) + } + }() ctx, cancel := context.WithTimeout(cmd.Context(), time.Second) defer cancel() - path, err := o.Path() + location, err := opts.Location() if err != nil { return err } - settingsPath, err := o.SettingsPath() + settingsPath, err := opts.SettingsPath() if err != nil { return err } - r, err := c.Register(ctx, &svctl.ServerOpts{ - Path: path, + r, err := c.Register(ctx, &svctl.RegisterServerOpts{ + Id: opts.id, SettingsPath: settingsPath, + Location: location, + Type: opts.ServerType(), }) if err != nil { return fmt.Errorf("error calling function Register: %v", err) @@ -78,6 +93,35 @@ func (o *registerOpts) Run(cmd *cobra.Command, args []string) error { return nil } +func (opts *registerOpts) Location() (string, error) { + switch { + case opts.serviceName != "": + return opts.serviceName, nil + case opts.containerName != "": + return opts.containerName, nil + case opts.localPath != "": + if filepath.IsAbs(opts.localPath) { + return opts.localPath, nil + } + return concatWithWorkingDir(opts.localPath) + default: + return "", fmt.Errorf("no server identifier provided") + } +} + +func (opts *registerOpts) ServerType() svctl.ServerType { + switch { + case opts.serviceName != "": + return svctl.ServerType_SERVER_TYPE_SYSTEMD + case opts.containerName != "": + return svctl.ServerType_SERVER_TYPE_DOCKER + case opts.localPath != "": + return svctl.ServerType_SERVER_TYPE_LOCAL + default: + return svctl.ServerType_SERVER_TYPE_UNSPECIFIED + } +} + func init() { rootCmd.AddCommand(registerCmd()) } diff --git a/cmd/register_test.go b/cmd/register_test.go new file mode 100644 index 0000000..027273c --- /dev/null +++ b/cmd/register_test.go @@ -0,0 +1,101 @@ +package cmd + +import ( + "context" + "testing" + + "github.com/prbf2-tools/svctl/svctl/v1" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestRegisterCmd(t *testing.T) { + tests := []struct { + name string + args []string + mockFunc func(ctx context.Context, opts *svctl.RegisterServerOpts) (*svctl.ServerInfo, error) + expectedOutput string + errOutput string + }{ + { + name: "successful register with local path", + args: []string{"--path", "/test/path", "test-server"}, + mockFunc: func(ctx context.Context, opts *svctl.RegisterServerOpts) (*svctl.ServerInfo, error) { + assert.Equal(t, "test-server", opts.Id) + assert.Equal(t, svctl.ServerType_SERVER_TYPE_LOCAL, opts.Type) + assert.Equal(t, "/test/path", opts.Location) + return &svctl.ServerInfo{ + Id: "test-server", + Status: svctl.Status_STATUS_REGISTERED, + }, nil + }, + expectedOutput: "Server status: STATUS_REGISTERED\n", + }, + { + name: "successful register with container", + args: []string{"--container", "test-container", "test-server"}, + mockFunc: func(ctx context.Context, opts *svctl.RegisterServerOpts) (*svctl.ServerInfo, error) { + assert.Equal(t, "test-server", opts.Id) + assert.Equal(t, "test-container", opts.Location) + assert.Equal(t, svctl.ServerType_SERVER_TYPE_DOCKER, opts.Type) + return &svctl.ServerInfo{ + Id: "test-server", + Status: svctl.Status_STATUS_REGISTERED, + }, nil + }, + expectedOutput: "Server status: STATUS_REGISTERED\n", + }, + { + name: "successful register with service", + args: []string{"--service", "test-service", "test-server"}, + mockFunc: func(ctx context.Context, opts *svctl.RegisterServerOpts) (*svctl.ServerInfo, error) { + assert.Equal(t, "test-server", opts.Id) + assert.Equal(t, "test-service", opts.Location) + assert.Equal(t, svctl.ServerType_SERVER_TYPE_SYSTEMD, opts.Type) + return &svctl.ServerInfo{ + Id: "test-server", + Status: svctl.Status_STATUS_REGISTERED, + }, nil + }, + expectedOutput: "Server status: STATUS_REGISTERED\n", + }, + { + name: "missing arguments", + args: []string{}, + errOutput: "accepts 1 arg(s), received 0", + }, + { + name: "missing location flags", + args: []string{"test-server"}, + errOutput: "flags in the group", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Setup test server + testServer := NewTestGRPCServer(t) + defer testServer.Close() + + // Configure mock + testServer.Mock.RegisterFunc = tt.mockFunc + + // Create command + cmd := registerCmd() + + // Execute command with server address + output, err := ExecuteCommandWithServer(t, cmd, testServer, tt.args) + + // Check results + if tt.errOutput != "" { + require.Error(t, err) + assert.Contains(t, err.Error(), tt.errOutput) + } else { + require.NoError(t, err) + assert.Contains(t, output, tt.expectedOutput) + } + }) + } +} + + diff --git a/cmd/render.go b/cmd/render.go index 22ad12f..074a1c6 100644 --- a/cmd/render.go +++ b/cmd/render.go @@ -1,69 +1,78 @@ package cmd import ( + "context" "fmt" + "time" + "github.com/prbf2-tools/svctl/svctl/v1" "github.com/spf13/cobra" ) type renderOpts struct { - *serverOpts - dryRun bool + *grpcClientCmdOpts reloadableOnly bool } func newRenderOpts() *renderOpts { return &renderOpts{ - serverOpts: newServerOpts(), + grpcClientCmdOpts: newGrpcClientCmdOpts(), } } -func init() { - rootCmd.AddCommand(renderCmd()) -} - func renderCmd() *cobra.Command { opts := newRenderOpts() cmd := &cobra.Command{ - Use: "render", - Short: "Render templates", + Use: "render ", + Short: "Render server templates", + Long: `Send a render signal to daemon to render server templates`, SilenceUsage: true, - RunE: func(cmd *cobra.Command, args []string) error { - return opts.Run(cmd) - }, + PreRunE: opts.PreRunE, + Args: cobra.ExactArgs(1), + RunE: opts.Run, } - opts.serverOpts.AddFlags(cmd) - - cmd.Flags().BoolVar(&opts.dryRun, "dry-run", false, "Print out rendered files") - cmd.Flags().BoolVar(&opts.reloadableOnly, "reloadable-only", false, "Only render reloadable templates") + opts.AddFlags(cmd) return cmd } -func (opts *renderOpts) Run(cmd *cobra.Command) error { - sv, err := opts.Server() +func (o *renderOpts) AddFlags(cmd *cobra.Command) { + o.serverOpts.AddFlags(cmd) + o.daemonConnOpts.AddFlags(cmd) + + cmd.Flags().BoolVar(&o.reloadableOnly, "reloadable-only", false, "Only render reloadable templates") +} + +func (o *renderOpts) Run(cmd *cobra.Command, args []string) error { + c, conn, err := o.Client() if err != nil { return err } - - if opts.dryRun { - outputs, err := sv.DryRender() + defer func() { + err := conn.Close() if err != nil { - return err + cmd.PrintErrf("error closing connection: %v\n", err) } - for _, out := range outputs { - fmt.Printf("File: %s\n---\n%s", out.Destination, string(out.Content)) - } - } else { - err := sv.Render(opts.reloadableOnly) - if err != nil { - return err - } - } + }() + + ctx, cancel := context.WithTimeout(cmd.Context(), time.Second) + defer cancel() - cmd.Println("Rendered templates.") + r, err := c.Render(ctx, &svctl.RenderOpts{ + Id: o.id, + ReloadableOnly: o.reloadableOnly, + }) + if err != nil { + return fmt.Errorf("error calling function Render: %v", err) + } + cmd.Printf("Server templates rendered: %v\n", r.GetId()) return nil } + +func init() { + rootCmd.AddCommand(renderCmd()) +} + diff --git a/cmd/render_test.go b/cmd/render_test.go new file mode 100644 index 0000000..eeeb82e --- /dev/null +++ b/cmd/render_test.go @@ -0,0 +1,77 @@ +package cmd + +import ( + "context" + "testing" + + "github.com/prbf2-tools/svctl/svctl/v1" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestRenderCmd(t *testing.T) { + tests := []struct { + name string + args []string + mockFunc func(ctx context.Context, opts *svctl.RenderOpts) (*svctl.ServerInfo, error) + expectedOutput string + errOutput string + }{ + { + name: "successful render", + args: []string{"test-server"}, + mockFunc: func(ctx context.Context, opts *svctl.RenderOpts) (*svctl.ServerInfo, error) { + assert.Equal(t, "test-server", opts.Id) + assert.False(t, opts.ReloadableOnly) + return &svctl.ServerInfo{ + Id: "test-server", + }, nil + }, + expectedOutput: "Server templates rendered: test-server\n", + }, + { + name: "successful render with reloadable-only flag", + args: []string{"--reloadable-only", "test-server"}, + mockFunc: func(ctx context.Context, opts *svctl.RenderOpts) (*svctl.ServerInfo, error) { + assert.Equal(t, "test-server", opts.Id) + assert.True(t, opts.ReloadableOnly) + return &svctl.ServerInfo{ + Id: "test-server", + }, nil + }, + expectedOutput: "Server templates rendered: test-server\n", + }, + { + name: "missing arguments", + args: []string{}, + errOutput: "accepts 1 arg(s), received 0", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Setup test server + testServer := NewTestGRPCServer(t) + defer testServer.Close() + + // Configure mock + testServer.Mock.RenderFunc = tt.mockFunc + + // Create command + cmd := renderCmd() + + // Execute command with server address + output, err := ExecuteCommandWithServer(t, cmd, testServer, tt.args) + + // Check results + if tt.errOutput != "" { + require.Error(t, err) + assert.Contains(t, err.Error(), tt.errOutput) + } else { + require.NoError(t, err) + assert.Contains(t, output, tt.expectedOutput) + } + }) + } +} + diff --git a/cmd/reset.go b/cmd/reset.go index 1d1796d..4444530 100644 --- a/cmd/reset.go +++ b/cmd/reset.go @@ -5,21 +5,17 @@ import ( "fmt" "time" - "github.com/sboon-gg/svctl/svctl" + "github.com/prbf2-tools/svctl/svctl/v1" "github.com/spf13/cobra" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" ) type resetOpts struct { - *serverOpts - *daemonOpts + *grpcClientCmdOpts } func newResetOpts() *resetOpts { return &resetOpts{ - serverOpts: newServerOpts(), - daemonOpts: newDaemonOpts(), + grpcClientCmdOpts: newGrpcClientCmdOpts(), } } @@ -27,10 +23,12 @@ func resetCmd() *cobra.Command { opts := newResetOpts() cmd := &cobra.Command{ - Use: "reset", + Use: "reset ", Short: "Resets the server", Long: `Send a reset signal to daemon to reset the server`, SilenceUsage: true, + PreRunE: opts.PreRunE, + Args: cobra.ExactArgs(1), RunE: opts.Run, } @@ -39,28 +37,22 @@ func resetCmd() *cobra.Command { return cmd } -func (o *resetOpts) AddFlags(cmd *cobra.Command) { - o.serverOpts.AddFlags(cmd) - o.daemonOpts.AddFlags(cmd) -} - func (o *resetOpts) Run(cmd *cobra.Command, args []string) error { - conn, err := grpc.NewClient(o.daemonOpts.address(), grpc.WithTransportCredentials(insecure.NewCredentials())) + c, conn, err := o.Client() if err != nil { - return fmt.Errorf("failed to connect to gRPC server at %s: %v", o.daemonOpts.address(), err) + return err } - defer conn.Close() - c := svctl.NewServersClient(conn) + defer func() { + err := conn.Close() + if err != nil { + cmd.PrintErrf("error closing connection: %v\n", err) + } + }() ctx, cancel := context.WithTimeout(cmd.Context(), time.Second) defer cancel() - path, err := o.Path() - if err != nil { - return err - } - - r, err := c.Reset(ctx, &svctl.ServerOpts{Path: path}) + r, err := c.Reset(ctx, &svctl.ServerOpts{Id: o.id}) if err != nil { return fmt.Errorf("error calling function Reset: %v", err) } diff --git a/cmd/reset_test.go b/cmd/reset_test.go new file mode 100644 index 0000000..acaacac --- /dev/null +++ b/cmd/reset_test.go @@ -0,0 +1,68 @@ +package cmd + +import ( + "context" + "testing" + + "github.com/prbf2-tools/svctl/svctl/v1" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestResetCmd(t *testing.T) { + tests := []struct { + name string + args []string + mockFunc func(ctx context.Context, opts *svctl.ServerOpts) (*svctl.ServerInfo, error) + expectedOutput string + errOutput string + }{ + { + name: "successful reset", + args: []string{"test-server"}, + mockFunc: func(ctx context.Context, opts *svctl.ServerOpts) (*svctl.ServerInfo, error) { + assert.Equal(t, "test-server", opts.Id) + return &svctl.ServerInfo{ + Id: "test-server", + Status: svctl.Status_STATUS_REGISTERED, + DesiredState: svctl.State_STATE_STOPPED, + CurrentState: svctl.State_STATE_STOPPED, + }, nil + }, + expectedOutput: "Reseted completed: STATUS_REGISTERED\n", + }, + { + name: "missing arguments", + args: []string{}, + errOutput: "accepts 1 arg(s), received 0", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Setup test server + testServer := NewTestGRPCServer(t) + defer testServer.Close() + + // Configure mock + testServer.Mock.ResetFunc = tt.mockFunc + + // Create command + cmd := resetCmd() + + // Execute command with server address + output, err := ExecuteCommandWithServer(t, cmd, testServer, tt.args) + + // Check results + if tt.errOutput != "" { + require.Error(t, err) + assert.Contains(t, err.Error(), tt.errOutput) + } else { + require.NoError(t, err) + assert.Contains(t, output, tt.expectedOutput) + } + }) + } +} + + diff --git a/cmd/restart.go b/cmd/restart.go new file mode 100644 index 0000000..eec1f99 --- /dev/null +++ b/cmd/restart.go @@ -0,0 +1,85 @@ +package cmd + +import ( + "context" + "fmt" + "time" + + "github.com/prbf2-tools/svctl/svctl/v1" + "github.com/spf13/cobra" +) + +type restartOpts struct { + *grpcClientCmdOpts +} + +func newRestartOpts() *restartOpts { + return &restartOpts{ + grpcClientCmdOpts: newGrpcClientCmdOpts(), + } +} + +func restartCmd() *cobra.Command { + opts := newRestartOpts() + + cmd := &cobra.Command{ + Use: "restart ", + Short: "Restarts the server", + Long: `Send stop and start signals to daemon to restart the server`, + SilenceUsage: true, + PreRunE: opts.PreRunE, + Args: cobra.ExactArgs(1), + RunE: opts.Run, + } + + opts.AddFlags(cmd) + + return cmd +} + +func (o *restartOpts) AddFlags(cmd *cobra.Command) { + o.grpcClientCmdOpts.AddFlags(cmd) +} + +func (o *restartOpts) Run(cmd *cobra.Command, args []string) error { + c, conn, err := o.Client() + if err != nil { + return err + } + defer func() { + err := conn.Close() + if err != nil { + cmd.PrintErrf("error closing connection: %v\n", err) + } + }() + + serverOpts := &svctl.ServerOpts{Id: o.id} + + // Stop the server first + cmd.Printf("Stopping server %s...\n", o.id) + ctx, cancel := context.WithTimeout(cmd.Context(), 5*time.Second) + defer cancel() + + _, err = c.Stop(ctx, serverOpts) + if err != nil { + return fmt.Errorf("error calling function Stop: %v", err) + } + + // Start the server + cmd.Printf("Starting server %s...\n", o.id) + ctx, cancel = context.WithTimeout(cmd.Context(), time.Second) + defer cancel() + + r, err := c.Start(ctx, serverOpts) + if err != nil { + return fmt.Errorf("error calling function Start: %v", err) + } + + cmd.Printf("Server restarted: %v\n", r.GetStatus().String()) + return nil +} + +func init() { + rootCmd.AddCommand(restartCmd()) +} + diff --git a/cmd/restart_test.go b/cmd/restart_test.go new file mode 100644 index 0000000..dc06e6f --- /dev/null +++ b/cmd/restart_test.go @@ -0,0 +1,80 @@ +package cmd + +import ( + "context" + "testing" + + "github.com/prbf2-tools/svctl/svctl/v1" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestRestartCmd(t *testing.T) { + tests := []struct { + name string + args []string + stopFunc func(ctx context.Context, opts *svctl.ServerOpts) (*svctl.ServerInfo, error) + startFunc func(ctx context.Context, opts *svctl.ServerOpts) (*svctl.ServerInfo, error) + expectedOutput []string + errOutput string + }{ + { + name: "successful restart", + args: []string{"test-server"}, + stopFunc: func(ctx context.Context, opts *svctl.ServerOpts) (*svctl.ServerInfo, error) { + assert.Equal(t, "test-server", opts.Id) + return &svctl.ServerInfo{ + Id: "test-server", + Status: svctl.Status_STATUS_STOPPING, + }, nil + }, + startFunc: func(ctx context.Context, opts *svctl.ServerOpts) (*svctl.ServerInfo, error) { + assert.Equal(t, "test-server", opts.Id) + return &svctl.ServerInfo{ + Id: "test-server", + Status: svctl.Status_STATUS_STARTING, + }, nil + }, + expectedOutput: []string{ + "Stopping server test-server...", + "Starting server test-server...", + "Server restarted: STATUS_STARTING", + }, + }, + { + name: "missing arguments", + args: []string{}, + errOutput: "accepts 1 arg(s), received 0", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Setup test server + testServer := NewTestGRPCServer(t) + defer testServer.Close() + + // Configure mock functions + testServer.Mock.StopFunc = tt.stopFunc + testServer.Mock.StartFunc = tt.startFunc + + // Create command + cmd := restartCmd() + + // Execute command with server address + output, err := ExecuteCommandWithServer(t, cmd, testServer, tt.args) + + // Check results + if tt.errOutput != "" { + require.Error(t, err) + assert.Contains(t, err.Error(), tt.errOutput) + } else { + require.NoError(t, err) + for _, expected := range tt.expectedOutput { + assert.Contains(t, output, expected) + } + } + }) + } +} + diff --git a/cmd/root.go b/cmd/root.go index 21eb4ab..2d46f02 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -11,13 +11,7 @@ import ( // rootCmd represents the base command when called without any subcommands var rootCmd = &cobra.Command{ Use: "svctl", - Short: "A brief description of your application", - Long: `A longer description that spans multiple lines and likely contains -examples and usage of using your application. For example: - -Cobra is a CLI library for Go that empowers applications. -This application is a tool to generate the needed files -to quickly create a Cobra application.`, + Short: "PRBF2 Server controller CLI", PersistentPreRunE: func(cmd *cobra.Command, args []string) error { debug, err := cmd.Flags().GetBool("debug") if err != nil { diff --git a/cmd/settings.go b/cmd/settings.go new file mode 100644 index 0000000..5cea8c7 --- /dev/null +++ b/cmd/settings.go @@ -0,0 +1,15 @@ +package cmd + +import ( + "github.com/spf13/cobra" +) + +var settingsCmd = &cobra.Command{ + Use: "settings", + Short: "Manage settings", +} + +func init() { + rootCmd.AddCommand(settingsCmd) +} + diff --git a/cmd/init.go b/cmd/settings_init.go similarity index 68% rename from cmd/init.go rename to cmd/settings_init.go index d4d685a..a99bb6a 100644 --- a/cmd/init.go +++ b/cmd/settings_init.go @@ -1,24 +1,24 @@ package cmd import ( - "github.com/sboon-gg/svctl/internal/settings" + "github.com/prbf2-tools/svctl/internal/settings" "github.com/spf13/cobra" ) -type initOpts struct { +type settingsInitOpts struct { serverOpts templatesRepo string token string } -func newInitOpts() *initOpts { - return &initOpts{ +func newSettingsInitOpts() *settingsInitOpts { + return &settingsInitOpts{ serverOpts: *newServerOpts(), } } -func initCmd() *cobra.Command { - opts := newInitOpts() +func settingsInitCmd() *cobra.Command { + opts := newSettingsInitOpts() cmd := &cobra.Command{ Use: "init", @@ -28,14 +28,19 @@ func initCmd() *cobra.Command { }, } + opts.AddFlags(cmd) + + return cmd +} + +func (opts *settingsInitOpts) AddFlags(cmd *cobra.Command) { opts.serverOpts.AddFlags(cmd) + cmd.Flags().StringVar(&opts.templatesRepo, "templates-repo", "", "Repository with templates") cmd.Flags().StringVar(&opts.token, "token", "", "Token to use when cloning templates repo") - - return cmd } -func (opts *initOpts) Run() error { +func (opts *settingsInitOpts) Run() error { svctlPath, err := opts.SettingsPath() if err != nil { return err @@ -53,5 +58,5 @@ func (opts *initOpts) Run() error { } func init() { - rootCmd.AddCommand(initCmd()) + settingsCmd.AddCommand(settingsInitCmd()) } diff --git a/cmd/start.go b/cmd/start.go index c9aaba9..82aca7d 100644 --- a/cmd/start.go +++ b/cmd/start.go @@ -5,21 +5,17 @@ import ( "fmt" "time" - "github.com/sboon-gg/svctl/svctl" + "github.com/prbf2-tools/svctl/svctl/v1" "github.com/spf13/cobra" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" ) type startOpts struct { - *serverOpts - *daemonOpts + *grpcClientCmdOpts } func newStartOpts() *startOpts { return &startOpts{ - serverOpts: newServerOpts(), - daemonOpts: newDaemonOpts(), + grpcClientCmdOpts: newGrpcClientCmdOpts(), } } @@ -27,10 +23,12 @@ func startCmd() *cobra.Command { opts := newStartOpts() cmd := &cobra.Command{ - Use: "start", + Use: "start ", Short: "Starts the server", Long: `Send a start signal to daemon to start the server`, SilenceUsage: true, + PreRunE: opts.PreRunE, + Args: cobra.ExactArgs(1), RunE: opts.Run, } @@ -41,26 +39,25 @@ func startCmd() *cobra.Command { func (o *startOpts) AddFlags(cmd *cobra.Command) { o.serverOpts.AddFlags(cmd) - o.daemonOpts.AddFlags(cmd) + o.daemonConnOpts.AddFlags(cmd) } func (o *startOpts) Run(cmd *cobra.Command, args []string) error { - conn, err := grpc.NewClient(o.daemonOpts.address(), grpc.WithTransportCredentials(insecure.NewCredentials())) + c, conn, err := o.Client() if err != nil { - return fmt.Errorf("failed to connect to gRPC server at %s: %v", o.daemonOpts.address(), err) + return err } - defer conn.Close() - c := svctl.NewServersClient(conn) + defer func() { + err := conn.Close() + if err != nil { + cmd.PrintErrf("error closing connection: %v\n", err) + } + }() ctx, cancel := context.WithTimeout(cmd.Context(), time.Second) defer cancel() - path, err := o.Path() - if err != nil { - return err - } - - r, err := c.Start(ctx, &svctl.ServerOpts{Path: path}) + r, err := c.Start(ctx, &svctl.ServerOpts{Id: o.id}) if err != nil { return fmt.Errorf("error calling function Start: %v", err) } diff --git a/cmd/start_test.go b/cmd/start_test.go new file mode 100644 index 0000000..179f917 --- /dev/null +++ b/cmd/start_test.go @@ -0,0 +1,65 @@ +package cmd + +import ( + "context" + "testing" + + "github.com/prbf2-tools/svctl/svctl/v1" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestStartCmd(t *testing.T) { + tests := []struct { + name string + args []string + mockFunc func(ctx context.Context, opts *svctl.ServerOpts) (*svctl.ServerInfo, error) + expectedOutput string + errOutput string + }{ + { + name: "successful start", + args: []string{"test-server"}, + mockFunc: func(ctx context.Context, opts *svctl.ServerOpts) (*svctl.ServerInfo, error) { + assert.Equal(t, "test-server", opts.Id) + return &svctl.ServerInfo{ + Id: "test-server", + Status: svctl.Status_STATUS_STARTING, + }, nil + }, + expectedOutput: "Server started: STATUS_STARTING\n", + }, + { + name: "missing arguments", + args: []string{}, + errOutput: "accepts 1 arg(s), received 0", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Setup test server + testServer := NewTestGRPCServer(t) + defer testServer.Close() + + // Configure mock + testServer.Mock.StartFunc = tt.mockFunc + + // Create command + cmd := startCmd() + + // Execute command with server address + output, err := ExecuteCommandWithServer(t, cmd, testServer, tt.args) + + // Check results + if tt.errOutput != "" { + require.Error(t, err) + assert.Contains(t, err.Error(), tt.errOutput) + } else { + require.NoError(t, err) + assert.Contains(t, output, tt.expectedOutput) + } + }) + } +} + diff --git a/cmd/status.go b/cmd/status.go index 2d27e12..3933357 100644 --- a/cmd/status.go +++ b/cmd/status.go @@ -6,22 +6,18 @@ import ( "fmt" "time" - "github.com/sboon-gg/svctl/svctl" + "github.com/prbf2-tools/svctl/svctl/v1" "github.com/spf13/cobra" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" ) type statusOpts struct { - *serverOpts - *daemonOpts + *grpcClientCmdOpts json bool } func newStatusOpts() *statusOpts { return &statusOpts{ - serverOpts: newServerOpts(), - daemonOpts: newDaemonOpts(), + grpcClientCmdOpts: newGrpcClientCmdOpts(), } } @@ -29,10 +25,12 @@ func statusCmd() *cobra.Command { opts := newStatusOpts() cmd := &cobra.Command{ - Use: "status", + Use: "status ", Short: "Server status", Long: `Display the status of the server`, SilenceUsage: true, + PreRunE: opts.PreRunE, + Args: cobra.ExactArgs(1), RunE: opts.Run, } @@ -42,29 +40,27 @@ func statusCmd() *cobra.Command { } func (o *statusOpts) AddFlags(cmd *cobra.Command) { - o.serverOpts.AddFlags(cmd) - o.daemonOpts.AddFlags(cmd) + o.grpcClientCmdOpts.AddFlags(cmd) cmd.Flags().BoolVarP(&o.json, "json", "j", false, "Output as JSON") } func (o *statusOpts) Run(cmd *cobra.Command, args []string) error { - conn, err := grpc.NewClient(o.daemonOpts.address(), grpc.WithTransportCredentials(insecure.NewCredentials())) + c, conn, err := o.Client() if err != nil { - return fmt.Errorf("failed to connect to gRPC server at %s: %v", o.daemonOpts.address(), err) + return err } - defer conn.Close() - c := svctl.NewServersClient(conn) + defer func() { + err := conn.Close() + if err != nil { + cmd.PrintErrf("error closing connection: %v\n", err) + } + }() ctx, cancel := context.WithTimeout(cmd.Context(), time.Second) defer cancel() - path, err := o.Path() - if err != nil { - return err - } - - status, err := c.Status(ctx, &svctl.ServerOpts{Path: path}) + status, err := c.Status(ctx, &svctl.ServerOpts{Id: o.id}) if err != nil { return fmt.Errorf("error calling function Status: %v", err) } @@ -80,7 +76,7 @@ func (o *statusOpts) Run(cmd *cobra.Command, args []string) error { } cmd.Printf("Server Info:\n") - cmd.Printf(" Path: %s\n", status.Path) + cmd.Printf(" Path: %s\n", status.Location) cmd.Printf(" Settings Path: %s\n", status.SettingsPath) cmd.Printf(" Desired State: %v\n", status.DesiredState) cmd.Printf(" Current State: %v\n", status.CurrentState) diff --git a/cmd/status_test.go b/cmd/status_test.go new file mode 100644 index 0000000..61d920f --- /dev/null +++ b/cmd/status_test.go @@ -0,0 +1,101 @@ +package cmd + +import ( + "context" + "testing" + + "github.com/prbf2-tools/svctl/svctl/v1" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestStatusCmd(t *testing.T) { + tests := []struct { + name string + args []string + mockFunc func(ctx context.Context, opts *svctl.ServerOpts) (*svctl.ServerInfo, error) + expectedOutput []string + errOutput string + }{ + { + name: "successful status", + args: []string{"test-server"}, + mockFunc: func(ctx context.Context, opts *svctl.ServerOpts) (*svctl.ServerInfo, error) { + assert.Equal(t, "test-server", opts.Id) + return &svctl.ServerInfo{ + Id: "test-server", + Location: "/test/location", + SettingsPath: "/test/settings", + Status: svctl.Status_STATUS_REGISTERED, + DesiredState: svctl.State_STATE_RUNNING, + CurrentState: svctl.State_STATE_RUNNING, + GameStatus: &svctl.GameStatus{ + Hostname: "Test Server", + Port: "16567", + Gamemode: "gpm_cq", + MapName: "strike_at_karkand", + MapSize: 64, + NumPlayers: 32, + MaxPlayers: 64, + }, + }, nil + }, + expectedOutput: []string{ + "Server Info:", + "Path: /test/location", + "Settings Path: /test/settings", + "Desired State: STATE_RUNNING", + "Current State: STATE_RUNNING", + "Hostname: Test Server", + "Port: 16567", + "Game Mode: gpm_cq", + "Map Name: strike_at_karkand", + }, + }, + { + name: "json output", + args: []string{"--json", "test-server"}, + mockFunc: func(ctx context.Context, opts *svctl.ServerOpts) (*svctl.ServerInfo, error) { + return TestServerInfo("test-server"), nil + }, + expectedOutput: []string{ + `"id": "test-server"`, + `"location": "/test/test-server"`, + }, + }, + { + name: "missing arguments", + args: []string{}, + errOutput: "accepts 1 arg(s), received 0", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Setup test server + testServer := NewTestGRPCServer(t) + defer testServer.Close() + + // Configure mock + testServer.Mock.StatusFunc = tt.mockFunc + + // Create command + cmd := statusCmd() + + // Execute command with server address + output, err := ExecuteCommandWithServer(t, cmd, testServer, tt.args) + + // Check results + if tt.errOutput != "" { + require.Error(t, err) + assert.Contains(t, err.Error(), tt.errOutput) + } else { + require.NoError(t, err) + for _, expected := range tt.expectedOutput { + assert.Contains(t, output, expected) + } + } + }) + } +} + diff --git a/cmd/stop.go b/cmd/stop.go index aef31ef..9850a13 100644 --- a/cmd/stop.go +++ b/cmd/stop.go @@ -5,21 +5,17 @@ import ( "fmt" "time" - "github.com/sboon-gg/svctl/svctl" + "github.com/prbf2-tools/svctl/svctl/v1" "github.com/spf13/cobra" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" ) type stopOpts struct { - *serverOpts - *daemonOpts + *grpcClientCmdOpts } func newStopOpts() *stopOpts { return &stopOpts{ - serverOpts: newServerOpts(), - daemonOpts: newDaemonOpts(), + grpcClientCmdOpts: newGrpcClientCmdOpts(), } } @@ -27,10 +23,12 @@ func stopCmd() *cobra.Command { opts := newStopOpts() cmd := &cobra.Command{ - Use: "stop", + Use: "stop ", Short: "Stops the server", Long: `Send a stop signal to daemon to stop the server`, SilenceUsage: true, + PreRunE: opts.PreRunE, + Args: cobra.ExactArgs(1), RunE: opts.Run, } @@ -39,28 +37,22 @@ func stopCmd() *cobra.Command { return cmd } -func (o *stopOpts) AddFlags(cmd *cobra.Command) { - o.serverOpts.AddFlags(cmd) - o.daemonOpts.AddFlags(cmd) -} - func (o *stopOpts) Run(cmd *cobra.Command, args []string) error { - conn, err := grpc.NewClient(o.daemonOpts.address(), grpc.WithTransportCredentials(insecure.NewCredentials())) + c, conn, err := o.Client() if err != nil { - return fmt.Errorf("failed to connect to gRPC server at %s: %v", o.daemonOpts.address(), err) + return err } - defer conn.Close() - c := svctl.NewServersClient(conn) + defer func() { + err := conn.Close() + if err != nil { + cmd.PrintErrf("error closing connection: %v\n", err) + } + }() ctx, cancel := context.WithTimeout(cmd.Context(), 5*time.Second) defer cancel() - path, err := o.Path() - if err != nil { - return err - } - - r, err := c.Stop(ctx, &svctl.ServerOpts{Path: path}) + r, err := c.Stop(ctx, &svctl.ServerOpts{Id: o.id}) if err != nil { return fmt.Errorf("error calling function Stop: %v", err) } diff --git a/cmd/stop_test.go b/cmd/stop_test.go new file mode 100644 index 0000000..56ee112 --- /dev/null +++ b/cmd/stop_test.go @@ -0,0 +1,65 @@ +package cmd + +import ( + "context" + "testing" + + "github.com/prbf2-tools/svctl/svctl/v1" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestStopCmd(t *testing.T) { + tests := []struct { + name string + args []string + mockFunc func(ctx context.Context, opts *svctl.ServerOpts) (*svctl.ServerInfo, error) + expectedOutput string + errOutput string + }{ + { + name: "successful stop", + args: []string{"test-server"}, + mockFunc: func(ctx context.Context, opts *svctl.ServerOpts) (*svctl.ServerInfo, error) { + assert.Equal(t, "test-server", opts.Id) + return &svctl.ServerInfo{ + Id: "test-server", + Status: svctl.Status_STATUS_STOPPING, + }, nil + }, + expectedOutput: "Server status: STATUS_STOPPING\n", + }, + { + name: "missing arguments", + args: []string{}, + errOutput: "accepts 1 arg(s), received 0", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Setup test server + testServer := NewTestGRPCServer(t) + defer testServer.Close() + + // Configure mock + testServer.Mock.StopFunc = tt.mockFunc + + // Create command + cmd := stopCmd() + + // Execute command with server address + output, err := ExecuteCommandWithServer(t, cmd, testServer, tt.args) + + // Check results + if tt.errOutput != "" { + require.Error(t, err) + assert.Contains(t, err.Error(), tt.errOutput) + } else { + require.NoError(t, err) + assert.Contains(t, output, tt.expectedOutput) + } + }) + } +} + diff --git a/cmd/templates.go b/cmd/templates.go new file mode 100644 index 0000000..3c00012 --- /dev/null +++ b/cmd/templates.go @@ -0,0 +1,52 @@ +package cmd + +import ( + "os" + + "github.com/goccy/go-yaml" + "github.com/prbf2-tools/svctl/pkg/templates" + "github.com/spf13/cobra" +) + +type templatesOpts struct { + values []string +} + +func newTemplatesOpts() *templatesOpts { + return &templatesOpts{} +} + +func (opts *templatesOpts) AddFlags(cmd *cobra.Command) { + cmd.Flags().StringArrayVarP(&opts.values, "values", "f", []string{}, "Path to values file(s)") + _ = cmd.MarkFlagFilename("values", "yaml", "yml", "json") +} + +func (opts *templatesOpts) MergedValues() (templates.Values, error) { + valuesSources := make([]templates.Values, len(opts.values)) + for i, path := range opts.values { + var values templates.Values + file, err := os.Open(path) + if err != nil { + return nil, err + } + + err = yaml.NewDecoder(file).Decode(&values) + _ = file.Close() + if err != nil { + return nil, err + } + + valuesSources[i] = values + } + + return templates.MergeValues(valuesSources...) +} + +var templatesCmd = &cobra.Command{ + Use: "templates", + Short: "Manage templates", +} + +func init() { + rootCmd.AddCommand(templatesCmd) +} diff --git a/cmd/templates_render.go b/cmd/templates_render.go new file mode 100644 index 0000000..cbaf71f --- /dev/null +++ b/cmd/templates_render.go @@ -0,0 +1,95 @@ +package cmd + +import ( + "os" + "path/filepath" + + "github.com/prbf2-tools/svctl/pkg/templates" + "github.com/spf13/cobra" +) + +type templatesRenderOpts struct { + *templatesOpts + outputPath string + dryRun bool +} + +func newTemplatesRenderOpts() *templatesRenderOpts { + return &templatesRenderOpts{ + templatesOpts: newTemplatesOpts(), + } +} + +func templatesRenderCmd() *cobra.Command { + opts := newTemplatesRenderOpts() + + cmd := &cobra.Command{ + Use: "render ", + Short: "Render templates with provided values", + RunE: opts.Run, + } + + cmd.Args = cobra.ExactArgs(1) + + opts.AddFlags(cmd) + + return cmd +} + +func (opts *templatesRenderOpts) AddFlags(cmd *cobra.Command) { + opts.templatesOpts.AddFlags(cmd) + + cmd.Flags().StringVarP(&opts.outputPath, "output", "o", "", "Path to output rendered files") + cmd.Flags().BoolVar(&opts.dryRun, "dry-run", false, "Print out rendered files") + + _ = cmd.MarkFlagDirname("output") + cmd.MarkFlagsOneRequired("output", "dry-run") + cmd.MarkFlagsMutuallyExclusive("output", "dry-run") +} + +func (opts *templatesRenderOpts) Run(cmd *cobra.Command, args []string) error { + renderer, err := templates.NewFromPath(args[0]) + if err != nil { + return err + } + + mergedValues, err := opts.MergedValues() + if err != nil { + return err + } + + outputs, err := renderer.Render(nil, mergedValues) + if err != nil { + return err + } + + if opts.dryRun { + for _, output := range outputs { + cmd.Println("=== " + output.Destination + " ===") + cmd.Println(string(output.Content)) + } + return nil + } + + for _, output := range outputs { + fullDir := filepath.Join(opts.outputPath, filepath.Dir(output.Destination)) + err = os.MkdirAll(fullDir, 0o755) + if err != nil { + return err + } + + fullPath := filepath.Join(opts.outputPath, output.Destination) + err = os.WriteFile(fullPath, output.Content, 0o644) + if err != nil { + return err + } + + cmd.Printf("Wrote %s\n", fullPath) + } + + return nil +} + +func init() { + templatesCmd.AddCommand(templatesRenderCmd()) +} diff --git a/cmd/templates_validate.go b/cmd/templates_validate.go new file mode 100644 index 0000000..5f57fd5 --- /dev/null +++ b/cmd/templates_validate.go @@ -0,0 +1,97 @@ +package cmd + +import ( + "fmt" + + "github.com/goccy/go-yaml" + "github.com/prbf2-tools/svctl/pkg/templates" + "github.com/spf13/cobra" +) + +type templatesValidateOpts struct { + *templatesOpts +} + +func newTemplatesValidateOpts() *templatesValidateOpts { + return &templatesValidateOpts{ + templatesOpts: newTemplatesOpts(), + } +} + +func templatesValidateCmd() *cobra.Command { + opts := newTemplatesValidateOpts() + + cmd := &cobra.Command{ + Use: "validate ", + Short: "Validate templates in the specified path", + RunE: opts.Run, + } + + cmd.Args = cobra.ExactArgs(1) + + opts.AddFlags(cmd) + + return cmd +} + +func (o *templatesValidateOpts) AddFlags(cmd *cobra.Command) { + // Add flags here if needed in the future +} + +func (o *templatesValidateOpts) Run(cmd *cobra.Command, args []string) error { + templatesPath := args[0] + + renderer, err := templates.NewFromPath(templatesPath) + if err != nil { + return err + } + + schema, err := renderer.Schema() + if err != nil { + return err + } + + cmd.Println("Validating defaults...") + + defaultsContent, err := renderer.DefaultsContent() + if err != nil { + return err + } + + var defaults map[string]any + err = yaml.Unmarshal(defaultsContent, &defaults) + if err != nil { + return err + } + + err = schema.Validate(defaults) + if err != nil { + return fmt.Errorf("defaults validation failed: %w", err) + } + + cmd.Println("Defaults validation succeeded") + cmd.Println("Validating values merged with defaults...") + + mergedValues, err := o.MergedValues() + if err != nil { + return err + } + + mergedValues, err = templates.MergeValues(defaults, mergedValues) + if err != nil { + return err + } + m := map[string]any(mergedValues) + + err = schema.Validate(m) + if err != nil { + return fmt.Errorf("merged values validation failed: %w", err) + } + + cmd.Println("Merged values validation succeeded") + return nil +} + +func init() { + templatesCmd.AddCommand(templatesValidateCmd()) +} diff --git a/cmd/test_helper.go b/cmd/test_helper.go new file mode 100644 index 0000000..ed0a120 --- /dev/null +++ b/cmd/test_helper.go @@ -0,0 +1,248 @@ +package cmd + +import ( + "context" + "fmt" + "net" + "testing" + + "github.com/prbf2-tools/svctl/svctl/v1" + "github.com/spf13/cobra" + "github.com/stretchr/testify/require" + "google.golang.org/grpc" +) + +// MockServersServer implements the svctl.ServersServer interface for testing +type MockServersServer struct { + svctl.UnimplementedServersServer + + // Test functions that can be overridden + RegisterFunc func(context.Context, *svctl.RegisterServerOpts) (*svctl.ServerInfo, error) + StartFunc func(context.Context, *svctl.ServerOpts) (*svctl.ServerInfo, error) + StopFunc func(context.Context, *svctl.ServerOpts) (*svctl.ServerInfo, error) + StatusFunc func(context.Context, *svctl.ServerOpts) (*svctl.ServerInfo, error) + ResetFunc func(context.Context, *svctl.ServerOpts) (*svctl.ServerInfo, error) + RenderFunc func(context.Context, *svctl.RenderOpts) (*svctl.ServerInfo, error) +} + +func (m *MockServersServer) Register(ctx context.Context, opts *svctl.RegisterServerOpts) (*svctl.ServerInfo, error) { + if m.RegisterFunc != nil { + return m.RegisterFunc(ctx, opts) + } + return &svctl.ServerInfo{ + Id: opts.Id, + Location: opts.Location, + SettingsPath: opts.SettingsPath, + Status: svctl.Status_STATUS_REGISTERED, + DesiredState: svctl.State_STATE_STOPPED, + CurrentState: svctl.State_STATE_STOPPED, + }, nil +} + +func (m *MockServersServer) Start(ctx context.Context, opts *svctl.ServerOpts) (*svctl.ServerInfo, error) { + if m.StartFunc != nil { + return m.StartFunc(ctx, opts) + } + return &svctl.ServerInfo{ + Id: opts.Id, + Status: svctl.Status_STATUS_STARTING, + DesiredState: svctl.State_STATE_RUNNING, + CurrentState: svctl.State_STATE_RUNNING, + }, nil +} + +func (m *MockServersServer) Stop(ctx context.Context, opts *svctl.ServerOpts) (*svctl.ServerInfo, error) { + if m.StopFunc != nil { + return m.StopFunc(ctx, opts) + } + return &svctl.ServerInfo{ + Id: opts.Id, + Status: svctl.Status_STATUS_STOPPING, + DesiredState: svctl.State_STATE_STOPPED, + CurrentState: svctl.State_STATE_STOPPED, + }, nil +} + +func (m *MockServersServer) Status(ctx context.Context, opts *svctl.ServerOpts) (*svctl.ServerInfo, error) { + if m.StatusFunc != nil { + return m.StatusFunc(ctx, opts) + } + return &svctl.ServerInfo{ + Id: opts.Id, + Location: "/test/location", + SettingsPath: "/test/settings", + Status: svctl.Status_STATUS_REGISTERED, + DesiredState: svctl.State_STATE_STOPPED, + CurrentState: svctl.State_STATE_STOPPED, + GameStatus: &svctl.GameStatus{ + Hostname: "Test Server", + Port: "16567", + Gamemode: "gpm_cq", + MapName: "strike_at_karkand", + MapSize: 64, + NumPlayers: 32, + MaxPlayers: 64, + }, + }, nil +} + +func (m *MockServersServer) Reset(ctx context.Context, opts *svctl.ServerOpts) (*svctl.ServerInfo, error) { + if m.ResetFunc != nil { + return m.ResetFunc(ctx, opts) + } + return &svctl.ServerInfo{ + Id: opts.Id, + Status: svctl.Status_STATUS_REGISTERED, + DesiredState: svctl.State_STATE_STOPPED, + CurrentState: svctl.State_STATE_STOPPED, + }, nil +} + +func (m *MockServersServer) Render(ctx context.Context, opts *svctl.RenderOpts) (*svctl.ServerInfo, error) { + if m.RenderFunc != nil { + return m.RenderFunc(ctx, opts) + } + return &svctl.ServerInfo{ + Id: opts.Id, + Status: svctl.Status_STATUS_REGISTERED, + DesiredState: svctl.State_STATE_STOPPED, + CurrentState: svctl.State_STATE_STOPPED, + }, nil +} + +// TestGRPCServer sets up a real gRPC server with mock implementation for testing +type TestGRPCServer struct { + Server *grpc.Server + Listener net.Listener + Mock *MockServersServer + Address string + done chan struct{} +} + +// NewTestGRPCServer creates a new test gRPC server with a mock implementation +func NewTestGRPCServer(t *testing.T) *TestGRPCServer { + // Create listener on available port + lis, err := net.Listen("tcp", "127.0.0.1:0") + require.NoError(t, err) + + // Create gRPC server + server := grpc.NewServer() + + // Create mock service + mock := &MockServersServer{} + svctl.RegisterServersServer(server, mock) + + done := make(chan struct{}) + + // Start server in background + go func() { + defer close(done) + err := server.Serve(lis) + // Only assert no error if the server wasn't gracefully stopped + if err != nil && err != grpc.ErrServerStopped { + require.NoError(t, err) + } + }() + + return &TestGRPCServer{ + Server: server, + Listener: lis, + Mock: mock, + Address: lis.Addr().String(), + done: done, + } +} + +// Close shuts down the test server +func (ts *TestGRPCServer) Close() { + if ts.Server != nil { + ts.Server.GracefulStop() + } + if ts.Listener != nil { + _ = ts.Listener.Close() + } + // Wait for the server goroutine to finish + if ts.done != nil { + <-ts.done + } +} + +// Host returns the host part of the server address +func (ts *TestGRPCServer) Host() string { + host, _, _ := net.SplitHostPort(ts.Address) + return host +} + +// Port returns the port part of the server address +func (ts *TestGRPCServer) Port() string { + _, port, _ := net.SplitHostPort(ts.Address) + return port +} + +// ExecuteCommandWithServer executes a cobra command with the given arguments and server address +func ExecuteCommandWithServer(t *testing.T, cmd *cobra.Command, server *TestGRPCServer, args []string) (string, error) { + // Capture output + output := &testOutput{} + cmd.SetOut(output) + cmd.SetErr(output) + + // Add server address flags and other args + allArgs := append([]string{"--host", server.Host(), "--port", server.Port()}, args...) + cmd.SetArgs(allArgs) + + // Execute + err := cmd.Execute() + + return output.String(), err +} + +// testOutput captures command output for testing +type testOutput struct { + data []byte +} + +func (o *testOutput) Write(p []byte) (n int, err error) { + o.data = append(o.data, p...) + return len(p), nil +} + +func (o *testOutput) String() string { + return string(o.data) +} + +// TestServerInfo returns a standard test ServerInfo for consistent testing +func TestServerInfo(id string) *svctl.ServerInfo { + return &svctl.ServerInfo{ + Id: id, + Location: fmt.Sprintf("/test/%s", id), + SettingsPath: fmt.Sprintf("/test/%s/.svctl", id), + Status: svctl.Status_STATUS_REGISTERED, + DesiredState: svctl.State_STATE_STOPPED, + CurrentState: svctl.State_STATE_STOPPED, + GameStatus: &svctl.GameStatus{ + Hostname: fmt.Sprintf("Test Server %s", id), + Port: "16567", + Gamemode: "gpm_cq", + MapName: "strike_at_karkand", + MapSize: 4, + NumPlayers: 32, + MaxPlayers: 100, + }, + } +} + +// ExecuteCommand executes a cobra command with the given arguments for testing (without server) +func ExecuteCommand(t *testing.T, cmd *cobra.Command, args []string) (string, error) { + // Capture output + output := &testOutput{} + cmd.SetOut(output) + cmd.SetErr(output) + + // Set args + cmd.SetArgs(args) + + // Execute + err := cmd.Execute() + + return output.String(), err +} diff --git a/cmd/update.go b/cmd/update.go index dd77df0..3f177f8 100644 --- a/cmd/update.go +++ b/cmd/update.go @@ -1,7 +1,7 @@ package cmd import ( - "github.com/sboon-gg/svctl/internal/game/local" + "github.com/prbf2-tools/svctl/internal/game/local" "github.com/spf13/cobra" ) diff --git a/go.mod b/go.mod index 52d3f93..d7c067b 100644 --- a/go.mod +++ b/go.mod @@ -1,256 +1,88 @@ -module github.com/sboon-gg/svctl +module github.com/prbf2-tools/svctl -go 1.24.1 +go 1.25.5 require ( - dario.cat/mergo v1.0.0 - github.com/Masterminds/sprig/v3 v3.2.3 - github.com/docker/docker v28.0.1+incompatible - github.com/emilekm/go-prbf2 v0.0.0-20250305193713-36eade76571f - github.com/go-git/go-git/v5 v5.11.0 - github.com/gocarina/gocsv v0.0.0-20231116093920-b87c2d0e983a - github.com/goccy/go-yaml v1.11.3 - github.com/golangci/golangci-lint v1.57.1 - github.com/samber/slog-multi v1.0.2 - github.com/samber/slog-webhook/v2 v2.5.1 - github.com/shirou/gopsutil/v3 v3.24.2 - github.com/spf13/cobra v1.8.0 - github.com/stretchr/testify v1.10.0 - go.uber.org/mock v0.4.0 - golang.org/x/sys v0.29.0 - google.golang.org/grpc v1.69.4 - google.golang.org/protobuf v1.36.3 + dario.cat/mergo v1.0.2 + github.com/Masterminds/sprig/v3 v3.3.0 + github.com/coreos/go-systemd/v22 v22.6.0 + github.com/go-git/go-git/v5 v5.16.4 + github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1 + github.com/goccy/go-yaml v1.19.1 + github.com/moby/moby/client v0.2.1 + github.com/samber/slog-multi v1.6.0 + github.com/samber/slog-webhook/v2 v2.8.2 + github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 + github.com/shirou/gopsutil/v3 v3.24.5 + github.com/spf13/cobra v1.10.2 + github.com/stretchr/testify v1.11.1 + go.uber.org/mock v0.6.0 + golang.org/x/sys v0.39.0 + google.golang.org/grpc v1.78.0 + google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 ) require ( - 4d63.com/gocheckcompilerdirectives v1.2.1 // indirect - 4d63.com/gochecknoglobals v0.2.1 // indirect - github.com/4meepo/tagalign v1.3.3 // indirect - github.com/Abirdcfly/dupword v0.0.14 // indirect - github.com/Antonboom/errname v0.1.12 // indirect - github.com/Antonboom/nilnil v0.1.7 // indirect - github.com/Antonboom/testifylint v1.2.0 // indirect - github.com/BurntSushi/toml v1.3.2 // indirect - github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect - github.com/GaijinEntertainment/go-exhaustruct/v3 v3.2.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/semver v1.5.0 // indirect - github.com/Masterminds/semver/v3 v3.2.0 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/OpenPeeDeeP/depguard/v2 v2.2.0 // indirect - github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect - github.com/alecthomas/go-check-sumtype v0.1.4 // indirect - github.com/alexkohler/nakedret/v2 v2.0.4 // indirect - github.com/alexkohler/prealloc v1.0.0 // indirect - github.com/alingse/asasalint v0.0.11 // indirect - github.com/ashanbrown/forbidigo v1.6.0 // indirect - github.com/ashanbrown/makezero v1.1.1 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/bkielbasa/cyclop v1.2.1 // indirect - github.com/blizzy78/varnamelen v0.8.0 // indirect - github.com/bombsimon/wsl/v4 v4.2.1 // indirect - github.com/breml/bidichk v0.2.7 // indirect - github.com/breml/errchkjson v0.3.6 // indirect - github.com/butuzov/ireturn v0.3.0 // indirect - github.com/butuzov/mirror v1.1.0 // indirect - github.com/catenacyber/perfsprint v0.7.1 // indirect - github.com/ccojocar/zxcvbn-go v1.0.2 // indirect + github.com/Masterminds/semver/v3 v3.4.0 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/ProtonMail/go-crypto v1.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/charithe/durationcheck v0.0.10 // indirect - github.com/chavacava/garif v0.1.0 // indirect - github.com/ckaznocha/intrange v0.1.0 // indirect - github.com/cloudflare/circl v1.3.3 // indirect - github.com/containerd/log v0.1.0 // indirect - github.com/curioswitch/go-reassign v0.2.0 // indirect - github.com/cyphar/filepath-securejoin v0.2.4 // indirect - github.com/daixiang0/gci v0.12.3 // indirect + github.com/cloudflare/circl v1.6.2 // indirect + github.com/containerd/errdefs v1.0.0 // indirect + github.com/containerd/errdefs/pkg v0.3.0 // indirect + github.com/cyphar/filepath-securejoin v0.6.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/denis-tingaikin/go-header v0.5.0 // indirect github.com/distribution/reference v0.6.0 // indirect - github.com/docker/go-connections v0.5.0 // indirect + github.com/docker/go-connections v0.6.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/emirpasic/gods v1.18.1 // indirect - github.com/ettle/strcase v0.2.0 // indirect - github.com/fatih/color v1.16.0 // indirect - github.com/fatih/structtag v1.2.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/firefart/nonamedreturns v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/fzipp/gocyclo v0.6.0 // indirect - github.com/ghostiam/protogetter v0.3.5 // indirect - github.com/go-critic/go-critic v0.11.2 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.5.0 // indirect - github.com/go-logr/logr v1.4.2 // indirect + github.com/go-git/go-billy/v5 v5.7.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-toolsmith/astcast v1.1.0 // indirect - github.com/go-toolsmith/astcopy v1.1.0 // indirect - github.com/go-toolsmith/astequal v1.2.0 // indirect - github.com/go-toolsmith/astfmt v1.1.0 // indirect - github.com/go-toolsmith/astp v1.1.0 // indirect - github.com/go-toolsmith/strparse v1.1.0 // indirect - github.com/go-toolsmith/typep v1.1.0 // indirect - github.com/go-viper/mapstructure/v2 v2.2.1 // indirect - github.com/go-xmlfmt/xmlfmt v1.1.2 // indirect - github.com/gobwas/glob v0.2.3 // indirect - github.com/gofrs/flock v0.8.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.4 // indirect - github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect - github.com/golangci/gofmt v0.0.0-20231018234816-f50ced29576e // indirect - github.com/golangci/misspell v0.4.1 // indirect - github.com/golangci/plugin-module-register v0.1.1 // indirect - github.com/golangci/revgrep v0.5.2 // indirect - github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed // indirect - github.com/google/go-cmp v0.6.0 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/godbus/dbus/v5 v5.2.2 // indirect + github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/gordonklaus/ineffassign v0.1.0 // indirect - github.com/gostaticanalysis/analysisutil v0.7.1 // indirect - github.com/gostaticanalysis/comment v1.4.2 // indirect - github.com/gostaticanalysis/forcetypeassert v0.1.0 // indirect - github.com/gostaticanalysis/nilerr v0.1.1 // indirect - github.com/hashicorp/go-version v1.6.0 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hexops/gotextdiff v1.0.3 // indirect - github.com/huandu/xstrings v1.3.3 // indirect - github.com/imdario/mergo v0.3.11 // indirect + github.com/huandu/xstrings v1.5.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect - github.com/jgautheron/goconst v1.7.0 // indirect - github.com/jingyugao/rowserrcheck v1.1.1 // indirect - github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af // indirect - github.com/jjti/go-spancheck v0.5.3 // indirect - github.com/julz/importas v0.1.0 // indirect - github.com/karamaru-alpha/copyloopvar v1.0.8 // indirect - github.com/kevinburke/ssh_config v1.2.0 // indirect - github.com/kisielk/errcheck v1.7.0 // indirect - github.com/kkHAIKE/contextcheck v1.1.4 // indirect - github.com/kulti/thelper v0.6.3 // indirect - github.com/kunwardeep/paralleltest v1.0.10 // indirect - github.com/kyoh86/exportloopref v0.1.11 // indirect - github.com/ldez/gomoddirectives v0.2.3 // indirect - github.com/ldez/tagliatelle v0.5.0 // indirect - github.com/leonklingele/grouper v1.1.1 // indirect - github.com/lufeee/execinquery v1.2.1 // indirect - github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect - github.com/macabu/inamedparam v0.1.3 // indirect - github.com/magiconair/properties v1.8.6 // indirect - github.com/maratori/testableexamples v1.0.0 // indirect - github.com/maratori/testpackage v1.1.1 // indirect - github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.9 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect - github.com/mgechev/revive v1.3.7 // indirect - github.com/mitchellh/copystructure v1.0.0 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/mitchellh/reflectwalk v1.0.0 // indirect + github.com/kevinburke/ssh_config v1.4.0 // indirect + github.com/klauspost/cpuid/v2 v2.3.0 // indirect + github.com/lufia/plan9stats v0.0.0-20251013123823-9fd1530e3ec3 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect - github.com/moby/term v0.5.2 // indirect - github.com/moricho/tparallel v0.3.1 // indirect - github.com/morikuni/aec v1.0.0 // indirect - github.com/nakabonne/nestif v0.3.1 // indirect - github.com/nishanths/exhaustive v0.12.0 // indirect - github.com/nishanths/predeclared v0.2.2 // indirect - github.com/nunnatsa/ginkgolinter v0.16.1 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/moby/moby/api v1.52.0 // indirect + github.com/onsi/gomega v1.38.2 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.1 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.2.0 // indirect - github.com/pjbgf/sha1cd v0.3.0 // indirect - github.com/pkg/errors v0.9.1 // indirect + github.com/pjbgf/sha1cd v0.5.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/polyfloyd/go-errorlint v1.4.8 // indirect - github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_golang v1.12.1 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.32.1 // indirect - github.com/prometheus/procfs v0.7.3 // indirect - github.com/quasilyte/go-ruleguard v0.4.2 // indirect - github.com/quasilyte/gogrep v0.5.0 // indirect - github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect - github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect - github.com/ryancurrah/gomodguard v1.3.1 // indirect - github.com/ryanrolds/sqlclosecheck v0.5.1 // indirect - github.com/samber/lo v1.38.1 // indirect - github.com/samber/slog-common v0.15.1 // indirect - github.com/sanposhiho/wastedassign/v2 v2.0.7 // indirect - github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect - github.com/sashamelentyev/interfacebloat v1.1.0 // indirect - github.com/sashamelentyev/usestdlibvars v1.25.0 // indirect - github.com/securego/gosec/v2 v2.19.0 // indirect - github.com/sergi/go-diff v1.1.0 // indirect - github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c // indirect - github.com/shoenig/go-m1cpu v0.1.6 // indirect - github.com/shopspring/decimal v1.2.0 // indirect - github.com/sirupsen/logrus v1.9.3 // indirect - github.com/sivchari/containedctx v1.0.3 // indirect - github.com/sivchari/tenv v1.7.1 // indirect - github.com/skeema/knownhosts v1.2.1 // indirect - github.com/sonatard/noctx v0.0.2 // indirect - github.com/sourcegraph/go-diff v0.7.0 // indirect - github.com/spf13/afero v1.11.0 // indirect - github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.12.0 // indirect - github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect - github.com/stbenjam/no-sprintf-host-port v0.1.1 // indirect - github.com/stretchr/objx v0.5.2 // indirect - github.com/subosito/gotenv v1.4.1 // indirect - github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c // indirect - github.com/tdakkota/asciicheck v0.2.0 // indirect - github.com/tetafro/godot v1.4.16 // indirect - github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 // indirect - github.com/timonwong/loggercheck v0.9.4 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect - github.com/tomarrell/wrapcheck/v2 v2.8.3 // indirect - github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect - github.com/ultraware/funlen v0.1.0 // indirect - github.com/ultraware/whitespace v0.1.0 // indirect - github.com/uudashr/gocognit v1.1.2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/samber/lo v1.52.0 // indirect + github.com/samber/slog-common v0.19.0 // indirect + github.com/sergi/go-diff v1.4.0 // indirect + github.com/shoenig/go-m1cpu v0.1.7 // indirect + github.com/shopspring/decimal v1.4.0 // indirect + github.com/skeema/knownhosts v1.3.2 // indirect + github.com/spf13/cast v1.10.0 // indirect + github.com/spf13/pflag v1.0.10 // indirect + github.com/tklauser/go-sysconf v0.3.16 // indirect + github.com/tklauser/numcpus v0.11.0 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect - github.com/xen0n/gosmopolitan v1.2.2 // indirect - github.com/yagipy/maintidx v1.0.0 // indirect - github.com/yeya24/promlinter v0.2.0 // indirect - github.com/ykadowak/zerologlint v0.1.5 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect - gitlab.com/bosi/decorder v0.4.1 // indirect - go-simpler.org/musttag v0.9.0 // indirect - go-simpler.org/sloglint v0.5.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 v1.34.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 // indirect - go.opentelemetry.io/otel/metric v1.34.0 // indirect - go.opentelemetry.io/otel/sdk v1.34.0 // indirect - go.opentelemetry.io/otel/trace v1.34.0 // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/automaxprocs v1.5.3 // indirect - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.32.0 // indirect - golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc // indirect - golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f // indirect - golang.org/x/mod v0.21.0 // indirect - golang.org/x/net v0.34.0 // indirect - golang.org/x/sync v0.10.0 // indirect - golang.org/x/text v0.21.0 // indirect - golang.org/x/tools v0.25.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect - gopkg.in/ini.v1 v1.67.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0 // indirect + go.opentelemetry.io/otel v1.39.0 // indirect + go.opentelemetry.io/otel/metric v1.39.0 // indirect + go.opentelemetry.io/otel/trace v1.39.0 // indirect + golang.org/x/crypto v0.46.0 // indirect + golang.org/x/net v0.48.0 // indirect + golang.org/x/text v0.32.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251222181119-0a764e51fe1b // indirect gopkg.in/warnings.v0 v0.1.2 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gotest.tools/v3 v3.5.2 // indirect - honnef.co/go/tools v0.4.7 // indirect - mvdan.cc/gofumpt v0.6.0 // indirect - mvdan.cc/unparam v0.0.0-20240104100049-c549a3470d14 // indirect ) diff --git a/go.sum b/go.sum index 059d0f0..d2f8fa7 100644 --- a/go.sum +++ b/go.sum @@ -1,414 +1,92 @@ -4d63.com/gocheckcompilerdirectives v1.2.1 h1:AHcMYuw56NPjq/2y615IGg2kYkBdTvOaojYCBcRE7MA= -4d63.com/gocheckcompilerdirectives v1.2.1/go.mod h1:yjDJSxmDTtIHHCqX0ufRYZDL6vQtMG7tJdKVeWwsqvs= -4d63.com/gochecknoglobals v0.2.1 h1:1eiorGsgHOFOuoOiJDy2psSrQbRdIHrlge0IJIkUgDc= -4d63.com/gochecknoglobals v0.2.1/go.mod h1:KRE8wtJB3CXCsb1xy421JfTHIIbmT3U5ruxw2Qu8fSU= -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= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= -dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/4meepo/tagalign v1.3.3 h1:ZsOxcwGD/jP4U/aw7qeWu58i7dwYemfy5Y+IF1ACoNw= -github.com/4meepo/tagalign v1.3.3/go.mod h1:Q9c1rYMZJc9dPRkbQPpcBNCLEmY2njbAsXhQOZFE2dE= -github.com/Abirdcfly/dupword v0.0.14 h1:3U4ulkc8EUo+CaT105/GJ1BQwtgyj6+VaBVbAX11Ba8= -github.com/Abirdcfly/dupword v0.0.14/go.mod h1:VKDAbxdY8YbKUByLGg8EETzYSuC4crm9WwI6Y3S0cLI= -github.com/Antonboom/errname v0.1.12 h1:oh9ak2zUtsLp5oaEd/erjB4GPu9w19NyoIskZClDcQY= -github.com/Antonboom/errname v0.1.12/go.mod h1:bK7todrzvlaZoQagP1orKzWXv59X/x0W0Io2XT1Ssro= -github.com/Antonboom/nilnil v0.1.7 h1:ofgL+BA7vlA1K2wNQOsHzLJ2Pw5B5DpWRLdDAVvvTow= -github.com/Antonboom/nilnil v0.1.7/go.mod h1:TP+ScQWVEq0eSIxqU8CbdT5DFWoHp0MbP+KMUO1BKYQ= -github.com/Antonboom/testifylint v1.2.0 h1:015bxD8zc5iY8QwTp4+RG9I4kIbqwvGX9TrBbb7jGdM= -github.com/Antonboom/testifylint v1.2.0/go.mod h1:rkmEqjqVnHDRNsinyN6fPSLnoajzFwsCcguJgwADBkw= -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.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= -github.com/GaijinEntertainment/go-exhaustruct/v3 v3.2.0 h1:sATXp1x6/axKxz2Gjxv8MALP0bXaNRfQinEwyfMcx8c= -github.com/GaijinEntertainment/go-exhaustruct/v3 v3.2.0/go.mod h1:Nl76DrGNJTA1KJ0LePKBw/vznBX1EHbAZX8mwjR82nI= +dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= +dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= -github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= -github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= +github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= +github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe3tPhs= +github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/OpenPeeDeeP/depguard/v2 v2.2.0 h1:vDfG60vDtIuf0MEOhmLlLLSzqaRM8EMcgJPdp74zmpA= -github.com/OpenPeeDeeP/depguard/v2 v2.2.0/go.mod h1:CIzddKRvLBC4Au5aYP/i3nyaWQ+ClszLIuVocRiCYFQ= -github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 h1:kkhsdkhsCvIsutKu5zLMgWtgh9YxGCNAw8Ad8hjwfYg= -github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= -github.com/alecthomas/assert/v2 v2.2.2 h1:Z/iVC0xZfWTaFNE6bA3z07T86hd45Xe2eLt6WVy2bbk= -github.com/alecthomas/assert/v2 v2.2.2/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= -github.com/alecthomas/go-check-sumtype v0.1.4 h1:WCvlB3l5Vq5dZQTFmodqL2g68uHiSwwlWcT5a2FGK0c= -github.com/alecthomas/go-check-sumtype v0.1.4/go.mod h1:WyYPfhfkdhyrdaligV6svFopZV8Lqdzn5pyVBaV6jhQ= -github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= -github.com/alecthomas/repr v0.2.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -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/alexkohler/nakedret/v2 v2.0.4 h1:yZuKmjqGi0pSmjGpOC016LtPJysIL0WEUiaXW5SUnNg= -github.com/alexkohler/nakedret/v2 v2.0.4/go.mod h1:bF5i0zF2Wo2o4X4USt9ntUWve6JbFv02Ff4vlkmS/VU= -github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= -github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= -github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw= -github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBiRGFrw= +github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/ashanbrown/forbidigo v1.6.0 h1:D3aewfM37Yb3pxHujIPSpTf6oQk9sc9WZi8gerOIVIY= -github.com/ashanbrown/forbidigo v1.6.0/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU= -github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s= -github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -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/bkielbasa/cyclop v1.2.1 h1:AeF71HZDob1P2/pRm1so9cd1alZnrpyc4q2uP2l0gJY= -github.com/bkielbasa/cyclop v1.2.1/go.mod h1:K/dT/M0FPAiYjBgQGau7tz+3TMh4FWAEqlMhzFWCrgM= -github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= -github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= -github.com/bombsimon/wsl/v4 v4.2.1 h1:Cxg6u+XDWff75SIFFmNsqnIOgob+Q9hG6y/ioKbRFiM= -github.com/bombsimon/wsl/v4 v4.2.1/go.mod h1:Xu/kDxGZTofQcDGCtQe9KCzhHphIe0fDuyWTxER9Feo= -github.com/breml/bidichk v0.2.7 h1:dAkKQPLl/Qrk7hnP6P+E0xOodrq8Us7+U0o4UBOAlQY= -github.com/breml/bidichk v0.2.7/go.mod h1:YodjipAGI9fGcYM7II6wFvGhdMYsC5pHDlGzqvEW3tQ= -github.com/breml/errchkjson v0.3.6 h1:VLhVkqSBH96AvXEyclMR37rZslRrY2kcyq+31HCsVrA= -github.com/breml/errchkjson v0.3.6/go.mod h1:jhSDoFheAF2RSDOlCfhHO9KqhZgAYLyvHe7bRCX8f/U= -github.com/butuzov/ireturn v0.3.0 h1:hTjMqWw3y5JC3kpnC5vXmFJAWI/m31jaCYQqzkS6PL0= -github.com/butuzov/ireturn v0.3.0/go.mod h1:A09nIiwiqzN/IoVo9ogpa0Hzi9fex1kd9PSD6edP5ZA= -github.com/butuzov/mirror v1.1.0 h1:ZqX54gBVMXu78QLoiqdwpl2mgmoOJTk7s4p4o+0avZI= -github.com/butuzov/mirror v1.1.0/go.mod h1:8Q0BdQU6rC6WILDiBM60DBfvV78OLJmMmixe7GF45AE= -github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/catenacyber/perfsprint v0.7.1 h1:PGW5G/Kxn+YrN04cRAZKC+ZuvlVwolYMrIyyTJ/rMmc= -github.com/catenacyber/perfsprint v0.7.1/go.mod h1:/wclWYompEyjUD2FuIIDVKNkqz7IgBIWXIH3V0Zol50= -github.com/ccojocar/zxcvbn-go v1.0.2 h1:na/czXU8RrhXO4EZme6eQJLR4PzcGsahsBOAwU6I3Vg= -github.com/ccojocar/zxcvbn-go v1.0.2/go.mod h1:g1qkXtUSvHP8lhHp5GrSmTz6uWALGRMQdw6Qnz/hi60= -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/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/charithe/durationcheck v0.0.10 h1:wgw73BiocdBDQPik+zcEoBG/ob8uyBHf2iyoHGPf5w4= -github.com/charithe/durationcheck v0.0.10/go.mod h1:bCWXb7gYRysD1CU3C+u4ceO49LoGOY1C1L6uouGNreQ= -github.com/chavacava/garif v0.1.0 h1:2JHa3hbYf5D9dsgseMKAmc/MZ109otzgNFk5s87H9Pc= -github.com/chavacava/garif v0.1.0/go.mod h1:XMyYCkEL58DF0oyW4qDjjnPWONs2HBqYKI+UIPD+Gww= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/ckaznocha/intrange v0.1.0 h1:ZiGBhvrdsKpoEfzh9CjBfDSZof6QB0ORY5tXasUtiew= -github.com/ckaznocha/intrange v0.1.0/go.mod h1:Vwa9Ekex2BrEQMg6zlrWwbs/FtYw7eS5838Q7UjK7TQ= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs= -github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= -github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/curioswitch/go-reassign v0.2.0 h1:G9UZyOcpk/d7Gd6mqYgd8XYWFMw/znxwGDUstnC9DIo= -github.com/curioswitch/go-reassign v0.2.0/go.mod h1:x6OpXuWvgfQaMGks2BZybTngWjT84hqJfKoO8Tt/Roc= -github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= -github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/daixiang0/gci v0.12.3 h1:yOZI7VAxAGPQmkb1eqt5g/11SUlwoat1fSblGLmdiQc= -github.com/daixiang0/gci v0.12.3/go.mod h1:xtHP9N7AHdNvtRNfcx9gwTDfw7FRJx4bZUsiEfiNNAI= +github.com/cloudflare/circl v1.6.2 h1:hL7VBpHHKzrV5WTfHCaBsgx/HGbBYlgrwvNXEVDYYsQ= +github.com/cloudflare/circl v1.6.2/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/coreos/go-systemd/v22 v22.6.0 h1:aGVa/v8B7hpb0TKl0MWoAavPDmHvobFe5R5zn0bCJWo= +github.com/coreos/go-systemd/v22 v22.6.0/go.mod h1:iG+pp635Fo7ZmV/j14KUcmEyWF+0X7Lua8rrTWzYgWU= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/cyphar/filepath-securejoin v0.6.1 h1:5CeZ1jPXEiYt3+Z6zqprSAgSWiggmpVyciv8syjIpVE= +github.com/cyphar/filepath-securejoin v0.6.1/go.mod h1:A8hd4EnAeyujCJRrICiOWqjS1AX0a9kM5XL+NwKoYSc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denis-tingaikin/go-header v0.5.0 h1:SRdnP5ZKvcO9KKRP1KJrhFR3RrlGuD+42t4429eC9k8= -github.com/denis-tingaikin/go-header v0.5.0/go.mod h1:mMenU5bWrok6Wl2UsZjy+1okegmwQ3UgWl4V1D8gjlY= 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/docker v28.0.1+incompatible h1:FCHjSRdXhNRFjlHMTv4jUNlIBbTeRjrWfeFuJp7jpo0= -github.com/docker/docker v28.0.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -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-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94= +github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE= 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/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= -github.com/emilekm/go-prbf2 v0.0.0-20250305193713-36eade76571f h1:P1XkSwzLVN6CWTaBEOFy4Y6sreD9mxzsefzUv5doQqQ= -github.com/emilekm/go-prbf2 v0.0.0-20250305193713-36eade76571f/go.mod h1:JTr1cMYLHbRZckjPzuifqf0Xbm7B8/Klvy68/wLNR9E= +github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o= +github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -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/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q= -github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A= -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/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= -github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/firefart/nonamedreturns v1.0.4 h1:abzI1p7mAEPYuR4A+VLKn4eNDOycjYo2phmY9sfv40Y= -github.com/firefart/nonamedreturns v1.0.4/go.mod h1:TDhe/tjI1BXo48CmYbUduTV7BdIga8MAO/xbKdcVsGI= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= -github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= -github.com/ghostiam/protogetter v0.3.5 h1:+f7UiF8XNd4w3a//4DnusQ2SZjPkUjxkMEfjbxOK4Ug= -github.com/ghostiam/protogetter v0.3.5/go.mod h1:7lpeDnEJ1ZjL/YtyoN99ljO4z0pd3H0d18/t2dPBxHw= -github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= -github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= -github.com/go-critic/go-critic v0.11.2 h1:81xH/2muBphEgPtcwH1p6QD+KzXl2tMSi3hXjBSxDnM= -github.com/go-critic/go-critic v0.11.2/go.mod h1:OePaicfjsf+KPy33yq4gzv6CO7TEQ9Rom6ns1KsJnl8= +github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= +github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= -github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-billy/v5 v5.7.0 h1:83lBUJhGWhYp0ngzCMSgllhUSuoHP1iEWYjsPl9nwqM= +github.com/go-git/go-billy/v5 v5.7.0/go.mod h1:/1IUejTKH8xipsAcdfcSAlUlo2J7lkYV8GTKxAT/L3E= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4= -github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -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/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-git/go-git/v5 v5.16.4 h1:7ajIEZHZJULcyJebDLo99bGgS0jRrOxzZG4uCk2Yb2Y= +github.com/go-git/go-git/v5 v5.16.4/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= -github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +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-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8= -github.com/go-toolsmith/astcast v1.1.0/go.mod h1:qdcuFWeGGS2xX5bLM/c3U9lewg7+Zu4mr+xPwZIB4ZU= -github.com/go-toolsmith/astcopy v1.1.0 h1:YGwBN0WM+ekI/6SS6+52zLDEf8Yvp3n2seZITCUBt5s= -github.com/go-toolsmith/astcopy v1.1.0/go.mod h1:hXM6gan18VA1T/daUEHCFcYiW8Ai1tIwIzHY6srfEAw= -github.com/go-toolsmith/astequal v1.0.3/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= -github.com/go-toolsmith/astequal v1.1.0/go.mod h1:sedf7VIdCL22LD8qIvv7Nn9MuWJruQA/ysswh64lffQ= -github.com/go-toolsmith/astequal v1.2.0 h1:3Fs3CYZ1k9Vo4FzFhwwewC3CHISHDnVUPC4x0bI2+Cw= -github.com/go-toolsmith/astequal v1.2.0/go.mod h1:c8NZ3+kSFtFY/8lPso4v8LuJjdJiUFVnSuU3s0qrrDY= -github.com/go-toolsmith/astfmt v1.1.0 h1:iJVPDPp6/7AaeLJEruMsBUlOYCmvg0MoCfJprsOmcco= -github.com/go-toolsmith/astfmt v1.1.0/go.mod h1:OrcLlRwu0CuiIBp/8b5PYF9ktGVZUjlNMV634mhwuQ4= -github.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnpQA= -github.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA= -github.com/go-toolsmith/pkgload v1.2.2 h1:0CtmHq/02QhxcF7E9N5LIFcYFsMR5rdovfqTtRKkgIk= -github.com/go-toolsmith/pkgload v1.2.2/go.mod h1:R2hxLNRKuAsiXCo2i5J6ZQPhnPMOVtU+f0arbFPWCus= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw= -github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= -github.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus= -github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig= -github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= -github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/go-xmlfmt/xmlfmt v1.1.2 h1:Nea7b4icn8s57fTx1M5AI4qQT5HEM3rVUO8MuE6g80U= -github.com/go-xmlfmt/xmlfmt v1.1.2/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= -github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/gocarina/gocsv v0.0.0-20231116093920-b87c2d0e983a h1:RYfmiM0zluBJOiPDJseKLEN4BapJ42uSi9SZBQ2YyiA= -github.com/gocarina/gocsv v0.0.0-20231116093920-b87c2d0e983a/go.mod h1:5YoVOkjYAQumqlV356Hj3xeYh4BdZuLE0/nRkf2NKkI= -github.com/goccy/go-yaml v1.11.3 h1:B3W9IdWbvrUu2OYQGwvU1nZtvMQJPBKgBUuweJjLj6I= -github.com/goccy/go-yaml v1.11.3/go.mod h1:wKnAMd44+9JAAnGQpWVEgBzGt3YuTaQ4uXoHvE4m7WU= -github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -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-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -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= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -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.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1 h1:FWNFq4fM1wPfcK40yHE5UO3RUdSNPaBC+j3PokzA6OQ= +github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1/go.mod h1:5YoVOkjYAQumqlV356Hj3xeYh4BdZuLE0/nRkf2NKkI= +github.com/goccy/go-yaml v1.19.1 h1:3rG3+v8pkhRqoQ/88NYNMHYVGYztCOCIZ7UQhu7H+NE= +github.com/goccy/go-yaml v1.19.1/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= +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/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/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/gofmt v0.0.0-20231018234816-f50ced29576e h1:ULcKCDV1LOZPFxGZaA6TlQbiM3J2GCPnkx/bGF6sX/g= -github.com/golangci/gofmt v0.0.0-20231018234816-f50ced29576e/go.mod h1:Pm5KhLPA8gSnQwrQ6ukebRcapGb/BG9iUkdaiCcGHJM= -github.com/golangci/golangci-lint v1.57.1 h1:cqhpzkzjDwdN12rfMf1SUyyKyp88a1SltNqEYGS0nJw= -github.com/golangci/golangci-lint v1.57.1/go.mod h1:zLcHhz3NHc88T5zV2j75lyc0zH3LdOPOybblYa4p0oI= -github.com/golangci/misspell v0.4.1 h1:+y73iSicVy2PqyX7kmUefHusENlrP9YwuHZHPLGQj/g= -github.com/golangci/misspell v0.4.1/go.mod h1:9mAN1quEo3DlpbaIKKyEvRxK1pwqR9s/Sea1bJCtlNI= -github.com/golangci/plugin-module-register v0.1.1 h1:TCmesur25LnyJkpsVrupv1Cdzo+2f7zX0H6Jkw1Ol6c= -github.com/golangci/plugin-module-register v0.1.1/go.mod h1:TTpqoB6KkwOJMV8u7+NyXMrkwwESJLOkfl9TxR1DGFc= -github.com/golangci/revgrep v0.5.2 h1:EndcWoRhcnfj2NHQ+28hyuXpLMF+dQmCN+YaeeIl4FU= -github.com/golangci/revgrep v0.5.2/go.mod h1:bjAMA+Sh/QUfTDcHzxfyHxr4xKvllVr/0sCv2e7jJHA= -github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed h1:IURFTjxeTfNFP0hTEi1YKjB/ub8zkpaOqFFMApi2EAs= -github.com/golangci/unconvert v0.0.0-20240309020433-c5143eacb3ed/go.mod h1:XLXN8bNw4CGRPaqgl3bv/lhz7bsGPh4/xSaMTbo2vkQ= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/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.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +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/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gordonklaus/ineffassign v0.1.0 h1:y2Gd/9I7MdY1oEIt+n+rowjBNDcLQq3RsH5hwJd0f9s= -github.com/gordonklaus/ineffassign v0.1.0/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= -github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= -github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= -github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= -github.com/gostaticanalysis/comment v1.4.2 h1:hlnx5+S2fY9Zo9ePo4AhgYsYHbM2+eAv8m/s1JiCd6Q= -github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= -github.com/gostaticanalysis/forcetypeassert v0.1.0 h1:6eUflI3DiGusXGK6X7cCcIgVCpZ2CiZ1Q7jl6ZxNV70= -github.com/gostaticanalysis/forcetypeassert v0.1.0/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= -github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk= -github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= -github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= -github.com/gostaticanalysis/testutil v0.4.0 h1:nhdCmubdmDF6VEatUNjgUZBJKWRqugoISdUv3PPQgHY= -github.com/gostaticanalysis/testutil v0.4.0/go.mod h1:bLIoPefWXrRi/ssLFWX1dx7Repi5x3CuviD3dgAZaBU= -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/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -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/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= -github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4= -github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI= +github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jgautheron/goconst v1.7.0 h1:cEqH+YBKLsECnRSd4F4TK5ri8t/aXtt/qoL0Ft252B0= -github.com/jgautheron/goconst v1.7.0/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= -github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= -github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af h1:KA9BjwUk7KlCh6S9EAGWBt1oExIUv9WyNCiRz5amv48= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= -github.com/jjti/go-spancheck v0.5.3 h1:vfq4s2IB8T3HvbpiwDTYgVPj1Ze/ZSXrTtaZRTc7CuM= -github.com/jjti/go-spancheck v0.5.3/go.mod h1:eQdOX1k3T+nAKvZDyLC3Eby0La4dZ+I19iOl5NzSPFE= -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= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY= -github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= -github.com/karamaru-alpha/copyloopvar v1.0.8 h1:gieLARwuByhEMxRwM3GRS/juJqFbLraftXIKDDNJ50Q= -github.com/karamaru-alpha/copyloopvar v1.0.8/go.mod h1:u7CIfztblY0jZLOQZgH3oYsJzpC2A7S6u/lfgSXHy0k= -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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/errcheck v1.7.0 h1:+SbscKmWJ5mOK/bO1zS60F5I9WwZDWOfRsC4RwfwRV0= -github.com/kisielk/errcheck v1.7.0/go.mod h1:1kLL+jV4e+CFfueBmI1dSK2ADDyQnlrnrY/FqKluHJQ= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkHAIKE/contextcheck v1.1.4 h1:B6zAaLhOEEcjvUgIYEqystmnFk1Oemn8bvJhbt0GMb8= -github.com/kkHAIKE/contextcheck v1.1.4/go.mod h1:1+i/gWqokIa+dm31mqGLZhZJ7Uh44DJGZVmr6QRBNJg= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kevinburke/ssh_config v1.4.0 h1:6xxtP5bZ2E4NF5tuQulISpTO2z8XbtH8cg1PWkxoFkQ= +github.com/kevinburke/ssh_config v1.4.0/go.mod h1:q2RIzfka+BXARoNexmF9gkxEX7DmvbW9P4hIVx2Kg4M= +github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= +github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -416,730 +94,139 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs= -github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= -github.com/kunwardeep/paralleltest v1.0.10 h1:wrodoaKYzS2mdNVnc4/w31YaXFtsc21PCTdvWJ/lDDs= -github.com/kunwardeep/paralleltest v1.0.10/go.mod h1:2C7s65hONVqY7Q5Efj5aLzRCNLjw2h4eMc9EcypGjcY= -github.com/kyoh86/exportloopref v0.1.11 h1:1Z0bcmTypkL3Q4k+IDHMWTcnCliEZcaPiIe0/ymEyhQ= -github.com/kyoh86/exportloopref v0.1.11/go.mod h1:qkV4UF1zGl6EkF1ox8L5t9SwyeBAZ3qLMd6up458uqA= -github.com/ldez/gomoddirectives v0.2.3 h1:y7MBaisZVDYmKvt9/l1mjNCiSA1BVn34U0ObUcJwlhA= -github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= -github.com/ldez/tagliatelle v0.5.0 h1:epgfuYt9v0CG3fms0pEgIMNPuFf/LpPIfjk4kyqSioo= -github.com/ldez/tagliatelle v0.5.0/go.mod h1:rj1HmWiL1MiKQuOONhd09iySTEkUuE/8+5jtPYz9xa4= -github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/leonklingele/grouper v1.1.1 h1:suWXRU57D4/Enn6pXR0QVqqWWrnJ9Osrz+5rjt8ivzU= -github.com/leonklingele/grouper v1.1.1/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= -github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCEtOM= -github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/macabu/inamedparam v0.1.3 h1:2tk/phHkMlEL/1GNe/Yf6kkR/hkcUdAEY3L0hjYV1Mk= -github.com/macabu/inamedparam v0.1.3/go.mod h1:93FLICAIk/quk7eaPPQvbzihUdn/QkGDwIZEoLtpH6I= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI= -github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE= -github.com/maratori/testpackage v1.1.1 h1:S58XVV5AD7HADMmD0fNnziNHqKvSdDuEKdPD1rNTU04= -github.com/maratori/testpackage v1.1.1/go.mod h1:s4gRK/ym6AMrqpOa/kEbQTV4Q4jb7WeLZzVhVVVOQMc= -github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26 h1:gWg6ZQ4JhDfJPqlo2srm/LN17lpybq15AryXIRcWYLE= -github.com/matoous/godox v0.0.0-20230222163458-006bad1f9d26/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= -github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= -github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= -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.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -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.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mgechev/revive v1.3.7 h1:502QY0vQGe9KtYJ9FpxMz9rL+Fc/P13CI5POL4uHCcE= -github.com/mgechev/revive v1.3.7/go.mod h1:RJ16jUbF0OWC3co/+XTxmFNgEpUPwnnA0BRllX2aDNA= -github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= -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/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/lufia/plan9stats v0.0.0-20251013123823-9fd1530e3ec3 h1:PwQumkgq4/acIiZhtifTV5OUqqiP82UAl0h87xj/l9k= +github.com/lufia/plan9stats v0.0.0-20251013123823-9fd1530e3ec3/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= 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/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ= -github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -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/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/moricho/tparallel v0.3.1 h1:fQKD4U1wRMAYNngDonW5XupoB/ZGJHdpzrWqgyg9krA= -github.com/moricho/tparallel v0.3.1/go.mod h1:leENX2cUv7Sv2qDgdi0D0fCftN8fRC67Bcn8pqzeYNI= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -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/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= -github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= -github.com/nishanths/exhaustive v0.12.0 h1:vIY9sALmw6T/yxiASewa4TQcFsVYZQQRUQJhKRf3Swg= -github.com/nishanths/exhaustive v0.12.0/go.mod h1:mEZ95wPIZW+x8kC4TgC+9YCUgiST7ecevsVDTgc2obs= -github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= -github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= -github.com/nunnatsa/ginkgolinter v0.16.1 h1:uDIPSxgVHZ7PgbJElRDGzymkXH+JaF7mjew+Thjnt6Q= -github.com/nunnatsa/ginkgolinter v0.16.1/go.mod h1:4tWRinDN1FeJgU+iJANW/kz7xKN5nYRAOfJDQUS9dOQ= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= -github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= -github.com/onsi/gomega v1.31.1 h1:KYppCUK+bUgAZwHOu7EXVBKyQA6ILvOESHkn/tgoqvo= -github.com/onsi/gomega v1.31.1/go.mod h1:y40C95dwAD1Nz36SsEnxvfFe8FFfNxzI5eJ0EYGyAy0= +github.com/moby/moby/api v1.52.0 h1:00BtlJY4MXkkt84WhUZPRqt5TvPbgig2FZvTbe3igYg= +github.com/moby/moby/api v1.52.0/go.mod h1:8mb+ReTlisw4pS6BRzCMts5M49W5M7bKt1cJy/YbAqc= +github.com/moby/moby/client v0.2.1 h1:1Grh1552mvv6i+sYOdY+xKKVTvzJegcVMhuXocyDz/k= +github.com/moby/moby/client v0.2.1/go.mod h1:O+/tw5d4a1Ha/ZA/tPxIZJapJRUS6LNZ1wiVRxYHyUE= +github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A= +github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k= 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/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= -github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= -github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w= -github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= -github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.2.0 h1:QLgLl2yMN7N+ruc31VynXs1vhMZa7CeHHejIeBAsoHo= -github.com/pelletier/go-toml/v2 v2.2.0/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= -github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= -github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= -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/pjbgf/sha1cd v0.5.0 h1:a+UkboSi1znleCDUNT3M5YxjOnN1fz2FhN48FlwCxs0= +github.com/pjbgf/sha1cd v0.5.0/go.mod h1:lhpGlyHLpQZoxMv8HcgXvZEhcGs0PG/vsZnEJ7H0iCM= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polyfloyd/go-errorlint v1.4.8 h1:jiEjKDH33ouFktyez7sckv6pHWif9B7SuS8cutDXFHw= -github.com/polyfloyd/go-errorlint v1.4.8/go.mod h1:NNCxFcFjZcw3xNjVdCchERkEM6Oz7wta2XJVxRftwO4= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= -github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= -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.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -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 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -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.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -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.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/quasilyte/go-ruleguard v0.4.2 h1:htXcXDK6/rO12kiTHKfHuqR4kr3Y4M0J0rOL6CH/BYs= -github.com/quasilyte/go-ruleguard v0.4.2/go.mod h1:GJLgqsLeo4qgavUoL8JeGFNS7qcisx3awV/w9eWTmNI= -github.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo= -github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= -github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl980XxGFEZSS6KlBGIV0diGdySzxATTWoqaU= -github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= -github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= -github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -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/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +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/ryancurrah/gomodguard v1.3.1 h1:fH+fUg+ngsQO0ruZXXHnA/2aNllWA1whly4a6UvyzGE= -github.com/ryancurrah/gomodguard v1.3.1/go.mod h1:DGFHzEhi6iJ0oIDfMuo3TgrS+L9gZvrEfmjjuelnRU0= -github.com/ryanrolds/sqlclosecheck v0.5.1 h1:dibWW826u0P8jNLsLN+En7+RqWWTYrjCB9fJfSfdyCU= -github.com/ryanrolds/sqlclosecheck v0.5.1/go.mod h1:2g3dUjoS6AL4huFdv6wn55WpLIDjY7ZgUR4J8HOO/XQ= -github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM= -github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= -github.com/samber/slog-common v0.15.1 h1:0HIQ/a8nqMeqAfc2vbGbnuBwmXzgZAhODbA4oPUXPeg= -github.com/samber/slog-common v0.15.1/go.mod h1:Qjrfhwk79XiCIhBj8+jTq1Cr0u9rlWbjawh3dWXzaHk= -github.com/samber/slog-multi v1.0.2 h1:6BVH9uHGAsiGkbbtQgAOQJMpKgV8unMrHhhJaw+X1EQ= -github.com/samber/slog-multi v1.0.2/go.mod h1:uLAvHpGqbYgX4FSL0p1ZwoLuveIAJvBECtE07XmYvFo= -github.com/samber/slog-webhook/v2 v2.5.1 h1:RbC5DCauLwHnS+SizORYtSOJNMKrKPOdEBHuLFGyjjg= -github.com/samber/slog-webhook/v2 v2.5.1/go.mod h1:06jfwYPahhx1xy3CgfKMhOqv+L6+Lu+k77cPTeCH+2k= -github.com/sanposhiho/wastedassign/v2 v2.0.7 h1:J+6nrY4VW+gC9xFzUc+XjPD3g3wF3je/NsJFwFK7Uxc= -github.com/sanposhiho/wastedassign/v2 v2.0.7/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= +github.com/samber/lo v1.52.0 h1:Rvi+3BFHES3A8meP33VPAxiBZX/Aws5RxrschYGjomw= +github.com/samber/lo v1.52.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= +github.com/samber/slog-common v0.19.0 h1:fNcZb8B2uOLooeYwFpAlKjkQTUafdjfqKcwcC89G9YI= +github.com/samber/slog-common v0.19.0/go.mod h1:dTz+YOU76aH007YUU0DffsXNsGFQRQllPQh9XyNoA3M= +github.com/samber/slog-multi v1.6.0 h1:i1uBY+aaln6ljwdf7Nrt4Sys8Kk6htuYuXDHWJsHtZg= +github.com/samber/slog-multi v1.6.0/go.mod h1:qTqzmKdPpT0h4PFsTN5rYRgLwom1v+fNGuIrl1Xnnts= +github.com/samber/slog-webhook/v2 v2.8.2 h1:L472t2Xz9O3FPxDQqEb04yM6wy0QibFc42a+rfNslvg= +github.com/samber/slog-webhook/v2 v2.8.2/go.mod h1:sw6qnGIGAkEja7aIpdAlyyduROn8Z2VQzOf05Furt2E= github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= -github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw= -github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= -github.com/sashamelentyev/usestdlibvars v1.25.0 h1:IK8SI2QyFzy/2OD2PYnhy84dpfNo9qADrRt6LH8vSzU= -github.com/sashamelentyev/usestdlibvars v1.25.0/go.mod h1:9nl0jgOfHKWNFS43Ojw0i7aRoS4j6EBye3YBhmAIRF8= -github.com/securego/gosec/v2 v2.19.0 h1:gl5xMkOI0/E6Hxx0XCY2XujA3V7SNSefA8sC+3f1gnk= -github.com/securego/gosec/v2 v2.19.0/go.mod h1:hOkDcHz9J/XIgIlPDXalxjeVYsHxoWUc5zJSHxcB8YM= -github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= -github.com/shirou/gopsutil/v3 v3.24.2 h1:kcR0erMbLg5/3LcInpw0X/rrPSqq4CDPyI6A6ZRC18Y= -github.com/shirou/gopsutil/v3 v3.24.2/go.mod h1:tSg/594BcA+8UdQU2XcW803GWYgdtauFFPgJCJKZlVk= -github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= -github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= -github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= -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/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -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/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/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI= +github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk= +github.com/shoenig/go-m1cpu v0.1.7 h1:C76Yd0ObKR82W4vhfjZiCp0HxcSZ8Nqd84v+HZ0qyI0= +github.com/shoenig/go-m1cpu v0.1.7/go.mod h1:KkDOw6m3ZJQAPHbrzkZki4hnx+pDRR1Lo+ldA56wD5w= +github.com/shoenig/test v1.7.0 h1:eWcHtTXa6QLnBvm0jgEabMRN/uJ4DMV3M8xUGgRkZmk= +github.com/shoenig/test v1.7.0/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= +github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= +github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE= -github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4= -github.com/sivchari/tenv v1.7.1 h1:PSpuD4bu6fSmtWMxSGWcvqUUgIn7k3yOJhOIzVWn8Ak= -github.com/sivchari/tenv v1.7.1/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= -github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ= -github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= -github.com/sonatard/noctx v0.0.2 h1:L7Dz4De2zDQhW8S0t+KUjY0MAQJd6SgVwhzNIc4ok00= -github.com/sonatard/noctx v0.0.2/go.mod h1:kzFz+CzWSjQ2OzIm46uJZoXuBpa2+0y3T36U18dWqIo= -github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCpA8G0= -github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= -github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= -github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= -github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= -github.com/stbenjam/no-sprintf-host-port v0.1.1 h1:tYugd/yrm1O0dV+ThCbaKZh195Dfm07ysF0U6JQXczc= -github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= +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/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= +github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= +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/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/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= 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.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= -github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c h1:+aPplBwWcHBo6q9xrfWdMrT9o4kltkmmvpemgIjep/8= -github.com/t-yuki/gocover-cobertura v0.0.0-20180217150009-aaee18c8195c/go.mod h1:SbErYREK7xXdsRiigaQiQkI9McGRzYMvlKYaP3Nimdk= -github.com/tdakkota/asciicheck v0.2.0 h1:o8jvnUANo0qXtnslk2d3nMKTFNlOnJjRrNcj0j9qkHM= -github.com/tdakkota/asciicheck v0.2.0/go.mod h1:Qb7Y9EgjCLJGup51gDHFzbI08/gbGhL/UVhYIPWG2rg= -github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA= -github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag= -github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= -github.com/tetafro/godot v1.4.16 h1:4ChfhveiNLk4NveAZ9Pu2AN8QZ2nkUGFuadM9lrr5D0= -github.com/tetafro/godot v1.4.16/go.mod h1:2oVxTBSftRTh4+MVfUaUXR6bn2GDXCaMcOG4Dk3rfio= -github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966 h1:quvGphlmUVU+nhpFa4gg4yJyTRJ13reZMDHrKwYw53M= -github.com/timakin/bodyclose v0.0.0-20230421092635-574207250966/go.mod h1:27bSVNWSBOHm+qRp1T9qzaIpsWEP6TbUnei/43HK+PQ= -github.com/timonwong/loggercheck v0.9.4 h1:HKKhqrjcVj8sxL7K77beXh0adEm6DLjV/QOGeMXEVi4= -github.com/timonwong/loggercheck v0.9.4/go.mod h1:caz4zlPcgvpEkXgVnAJGowHAMW2NwHaNlpS8xDbVhTg= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/tomarrell/wrapcheck/v2 v2.8.3 h1:5ov+Cbhlgi7s/a42BprYoxsr73CbdMUTzE3bRDFASUs= -github.com/tomarrell/wrapcheck/v2 v2.8.3/go.mod h1:g9vNIyhb5/9TQgumxQyOEqDHsmGYcGsVMOx/xGkqdMo= -github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw= -github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= -github.com/ultraware/funlen v0.1.0 h1:BuqclbkY6pO+cvxoq7OsktIXZpgBSkYTQtmwhAK81vI= -github.com/ultraware/funlen v0.1.0/go.mod h1:XJqmOQja6DpxarLj6Jj1U7JuoS8PvL4nEqDaQhy22p4= -github.com/ultraware/whitespace v0.1.0 h1:O1HKYoh0kIeqE8sFqZf1o0qbORXUCOQFrlaQyZsczZw= -github.com/ultraware/whitespace v0.1.0/go.mod h1:/se4r3beMFNmewJ4Xmz0nMQ941GJt+qmSHGP9emHYe0= -github.com/uudashr/gocognit v1.1.2 h1:l6BAEKJqQH2UpKAPKdMfZf5kE4W/2xk8pfU1OVLvniI= -github.com/uudashr/gocognit v1.1.2/go.mod h1:aAVdLURqcanke8h3vg35BC++eseDm66Z7KmchI5et4k= +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/tklauser/go-sysconf v0.3.16 h1:frioLaCQSsF5Cy1jgRBrzr6t502KIIwQ0MArYICU0nA= +github.com/tklauser/go-sysconf v0.3.16/go.mod h1:/qNL9xxDhc7tx3HSRsLWNnuzbVfh3e7gh/BmM179nYI= +github.com/tklauser/numcpus v0.11.0 h1:nSTwhKH5e1dMNsCdVBukSZrURJRoHbSEQjdEbY+9RXw= +github.com/tklauser/numcpus v0.11.0/go.mod h1:z+LwcLq54uWZTX0u/bGobaV34u6V7KNlTZejzM6/3MQ= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= -github.com/xen0n/gosmopolitan v1.2.2 h1:/p2KTnMzwRexIW8GlKawsTWOxn7UHA+jCMF/V8HHtvU= -github.com/xen0n/gosmopolitan v1.2.2/go.mod h1:7XX7Mj61uLYrj0qmeN0zi7XDon9JRAEhYQqAPLVNTeg= -github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= -github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= -github.com/yeya24/promlinter v0.2.0 h1:xFKDQ82orCU5jQujdaD8stOHiv8UN68BSdn2a8u8Y3o= -github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= -github.com/ykadowak/zerologlint v0.1.5 h1:Gy/fMz1dFQN9JZTPjv1hxEk+sRWm05row04Yoolgdiw= -github.com/ykadowak/zerologlint v0.1.5/go.mod h1:KaUskqF3e/v59oPmdq1U1DnKcuHokl2/K1U4pmIELKg= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -gitlab.com/bosi/decorder v0.4.1 h1:VdsdfxhstabyhZovHafFw+9eJ6eU0d2CkFNJcZz/NU4= -gitlab.com/bosi/decorder v0.4.1/go.mod h1:jecSqWUew6Yle1pCr2eLWTensJMmsxHsBwt+PVbkAqA= -go-simpler.org/assert v0.7.0 h1:OzWWZqfNxt8cLS+MlUp6Tgk1HjPkmgdKBq9qvy8lZsA= -go-simpler.org/assert v0.7.0/go.mod h1:74Eqh5eI6vCK6Y5l3PI8ZYFXG4Sa+tkr70OIPJAUr28= -go-simpler.org/musttag v0.9.0 h1:Dzt6/tyP9ONr5g9h9P3cnYWCxeBFRkd0uJL/w+1Mxos= -go-simpler.org/musttag v0.9.0/go.mod h1:gA9nThnalvNSKpEoyp3Ko4/vCX2xTpqKoUtNqXOnVR4= -go-simpler.org/sloglint v0.5.0 h1:2YCcd+YMuYpuqthCgubcF5lBSjb6berc5VMOYUHKrpY= -go-simpler.org/sloglint v0.5.0/go.mod h1:EUknX5s8iXqf18KQxKnaBHUPVriiPnOrPjjJcsaTcSQ= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -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.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= -go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 h1:BEj3SPM81McUZHYjRS5pEgNgnmzGJ5tRpU5krWnV8Bs= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0/go.mod h1:9cKLGBDzI/F3NoHLQGm4ZrYdIHsvGt6ej6hUowxY0J4= -go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= -go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= -go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= -go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= -go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= -go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= -go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= -go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= -go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= -go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= -go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= -go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= -go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -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-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +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.64.0 h1:ssfIgGNANqpVFCndZvcuyKbl0g+UAVcbBcqGkG28H0Y= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0/go.mod h1:GQ/474YrbE4Jx8gZ4q5I4hrhUzM6UPzyrqJYV2AqPoQ= +go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= +go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8= +go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0= +go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs= +go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18= +go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE= +go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8= +go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew= +go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= +go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= +go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= +go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= -golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc h1:ao2WRsKSzW6KuUY9IWPwWahcHCgR0s52IfwutMfEbdM= -golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= -golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f h1:phY1HzDcf18Aq9A8KkmRtY9WvOFIxN8wgfvy6Zm1DV8= -golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -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-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -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.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= -golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= -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-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -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= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/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-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= +golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= -golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -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-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= +golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/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-20220702020025-31831981b65f/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-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= -golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= +golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= 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.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= -golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/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= +golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q= +golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= -golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= +golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= 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-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= -golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE= -golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg= -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= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= -google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f h1:gap6+3Gk41EItBuyi4XX/bp4oqJ3UwuIMl25yGinuAA= -google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:Ic02D47M+zbarjYYUlK57y316f2MoN0gjAwI3f2S95o= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f h1:OxYkA3wjPsZyBylwymxSHa7ViiW1Sml4ToBrncvFehI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -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.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.69.4 h1:MF5TftSMkd8GLw/m0KM6V8CMOCY6NZ1NQDPGFgbTt4A= -google.golang.org/grpc v1.69.4/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= -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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -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.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU= -google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251222181119-0a764e51fe1b h1:Mv8VFug0MP9e5vUxfBcE3vUkV6CImK3cMNMIDFjmzxU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251222181119-0a764e51fe1b/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= +google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc= +google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -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-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.4.7 h1:9MDAWxMoSnB6QoSqiVr7P5mtkT9pOc1kSxchzPCnqJs= -honnef.co/go/tools v0.4.7/go.mod h1:+rnGS1THNh8zMwnd2oVOTL9QF6vmfyG6ZXBULae2uc0= -mvdan.cc/gofumpt v0.6.0 h1:G3QvahNDmpD+Aek/bNOLrFR2XC6ZAdo62dZu65gmwGo= -mvdan.cc/gofumpt v0.6.0/go.mod h1:4L0wf+kgIPZtcCWXynNS2e6bhmj73umwnuXSZarixzA= -mvdan.cc/unparam v0.0.0-20240104100049-c549a3470d14 h1:zCr3iRRgdk5eIikZNDphGcM6KGVTx3Yu+/Uu9Es254w= -mvdan.cc/unparam v0.0.0-20240104100049-c549a3470d14/go.mod h1:ZzZjEpJDOmx8TdVU6umamY3Xy0UAQUI2DHbf05USVbI= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +pgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk= +pgregory.net/rapid v1.2.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= diff --git a/internal/api/api.go b/internal/api/api.go index bc65bf1..ce692e9 100644 --- a/internal/api/api.go +++ b/internal/api/api.go @@ -3,8 +3,8 @@ package api import ( "context" - "github.com/sboon-gg/svctl/internal/daemon" - "github.com/sboon-gg/svctl/svctl" + "github.com/prbf2-tools/svctl/internal/daemon" + "github.com/prbf2-tools/svctl/svctl/v1" ) type daemonServer struct { @@ -18,56 +18,58 @@ func NewDaemonServer(daemon *daemon.Daemon) svctl.ServersServer { } } -func (s *daemonServer) Register(ctx context.Context, opts *svctl.ServerOpts) (*svctl.ServerInfo, error) { - err := s.daemon.Register(opts.GetPath(), opts.GetSettingsPath()) +func (s *daemonServer) Register(ctx context.Context, opts *svctl.RegisterServerOpts) (*svctl.ServerInfo, error) { + typ := serverTypeFromProto(opts.GetType()) + + err := s.daemon.Register(opts.GetId(), opts.GetLocation(), opts.GetSettingsPath(), typ) if err != nil { return nil, err } - info, err := s.fetchServerInfo(opts.GetPath()) + info, err := s.fetchServerInfo(opts.GetId()) if err != nil { return nil, err } - info.Status = svctl.Status_REGISTERED + info.Status = svctl.Status_STATUS_REGISTERED return info, nil } func (s *daemonServer) Start(ctx context.Context, opts *svctl.ServerOpts) (*svctl.ServerInfo, error) { - err := s.daemon.Start(opts.GetPath()) + err := s.daemon.Start(opts.GetId()) if err != nil { return nil, err } - info, err := s.fetchServerInfo(opts.GetPath()) + info, err := s.fetchServerInfo(opts.GetId()) if err != nil { return nil, err } - info.Status = svctl.Status_STARTING + info.Status = svctl.Status_STATUS_STARTING return info, nil } func (s *daemonServer) Stop(ctx context.Context, opts *svctl.ServerOpts) (*svctl.ServerInfo, error) { - err := s.daemon.Stop(opts.GetPath()) + err := s.daemon.Stop(opts.GetId()) if err != nil { return nil, err } - info, err := s.fetchServerInfo(opts.GetPath()) + info, err := s.fetchServerInfo(opts.GetId()) if err != nil { return nil, err } - info.Status = svctl.Status_STOPPING + info.Status = svctl.Status_STATUS_STOPPING return info, nil } func (s *daemonServer) Status(ctx context.Context, opts *svctl.ServerOpts) (*svctl.ServerInfo, error) { - info, err := s.fetchServerInfo(opts.GetPath()) + info, err := s.fetchServerInfo(opts.GetId()) if err != nil { return nil, err } @@ -76,22 +78,32 @@ func (s *daemonServer) Status(ctx context.Context, opts *svctl.ServerOpts) (*svc } func (s *daemonServer) Reset(ctx context.Context, opts *svctl.ServerOpts) (*svctl.ServerInfo, error) { - err := s.daemon.Reset(opts.GetPath()) + err := s.daemon.Reset(opts.GetId()) if err != nil { return nil, err } - return s.fetchServerInfo(opts.GetPath()) + return s.fetchServerInfo(opts.GetId()) } -func (s *daemonServer) fetchServerInfo(path string) (*svctl.ServerInfo, error) { - status, err := s.daemon.Status(path) +func (s *daemonServer) Render(ctx context.Context, opts *svctl.RenderOpts) (*svctl.ServerInfo, error) { + err := s.daemon.Render(opts.GetId(), opts.GetReloadableOnly()) + if err != nil { + return nil, err + } + + return s.fetchServerInfo(opts.GetId()) +} + +func (s *daemonServer) fetchServerInfo(id string) (*svctl.ServerInfo, error) { + status, err := s.daemon.Status(id) if err != nil { return nil, err } info := &svctl.ServerInfo{ - Path: path, + Id: id, + Location: status.Location, SettingsPath: status.SettingsPath, DesiredState: serverStateToProto(status.DesiredState), CurrentState: serverStateToProto(status.CurrentState), @@ -115,10 +127,23 @@ func (s *daemonServer) fetchServerInfo(path string) (*svctl.ServerInfo, error) { func serverStateToProto(state daemon.ServerState) svctl.State { switch state { case daemon.Running: - return svctl.State_RUNNING + return svctl.State_STATE_RUNNING case daemon.Stopped: - return svctl.State_STOPPED + return svctl.State_STATE_STOPPED + default: + return svctl.State_STATE_UNSPECIFIED + } +} + +func serverTypeFromProto(t svctl.ServerType) daemon.ServerType { + switch t { + case svctl.ServerType_SERVER_TYPE_LOCAL: + return daemon.LocalServer + case svctl.ServerType_SERVER_TYPE_DOCKER: + return daemon.DockerServer + case svctl.ServerType_SERVER_TYPE_SYSTEMD: + return daemon.SystemdServer default: - return svctl.State_STOPPED + return daemon.LocalServer } } diff --git a/internal/daemon/daemon.go b/internal/daemon/daemon.go index 254f36b..1658cec 100644 --- a/internal/daemon/daemon.go +++ b/internal/daemon/daemon.go @@ -6,8 +6,8 @@ import ( "os" "path/filepath" - "github.com/sboon-gg/svctl/internal/fsm" - "github.com/sboon-gg/svctl/internal/server" + "github.com/prbf2-tools/svctl/internal/fsm" + "github.com/prbf2-tools/svctl/internal/server" ) const ( @@ -76,18 +76,48 @@ func Recover(configFile string) (*Daemon, error) { return nil, err } - for svPath, sv := range d.ServerManager.ServersInfo { + for serverID, sv := range d.ServersInfo { settingsPath := sv.SettingsPath if !filepath.IsAbs(settingsPath) { - settingsPath = filepath.Join(svPath, sv.SettingsPath) + if sv.Type != LocalServer { + slog.Warn("Non-local server with relative settings path", "serverID", serverID, "settingsPath", settingsPath) + } else { + settingsPath = filepath.Join(serverID, sv.SettingsPath) + } } - s, err := server.Open( - svPath, - settingsPath, - ) - if err != nil { - slog.Error("Unable to open server", "svPath", svPath, "settingsPath", settingsPath, "err", err) + var s *server.Server + + switch sv.Type { + case LocalServer: + s, err = server.OpenLocal( + sv.Location, + settingsPath, + ) + if err != nil { + slog.Error("Unable to open local server", "serverID", serverID, "settingsPath", settingsPath, "err", err) + continue + } + case DockerServer: + s, err = server.OpenDocker( + sv.Location, + settingsPath, + ) + if err != nil { + slog.Error("Unable to open docker server", "serverID", serverID, "settingsPath", settingsPath, "err", err) + continue + } + case SystemdServer: + s, err = server.OpenSystemd( + sv.Location, + settingsPath, + ) + if err != nil { + slog.Error("Unable to open systemd server", "serverID", serverID, "settingsPath", settingsPath, "err", err) + continue + } + default: + slog.Error("Unknown server type", "serverID", serverID, "type", sv.Type) continue } @@ -117,35 +147,51 @@ func Recover(configFile string) (*Daemon, error) { } } - d.Servers[svPath] = machine + d.Servers[serverID] = machine } return d, nil } -func (s *Daemon) Register(serverPath, settingsPath string) error { - err := s.ServerManager.AddServer(serverPath, settingsPath) +func (s *Daemon) Register(serverID, location, settingsPath string, typ ServerType) error { + err := s.AddServer(serverID, location, settingsPath, typ) if err != nil { return err } - sv, err := server.Open(serverPath, settingsPath) - if err != nil { - return err + var sv *server.Server + switch typ { + case LocalServer: + sv, err = server.OpenLocal(location, settingsPath) + if err != nil { + return err + } + case DockerServer: + sv, err = server.OpenDocker(location, settingsPath) + if err != nil { + return err + } + case SystemdServer: + sv, err = server.OpenSystemd(location, settingsPath) + if err != nil { + return err + } + default: + return fmt.Errorf("unknown server type %q", typ) } - s.Servers[serverPath] = fsm.New(sv, sv.Log, fsm.NewStateStopped()) + s.Servers[serverID] = fsm.New(sv, sv.Log, fsm.NewStateStopped()) return nil } -func (s *Daemon) Start(path string) error { - sv, err := s.findServer(path) +func (s *Daemon) Start(id string) error { + sv, err := s.findServer(id) if err != nil { return err } - err = s.ServerManager.ChangeState(path, Running) + err = s.ChangeState(id, Running) if err != nil { return err } @@ -159,13 +205,13 @@ func (s *Daemon) Start(path string) error { return nil } -func (s *Daemon) Stop(path string) error { - sv, err := s.findServer(path) +func (s *Daemon) Stop(id string) error { + sv, err := s.findServer(id) if err != nil { return err } - err = s.ServerManager.ChangeState(path, Stopped) + err = s.ChangeState(id, Stopped) if err != nil { return err } @@ -179,14 +225,14 @@ func (s *Daemon) Stop(path string) error { return nil } -func (s *Daemon) Reset(path string) error { - sv, err := s.findServer(path) +func (s *Daemon) Reset(id string) error { + sv, err := s.findServer(id) if err != nil { return err } sv.Log.Info("Reseting server", "op", "Daemon.Reset") - err = s.ServerManager.ChangeState(path, Stopped) + err = s.ChangeState(id, Stopped) if err != nil { return err } @@ -194,34 +240,51 @@ func (s *Daemon) Reset(path string) error { return sv.Event(fsm.EventReset) } +func (s *Daemon) Render(id string, reloadableOnly bool) error { + sv, err := s.findServer(id) + if err != nil { + return err + } + + err = sv.Server().Render(reloadableOnly) + if err != nil { + return err + } + + sv.Log.Info("Server templates rendered", "op", "Daemon.Render", "reloadableOnly", reloadableOnly) + return nil +} + type ServerStatus struct { DesiredState ServerState CurrentState ServerState SettingsPath string + Location string GameStatus *server.Status } -func (s *Daemon) Status(path string) (*ServerStatus, error) { - sv, err := s.findServer(path) +func (s *Daemon) Status(id string) (*ServerStatus, error) { + sv, err := s.findServer(id) if err != nil { return nil, err } - gameStatus, err := sv.Server().Status() - if err != nil { - sv.Log.Error("Unable to get Gamespy 3 query status", "err", err) - } + // gameStatus, err := sv.Server().Status() + // if err != nil { + // sv.Log.Error("Unable to get Gamespy 3 query status", "err", err) + // } - info, ok := s.ServersInfo[path] + info, ok := s.ServersInfo[id] if !ok { - return nil, fmt.Errorf("server %q not found", path) + return nil, fmt.Errorf("server %q not found", id) } status := ServerStatus{ DesiredState: info.DesiredState, CurrentState: Stopped, SettingsPath: info.SettingsPath, - GameStatus: gameStatus, + Location: info.Location, + // GameStatus: gameStatus, } if sv.Server() != nil { @@ -233,10 +296,10 @@ func (s *Daemon) Status(path string) (*ServerStatus, error) { return &status, nil } -func (d *Daemon) findServer(path string) (*fsm.FSM, error) { - s, ok := d.Servers[path] +func (d *Daemon) findServer(id string) (*fsm.FSM, error) { + s, ok := d.Servers[id] if !ok { - return nil, fmt.Errorf("server %q not found", path) + return nil, fmt.Errorf("server %q not found", id) } return s, nil diff --git a/internal/daemon/manager.go b/internal/daemon/manager.go index eab44e4..2510375 100644 --- a/internal/daemon/manager.go +++ b/internal/daemon/manager.go @@ -14,8 +14,18 @@ const ( Stopped ServerState = "stopped" ) +type ServerType string + +const ( + LocalServer ServerType = "local" + DockerServer ServerType = "docker" + SystemdServer ServerType = "systemd" +) + type ServerInfo struct { - ServerPath string `yaml:"serverPath"` + ID string `yaml:"id"` + Type ServerType `yaml:"type"` + Location string `yaml:"location"` SettingsPath string `yaml:"settingsPath"` DesiredState ServerState `yaml:"desiredState"` } @@ -26,30 +36,40 @@ type ServerManager struct { } func NewServerManager(cachePath string) (*ServerManager, error) { + manager := &ServerManager{ + ServersInfo: make(map[string]*ServerInfo), + cachePath: cachePath, + } + content, err := os.ReadFile(cachePath) if err != nil && !os.IsNotExist(err) { return nil, err } - servers := make(map[string]*ServerInfo) - err = yaml.Unmarshal(content, &servers) if err != nil { + if os.IsNotExist(err) { + return manager, nil + } return nil, err } - return &ServerManager{ - ServersInfo: servers, - cachePath: cachePath, - }, nil + err = yaml.Unmarshal(content, &manager.ServersInfo) + if err != nil { + return nil, err + } + + return manager, nil } -func (m *ServerManager) AddServer(serverPath, settingsPath string) error { - if _, ok := m.ServersInfo[serverPath]; ok { - return fmt.Errorf("server %q already exists", serverPath) +func (m *ServerManager) AddServer(serverID, location, settingsPath string, typ ServerType) error { + if _, ok := m.ServersInfo[serverID]; ok { + return fmt.Errorf("server %q already exists", serverID) } - m.ServersInfo[serverPath] = &ServerInfo{ - ServerPath: serverPath, + m.ServersInfo[serverID] = &ServerInfo{ + ID: serverID, + Location: location, + Type: typ, SettingsPath: settingsPath, DesiredState: Stopped, } diff --git a/internal/fsm/fsm.go b/internal/fsm/fsm.go index 3860308..9690fff 100644 --- a/internal/fsm/fsm.go +++ b/internal/fsm/fsm.go @@ -5,7 +5,7 @@ import ( "log/slog" "time" - "github.com/sboon-gg/svctl/internal/server" + "github.com/prbf2-tools/svctl/internal/server" ) type GameServer interface { diff --git a/internal/fsm/mock_game_server.go b/internal/fsm/mock_game_server.go index 45cf33e..9eec5c6 100644 --- a/internal/fsm/mock_game_server.go +++ b/internal/fsm/mock_game_server.go @@ -12,7 +12,7 @@ package fsm import ( reflect "reflect" - server "github.com/sboon-gg/svctl/internal/server" + server "github.com/prbf2-tools/svctl/internal/server" gomock "go.uber.org/mock/gomock" ) diff --git a/internal/game/docker/server.go b/internal/game/docker/server.go index a64bba3..189d3a6 100644 --- a/internal/game/docker/server.go +++ b/internal/game/docker/server.go @@ -9,9 +9,8 @@ import ( "os" "path" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/client" - "github.com/sboon-gg/svctl/internal/game" + "github.com/moby/moby/client" + "github.com/prbf2-tools/svctl/internal/game" ) var _ game.GameServer = &Container{} @@ -25,19 +24,25 @@ type Container struct { } func Open(c *client.Client, containerName string) (*Container, error) { - inspect, err := c.ContainerInspect(context.Background(), containerName) + inspect, err := c.ContainerInspect(context.Background(), containerName, client.ContainerInspectOptions{}) if err != nil { return nil, err } - workDir := inspect.Config.WorkingDir + workDir := inspect.Container.Config.WorkingDir - readCloser, _, err := c.CopyFromContainer(context.Background(), containerName, path.Join(workDir, "mods/pr/mod.desc")) + copyResult, err := c.CopyFromContainer(context.Background(), containerName, client.CopyFromContainerOptions{ + SourcePath: path.Join(workDir, "mods/pr/mod.desc"), + }) if err != nil { return nil, err } - defer readCloser.Close() + readCloser := copyResult.Content + + defer func() { + _ = readCloser.Close() + }() tarReader := tar.NewReader(readCloser) header, err := tarReader.Next() @@ -54,21 +59,27 @@ func Open(c *client.Client, containerName string) (*Container, error) { }, nil } +func (c *Container) ID() string { + return c.name +} + func (c *Container) Start() error { - return c.docker.ContainerStart(context.Background(), c.name, container.StartOptions{}) + _, err := c.docker.ContainerStart(context.Background(), c.name, client.ContainerStartOptions{}) + return err } func (c *Container) Stop() error { - return c.docker.ContainerStop(context.Background(), c.name, container.StopOptions{}) + _, err := c.docker.ContainerStop(context.Background(), c.name, client.ContainerStopOptions{}) + return err } func (c *Container) IsRunning() (bool, error) { - inspect, err := c.docker.ContainerInspect(context.Background(), c.name) + inspect, err := c.docker.ContainerInspect(context.Background(), c.name, client.ContainerInspectOptions{}) if err != nil { return false, err } - return inspect.State.Running, nil + return inspect.Container.State.Running, nil } func (c *Container) WriteFile(filePath string, data []byte) error { @@ -81,9 +92,11 @@ func (c *Container) WriteFileFromReader(filePath string, reader io.Reader, size fullPath := path.Join(c.workDir, filePath) mode := int64(0644) - stat, err := c.docker.ContainerStatPath(ctx, c.name, fullPath) + stat, err := c.docker.ContainerStatPath(ctx, c.name, client.ContainerStatPathOptions{ + Path: fullPath, + }) if err == nil { - mode = int64(stat.Mode) + mode = int64(stat.Stat.Mode) } f, err := os.CreateTemp("", "svctl-tar-*.tar") @@ -92,8 +105,8 @@ func (c *Container) WriteFileFromReader(filePath string, reader io.Reader, size } defer func() { - f.Close() - os.Remove(f.Name()) + _ = f.Close() + _ = os.Remove(f.Name()) }() tarWriter := tar.NewWriter(f) @@ -123,23 +136,33 @@ func (c *Container) WriteFileFromReader(filePath string, reader io.Reader, size return err } - return c.docker.CopyToContainer(ctx, c.name, path.Dir(fullPath), f, container.CopyToContainerOptions{}) + _, err = c.docker.CopyToContainer(ctx, c.name, client.CopyToContainerOptions{ + DestinationPath: path.Dir(fullPath), + Content: f, + CopyUIDGID: true, + }) + return err } func (c *Container) ReadFile(filePath string) ([]byte, error) { ctx := context.Background() fullPath := path.Join(c.workDir, filePath) - println(fullPath) - readCloser, stat, err := c.docker.CopyFromContainer(ctx, c.name, fullPath) + copyResult, err := c.docker.CopyFromContainer(ctx, c.name, client.CopyFromContainerOptions{ + SourcePath: fullPath, + }) if err != nil { return nil, err } - defer readCloser.Close() + readCloser := copyResult.Content + + defer func() { + _ = readCloser.Close() + }() - if stat.Mode.IsDir() { + if copyResult.Stat.Mode.IsDir() { return nil, game.ErrIsDir } diff --git a/internal/game/game.go b/internal/game/game.go index 35d1053..bc264f9 100644 --- a/internal/game/game.go +++ b/internal/game/game.go @@ -6,6 +6,7 @@ import ( ) type GameServer interface { + ID() string Start() error IsRunning() (bool, error) Stop() error diff --git a/internal/game/local/game.go b/internal/game/local/game.go index ecba962..ac81c21 100644 --- a/internal/game/local/game.go +++ b/internal/game/local/game.go @@ -9,7 +9,7 @@ import ( "strconv" "strings" - "github.com/sboon-gg/svctl/internal/game" + "github.com/prbf2-tools/svctl/internal/game" ) const ( @@ -43,6 +43,10 @@ func Open(path string) (*Server, error) { return s, nil } +func (s *Server) ID() string { + return s.path +} + func (s *Server) ReadFile(path string) ([]byte, error) { return os.ReadFile(filepath.Join(s.path, path)) } @@ -70,7 +74,9 @@ func (s *Server) WriteFileFromReader(path string, r io.Reader, _ int64) error { if err != nil { return err } - defer f.Close() + defer func() { + _ = f.Close() + }() _, err = io.Copy(f, r) return err diff --git a/internal/game/systemd/service.go b/internal/game/systemd/service.go new file mode 100644 index 0000000..55eb374 --- /dev/null +++ b/internal/game/systemd/service.go @@ -0,0 +1,147 @@ +package systemd + +import ( + "context" + "fmt" + "io" + "os" + "path/filepath" + + "github.com/coreos/go-systemd/v22/dbus" + "github.com/coreos/go-systemd/v22/unit" + "github.com/prbf2-tools/svctl/internal/game" +) + +var _ game.GameServer = &Service{} + +type Service struct { + name string + path string +} + +func Open(serviceName string) (*Service, error) { + ctx := context.Background() + conn, err := dbus.NewSystemConnectionContext(ctx) + if err != nil { + return nil, err + } + defer conn.Close() + + unitPathProp, err := conn.GetUnitPropertyContext(ctx, fmt.Sprintf("%s.service", serviceName), "FragmentPath") + if err != nil { + return nil, err + } + + unitPath := unitPathProp.Value.Value().(string) + + unitFile, err := os.Open(unitPath) + if err != nil { + return nil, err + } + defer func() { + _ = unitFile.Close() + }() + + unitOptions, err := unit.DeserializeOptions(unitFile) + if err != nil { + return nil, err + } + + var path string + for _, option := range unitOptions { + if option.Section == "Service" && option.Name == "WorkingDirectory" { + path = option.Value + break + } + } + + if path == "" { + return nil, fmt.Errorf("working directory not found in unit file") + } + + return &Service{ + name: serviceName, + path: path, + }, nil +} + +func (c *Service) ID() string { + return c.name +} + +func (c *Service) Start() error { + ctx := context.Background() + conn, err := dbus.NewSystemConnectionContext(ctx) + if err != nil { + return err + } + defer conn.Close() + + _, err = conn.StartUnitContext(ctx, fmt.Sprintf("%s.service", c.name), "fail", nil) + return err +} + +func (c *Service) Stop() error { + ctx := context.Background() + conn, err := dbus.NewSystemConnectionContext(ctx) + if err != nil { + return err + } + defer conn.Close() + + _, err = conn.StopUnitContext(ctx, fmt.Sprintf("%s.service", c.name), "fail", nil) + return err +} + +func (c *Service) IsRunning() (bool, error) { + ctx := context.Background() + conn, err := dbus.NewSystemConnectionContext(ctx) + if err != nil { + return false, err + } + defer conn.Close() + + unitStatus, err := conn.GetUnitPropertyContext(ctx, fmt.Sprintf("%s.service", c.name), "ActiveState") + if err != nil { + return false, err + } + + activeState := unitStatus.Value.Value().(string) + return activeState == "active", nil +} + +func (c *Service) ReadFile(path string) ([]byte, error) { + return os.ReadFile(filepath.Join(c.path, path)) +} + +func (c *Service) WriteFile(path string, data []byte) error { + fullPath := filepath.Join(c.path, path) + + if _, err := os.Stat(filepath.Dir(fullPath)); os.IsNotExist(err) { + // Ignore error, the write will fail if the directory doesn't exist. + _ = os.MkdirAll(filepath.Dir(fullPath), 0755) + } + + return os.WriteFile(fullPath, data, 0644) +} + +func (c *Service) WriteFileFromReader(path string, r io.Reader, _ int64) error { + fullPath := filepath.Join(c.path, path) + + if _, err := os.Stat(filepath.Dir(fullPath)); os.IsNotExist(err) { + // Ignore error, the write will fail if the directory doesn't exist. + _ = os.MkdirAll(filepath.Dir(fullPath), 0755) + } + + f, err := os.Create(fullPath) + if err != nil { + return err + } + defer func() { + _ = f.Sync() + _ = f.Close() + }() + + _, err = io.Copy(f, r) + return err +} diff --git a/internal/server/server.go b/internal/server/server.go index 33d1564..642c0c6 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -4,12 +4,13 @@ import ( "os" "path/filepath" - "github.com/docker/docker/client" - "github.com/sboon-gg/svctl/internal/game" - "github.com/sboon-gg/svctl/internal/game/docker" - "github.com/sboon-gg/svctl/internal/game/local" - "github.com/sboon-gg/svctl/internal/settings" - "github.com/sboon-gg/svctl/pkg/templates" + "github.com/moby/moby/client" + "github.com/prbf2-tools/svctl/internal/game" + "github.com/prbf2-tools/svctl/internal/game/docker" + "github.com/prbf2-tools/svctl/internal/game/local" + "github.com/prbf2-tools/svctl/internal/game/systemd" + "github.com/prbf2-tools/svctl/internal/settings" + "github.com/prbf2-tools/svctl/pkg/templates" ) type Server struct { @@ -17,56 +18,65 @@ type Server struct { settings.Settings } -func Open(serverPath, settingsPath string) (*Server, error) { +func Open(server game.GameServer, settingsPath string) (*Server, error) { s, err := settings.Open(settingsPath) if err != nil { return nil, err } - config, err := s.Config() + sv := &Server{ + GameServer: server, + Settings: *s, + } + + sv.Log = sv.Log.With("server", server.ID()) + + return sv, nil +} + +func OpenLocal(serverPath, settingsPath string) (*Server, error) { + g, err := local.Open(serverPath) if err != nil { return nil, err } - var g game.GameServer - if config.Docker != nil { - c, err := client.NewClientWithOpts(client.FromEnv) - if err != nil { - return nil, err - } + return Open(g, settingsPath) +} - g, err = docker.Open(c, config.Docker.ContainerName) - if err != nil { - return nil, err - } - } else { - g, err = local.Open(serverPath) - if err != nil { - return nil, err - } +func OpenDocker(containerName, settingsPath string) (*Server, error) { + c, err := client.New(client.FromEnv) + if err != nil { + return nil, err } - sv := &Server{ - GameServer: g, - Settings: *s, + g, err := docker.Open(c, containerName) + if err != nil { + return nil, err } - sv.Log = sv.Log.With("server", filepath.Base(serverPath)) + return Open(g, settingsPath) +} - return sv, nil +func OpenSystemd(serviceName, settingsPath string) (*Server, error) { + g, err := systemd.Open(serviceName) + if err != nil { + return nil, err + } + + return Open(g, settingsPath) } func (s *Server) Render(reloadableOnly bool) error { - if s.Settings.Templates == nil { + if s.Templates == nil { return nil } - values, gameConfig, err := s.Settings.TemplateData() + values, gameConfig, err := s.TemplateData() if err != nil { return err } - outputs, err := s.Settings.Templates.Render(gameConfig, values) + outputs, err := s.Templates.Render(gameConfig, values) if err != nil { return err } @@ -86,20 +96,20 @@ func (s *Server) Render(reloadableOnly bool) error { } func (s *Server) DryRender() ([]templates.RenderOutput, error) { - if s.Settings.Templates == nil { + if s.Templates == nil { return nil, nil } - values, gameConfig, err := s.Settings.TemplateData() + values, gameConfig, err := s.TemplateData() if err != nil { return nil, err } - return s.Settings.Templates.Render(gameConfig, values) + return s.Templates.Render(gameConfig, values) } func (s *Server) ApplyPatches() error { - cfg, err := s.Settings.Config() + cfg, err := s.Config() if err != nil { return err } @@ -109,11 +119,13 @@ func (s *Server) ApplyPatches() error { continue } - f, err := os.Open(filepath.Join(s.Settings.Path, patch.Source)) + f, err := os.Open(filepath.Join(s.Path, patch.Source)) if err != nil { return err } - defer f.Close() + defer func() { + _ = f.Close() + }() stat, err := f.Stat() if err != nil { diff --git a/internal/server/status.go b/internal/server/status.go index 2a95e4e..4cf7654 100644 --- a/internal/server/status.go +++ b/internal/server/status.go @@ -1,13 +1,5 @@ package server -import ( - "context" - "net" - "strconv" - - "github.com/emilekm/go-prbf2/gamespy3" -) - type Status struct { Hostname string `json:"hostname"` Port string `json:"hostport"` @@ -19,44 +11,46 @@ type Status struct { } func (s *Server) Status() (*Status, error) { - config, err := s.Config() - if err != nil { - return nil, err - } - - host := "127.0.0.1" - if config.Game.ExternalIP != "" { - host = config.Game.ServerIP - } - - serverAddr, err := net.ResolveUDPAddr("udp", net.JoinHostPort(host, strconv.Itoa(config.Game.GamespyPort))) - if err != nil { - return nil, err - } - - udp, err := net.DialUDP("udp", nil, serverAddr) - if err != nil { - return nil, err - } - - defer udp.Close() - - c := gamespy3.New(udp) - - resp, err := c.ServerInfoB(context.Background()) - if err != nil { - return nil, err - } - - status := &Status{ - Hostname: resp.Header.Hostname, - Port: strconv.Itoa(resp.Header.HostPort), - MapName: resp.Header.Map.Name, - GameMode: resp.Header.Map.GameMode, - MapSize: resp.Header.Map.Layer, - NumPlayers: resp.Header.NumPlayers, - MaxPlayers: resp.Header.MaxPlayers, - } - - return status, nil + // config, err := s.Config() + // if err != nil { + // return nil, err + // } + // + // host := "127.0.0.1" + // if config.Game.ExternalIP != "" { + // host = config.Game.ServerIP + // } + // + // serverAddr, err := net.ResolveUDPAddr("udp", net.JoinHostPort(host, strconv.Itoa(config.Game.GamespyPort))) + // if err != nil { + // return nil, err + // } + // + // udp, err := net.DialUDP("udp", nil, serverAddr) + // if err != nil { + // return nil, err + // } + // + // defer udp.Close() + // + // c := gamespy3.Status(context.Background(), udp) + // + // resp, err := c.ServerInfoB(context.Background()) + // if err != nil { + // return nil, err + // } + // + // status := &Status{ + // Hostname: resp.Header.Hostname, + // Port: strconv.Itoa(resp.Header.HostPort), + // MapName: resp.Header.Map.Name, + // GameMode: resp.Header.Map.GameMode, + // MapSize: resp.Header.Map.Layer, + // NumPlayers: resp.Header.NumPlayers, + // MaxPlayers: resp.Header.MaxPlayers, + // } + // + // return status, nil + // TODO: Implement actual status retrieval + return &Status{}, nil } diff --git a/internal/settings/config.go b/internal/settings/config.go index 7c67a1c..ee5658f 100644 --- a/internal/settings/config.go +++ b/internal/settings/config.go @@ -20,7 +20,6 @@ type GameConfig struct { } type DockerConfig struct { - ContainerName string `yaml:"containerName"` } type PatchConfig struct { diff --git a/internal/settings/settings.go b/internal/settings/settings.go index 49faec0..391ae5f 100644 --- a/internal/settings/settings.go +++ b/internal/settings/settings.go @@ -6,7 +6,7 @@ import ( "os" "path/filepath" - "github.com/sboon-gg/svctl/pkg/templates" + "github.com/prbf2-tools/svctl/pkg/templates" ) const ( diff --git a/internal/settings/settings_test.go b/internal/settings/settings_test.go index 2a6e35a..7c73621 100644 --- a/internal/settings/settings_test.go +++ b/internal/settings/settings_test.go @@ -9,7 +9,7 @@ import ( "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing/object" - "github.com/sboon-gg/svctl/internal/settings" + "github.com/prbf2-tools/svctl/internal/settings" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -89,7 +89,9 @@ func createRepoFromTemplatesDir(t *testing.T, templatesDir, repoDir string) { if err != nil { return err } - defer in.Close() + defer func() { + _ = in.Close() + }() out, err := os.Create(dst) if err != nil { diff --git a/internal/settings/templates.go b/internal/settings/templates.go index d03131a..aa3cd86 100644 --- a/internal/settings/templates.go +++ b/internal/settings/templates.go @@ -7,16 +7,15 @@ import ( "path/filepath" "strings" - "dario.cat/mergo" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing/transport" "github.com/go-git/go-git/v5/plumbing/transport/http" "github.com/goccy/go-yaml" - "github.com/sboon-gg/svctl/pkg/templates" + "github.com/prbf2-tools/svctl/pkg/templates" ) func (s *Settings) TemplateData() (templates.Values, *GameConfig, error) { - var allValues templates.Values + var allValuesSources []templates.Values config, err := s.Config() if err != nil { @@ -41,18 +40,17 @@ func (s *Settings) TemplateData() (templates.Values, *GameConfig, error) { return nil, nil, err } - err = mergo.Map(&allValues, values, mergo.WithAppendSlice, mergo.WithOverride) - if err != nil { - return nil, nil, err - } + allValuesSources = append(allValuesSources, values) } else if source.Values != nil { - err = mergo.Map(&allValues, source.Values, mergo.WithAppendSlice, mergo.WithOverride) - if err != nil { - return nil, nil, err - } + allValuesSources = append(allValuesSources, source.Values) } } + allValues, err := templates.MergeValues(allValuesSources...) + if err != nil { + return nil, nil, err + } + return allValues, &config.Game, nil } diff --git a/main.go b/main.go index 82fd6df..fa408d8 100644 --- a/main.go +++ b/main.go @@ -6,7 +6,7 @@ package main import ( "os" - "github.com/sboon-gg/svctl/cmd" + "github.com/prbf2-tools/svctl/cmd" ) func main() { diff --git a/pkg/templates/funcs.go b/pkg/templates/funcs.go index 8a398a5..e3d3b14 100644 --- a/pkg/templates/funcs.go +++ b/pkg/templates/funcs.go @@ -9,7 +9,7 @@ import ( "text/template" "github.com/Masterminds/sprig/v3" - "github.com/sboon-gg/svctl/pkg/maplist" + "github.com/prbf2-tools/svctl/pkg/maplist" ) func (r *Renderer) FuncMap() template.FuncMap { diff --git a/pkg/templates/templates.go b/pkg/templates/templates.go index 410627c..c3407d5 100644 --- a/pkg/templates/templates.go +++ b/pkg/templates/templates.go @@ -7,18 +7,21 @@ import ( "text/template" "dario.cat/mergo" + "github.com/santhosh-tekuri/jsonschema/v5" "gopkg.in/yaml.v3" ) const ( configFileName = "config.yaml" + schemaFileName = "schema.json" ) type Values map[string]any type Data struct { - Values Values - Config any + Values Values + Defaults Values + Config any } type Template struct { @@ -94,6 +97,8 @@ func (t *Renderer) prepData(values Values) (*Data, error) { return nil, err } + data.Defaults = defaults + err = mergo.Map(&data.Values, defaults) if err != nil { return nil, err @@ -191,3 +196,28 @@ func (t *Renderer) Defaults() (Values, error) { return defaults, nil } + +func (t *Renderer) Schema() (*jsonschema.Schema, error) { + schemaContent, err := fs.ReadFile(t.files, schemaFileName) + if err != nil { + return nil, err + } + + schema, err := jsonschema.CompileString("schema.json", string(schemaContent)) + if err != nil { + return nil, err + } + + return schema, nil +} + +func MergeValues(sources ...Values) (Values, error) { + allValues := make(Values) + for _, values := range sources { + err := mergo.Map(&allValues, values, mergo.WithAppendSlice, mergo.WithOverride) + if err != nil { + return nil, err + } + } + return allValues, nil +} diff --git a/pkg/templates/templates_test.go b/pkg/templates/templates_test.go index be55787..6df1115 100644 --- a/pkg/templates/templates_test.go +++ b/pkg/templates/templates_test.go @@ -1,7 +1,6 @@ package templates import ( - "os" "testing" "github.com/stretchr/testify/assert" @@ -99,8 +98,7 @@ mapList.append saaremaa gpm_coop 64 for _, test := range tests { t.Run(test.name, func(t *testing.T) { for k, v := range test.env { - os.Setenv(k, v) - defer os.Unsetenv(k) + t.Setenv(k, v) } tmpl, err := NewFromPath("./testdata/example") diff --git a/svctl/svctl.pb.go b/svctl/svctl.pb.go deleted file mode 100644 index 3650165..0000000 --- a/svctl/svctl.pb.go +++ /dev/null @@ -1,529 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.32.0 -// protoc v5.29.2 -// source: svctl/svctl.proto - -package svctl - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type Status int32 - -const ( - Status_None Status = 0 - Status_REGISTERED Status = 1 - Status_STARTING Status = 2 - Status_STOPPING Status = 3 -) - -// Enum value maps for Status. -var ( - Status_name = map[int32]string{ - 0: "None", - 1: "REGISTERED", - 2: "STARTING", - 3: "STOPPING", - } - Status_value = map[string]int32{ - "None": 0, - "REGISTERED": 1, - "STARTING": 2, - "STOPPING": 3, - } -) - -func (x Status) Enum() *Status { - p := new(Status) - *p = x - return p -} - -func (x Status) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (Status) Descriptor() protoreflect.EnumDescriptor { - return file_svctl_svctl_proto_enumTypes[0].Descriptor() -} - -func (Status) Type() protoreflect.EnumType { - return &file_svctl_svctl_proto_enumTypes[0] -} - -func (x Status) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use Status.Descriptor instead. -func (Status) EnumDescriptor() ([]byte, []int) { - return file_svctl_svctl_proto_rawDescGZIP(), []int{0} -} - -type State int32 - -const ( - State_STOPPED State = 0 - State_RUNNING State = 1 -) - -// Enum value maps for State. -var ( - State_name = map[int32]string{ - 0: "STOPPED", - 1: "RUNNING", - } - State_value = map[string]int32{ - "STOPPED": 0, - "RUNNING": 1, - } -) - -func (x State) Enum() *State { - p := new(State) - *p = x - return p -} - -func (x State) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (State) Descriptor() protoreflect.EnumDescriptor { - return file_svctl_svctl_proto_enumTypes[1].Descriptor() -} - -func (State) Type() protoreflect.EnumType { - return &file_svctl_svctl_proto_enumTypes[1] -} - -func (x State) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use State.Descriptor instead. -func (State) EnumDescriptor() ([]byte, []int) { - return file_svctl_svctl_proto_rawDescGZIP(), []int{1} -} - -type ServerOpts struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` - SettingsPath string `protobuf:"bytes,2,opt,name=settingsPath,proto3" json:"settingsPath,omitempty"` -} - -func (x *ServerOpts) Reset() { - *x = ServerOpts{} - if protoimpl.UnsafeEnabled { - mi := &file_svctl_svctl_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ServerOpts) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ServerOpts) ProtoMessage() {} - -func (x *ServerOpts) ProtoReflect() protoreflect.Message { - mi := &file_svctl_svctl_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ServerOpts.ProtoReflect.Descriptor instead. -func (*ServerOpts) Descriptor() ([]byte, []int) { - return file_svctl_svctl_proto_rawDescGZIP(), []int{0} -} - -func (x *ServerOpts) GetPath() string { - if x != nil { - return x.Path - } - return "" -} - -func (x *ServerOpts) GetSettingsPath() string { - if x != nil { - return x.SettingsPath - } - return "" -} - -type GameStatus struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Hostname string `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"` - Port string `protobuf:"bytes,2,opt,name=port,proto3" json:"port,omitempty"` - Gamemode string `protobuf:"bytes,3,opt,name=gamemode,proto3" json:"gamemode,omitempty"` - MapName string `protobuf:"bytes,4,opt,name=map_name,json=mapName,proto3" json:"map_name,omitempty"` - MapSize int64 `protobuf:"varint,5,opt,name=map_size,json=mapSize,proto3" json:"map_size,omitempty"` - NumPlayers int64 `protobuf:"varint,6,opt,name=num_players,json=numPlayers,proto3" json:"num_players,omitempty"` - MaxPlayers int64 `protobuf:"varint,7,opt,name=max_players,json=maxPlayers,proto3" json:"max_players,omitempty"` -} - -func (x *GameStatus) Reset() { - *x = GameStatus{} - if protoimpl.UnsafeEnabled { - mi := &file_svctl_svctl_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GameStatus) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GameStatus) ProtoMessage() {} - -func (x *GameStatus) ProtoReflect() protoreflect.Message { - mi := &file_svctl_svctl_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GameStatus.ProtoReflect.Descriptor instead. -func (*GameStatus) Descriptor() ([]byte, []int) { - return file_svctl_svctl_proto_rawDescGZIP(), []int{1} -} - -func (x *GameStatus) GetHostname() string { - if x != nil { - return x.Hostname - } - return "" -} - -func (x *GameStatus) GetPort() string { - if x != nil { - return x.Port - } - return "" -} - -func (x *GameStatus) GetGamemode() string { - if x != nil { - return x.Gamemode - } - return "" -} - -func (x *GameStatus) GetMapName() string { - if x != nil { - return x.MapName - } - return "" -} - -func (x *GameStatus) GetMapSize() int64 { - if x != nil { - return x.MapSize - } - return 0 -} - -func (x *GameStatus) GetNumPlayers() int64 { - if x != nil { - return x.NumPlayers - } - return 0 -} - -func (x *GameStatus) GetMaxPlayers() int64 { - if x != nil { - return x.MaxPlayers - } - return 0 -} - -type ServerInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` - SettingsPath string `protobuf:"bytes,2,opt,name=settingsPath,proto3" json:"settingsPath,omitempty"` - Status Status `protobuf:"varint,3,opt,name=status,proto3,enum=svctl.Status" json:"status,omitempty"` - DesiredState State `protobuf:"varint,4,opt,name=desired_state,json=desiredState,proto3,enum=svctl.State" json:"desired_state,omitempty"` - CurrentState State `protobuf:"varint,5,opt,name=current_state,json=currentState,proto3,enum=svctl.State" json:"current_state,omitempty"` - GameStatus *GameStatus `protobuf:"bytes,6,opt,name=game_status,json=gameStatus,proto3" json:"game_status,omitempty"` -} - -func (x *ServerInfo) Reset() { - *x = ServerInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_svctl_svctl_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ServerInfo) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ServerInfo) ProtoMessage() {} - -func (x *ServerInfo) ProtoReflect() protoreflect.Message { - mi := &file_svctl_svctl_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ServerInfo.ProtoReflect.Descriptor instead. -func (*ServerInfo) Descriptor() ([]byte, []int) { - return file_svctl_svctl_proto_rawDescGZIP(), []int{2} -} - -func (x *ServerInfo) GetPath() string { - if x != nil { - return x.Path - } - return "" -} - -func (x *ServerInfo) GetSettingsPath() string { - if x != nil { - return x.SettingsPath - } - return "" -} - -func (x *ServerInfo) GetStatus() Status { - if x != nil { - return x.Status - } - return Status_None -} - -func (x *ServerInfo) GetDesiredState() State { - if x != nil { - return x.DesiredState - } - return State_STOPPED -} - -func (x *ServerInfo) GetCurrentState() State { - if x != nil { - return x.CurrentState - } - return State_STOPPED -} - -func (x *ServerInfo) GetGameStatus() *GameStatus { - if x != nil { - return x.GameStatus - } - return nil -} - -var File_svctl_svctl_proto protoreflect.FileDescriptor - -var file_svctl_svctl_proto_rawDesc = []byte{ - 0x0a, 0x11, 0x73, 0x76, 0x63, 0x74, 0x6c, 0x2f, 0x73, 0x76, 0x63, 0x74, 0x6c, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x73, 0x76, 0x63, 0x74, 0x6c, 0x22, 0x44, 0x0a, 0x0a, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x22, 0x0a, 0x0c, - 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, 0x61, 0x74, 0x68, - 0x22, 0xd0, 0x01, 0x0a, 0x0a, 0x47, 0x61, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, - 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x67, 0x61, 0x6d, 0x65, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x67, 0x61, 0x6d, 0x65, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6d, - 0x61, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, - 0x61, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x70, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x61, 0x70, 0x53, 0x69, 0x7a, - 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6e, 0x75, 0x6d, 0x50, 0x6c, 0x61, 0x79, 0x65, - 0x72, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, - 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x50, 0x6c, 0x61, 0x79, - 0x65, 0x72, 0x73, 0x22, 0x85, 0x02, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x25, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x73, 0x76, 0x63, - 0x74, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x31, 0x0a, 0x0d, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0c, 0x2e, 0x73, 0x76, 0x63, 0x74, 0x6c, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x31, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0c, 0x2e, 0x73, 0x76, - 0x63, 0x74, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x32, 0x0a, 0x0b, 0x67, 0x61, 0x6d, 0x65, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x73, - 0x76, 0x63, 0x74, 0x6c, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x0a, 0x67, 0x61, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2a, 0x3e, 0x0a, 0x06, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, - 0x0e, 0x0a, 0x0a, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x45, 0x44, 0x10, 0x01, 0x12, - 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x41, 0x52, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0c, 0x0a, - 0x08, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x2a, 0x21, 0x0a, 0x05, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x32, 0x81, - 0x02, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x2f, 0x0a, 0x05, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x12, 0x11, 0x2e, 0x73, 0x76, 0x63, 0x74, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x4f, 0x70, 0x74, 0x73, 0x1a, 0x11, 0x2e, 0x73, 0x76, 0x63, 0x74, 0x6c, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x00, 0x12, 0x2e, 0x0a, 0x04, 0x53, - 0x74, 0x6f, 0x70, 0x12, 0x11, 0x2e, 0x73, 0x76, 0x63, 0x74, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x4f, 0x70, 0x74, 0x73, 0x1a, 0x11, 0x2e, 0x73, 0x76, 0x63, 0x74, 0x6c, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x00, 0x12, 0x32, 0x0a, 0x08, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x11, 0x2e, 0x73, 0x76, 0x63, 0x74, 0x6c, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x73, 0x1a, 0x11, 0x2e, 0x73, 0x76, 0x63, - 0x74, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x00, 0x12, - 0x30, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x11, 0x2e, 0x73, 0x76, 0x63, 0x74, - 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x73, 0x1a, 0x11, 0x2e, 0x73, - 0x76, 0x63, 0x74, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, - 0x00, 0x12, 0x2f, 0x0a, 0x05, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x11, 0x2e, 0x73, 0x76, 0x63, - 0x74, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x73, 0x1a, 0x11, 0x2e, - 0x73, 0x76, 0x63, 0x74, 0x6c, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, - 0x22, 0x00, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x73, 0x62, 0x6f, 0x6f, 0x6e, 0x2d, 0x67, 0x67, 0x2f, 0x73, 0x76, 0x63, 0x74, 0x6c, 0x2f, - 0x73, 0x76, 0x63, 0x74, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_svctl_svctl_proto_rawDescOnce sync.Once - file_svctl_svctl_proto_rawDescData = file_svctl_svctl_proto_rawDesc -) - -func file_svctl_svctl_proto_rawDescGZIP() []byte { - file_svctl_svctl_proto_rawDescOnce.Do(func() { - file_svctl_svctl_proto_rawDescData = protoimpl.X.CompressGZIP(file_svctl_svctl_proto_rawDescData) - }) - return file_svctl_svctl_proto_rawDescData -} - -var file_svctl_svctl_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_svctl_svctl_proto_msgTypes = make([]protoimpl.MessageInfo, 3) -var file_svctl_svctl_proto_goTypes = []interface{}{ - (Status)(0), // 0: svctl.Status - (State)(0), // 1: svctl.State - (*ServerOpts)(nil), // 2: svctl.ServerOpts - (*GameStatus)(nil), // 3: svctl.GameStatus - (*ServerInfo)(nil), // 4: svctl.ServerInfo -} -var file_svctl_svctl_proto_depIdxs = []int32{ - 0, // 0: svctl.ServerInfo.status:type_name -> svctl.Status - 1, // 1: svctl.ServerInfo.desired_state:type_name -> svctl.State - 1, // 2: svctl.ServerInfo.current_state:type_name -> svctl.State - 3, // 3: svctl.ServerInfo.game_status:type_name -> svctl.GameStatus - 2, // 4: svctl.Servers.Start:input_type -> svctl.ServerOpts - 2, // 5: svctl.Servers.Stop:input_type -> svctl.ServerOpts - 2, // 6: svctl.Servers.Register:input_type -> svctl.ServerOpts - 2, // 7: svctl.Servers.Status:input_type -> svctl.ServerOpts - 2, // 8: svctl.Servers.Reset:input_type -> svctl.ServerOpts - 4, // 9: svctl.Servers.Start:output_type -> svctl.ServerInfo - 4, // 10: svctl.Servers.Stop:output_type -> svctl.ServerInfo - 4, // 11: svctl.Servers.Register:output_type -> svctl.ServerInfo - 4, // 12: svctl.Servers.Status:output_type -> svctl.ServerInfo - 4, // 13: svctl.Servers.Reset:output_type -> svctl.ServerInfo - 9, // [9:14] is the sub-list for method output_type - 4, // [4:9] is the sub-list for method input_type - 4, // [4:4] is the sub-list for extension type_name - 4, // [4:4] is the sub-list for extension extendee - 0, // [0:4] is the sub-list for field type_name -} - -func init() { file_svctl_svctl_proto_init() } -func file_svctl_svctl_proto_init() { - if File_svctl_svctl_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_svctl_svctl_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerOpts); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_svctl_svctl_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GameStatus); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_svctl_svctl_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_svctl_svctl_proto_rawDesc, - NumEnums: 2, - NumMessages: 3, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_svctl_svctl_proto_goTypes, - DependencyIndexes: file_svctl_svctl_proto_depIdxs, - EnumInfos: file_svctl_svctl_proto_enumTypes, - MessageInfos: file_svctl_svctl_proto_msgTypes, - }.Build() - File_svctl_svctl_proto = out.File - file_svctl_svctl_proto_rawDesc = nil - file_svctl_svctl_proto_goTypes = nil - file_svctl_svctl_proto_depIdxs = nil -} diff --git a/svctl/svctl.proto b/svctl/svctl.proto deleted file mode 100644 index 1119f19..0000000 --- a/svctl/svctl.proto +++ /dev/null @@ -1,49 +0,0 @@ -syntax = "proto3"; - -option go_package = "github.com/sboon-gg/svctl/svctl"; - -package svctl; - -service Servers { - rpc Start(ServerOpts) returns (ServerInfo) {} - rpc Stop(ServerOpts) returns (ServerInfo) {} - rpc Register(ServerOpts) returns (ServerInfo) {} - rpc Status(ServerOpts) returns (ServerInfo) {} - rpc Reset(ServerOpts) returns (ServerInfo) {} -} - -message ServerOpts { - string path = 1; - string settingsPath = 2; -} - -enum Status { - None = 0; - REGISTERED = 1; - STARTING = 2; - STOPPING = 3; -} - -enum State { - STOPPED = 0; - RUNNING = 1; -} - -message GameStatus { - string hostname = 1; - string port = 2; - string gamemode = 3; - string map_name = 4; - int64 map_size = 5; - int64 num_players = 6; - int64 max_players = 7; -} - -message ServerInfo { - string path = 1; - string settingsPath = 2; - Status status = 3; - State desired_state = 4; - State current_state = 5; - GameStatus game_status = 6; -} diff --git a/svctl/v1/svctl.pb.go b/svctl/v1/svctl.pb.go new file mode 100644 index 0000000..f740921 --- /dev/null +++ b/svctl/v1/svctl.pb.go @@ -0,0 +1,771 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.32.0 +// protoc v6.33.1 +// source: svctl/v1/svctl.proto + +package svctl + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type ServerType int32 + +const ( + ServerType_SERVER_TYPE_UNSPECIFIED ServerType = 0 + ServerType_SERVER_TYPE_LOCAL ServerType = 1 + ServerType_SERVER_TYPE_DOCKER ServerType = 2 + ServerType_SERVER_TYPE_SYSTEMD ServerType = 3 +) + +// Enum value maps for ServerType. +var ( + ServerType_name = map[int32]string{ + 0: "SERVER_TYPE_UNSPECIFIED", + 1: "SERVER_TYPE_LOCAL", + 2: "SERVER_TYPE_DOCKER", + 3: "SERVER_TYPE_SYSTEMD", + } + ServerType_value = map[string]int32{ + "SERVER_TYPE_UNSPECIFIED": 0, + "SERVER_TYPE_LOCAL": 1, + "SERVER_TYPE_DOCKER": 2, + "SERVER_TYPE_SYSTEMD": 3, + } +) + +func (x ServerType) Enum() *ServerType { + p := new(ServerType) + *p = x + return p +} + +func (x ServerType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ServerType) Descriptor() protoreflect.EnumDescriptor { + return file_svctl_v1_svctl_proto_enumTypes[0].Descriptor() +} + +func (ServerType) Type() protoreflect.EnumType { + return &file_svctl_v1_svctl_proto_enumTypes[0] +} + +func (x ServerType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ServerType.Descriptor instead. +func (ServerType) EnumDescriptor() ([]byte, []int) { + return file_svctl_v1_svctl_proto_rawDescGZIP(), []int{0} +} + +type Status int32 + +const ( + Status_STATUS_UNSPECIFIED Status = 0 + Status_STATUS_REGISTERED Status = 1 + Status_STATUS_STARTING Status = 2 + Status_STATUS_STOPPING Status = 3 +) + +// Enum value maps for Status. +var ( + Status_name = map[int32]string{ + 0: "STATUS_UNSPECIFIED", + 1: "STATUS_REGISTERED", + 2: "STATUS_STARTING", + 3: "STATUS_STOPPING", + } + Status_value = map[string]int32{ + "STATUS_UNSPECIFIED": 0, + "STATUS_REGISTERED": 1, + "STATUS_STARTING": 2, + "STATUS_STOPPING": 3, + } +) + +func (x Status) Enum() *Status { + p := new(Status) + *p = x + return p +} + +func (x Status) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Status) Descriptor() protoreflect.EnumDescriptor { + return file_svctl_v1_svctl_proto_enumTypes[1].Descriptor() +} + +func (Status) Type() protoreflect.EnumType { + return &file_svctl_v1_svctl_proto_enumTypes[1] +} + +func (x Status) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Status.Descriptor instead. +func (Status) EnumDescriptor() ([]byte, []int) { + return file_svctl_v1_svctl_proto_rawDescGZIP(), []int{1} +} + +type State int32 + +const ( + State_STATE_UNSPECIFIED State = 0 + State_STATE_STOPPED State = 1 + State_STATE_RUNNING State = 2 +) + +// Enum value maps for State. +var ( + State_name = map[int32]string{ + 0: "STATE_UNSPECIFIED", + 1: "STATE_STOPPED", + 2: "STATE_RUNNING", + } + State_value = map[string]int32{ + "STATE_UNSPECIFIED": 0, + "STATE_STOPPED": 1, + "STATE_RUNNING": 2, + } +) + +func (x State) Enum() *State { + p := new(State) + *p = x + return p +} + +func (x State) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (State) Descriptor() protoreflect.EnumDescriptor { + return file_svctl_v1_svctl_proto_enumTypes[2].Descriptor() +} + +func (State) Type() protoreflect.EnumType { + return &file_svctl_v1_svctl_proto_enumTypes[2] +} + +func (x State) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use State.Descriptor instead. +func (State) EnumDescriptor() ([]byte, []int) { + return file_svctl_v1_svctl_proto_rawDescGZIP(), []int{2} +} + +type ServerOpts struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *ServerOpts) Reset() { + *x = ServerOpts{} + if protoimpl.UnsafeEnabled { + mi := &file_svctl_v1_svctl_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ServerOpts) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ServerOpts) ProtoMessage() {} + +func (x *ServerOpts) ProtoReflect() protoreflect.Message { + mi := &file_svctl_v1_svctl_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ServerOpts.ProtoReflect.Descriptor instead. +func (*ServerOpts) Descriptor() ([]byte, []int) { + return file_svctl_v1_svctl_proto_rawDescGZIP(), []int{0} +} + +func (x *ServerOpts) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +type RegisterServerOpts struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Location string `protobuf:"bytes,2,opt,name=location,proto3" json:"location,omitempty"` + SettingsPath string `protobuf:"bytes,3,opt,name=settings_path,json=settingsPath,proto3" json:"settings_path,omitempty"` + Type ServerType `protobuf:"varint,4,opt,name=type,proto3,enum=svctl.v1.ServerType" json:"type,omitempty"` +} + +func (x *RegisterServerOpts) Reset() { + *x = RegisterServerOpts{} + if protoimpl.UnsafeEnabled { + mi := &file_svctl_v1_svctl_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RegisterServerOpts) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RegisterServerOpts) ProtoMessage() {} + +func (x *RegisterServerOpts) ProtoReflect() protoreflect.Message { + mi := &file_svctl_v1_svctl_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RegisterServerOpts.ProtoReflect.Descriptor instead. +func (*RegisterServerOpts) Descriptor() ([]byte, []int) { + return file_svctl_v1_svctl_proto_rawDescGZIP(), []int{1} +} + +func (x *RegisterServerOpts) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *RegisterServerOpts) GetLocation() string { + if x != nil { + return x.Location + } + return "" +} + +func (x *RegisterServerOpts) GetSettingsPath() string { + if x != nil { + return x.SettingsPath + } + return "" +} + +func (x *RegisterServerOpts) GetType() ServerType { + if x != nil { + return x.Type + } + return ServerType_SERVER_TYPE_UNSPECIFIED +} + +type RenderOpts struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + ReloadableOnly bool `protobuf:"varint,2,opt,name=reloadable_only,json=reloadableOnly,proto3" json:"reloadable_only,omitempty"` +} + +func (x *RenderOpts) Reset() { + *x = RenderOpts{} + if protoimpl.UnsafeEnabled { + mi := &file_svctl_v1_svctl_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RenderOpts) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RenderOpts) ProtoMessage() {} + +func (x *RenderOpts) ProtoReflect() protoreflect.Message { + mi := &file_svctl_v1_svctl_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RenderOpts.ProtoReflect.Descriptor instead. +func (*RenderOpts) Descriptor() ([]byte, []int) { + return file_svctl_v1_svctl_proto_rawDescGZIP(), []int{2} +} + +func (x *RenderOpts) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *RenderOpts) GetReloadableOnly() bool { + if x != nil { + return x.ReloadableOnly + } + return false +} + +type GameStatus struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Hostname string `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"` + Port string `protobuf:"bytes,2,opt,name=port,proto3" json:"port,omitempty"` + Gamemode string `protobuf:"bytes,3,opt,name=gamemode,proto3" json:"gamemode,omitempty"` + MapName string `protobuf:"bytes,4,opt,name=map_name,json=mapName,proto3" json:"map_name,omitempty"` + MapSize int64 `protobuf:"varint,5,opt,name=map_size,json=mapSize,proto3" json:"map_size,omitempty"` + NumPlayers int64 `protobuf:"varint,6,opt,name=num_players,json=numPlayers,proto3" json:"num_players,omitempty"` + MaxPlayers int64 `protobuf:"varint,7,opt,name=max_players,json=maxPlayers,proto3" json:"max_players,omitempty"` +} + +func (x *GameStatus) Reset() { + *x = GameStatus{} + if protoimpl.UnsafeEnabled { + mi := &file_svctl_v1_svctl_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameStatus) ProtoMessage() {} + +func (x *GameStatus) ProtoReflect() protoreflect.Message { + mi := &file_svctl_v1_svctl_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GameStatus.ProtoReflect.Descriptor instead. +func (*GameStatus) Descriptor() ([]byte, []int) { + return file_svctl_v1_svctl_proto_rawDescGZIP(), []int{3} +} + +func (x *GameStatus) GetHostname() string { + if x != nil { + return x.Hostname + } + return "" +} + +func (x *GameStatus) GetPort() string { + if x != nil { + return x.Port + } + return "" +} + +func (x *GameStatus) GetGamemode() string { + if x != nil { + return x.Gamemode + } + return "" +} + +func (x *GameStatus) GetMapName() string { + if x != nil { + return x.MapName + } + return "" +} + +func (x *GameStatus) GetMapSize() int64 { + if x != nil { + return x.MapSize + } + return 0 +} + +func (x *GameStatus) GetNumPlayers() int64 { + if x != nil { + return x.NumPlayers + } + return 0 +} + +func (x *GameStatus) GetMaxPlayers() int64 { + if x != nil { + return x.MaxPlayers + } + return 0 +} + +type ServerInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Location string `protobuf:"bytes,2,opt,name=location,proto3" json:"location,omitempty"` + SettingsPath string `protobuf:"bytes,3,opt,name=settings_path,json=settingsPath,proto3" json:"settings_path,omitempty"` + Status Status `protobuf:"varint,4,opt,name=status,proto3,enum=svctl.v1.Status" json:"status,omitempty"` + DesiredState State `protobuf:"varint,5,opt,name=desired_state,json=desiredState,proto3,enum=svctl.v1.State" json:"desired_state,omitempty"` + CurrentState State `protobuf:"varint,6,opt,name=current_state,json=currentState,proto3,enum=svctl.v1.State" json:"current_state,omitempty"` + GameStatus *GameStatus `protobuf:"bytes,7,opt,name=game_status,json=gameStatus,proto3" json:"game_status,omitempty"` +} + +func (x *ServerInfo) Reset() { + *x = ServerInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_svctl_v1_svctl_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ServerInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ServerInfo) ProtoMessage() {} + +func (x *ServerInfo) ProtoReflect() protoreflect.Message { + mi := &file_svctl_v1_svctl_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ServerInfo.ProtoReflect.Descriptor instead. +func (*ServerInfo) Descriptor() ([]byte, []int) { + return file_svctl_v1_svctl_proto_rawDescGZIP(), []int{4} +} + +func (x *ServerInfo) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *ServerInfo) GetLocation() string { + if x != nil { + return x.Location + } + return "" +} + +func (x *ServerInfo) GetSettingsPath() string { + if x != nil { + return x.SettingsPath + } + return "" +} + +func (x *ServerInfo) GetStatus() Status { + if x != nil { + return x.Status + } + return Status_STATUS_UNSPECIFIED +} + +func (x *ServerInfo) GetDesiredState() State { + if x != nil { + return x.DesiredState + } + return State_STATE_UNSPECIFIED +} + +func (x *ServerInfo) GetCurrentState() State { + if x != nil { + return x.CurrentState + } + return State_STATE_UNSPECIFIED +} + +func (x *ServerInfo) GetGameStatus() *GameStatus { + if x != nil { + return x.GameStatus + } + return nil +} + +var File_svctl_v1_svctl_proto protoreflect.FileDescriptor + +var file_svctl_v1_svctl_proto_rawDesc = []byte{ + 0x0a, 0x14, 0x73, 0x76, 0x63, 0x74, 0x6c, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x76, 0x63, 0x74, 0x6c, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x73, 0x76, 0x63, 0x74, 0x6c, 0x2e, 0x76, 0x31, + 0x22, 0x1c, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x73, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x8f, + 0x01, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x4f, 0x70, 0x74, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x28, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x73, 0x76, 0x63, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x45, 0x0a, 0x0a, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x73, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x27, + 0x0a, 0x0f, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x61, + 0x62, 0x6c, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0xd0, 0x01, 0x0a, 0x0a, 0x47, 0x61, 0x6d, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x67, 0x61, 0x6d, 0x65, 0x6d, 0x6f, + 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x67, 0x61, 0x6d, 0x65, 0x6d, 0x6f, + 0x64, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, + 0x08, 0x6d, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x07, 0x6d, 0x61, 0x70, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x75, 0x6d, 0x5f, + 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6e, + 0x75, 0x6d, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, + 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, + 0x6d, 0x61, 0x78, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x22, 0xaa, 0x02, 0x0a, 0x0a, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x28, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x73, 0x76, 0x63, + 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x34, 0x0a, 0x0d, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x73, 0x76, + 0x63, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x64, 0x65, + 0x73, 0x69, 0x72, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x0d, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x0f, 0x2e, 0x73, 0x76, 0x63, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x35, 0x0a, 0x0b, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x73, 0x76, 0x63, 0x74, 0x6c, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0a, 0x67, 0x61, 0x6d, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2a, 0x71, 0x0a, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x45, 0x52, + 0x56, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x43, 0x4b, 0x45, 0x52, 0x10, + 0x02, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x44, 0x10, 0x03, 0x2a, 0x61, 0x0a, 0x06, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, 0x45, 0x52, 0x45, + 0x44, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x54, + 0x41, 0x52, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x2a, 0x44, 0x0a, + 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x11, 0x0a, + 0x0d, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x01, + 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, + 0x47, 0x10, 0x02, 0x32, 0xdf, 0x02, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, + 0x35, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x2e, 0x73, 0x76, 0x63, 0x74, 0x6c, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x73, 0x1a, 0x14, + 0x2e, 0x73, 0x76, 0x63, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x00, 0x12, 0x34, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x14, + 0x2e, 0x73, 0x76, 0x63, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x4f, 0x70, 0x74, 0x73, 0x1a, 0x14, 0x2e, 0x73, 0x76, 0x63, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x08, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x73, 0x76, 0x63, 0x74, 0x6c, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x4f, 0x70, 0x74, 0x73, 0x1a, 0x14, 0x2e, 0x73, 0x76, 0x63, 0x74, 0x6c, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x00, 0x12, 0x36, + 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x2e, 0x73, 0x76, 0x63, 0x74, 0x6c, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x73, 0x1a, 0x14, + 0x2e, 0x73, 0x76, 0x63, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x05, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, + 0x14, 0x2e, 0x73, 0x76, 0x63, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x4f, 0x70, 0x74, 0x73, 0x1a, 0x14, 0x2e, 0x73, 0x76, 0x63, 0x74, 0x6c, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x00, 0x12, 0x36, 0x0a, + 0x06, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x12, 0x14, 0x2e, 0x73, 0x76, 0x63, 0x74, 0x6c, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x73, 0x1a, 0x14, 0x2e, + 0x73, 0x76, 0x63, 0x74, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, + 0x6e, 0x66, 0x6f, 0x22, 0x00, 0x42, 0x21, 0x5a, 0x1f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x62, 0x6f, 0x6f, 0x6e, 0x2d, 0x67, 0x67, 0x2f, 0x73, 0x76, 0x63, + 0x74, 0x6c, 0x2f, 0x73, 0x76, 0x63, 0x74, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_svctl_v1_svctl_proto_rawDescOnce sync.Once + file_svctl_v1_svctl_proto_rawDescData = file_svctl_v1_svctl_proto_rawDesc +) + +func file_svctl_v1_svctl_proto_rawDescGZIP() []byte { + file_svctl_v1_svctl_proto_rawDescOnce.Do(func() { + file_svctl_v1_svctl_proto_rawDescData = protoimpl.X.CompressGZIP(file_svctl_v1_svctl_proto_rawDescData) + }) + return file_svctl_v1_svctl_proto_rawDescData +} + +var file_svctl_v1_svctl_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_svctl_v1_svctl_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_svctl_v1_svctl_proto_goTypes = []interface{}{ + (ServerType)(0), // 0: svctl.v1.ServerType + (Status)(0), // 1: svctl.v1.Status + (State)(0), // 2: svctl.v1.State + (*ServerOpts)(nil), // 3: svctl.v1.ServerOpts + (*RegisterServerOpts)(nil), // 4: svctl.v1.RegisterServerOpts + (*RenderOpts)(nil), // 5: svctl.v1.RenderOpts + (*GameStatus)(nil), // 6: svctl.v1.GameStatus + (*ServerInfo)(nil), // 7: svctl.v1.ServerInfo +} +var file_svctl_v1_svctl_proto_depIdxs = []int32{ + 0, // 0: svctl.v1.RegisterServerOpts.type:type_name -> svctl.v1.ServerType + 1, // 1: svctl.v1.ServerInfo.status:type_name -> svctl.v1.Status + 2, // 2: svctl.v1.ServerInfo.desired_state:type_name -> svctl.v1.State + 2, // 3: svctl.v1.ServerInfo.current_state:type_name -> svctl.v1.State + 6, // 4: svctl.v1.ServerInfo.game_status:type_name -> svctl.v1.GameStatus + 3, // 5: svctl.v1.Servers.Start:input_type -> svctl.v1.ServerOpts + 3, // 6: svctl.v1.Servers.Stop:input_type -> svctl.v1.ServerOpts + 4, // 7: svctl.v1.Servers.Register:input_type -> svctl.v1.RegisterServerOpts + 3, // 8: svctl.v1.Servers.Status:input_type -> svctl.v1.ServerOpts + 3, // 9: svctl.v1.Servers.Reset:input_type -> svctl.v1.ServerOpts + 5, // 10: svctl.v1.Servers.Render:input_type -> svctl.v1.RenderOpts + 7, // 11: svctl.v1.Servers.Start:output_type -> svctl.v1.ServerInfo + 7, // 12: svctl.v1.Servers.Stop:output_type -> svctl.v1.ServerInfo + 7, // 13: svctl.v1.Servers.Register:output_type -> svctl.v1.ServerInfo + 7, // 14: svctl.v1.Servers.Status:output_type -> svctl.v1.ServerInfo + 7, // 15: svctl.v1.Servers.Reset:output_type -> svctl.v1.ServerInfo + 7, // 16: svctl.v1.Servers.Render:output_type -> svctl.v1.ServerInfo + 11, // [11:17] is the sub-list for method output_type + 5, // [5:11] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name +} + +func init() { file_svctl_v1_svctl_proto_init() } +func file_svctl_v1_svctl_proto_init() { + if File_svctl_v1_svctl_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_svctl_v1_svctl_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ServerOpts); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_svctl_v1_svctl_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RegisterServerOpts); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_svctl_v1_svctl_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RenderOpts); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_svctl_v1_svctl_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GameStatus); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_svctl_v1_svctl_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ServerInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_svctl_v1_svctl_proto_rawDesc, + NumEnums: 3, + NumMessages: 5, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_svctl_v1_svctl_proto_goTypes, + DependencyIndexes: file_svctl_v1_svctl_proto_depIdxs, + EnumInfos: file_svctl_v1_svctl_proto_enumTypes, + MessageInfos: file_svctl_v1_svctl_proto_msgTypes, + }.Build() + File_svctl_v1_svctl_proto = out.File + file_svctl_v1_svctl_proto_rawDesc = nil + file_svctl_v1_svctl_proto_goTypes = nil + file_svctl_v1_svctl_proto_depIdxs = nil +} diff --git a/svctl/v1/svctl.proto b/svctl/v1/svctl.proto new file mode 100644 index 0000000..86d7063 --- /dev/null +++ b/svctl/v1/svctl.proto @@ -0,0 +1,68 @@ +syntax = "proto3"; + +package svctl.v1; + +option go_package = "github.com/sboon-gg/svctl/svctl"; + +service Servers { + rpc Start(ServerOpts) returns (ServerInfo) {} + rpc Stop(ServerOpts) returns (ServerInfo) {} + rpc Register(RegisterServerOpts) returns (ServerInfo) {} + rpc Status(ServerOpts) returns (ServerInfo) {} + rpc Reset(ServerOpts) returns (ServerInfo) {} + rpc Render(RenderOpts) returns (ServerInfo) {} +} + +message ServerOpts { string id = 1; } + +enum ServerType { + SERVER_TYPE_UNSPECIFIED = 0; + SERVER_TYPE_LOCAL = 1; + SERVER_TYPE_DOCKER = 2; + SERVER_TYPE_SYSTEMD = 3; +} + +message RegisterServerOpts { + string id = 1; + string location = 2; + string settings_path = 3; + ServerType type = 4; +} + +message RenderOpts { + string id = 1; + bool reloadable_only = 2; +} + +enum Status { + STATUS_UNSPECIFIED = 0; + STATUS_REGISTERED = 1; + STATUS_STARTING = 2; + STATUS_STOPPING = 3; +} + +enum State { + STATE_UNSPECIFIED = 0; + STATE_STOPPED = 1; + STATE_RUNNING = 2; +} + +message GameStatus { + string hostname = 1; + string port = 2; + string gamemode = 3; + string map_name = 4; + int64 map_size = 5; + int64 num_players = 6; + int64 max_players = 7; +} + +message ServerInfo { + string id = 1; + string location = 2; + string settings_path = 3; + Status status = 4; + State desired_state = 5; + State current_state = 6; + GameStatus game_status = 7; +} diff --git a/svctl/svctl_grpc.pb.go b/svctl/v1/svctl_grpc.pb.go similarity index 77% rename from svctl/svctl_grpc.pb.go rename to svctl/v1/svctl_grpc.pb.go index 95c77e9..182a611 100644 --- a/svctl/svctl_grpc.pb.go +++ b/svctl/v1/svctl_grpc.pb.go @@ -1,8 +1,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v5.29.2 -// source: svctl/svctl.proto +// - protoc v6.33.1 +// source: svctl/v1/svctl.proto package svctl @@ -19,11 +19,12 @@ import ( const _ = grpc.SupportPackageIsVersion7 const ( - Servers_Start_FullMethodName = "/svctl.Servers/Start" - Servers_Stop_FullMethodName = "/svctl.Servers/Stop" - Servers_Register_FullMethodName = "/svctl.Servers/Register" - Servers_Status_FullMethodName = "/svctl.Servers/Status" - Servers_Reset_FullMethodName = "/svctl.Servers/Reset" + Servers_Start_FullMethodName = "/svctl.v1.Servers/Start" + Servers_Stop_FullMethodName = "/svctl.v1.Servers/Stop" + Servers_Register_FullMethodName = "/svctl.v1.Servers/Register" + Servers_Status_FullMethodName = "/svctl.v1.Servers/Status" + Servers_Reset_FullMethodName = "/svctl.v1.Servers/Reset" + Servers_Render_FullMethodName = "/svctl.v1.Servers/Render" ) // ServersClient is the client API for Servers service. @@ -32,9 +33,10 @@ const ( type ServersClient interface { Start(ctx context.Context, in *ServerOpts, opts ...grpc.CallOption) (*ServerInfo, error) Stop(ctx context.Context, in *ServerOpts, opts ...grpc.CallOption) (*ServerInfo, error) - Register(ctx context.Context, in *ServerOpts, opts ...grpc.CallOption) (*ServerInfo, error) + Register(ctx context.Context, in *RegisterServerOpts, opts ...grpc.CallOption) (*ServerInfo, error) Status(ctx context.Context, in *ServerOpts, opts ...grpc.CallOption) (*ServerInfo, error) Reset(ctx context.Context, in *ServerOpts, opts ...grpc.CallOption) (*ServerInfo, error) + Render(ctx context.Context, in *RenderOpts, opts ...grpc.CallOption) (*ServerInfo, error) } type serversClient struct { @@ -63,7 +65,7 @@ func (c *serversClient) Stop(ctx context.Context, in *ServerOpts, opts ...grpc.C return out, nil } -func (c *serversClient) Register(ctx context.Context, in *ServerOpts, opts ...grpc.CallOption) (*ServerInfo, error) { +func (c *serversClient) Register(ctx context.Context, in *RegisterServerOpts, opts ...grpc.CallOption) (*ServerInfo, error) { out := new(ServerInfo) err := c.cc.Invoke(ctx, Servers_Register_FullMethodName, in, out, opts...) if err != nil { @@ -90,15 +92,25 @@ func (c *serversClient) Reset(ctx context.Context, in *ServerOpts, opts ...grpc. return out, nil } +func (c *serversClient) Render(ctx context.Context, in *RenderOpts, opts ...grpc.CallOption) (*ServerInfo, error) { + out := new(ServerInfo) + err := c.cc.Invoke(ctx, Servers_Render_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ServersServer is the server API for Servers service. // All implementations must embed UnimplementedServersServer // for forward compatibility type ServersServer interface { Start(context.Context, *ServerOpts) (*ServerInfo, error) Stop(context.Context, *ServerOpts) (*ServerInfo, error) - Register(context.Context, *ServerOpts) (*ServerInfo, error) + Register(context.Context, *RegisterServerOpts) (*ServerInfo, error) Status(context.Context, *ServerOpts) (*ServerInfo, error) Reset(context.Context, *ServerOpts) (*ServerInfo, error) + Render(context.Context, *RenderOpts) (*ServerInfo, error) mustEmbedUnimplementedServersServer() } @@ -112,7 +124,7 @@ func (UnimplementedServersServer) Start(context.Context, *ServerOpts) (*ServerIn func (UnimplementedServersServer) Stop(context.Context, *ServerOpts) (*ServerInfo, error) { return nil, status.Errorf(codes.Unimplemented, "method Stop not implemented") } -func (UnimplementedServersServer) Register(context.Context, *ServerOpts) (*ServerInfo, error) { +func (UnimplementedServersServer) Register(context.Context, *RegisterServerOpts) (*ServerInfo, error) { return nil, status.Errorf(codes.Unimplemented, "method Register not implemented") } func (UnimplementedServersServer) Status(context.Context, *ServerOpts) (*ServerInfo, error) { @@ -121,6 +133,9 @@ func (UnimplementedServersServer) Status(context.Context, *ServerOpts) (*ServerI func (UnimplementedServersServer) Reset(context.Context, *ServerOpts) (*ServerInfo, error) { return nil, status.Errorf(codes.Unimplemented, "method Reset not implemented") } +func (UnimplementedServersServer) Render(context.Context, *RenderOpts) (*ServerInfo, error) { + return nil, status.Errorf(codes.Unimplemented, "method Render not implemented") +} func (UnimplementedServersServer) mustEmbedUnimplementedServersServer() {} // UnsafeServersServer may be embedded to opt out of forward compatibility for this service. @@ -171,7 +186,7 @@ func _Servers_Stop_Handler(srv interface{}, ctx context.Context, dec func(interf } func _Servers_Register_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ServerOpts) + in := new(RegisterServerOpts) if err := dec(in); err != nil { return nil, err } @@ -183,7 +198,7 @@ func _Servers_Register_Handler(srv interface{}, ctx context.Context, dec func(in FullMethod: Servers_Register_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ServersServer).Register(ctx, req.(*ServerOpts)) + return srv.(ServersServer).Register(ctx, req.(*RegisterServerOpts)) } return interceptor(ctx, in, info, handler) } @@ -224,11 +239,29 @@ func _Servers_Reset_Handler(srv interface{}, ctx context.Context, dec func(inter return interceptor(ctx, in, info, handler) } +func _Servers_Render_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RenderOpts) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ServersServer).Render(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Servers_Render_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ServersServer).Render(ctx, req.(*RenderOpts)) + } + return interceptor(ctx, in, info, handler) +} + // Servers_ServiceDesc is the grpc.ServiceDesc for Servers service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) var Servers_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "svctl.Servers", + ServiceName: "svctl.v1.Servers", HandlerType: (*ServersServer)(nil), Methods: []grpc.MethodDesc{ { @@ -251,7 +284,11 @@ var Servers_ServiceDesc = grpc.ServiceDesc{ MethodName: "Reset", Handler: _Servers_Reset_Handler, }, + { + MethodName: "Render", + Handler: _Servers_Render_Handler, + }, }, Streams: []grpc.StreamDesc{}, - Metadata: "svctl/svctl.proto", + Metadata: "svctl/v1/svctl.proto", } diff --git a/tools/tools.go b/tools/tools.go deleted file mode 100644 index f6d0a8c..0000000 --- a/tools/tools.go +++ /dev/null @@ -1,8 +0,0 @@ -//go:build tools -// +build tools - -package tools - -import ( - _ "github.com/golangci/golangci-lint/cmd/golangci-lint" -)