diff --git a/access/email/app.go b/access/email/app.go index 74c045dbd..77b6a0b05 100644 --- a/access/email/app.go +++ b/access/email/app.go @@ -24,12 +24,9 @@ import ( "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/integrations/lib" - "github.com/gravitational/teleport/integrations/lib/credentials" "github.com/gravitational/teleport/integrations/lib/logger" "github.com/gravitational/teleport/integrations/lib/watcherjob" "github.com/gravitational/trace" - "google.golang.org/grpc" - grpcbackoff "google.golang.org/grpc/backoff" ) const ( @@ -37,8 +34,6 @@ const ( minServerVersion = "6.1.0-beta.1" // pluginName is used to tag PluginData and as a Delegator in Audit log. pluginName = "email" - // backoffMaxDelay is a maximum time GRPC client waits before reconnection attempt. - grpcBackoffMaxDelay = time.Second * 2 // initTimeout is used to bound execution time of health check and teleport version check. initTimeout = time.Second * 10 // handlerTimeout is used to bound the execution time of watcher event handler. @@ -127,44 +122,18 @@ func (a *App) run(ctx context.Context) error { func (a *App) init(ctx context.Context) error { ctx, cancel := context.WithTimeout(ctx, initTimeout) defer cancel() - log := logger.Get(ctx) - if validCred, err := credentials.CheckIfExpired(a.conf.Teleport.Credentials()); err != nil { - log.Warn(err) - if !validCred { - return trace.BadParameter( - "No valid credentials found, this likely means credentials are expired. In this case, please sign new credentials and increase their TTL if needed.", - ) - } - log.Info("At least one non-expired credential has been found, continuing startup") - } - - var ( - err error - webProxyAddr string - pong proto.PingResponse - ) - - bk := grpcbackoff.DefaultConfig - bk.MaxDelay = grpcBackoffMaxDelay - if a.apiClient, err = client.New(ctx, client.Config{ - Addrs: a.conf.Teleport.GetAddrs(), - Credentials: a.conf.Teleport.Credentials(), - DialOpts: []grpc.DialOption{ - grpc.WithConnectParams(grpc.ConnectParams{Backoff: bk, MinConnectTimeout: initTimeout}), - grpc.WithDefaultCallOptions( - grpc.WaitForReady(true), - ), - grpc.WithReturnConnectionError(), - }, - }); err != nil { + var err error + if a.apiClient, err = a.conf.Teleport.NewClient(ctx); err != nil { return trace.Wrap(err) } - if pong, err = a.checkTeleportVersion(ctx); err != nil { + pong, err := a.checkTeleportVersion(ctx) + if err != nil { return trace.Wrap(err) } + var webProxyAddr string if pong.ServerFeatures.AdvancedAccessWorkflows { webProxyAddr = pong.ProxyPublicAddr } diff --git a/access/msteams/app.go b/access/msteams/app.go index bae3db5c1..b6c835024 100644 --- a/access/msteams/app.go +++ b/access/msteams/app.go @@ -22,14 +22,11 @@ import ( "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/integrations/lib" - "github.com/gravitational/teleport/integrations/lib/credentials" "github.com/gravitational/teleport/integrations/lib/logger" pd "github.com/gravitational/teleport/integrations/lib/plugindata" "github.com/gravitational/teleport/integrations/lib/stringset" "github.com/gravitational/teleport/integrations/lib/watcherjob" "github.com/gravitational/trace" - "google.golang.org/grpc" - grpcbackoff "google.golang.org/grpc/backoff" ) const ( @@ -37,10 +34,8 @@ const ( pluginName = "msteams" // minServerVersion is the minimal teleport version the plugin supports. minServerVersion = "8.0.0" - // grpcBackoffMaxDelay is a maximum time GRPC client waits before reconnection attempt. - grpcBackoffMaxDelay = time.Second * 2 - // minConnectTimeout GRPC connect timeout. - minConnectTimeout = time.Second * 10 + // initTimeout is used to bound execution time of health check and teleport version check. + initTimeout = time.Second * 10 // handlerTimeout is used to bound the execution time of watcher event handler. handlerTimeout = time.Second * 5 ) @@ -106,36 +101,10 @@ func (a *App) WaitReady(ctx context.Context) (bool, error) { // init initializes the application func (a *App) init(ctx context.Context) error { - log := logger.Get(ctx) - if validCred, err := credentials.CheckIfExpired(a.conf.Teleport.Credentials()); err != nil { - log.Warn(err) - if !validCred { - return trace.BadParameter( - "No valid credentials found, this likely means credentials are expired. In this case, please sign new credentials and increase their TTL if needed.", - ) - } - log.Info("At least one non-expired credential has been found, continuing startup") - } + ctx, cancel := context.WithTimeout(ctx, initTimeout) + defer cancel() - bk := grpcbackoff.DefaultConfig - bk.MaxDelay = grpcBackoffMaxDelay - - apiClient, err := client.New(ctx, client.Config{ - Addrs: a.conf.Teleport.GetAddrs(), - Credentials: a.conf.Teleport.Credentials(), - DialOpts: []grpc.DialOption{ - grpc.WithReturnConnectionError(), - grpc.WithDefaultCallOptions( - grpc.WaitForReady(true), - ), - grpc.WithConnectParams( - grpc.ConnectParams{ - Backoff: bk, - MinConnectTimeout: minConnectTimeout, - }, - ), - }, - }) + apiClient, err := a.conf.Teleport.NewClient(ctx) if err != nil { return trace.Wrap(err) } diff --git a/event-handler/README.md b/event-handler/README.md index 3f8b3a541..ca169a838 100644 --- a/event-handler/README.md +++ b/event-handler/README.md @@ -213,7 +213,7 @@ storage = "./storage" # Plugin will save it's state here timeout = "10s" batch = 20 -[fluentd] +[forward.fluentd] cert = "client.crt" key = "client.key" ca = "ca.crt" @@ -278,26 +278,28 @@ Note that start time can be set only once, on the first run of the tool. If you You may specify configuration options via command line arguments, environment variables or TOML file. -| CLI arg name | Description | Env var name | -| --------------------|-----------------------------------------------------|---------------------------| -| teleport-addr | Teleport host and port | FDFWD_TELEPORT_ADDR | -| teleport-ca | Teleport TLS CA file | FDFWD_TELEPORT_CA | -| teleport-cert | Teleport TLS certificate file | FDWRD_TELEPORT_CERT | -| teleport-key | Teleport TLS key file | FDFWD_TELEPORT_KEY | -| teleport-identity | Teleport identity file | FDFWD_TELEPORT_IDENTITY | -| fluentd-url | Fluentd URL | FDFWD_FLUENTD_URL | -| fluentd-session-url | Fluentd session URL | FDFWD_FLUENTD_SESSION_URL | -| fluentd-ca | fluentd TLS CA file | FDFWD_FLUENTD_CA | -| fluentd-cert | Fluentd TLS certificate file | FDFWD_FLUENTD_CERT | -| fluentd-key | Fluentd TLS key file | FDFWD_FLUENTD_KEY | -| storage | Storage directory | FDFWD_STORAGE | -| batch | Fetch batch size | FDFWD_BATCH | -| types | Comma-separated list of event types to forward | FDFWD_TYPES | -| skip-session-types | Comma-separated list of session event types to skip | FDFWD_SKIP_SESSION_TYPES | -| start-time | Minimum event time (RFC3339 format) | FDFWD_START_TIME | -| timeout | Polling timeout | FDFWD_TIMEOUT | -| cursor | Start cursor value | FDFWD_CURSOR | -| debug | Debug logging | FDFWD_DEBUG | +| CLI arg name | Description | Env var name | +|---------------------------|-------------------------------------------------------------------------------------------------------|---------------------------------| +| teleport-addr | Teleport host and port | FDFWD_TELEPORT_ADDR | +| teleport-ca | Teleport TLS CA file | FDFWD_TELEPORT_CA | +| teleport-cert | Teleport TLS certificate file | FDWRD_TELEPORT_CERT | +| teleport-key | Teleport TLS key file | FDFWD_TELEPORT_KEY | +| teleport-identity | Teleport identity file | FDFWD_TELEPORT_IDENTITY | +| teleport-refresh-enabled | Controls if the identity file should be reloaded from disk after the initial start on interval. | FDFWD_TELEPORT_REFRESH_ENABLED | +| teleport-refresh-interval | How often to load the identity file from disk when teleport-refresh-enabled is specified. Default: 1m | FDFWD_TELEPORT_REFRESH_INTERVAL | +| fluentd-url | Fluentd URL | FDFWD_FLUENTD_URL | +| fluentd-session-url | Fluentd session URL | FDFWD_FLUENTD_SESSION_URL | +| fluentd-ca | fluentd TLS CA file | FDFWD_FLUENTD_CA | +| fluentd-cert | Fluentd TLS certificate file | FDFWD_FLUENTD_CERT | +| fluentd-key | Fluentd TLS key file | FDFWD_FLUENTD_KEY | +| storage | Storage directory | FDFWD_STORAGE | +| batch | Fetch batch size | FDFWD_BATCH | +| types | Comma-separated list of event types to forward | FDFWD_TYPES | +| skip-session-types | Comma-separated list of session event types to skip | FDFWD_SKIP_SESSION_TYPES | +| start-time | Minimum event time (RFC3339 format) | FDFWD_START_TIME | +| timeout | Polling timeout | FDFWD_TIMEOUT | +| cursor | Start cursor value | FDFWD_CURSOR | +| debug | Debug logging | FDFWD_DEBUG | TOML configuration keys are the same as CLI args. Teleport and Fluentd variables can be grouped into sections. See [example TOML](example/config.toml). You can specify TOML file location using `--config` CLI flag. diff --git a/event-handler/cli.go b/event-handler/cli.go index 3fa48a9bf..2ee3871b8 100644 --- a/event-handler/cli.go +++ b/event-handler/cli.go @@ -55,6 +55,14 @@ type TeleportConfig struct { // TeleportIdentityFile is a path to Teleport identity file TeleportIdentityFile string `help:"Teleport identity file" type:"existingfile" name:"teleport-identity" env:"FDFWD_TELEPORT_IDENTITY"` + // TeleportRefreshEnabled will reload the identity file from disk on the + // configured interval. + TeleportRefreshEnabled bool `help:"Configures the identity file to be reloaded from disk at a configured interval." env:"FDFWD_TELEPORT_REFRESH_ENABLED"` + + // TeleportRefreshInterval is how often the identity file should + // be reloaded from disk. + TeleportRefreshInterval time.Duration `help:"Configures how often the identity file should be reloaded from disk." env:"FDFWD_TELEPORT_REFRESH_INTERVAL" default:"1m"` + // TeleportCA is a path to Teleport CA file TeleportCA string `help:"Teleport TLS CA file" type:"existingfile" env:"FDFWD_TELEPORT_CA"` @@ -241,6 +249,9 @@ func (c *StartCmdConfig) Dump(ctx context.Context) { if c.TeleportIdentityFile != "" { log.WithField("file", c.TeleportIdentityFile).Info("Using Teleport identity file") } + if c.TeleportRefreshEnabled { + log.WithField("interval", c.TeleportRefreshInterval).Info("Using Teleport identity file refresh") + } if c.TeleportKey != "" { log.WithField("addr", c.TeleportAddr).Info("Using Teleport addr") diff --git a/event-handler/cli_test.go b/event-handler/cli_test.go new file mode 100644 index 000000000..58f2ef0eb --- /dev/null +++ b/event-handler/cli_test.go @@ -0,0 +1,93 @@ +/* +Copyright 2015-2023 Gravitational, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "os" + "path" + "testing" + "time" + + "github.com/alecthomas/kong" + "github.com/stretchr/testify/require" +) + +// StartCmdConfig is mostly to test that the TOML file parsing works as +// expected. +func TestStartCmdConfig(t *testing.T) { + wd, err := os.Getwd() + require.NoError(t, err) + + testCases := []struct { + name string + args []string + + want StartCmdConfig + }{ + { + name: "standard", + args: []string{"start", "--config", "testdata/config.toml"}, + want: StartCmdConfig{ + FluentdConfig: FluentdConfig{ + FluentdURL: "https://localhost:8888/test.log", + FluentdSessionURL: "https://localhost:8888/session", + FluentdCert: path.Join(wd, "testdata", "fake-file"), + FluentdKey: path.Join(wd, "testdata", "fake-file"), + FluentdCA: path.Join(wd, "testdata", "fake-file"), + }, + TeleportConfig: TeleportConfig{ + TeleportAddr: "localhost:3025", + TeleportIdentityFile: path.Join(wd, "testdata", "fake-file"), + TeleportRefreshEnabled: true, + TeleportRefreshInterval: 2 * time.Minute, + }, + IngestConfig: IngestConfig{ + StorageDir: "./storage", + BatchSize: 20, + SkipSessionTypesRaw: []string{"print"}, + SkipSessionTypes: map[string]struct{}{ + "print": {}, + }, + Timeout: 10 * time.Second, + Concurrency: 5, + }, + LockConfig: LockConfig{ + LockFailedAttemptsCount: 3, + LockPeriod: time.Minute, + }, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + cli := CLI{} + parser, err := kong.New( + &cli, + kong.UsageOnError(), + kong.Configuration(KongTOMLResolver), + kong.Name(pluginName), + kong.Description(pluginDescription), + ) + require.NoError(t, err) + _, err = parser.Parse(tc.args) + require.NoError(t, err) + + require.Equal(t, tc.want, cli.Start) + }) + } +} diff --git a/event-handler/kong_toml_resolver.go b/event-handler/kong_toml_resolver.go index 1cda321ae..56b1f517a 100644 --- a/event-handler/kong_toml_resolver.go +++ b/event-handler/kong_toml_resolver.go @@ -49,10 +49,10 @@ func KongTOMLResolver(r io.Reader) (kong.Resolver, error) { } value := config.Get(name) - valueWithinSeciton := config.Get(strings.ReplaceAll(name, "-", ".")) + valueWithinSection := config.Get(strings.ReplaceAll(name, "-", ".")) - if valueWithinSeciton != nil { - return valueWithinSeciton, nil + if valueWithinSection != nil { + return valueWithinSection, nil } return value, nil diff --git a/event-handler/teleport_events_watcher.go b/event-handler/teleport_events_watcher.go index 2689cb9b3..44c85b3d0 100644 --- a/event-handler/teleport_events_watcher.go +++ b/event-handler/teleport_events_watcher.go @@ -25,6 +25,7 @@ import ( auditlogpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/auditlog/v1" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/events" + "github.com/gravitational/teleport/integrations/lib" "github.com/gravitational/teleport/integrations/lib/credentials" "github.com/gravitational/teleport/integrations/lib/logger" "github.com/gravitational/trace" @@ -80,17 +81,23 @@ func NewTeleportEventsWatcher( cursor string, id string, ) (*TeleportEventsWatcher, error) { - var err error - - config := client.Config{ - Addrs: []string{c.TeleportAddr}, - Credentials: []client.Credentials{ - client.LoadIdentityFile(c.TeleportIdentityFile), - client.LoadKeyPair(c.TeleportCert, c.TeleportKey, c.TeleportCA), - }, + var creds []client.Credentials + switch { + case c.TeleportIdentityFile != "" && !c.TeleportRefreshEnabled: + creds = []client.Credentials{client.LoadIdentityFile(c.TeleportIdentityFile)} + case c.TeleportIdentityFile != "" && c.TeleportRefreshEnabled: + cred, err := lib.NewIdentityFileWatcher(ctx, c.TeleportIdentityFile, c.TeleportRefreshInterval) + if err != nil { + return nil, trace.Wrap(err) + } + creds = []client.Credentials{cred} + case c.TeleportCert != "" && c.TeleportKey != "" && c.TeleportCA != "": + creds = []client.Credentials{client.LoadKeyPair(c.TeleportCert, c.TeleportKey, c.TeleportCA)} + default: + return nil, trace.BadParameter("no credentials configured") } - if validCred, err := credentials.CheckIfExpired(config.Credentials); err != nil { + if validCred, err := credentials.CheckIfExpired(creds); err != nil { log.Warn(err) if !validCred { return nil, trace.BadParameter( @@ -100,13 +107,18 @@ func NewTeleportEventsWatcher( log.Info("At least one non-expired credential has been found, continuing startup") } - client, err := client.New(ctx, config) + config := client.Config{ + Addrs: []string{c.TeleportAddr}, + Credentials: creds, + } + + teleportClient, err := client.New(ctx, config) if err != nil { return nil, trace.Wrap(err) } tc := TeleportEventsWatcher{ - client: client, + client: teleportClient, pos: -1, cursor: cursor, config: c, diff --git a/event-handler/testdata/config.toml b/event-handler/testdata/config.toml new file mode 100644 index 000000000..76d6b020b --- /dev/null +++ b/event-handler/testdata/config.toml @@ -0,0 +1,16 @@ +storage = "./storage" # Plugin will save its state here +timeout = "10s" +batch = 20 + +[forward.fluentd] +cert = "testdata/fake-file" +key = "testdata/fake-file" +ca = "testdata/fake-file" +url = "https://localhost:8888/test.log" +session-url = "https://localhost:8888/session" + +[teleport] +addr = "localhost:3025" +identity = "testdata/fake-file" +refresh.enabled = true +refresh.interval = "2m" \ No newline at end of file diff --git a/event-handler/testdata/fake-file b/event-handler/testdata/fake-file new file mode 100644 index 000000000..e69de29bb diff --git a/event-handler/tpl/teleport-event-handler.toml.tpl b/event-handler/tpl/teleport-event-handler.toml.tpl index b261852dc..e49427332 100644 --- a/event-handler/tpl/teleport-event-handler.toml.tpl +++ b/event-handler/tpl/teleport-event-handler.toml.tpl @@ -12,3 +12,4 @@ session-url = "https://localhost:8888/session" [teleport] addr = "{{.Addr}}" identity = "identity" +refresh.enabled = true diff --git a/go.mod b/go.mod index c2e3f3e2d..b812257af 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ toolchain go1.21.3 require ( github.com/DanielTitkov/go-adaptive-cards v0.2.2 github.com/alecthomas/kong v0.2.22 - github.com/go-resty/resty/v2 v2.7.0 // indirect + github.com/go-resty/resty/v2 v2.10.0 // indirect github.com/gogo/protobuf v1.3.2 github.com/google/uuid v1.3.1 github.com/gravitational/kingpin v2.1.11-0.20220901134012-2a1956e29525+incompatible @@ -31,8 +31,8 @@ require ( github.com/tidwall/gjson v1.14.4 golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb golang.org/x/net v0.17.0 - golang.org/x/sync v0.3.0 - google.golang.org/grpc v1.58.3 + golang.org/x/sync v0.4.0 + google.golang.org/grpc v1.59.0 google.golang.org/protobuf v1.31.0 gopkg.in/mail.v2 v2.3.1 ) @@ -57,7 +57,7 @@ require ( github.com/go-piv/piv-go v1.11.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/btree v1.1.2 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/gorilla/mux v1.8.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect @@ -107,8 +107,8 @@ require ( github.com/vmihailenco/msgpack/v4 v4.3.12 // indirect github.com/vmihailenco/tagparser v0.1.2 // indirect github.com/zclconf/go-cty v1.12.1 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.45.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0 // indirect go.opentelemetry.io/otel v1.19.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 // indirect @@ -121,20 +121,20 @@ require ( golang.org/x/term v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20231009173412-8bfb1ae86b6c // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apimachinery v0.28.1 // indirect + k8s.io/apimachinery v0.28.2 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/yaml v1.3.0 // indirect ) replace ( github.com/gogo/protobuf => github.com/gravitational/protobuf v1.3.2-0.20201123192827-2b9fcfaffcbf - github.com/gravitational/teleport => github.com/gravitational/teleport v0.0.0-20231019024622-508ccc563261 // ref: tags/v14.1.0 - github.com/gravitational/teleport/api => github.com/gravitational/teleport/api v0.0.0-20231019024622-508ccc563261 // ref: tags/v14.1.0 + github.com/gravitational/teleport => github.com/gravitational/teleport v0.0.0-20231101095026-54558b7a3d04 // ref: heads/auto-backport/32974-to-branch/v14 + github.com/gravitational/teleport/api => github.com/gravitational/teleport/api v0.0.0-20231101095026-54558b7a3d04 // ref: heads/auto-backport/32974-to-branch/v14 github.com/julienschmidt/httprouter => github.com/rw-access/httprouter v1.3.1-0.20210321233808-98e93175c124 github.com/microsoft/go-mssqldb => github.com/gravitational/go-mssqldb v0.11.1-0.20230331180905-0f76f1751cd3 ) diff --git a/go.sum b/go.sum index 8d774d87e..27dbc1212 100644 --- a/go.sum +++ b/go.sum @@ -186,14 +186,14 @@ 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-piv/piv-go v1.11.0 h1:5vAaCdRTFSIW4PeqMbnsDlUZ7odMYWnHBDGdmtU/Zhg= github.com/go-piv/piv-go v1.11.0/go.mod h1:NZ2zmjVkfFaL/CF8cVQ/pXdXtuj110zEKGdJM6fJZZM= -github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= -github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= +github.com/go-resty/resty/v2 v2.10.0 h1:Qla4W/+TMmv0fOeeRqzEpXPLfTUnR5HZ1+lGs+CkiCo= +github.com/go-resty/resty/v2 v2.10.0/go.mod h1:iiP/OpA0CkcL3IGt1O0+/SIItFUbkkyw5BGXiVdTu+A= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= +github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 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= @@ -238,8 +238,8 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ 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 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -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/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -272,10 +272,10 @@ github.com/gravitational/kingpin v2.1.11-0.20220901134012-2a1956e29525+incompati github.com/gravitational/kingpin v2.1.11-0.20220901134012-2a1956e29525+incompatible/go.mod h1:LWxG30M3FcrjhOn3T4zz7JmBoQJ45MWZmOXgy9Ganoc= github.com/gravitational/protobuf v1.3.2-0.20201123192827-2b9fcfaffcbf h1:MQ4e8XcxvZTeuOmRl7yE519vcWc2h/lyvYzsvt41cdY= github.com/gravitational/protobuf v1.3.2-0.20201123192827-2b9fcfaffcbf/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gravitational/teleport v0.0.0-20231019024622-508ccc563261 h1:qtwlYVh/I++NdkgOKgOaj5Qt9uXnBcj9MmCxeGY8bd4= -github.com/gravitational/teleport v0.0.0-20231019024622-508ccc563261/go.mod h1:N99QPpceaf8pL0k/fhG4pvmtXD6QxDKmc6Ys+1U32dw= -github.com/gravitational/teleport/api v0.0.0-20231019024622-508ccc563261 h1:pwFrQ6o2DpZhYnGJkmwlv5/UZXiQYXsnD+c95vYs/QA= -github.com/gravitational/teleport/api v0.0.0-20231019024622-508ccc563261/go.mod h1:ukcgRDeYhOgA1flNUsg53QuRU3wtEKsT/XcS3TM8rYI= +github.com/gravitational/teleport v0.0.0-20231101095026-54558b7a3d04 h1:QscaQtEcHBlxpYnv8r0HEPcYNcgkHaW8kCxWTo2C0bI= +github.com/gravitational/teleport v0.0.0-20231101095026-54558b7a3d04/go.mod h1:3iNkTU138UBKehGPjFBSEhEgcerzlPxCJ+OHiYt/Kmo= +github.com/gravitational/teleport/api v0.0.0-20231101095026-54558b7a3d04 h1:f3kOA/JzZrvQMqJ7rVKzKr2u0I1bMsrWZ1Y2nLNa2Y4= +github.com/gravitational/teleport/api v0.0.0-20231101095026-54558b7a3d04/go.mod h1:nchdjlkWotGYKRUt40yInJzgd/MODZ2uQLiIqfCPnVU= github.com/gravitational/trace v1.3.1 h1:jwZEuRtCYpLhUtqHo+JH+lu2qM0LB98UagqHtvdKuLI= github.com/gravitational/trace v1.3.1/go.mod h1:E61mn73aro7Zg9gZheZaeUsK6gjUMbCLazY76xuYAVA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -604,10 +604,10 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0 h1:ZOLJc06r4CB42laIXg/7udr0pbZyuAihN10A/XuiQRY= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0/go.mod h1:5z+/ZWJQKXa9YT34fQNx5K8Hd1EoIhvtUygUQPqEOgQ= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0 h1:KfYpVmrjI7JuToy5k8XV3nkapjWx48k4E4JOtVstzQI= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0/go.mod h1:SeQhzAEccGVZVEy7aH87Nh0km+utSpo1pTv6eMMop48= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.45.0 h1:RsQi0qJ2imFfCvZabqzM9cNXBG8k6gXMv1A0cXRmH6A= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.45.0/go.mod h1:vsh3ySueQCiKPxFLvjWC4Z135gIa34TQ/NSqkDTZYUM= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0 h1:x8Z78aZx8cOF0+Kkazoc7lwUNMGy0LrzEMxTm4BbTxg= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0/go.mod h1:62CPTSry9QZtOaSsE3tOzhx6LzDhHnXJ6xHeMNNiM6Q= go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= @@ -719,10 +719,10 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= -golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -742,8 +742,8 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/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.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -788,7 +788,6 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -800,12 +799,14 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/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.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -814,15 +815,17 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 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/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -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.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.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 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.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -929,8 +932,8 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200711021454-869866162049/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97 h1:SeZZZx0cP0fqUyA+oRzP9k7cSwJlvDFiROO72uwD6i0= google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97/go.mod h1:t1VqOqqvce95G3hIDCT5FeO3YUc6Q4Oe24L/+rNMxRk= -google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5 h1:nIgk/EEq3/YlnmVVXVnm14rC2oxgs1o0ong4sD/rd44= -google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5/go.mod h1:5DZzOUPCLYL3mNkQ0ms0F3EuUNZ7py1Bqeq6sxzI7/Q= +google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 h1:W18sezcAYs+3tDZX4F80yctqa12jcP1PUS2gQu1zTPU= +google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97/go.mod h1:iargEX0SFPm3xcfMI0d1domjg0ZF4Aa0p2awqyxhvF0= google.golang.org/genproto/googleapis/rpc v0.0.0-20231009173412-8bfb1ae86b6c h1:jHkCUWkseRf+W+edG5hMzr/Uh1xkDREY4caybAq4dpY= google.golang.org/genproto/googleapis/rpc v0.0.0-20231009173412-8bfb1ae86b6c/go.mod h1:4cYg8o5yUbm77w8ZX00LhMVNl/YVBFJRYWDc0uYWMs0= google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -950,8 +953,8 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= -google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= 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= @@ -1003,8 +1006,8 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh 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= -k8s.io/apimachinery v0.28.1 h1:EJD40og3GizBSV3mkIoXQBsws32okPOy+MkRyzh6nPY= -k8s.io/apimachinery v0.28.1/go.mod h1:X0xh/chESs2hP9koe+SdIAcXWcQ+RM5hy0ZynB+yEvw= +k8s.io/apimachinery v0.28.2 h1:KCOJLrc6gu+wV1BYgwik4AF4vXOlVJPdiqn0yAWWwXQ= +k8s.io/apimachinery v0.28.2/go.mod h1:RdzF87y/ngqk9H4z3EL2Rppv5jj95vGS/HaFXrLDApU= 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=