From 39a7ea861456c4fbb8454af37d49f3934f6176e1 Mon Sep 17 00:00:00 2001 From: Denis Machard <5562930+dmachard@users.noreply.github.com> Date: Sat, 4 Nov 2023 18:59:54 +0100 Subject: [PATCH] add support to provide certificate/key and validate server certificate on loggers (#445) * add mTLS support for all loggers * update documentations for loggers * tls-support and sock-path marked as deprecated * some code factory on tls client configuration * fix for ReadFromConnection on redispub and backport for tcpclient and fluentd --- config.yml | 104 +++++++++--- dnsutils/config.go | 105 ++++++++---- dnsutils/tls_config.go | 73 ++++++++ dnsutils/tls_config_test.go | 26 +++ docs/loggers/logger_dnstap.md | 23 +-- docs/loggers/logger_elasticsearch.md | 1 + docs/loggers/logger_fluentd.md | 18 +- docs/loggers/logger_influxdb.md | 7 +- docs/loggers/logger_kafka.md | 12 +- docs/loggers/logger_loki.md | 11 +- docs/loggers/logger_redis.md | 26 +-- docs/loggers/logger_scalyr.md | 8 +- docs/loggers/logger_statsd.md | 16 +- docs/loggers/logger_syslog.md | 12 +- docs/loggers/logger_tcp.md | 24 +-- go.mod | 2 +- go.sum | 241 --------------------------- loggers/dnstapclient.go | 79 +++++---- loggers/fluentd.go | 111 +++++++++--- loggers/fluentd_test.go | 6 +- loggers/influxdb.go | 22 +-- loggers/kafkaproducer.go | 21 ++- loggers/lokiclient.go | 27 +-- loggers/redispub.go | 114 ++++++++----- loggers/redispub_test.go | 4 + loggers/scalyr.go | 20 +-- loggers/statsd.go | 35 ++-- loggers/syslog.go | 30 ++-- loggers/tcpclient.go | 106 +++++++++--- loggers/tcpclient_test.go | 8 +- testsdata/certs/ca.crt | 23 +++ testsdata/certs/ca.key | 28 ++++ testsdata/certs/client.crt | 23 +++ testsdata/certs/client.key | 28 ++++ testsdata/certs/server.crt | 29 ++++ testsdata/certs/server.key | 28 ++++ 36 files changed, 910 insertions(+), 541 deletions(-) create mode 100644 dnsutils/tls_config.go create mode 100644 dnsutils/tls_config_test.go create mode 100644 testsdata/certs/ca.crt create mode 100644 testsdata/certs/ca.key create mode 100644 testsdata/certs/client.crt create mode 100644 testsdata/certs/client.key create mode 100644 testsdata/certs/server.crt create mode 100644 testsdata/certs/server.key diff --git a/config.yml b/config.yml index 211e4603..d2b02176 100644 --- a/config.yml +++ b/config.yml @@ -304,22 +304,28 @@ multiplexer: # # resend captured dns traffic to another dnstap collector or to unix socket # dnstap: +# # network transport to use: unix|tcp|tcp+tls +# transport: tcp # # remote address # remote-address: 10.0.0.1 # # remote tcp port # remote-port: 6000 -# # unix socket path -# sock-path: null # # connect timeout # connect-timeout: 5 # # interval in second between retry reconnect # retry-interval: 10 # # interval in second before to flush the buffer # flush-interval: 30 -# # enable tls -# tls-support: false # # insecure skip verify # tls-insecure: false +# # tls min version +# tls-min-version: 1.2 +# # provide CA file to verify the server certificate +# ca-file: "" +# # provide client certificate file for mTLS +# cert-file: "" +# # provide client private key file for mTLS +# key-file: "" # # server identity, if empty use the global one or hostname # server-id: "dnscollector" # # overwrite original identity @@ -331,26 +337,30 @@ multiplexer: # # resend captured dns traffic to a tcp remote destination or to unix socket # tcpclient: -# # network transport to use: tcp|unix +# # network transport to use: unix|tcp|tcp+tls # transport: tcp -# # remote address +# # remote address or unix socket path # remote-address: 127.0.0.1 # # remote tcp port # remote-port: 9999 -# # unix socket path -# sock-path: null # # connect timeout # connect-timeout: 5 # # interval in second between retry reconnect # retry-interval: 10 # # interval in second before to flush the buffer # flush-interval: 30 -# # enable tls -# tls-support: false # # insecure skip verify # tls-insecure: false +# # tls min version +# tls-min-version: 1.2 +# # trusted certificate file +# ca-file: "" +# # provide client certificate file for mTLS +# cert-file: "" +# # provide client private key file for mTLS +# key-file: "" # # output format: text|json|flat-json -# mode: json +# mode: flat-json # # output text format, please refer to the top of this file to see all available directives # text-format: "timestamp-rfc3339ns identity operation rcode queryip queryport family protocol length qname qtype latency" # # delimiter to use between payload sent @@ -363,7 +373,7 @@ multiplexer: # # Send captured traffic to a redis channel, mapped on TCP client logger options # redispub: # # output format: text|json|flat-json -# mode: json +# mode: flat-json # # remote address # remote-address: 127.0.0.1 # # remote tcp port @@ -372,9 +382,14 @@ multiplexer: # connect-timeout: 5 # retry-interval: 10 # flush-interval: 2 -# # enable tls -# tls-support: false +# # enable insecure tls # tls-insecure: false +# # trusted certificate file +# ca-file: "" +# # provide client certificate file for mTLS +# cert-file: "" +# # provide client private key file for mTLS +# key-file: "" # # output text format, please refer to the top of this file to see all available directives # text-format: "timestamp-rfc3339ns identity operation rcode queryip queryport family protocol length qname qtype latency" # delimiter: "\n" @@ -406,6 +421,14 @@ multiplexer: # mode: text # # insecure mode, skip certificate verify # tls-insecure: false +# # tls min version +# tls-min-version: 1.2 +# # provide CA file to verify the server certificate +# ca-file: "" +# # provide client certificate file for mTLS +# cert-file: "" +# # provide client private key file for mTLS +# key-file: "" # # set syslog formatter between unix, rfc3164 (default) or rfc5424 # formatter: "rfc3164" # # set syslog framer: `none` or `rfc5425` @@ -432,15 +455,13 @@ multiplexer: # # resend captured dns traffic to a remote fluentd server or to unix socket # fluentd: -# # network transport to use: tcp|unix +# # network transport to use: tcp|unix|tcp+tls # transport: tcp # # remote address # remote-address: 127.0.0.1 # # remote tcp port # remote-port: 24224 -# # unix socket path -# sock-path: null -# # connect timeout +# # connect timeout in seconds # connect-timeout: 5 # # interval in second between retry reconnect # retry-interval: 10 @@ -448,10 +469,16 @@ multiplexer: # flush-interval: 30 # # tag name # tag: "dns.collector" -# # enable tls -# tls-support: false -# # insecure skip verify +# # insecure tls, skip certificate and hostname verify # tls-insecure: false +# # tls min version +# tls-min-version: 1.2 +# # provide CA file to verify the server certificate +# ca-file: "" +# # provide client certificate file for mTLS +# cert-file: "" +# # provide client private key file for mTLS +# key-file: "" # # how many DNS messages will be buffered before being sent # buffer-size: 100 # # Channel buffer size for incoming packets, number of packet before to drop it. @@ -467,6 +494,14 @@ multiplexer: # tls-support: false # # insecure skip verify # tls-insecure: false +# # tls min version +# tls-min-version: 1.2 +# # provide CA file to verify the server certificate +# ca-file: "" +# # provide client certificate file for mTLS +# cert-file: "" +# # provide client private key file for mTLS +# key-file: "" # # bucket # bucket: "db_dns" # # Organization @@ -495,6 +530,14 @@ multiplexer: # proxy-url: "" # # insecure skip verify # tls-insecure: false +# # tls min version +# tls-min-version: 1.2 +# # provide CA file to verify the server certificate +# ca-file: "" +# # provide client certificate file for mTLS +# cert-file: "" +# # provide client private key file for mTLS +# key-file: "" # # basic auth login # basic-auth-login: "" # # basic auth password @@ -515,16 +558,22 @@ multiplexer: # # forward to statsd proxy # statsd: -# # network transport to use: udp|tcp +# # network transport to use: udp|tcp|tcp+tls # transport: udp # # remote address # remote-address: 127.0.0.1 # # remote tcp port # remote-port: 8125 -# # enable tls -# tls-support: false -# # insecure skip verify +# # connect timeout in seconds +# connect-timeout: 5 +# # insecure tls, skip certificate verify # tls-insecure: false +# # provide CA file to verify the server certificate +# ca-file: "" +# # provide client certificate file for mTLS +# cert-file: "" +# # provide client private key file for mTLS +# key-file: "" # # prefix # prefix: "dnscollector" # # flush every X seconds @@ -557,6 +606,11 @@ multiplexer: # tls-insecure: false # # tls min version # tls-min-version: 1.2 +# ca-file: "" +# # provide client certificate file for mTLS +# cert-file: "" +# # provide client private key file for mTLS +# key-file: "" # # Channel buffer size for incoming packets, number of packet before to drop it. # chan-buffer-size: 65535 diff --git a/dnsutils/config.go b/dnsutils/config.go index fe28c8df..f1bcacd7 100644 --- a/dnsutils/config.go +++ b/dnsutils/config.go @@ -18,18 +18,6 @@ func IsValidMode(mode string) bool { return false } -func IsValidTLS(mode string) bool { - switch mode { - case - TLS_v10, - TLS_v11, - TLS_v12, - TLS_v13: - return true - } - return false -} - type MultiplexInOut struct { Name string `yaml:"name"` Transforms map[string]interface{} `yaml:"transforms"` @@ -309,6 +297,7 @@ type Config struct { Enable bool `yaml:"enable"` RemoteAddress string `yaml:"remote-address"` RemotePort int `yaml:"remote-port"` + Transport string `yaml:"transport"` SockPath string `yaml:"sock-path"` ConnectTimeout int `yaml:"connect-timeout"` RetryInterval int `yaml:"retry-interval"` @@ -316,6 +305,9 @@ type Config struct { TlsSupport bool `yaml:"tls-support"` TlsInsecure bool `yaml:"tls-insecure"` TlsMinVersion string `yaml:"tls-min-version"` + CAFile string `yaml:"ca-file"` + CertFile string `yaml:"cert-file"` + KeyFile string `yaml:"key-file"` ServerId string `yaml:"server-id"` OverwriteIdentity bool `yaml:"overwrite-identity"` BufferSize int `yaml:"buffer-size"` @@ -325,12 +317,15 @@ type Config struct { Enable bool `yaml:"enable"` RemoteAddress string `yaml:"remote-address"` RemotePort int `yaml:"remote-port"` - SockPath string `yaml:"sock-path"` + SockPath string `yaml:"sock-path"` // deprecated RetryInterval int `yaml:"retry-interval"` Transport string `yaml:"transport"` - TlsSupport bool `yaml:"tls-support"` + TlsSupport bool `yaml:"tls-support"` // deprecated TlsInsecure bool `yaml:"tls-insecure"` TlsMinVersion string `yaml:"tls-min-version"` + CAFile string `yaml:"ca-file"` + CertFile string `yaml:"cert-file"` + KeyFile string `yaml:"key-file"` Mode string `yaml:"mode"` TextFormat string `yaml:"text-format"` PayloadDelimiter string `yaml:"delimiter"` @@ -350,6 +345,9 @@ type Config struct { Mode string `yaml:"mode"` TlsInsecure bool `yaml:"tls-insecure"` TlsMinVersion string `yaml:"tls-min-version"` + CAFile string `yaml:"ca-file"` + CertFile string `yaml:"cert-file"` + KeyFile string `yaml:"key-file"` Formatter string `yaml:"formatter"` Framer string `yaml:"framer"` Hostname string `yaml:"hostname"` @@ -361,14 +359,17 @@ type Config struct { Enable bool `yaml:"enable"` RemoteAddress string `yaml:"remote-address"` RemotePort int `yaml:"remote-port"` - SockPath string `yaml:"sock-path"` + SockPath string `yaml:"sock-path"` // deprecated ConnectTimeout int `yaml:"connect-timeout"` RetryInterval int `yaml:"retry-interval"` FlushInterval int `yaml:"flush-interval"` Transport string `yaml:"transport"` - TlsSupport bool `yaml:"tls-support"` + TlsSupport bool `yaml:"tls-support"` // deprecated TlsInsecure bool `yaml:"tls-insecure"` TlsMinVersion string `yaml:"tls-min-version"` + CAFile string `yaml:"ca-file"` + CertFile string `yaml:"cert-file"` + KeyFile string `yaml:"key-file"` Tag string `yaml:"tag"` BufferSize int `yaml:"buffer-size"` ChannelBufferSize int `yaml:"chan-buffer-size"` @@ -380,6 +381,9 @@ type Config struct { TlsSupport bool `yaml:"tls-support"` TlsInsecure bool `yaml:"tls-insecure"` TlsMinVersion string `yaml:"tls-min-version"` + CAFile string `yaml:"ca-file"` + CertFile string `yaml:"cert-file"` + KeyFile string `yaml:"key-file"` Bucket string `yaml:"bucket"` Organization string `yaml:"organization"` ChannelBufferSize int `yaml:"chan-buffer-size"` @@ -396,6 +400,9 @@ type Config struct { ProxyURL string `yaml:"proxy-url"` TlsInsecure bool `yaml:"tls-insecure"` TlsMinVersion string `yaml:"tls-min-version"` + CAFile string `yaml:"ca-file"` + CertFile string `yaml:"cert-file"` + KeyFile string `yaml:"key-file"` BasicAuthLogin string `yaml:"basic-auth-login"` BasicAuthPwd string `yaml:"basic-auth-pwd"` BasicAuthPwdFile string `yaml:"basic-auth-pwd-file"` @@ -408,11 +415,15 @@ type Config struct { Prefix string `yaml:"prefix"` RemoteAddress string `yaml:"remote-address"` RemotePort int `yaml:"remote-port"` + ConnectTimeout int `yaml:"connect-timeout"` Transport string `yaml:"transport"` FlushInterval int `yaml:"flush-interval"` - TlsSupport bool `yaml:"tls-support"` + TlsSupport bool `yaml:"tls-support"` //deprecated TlsInsecure bool `yaml:"tls-insecure"` TlsMinVersion string `yaml:"tls-min-version"` + CAFile string `yaml:"ca-file"` + CertFile string `yaml:"cert-file"` + KeyFile string `yaml:"key-file"` ChannelBufferSize int `yaml:"chan-buffer-size"` } `yaml:"statsd"` ElasticSearchClient struct { @@ -436,18 +447,24 @@ type Config struct { ProxyURL string `yaml:"proxy-url"` TlsInsecure bool `yaml:"tls-insecure"` TlsMinVersion string `yaml:"tls-min-version"` + CAFile string `yaml:"ca-file"` + CertFile string `yaml:"cert-file"` + KeyFile string `yaml:"key-file"` ChannelBufferSize int `yaml:"chan-buffer-size"` } `yaml:"scalyrclient"` RedisPub struct { Enable bool `yaml:"enable"` RemoteAddress string `yaml:"remote-address"` RemotePort int `yaml:"remote-port"` - SockPath string `yaml:"sock-path"` + SockPath string `yaml:"sock-path"` // deprecated RetryInterval int `yaml:"retry-interval"` Transport string `yaml:"transport"` - TlsSupport bool `yaml:"tls-support"` + TlsSupport bool `yaml:"tls-support"` // deprecated TlsInsecure bool `yaml:"tls-insecure"` TlsMinVersion string `yaml:"tls-min-version"` + CAFile string `yaml:"ca-file"` + CertFile string `yaml:"cert-file"` + KeyFile string `yaml:"key-file"` Mode string `yaml:"mode"` TextFormat string `yaml:"text-format"` PayloadDelimiter string `yaml:"delimiter"` @@ -465,6 +482,9 @@ type Config struct { TlsSupport bool `yaml:"tls-support"` TlsInsecure bool `yaml:"tls-insecure"` TlsMinVersion string `yaml:"tls-min-version"` + CAFile string `yaml:"ca-file"` + CertFile string `yaml:"cert-file"` + KeyFile string `yaml:"key-file"` SaslSupport bool `yaml:"sasl-support"` SaslUsername string `yaml:"sasl-username"` SaslPassword string `yaml:"sasl-password"` @@ -584,6 +604,7 @@ func (c *Config) SetDefault() { c.Loggers.Dnstap.Enable = false c.Loggers.Dnstap.RemoteAddress = LOCALHOST_IP c.Loggers.Dnstap.RemotePort = 6000 + c.Loggers.Dnstap.Transport = SOCKET_TCP c.Loggers.Dnstap.ConnectTimeout = 5 c.Loggers.Dnstap.RetryInterval = 10 c.Loggers.Dnstap.FlushInterval = 30 @@ -591,6 +612,9 @@ func (c *Config) SetDefault() { c.Loggers.Dnstap.TlsSupport = false c.Loggers.Dnstap.TlsInsecure = false c.Loggers.Dnstap.TlsMinVersion = TLS_v12 + c.Loggers.Dnstap.CAFile = "" + c.Loggers.Dnstap.CertFile = "" + c.Loggers.Dnstap.KeyFile = "" c.Loggers.Dnstap.ServerId = "" c.Loggers.Dnstap.OverwriteIdentity = false c.Loggers.Dnstap.BufferSize = 100 @@ -643,11 +667,14 @@ func (c *Config) SetDefault() { c.Loggers.TcpClient.RemotePort = 9999 c.Loggers.TcpClient.SockPath = "" c.Loggers.TcpClient.RetryInterval = 10 - c.Loggers.TcpClient.Transport = "tcp" + c.Loggers.TcpClient.Transport = SOCKET_TCP c.Loggers.TcpClient.TlsSupport = false c.Loggers.TcpClient.TlsInsecure = false c.Loggers.TcpClient.TlsMinVersion = TLS_v12 - c.Loggers.TcpClient.Mode = MODE_JSON + c.Loggers.TcpClient.CAFile = "" + c.Loggers.TcpClient.CertFile = "" + c.Loggers.TcpClient.KeyFile = "" + c.Loggers.TcpClient.Mode = MODE_FLATJSON c.Loggers.TcpClient.TextFormat = "" c.Loggers.TcpClient.PayloadDelimiter = "\n" c.Loggers.TcpClient.BufferSize = 100 @@ -665,24 +692,30 @@ func (c *Config) SetDefault() { c.Loggers.Syslog.RetryInterval = 10 c.Loggers.Syslog.TlsInsecure = false c.Loggers.Syslog.TlsMinVersion = TLS_v12 + c.Loggers.Syslog.CAFile = "" + c.Loggers.Syslog.CertFile = "" + c.Loggers.Syslog.KeyFile = "" c.Loggers.Syslog.ChannelBufferSize = 65535 c.Loggers.Syslog.Tag = "" c.Loggers.Syslog.Framer = "" c.Loggers.Syslog.Formatter = "rfc5424" c.Loggers.Syslog.Hostname = "" - c.Loggers.Syslog.AppName = "" + c.Loggers.Syslog.AppName = "DNScollector" c.Loggers.Fluentd.Enable = false c.Loggers.Fluentd.RemoteAddress = LOCALHOST_IP c.Loggers.Fluentd.RemotePort = 24224 - c.Loggers.Fluentd.SockPath = "" + c.Loggers.Fluentd.SockPath = "" // deprecated c.Loggers.Fluentd.RetryInterval = 10 c.Loggers.Fluentd.ConnectTimeout = 5 c.Loggers.Fluentd.FlushInterval = 30 - c.Loggers.Fluentd.Transport = "tcp" - c.Loggers.Fluentd.TlsSupport = false + c.Loggers.Fluentd.Transport = SOCKET_TCP + c.Loggers.Fluentd.TlsSupport = false // deprecated c.Loggers.Fluentd.TlsInsecure = false c.Loggers.Fluentd.TlsMinVersion = TLS_v12 + c.Loggers.Fluentd.CAFile = "" + c.Loggers.Fluentd.CertFile = "" + c.Loggers.Fluentd.KeyFile = "" c.Loggers.Fluentd.Tag = "dns.collector" c.Loggers.Fluentd.BufferSize = 100 c.Loggers.Fluentd.ChannelBufferSize = 65535 @@ -693,6 +726,9 @@ func (c *Config) SetDefault() { c.Loggers.InfluxDB.TlsSupport = false c.Loggers.InfluxDB.TlsInsecure = false c.Loggers.InfluxDB.TlsMinVersion = TLS_v12 + c.Loggers.InfluxDB.CAFile = "" + c.Loggers.InfluxDB.CertFile = "" + c.Loggers.InfluxDB.KeyFile = "" c.Loggers.InfluxDB.Bucket = "" c.Loggers.InfluxDB.Organization = "" c.Loggers.InfluxDB.ChannelBufferSize = 65535 @@ -708,6 +744,9 @@ func (c *Config) SetDefault() { c.Loggers.LokiClient.ProxyURL = "" c.Loggers.LokiClient.TlsInsecure = false c.Loggers.LokiClient.TlsMinVersion = TLS_v12 + c.Loggers.LokiClient.CAFile = "" + c.Loggers.LokiClient.CertFile = "" + c.Loggers.LokiClient.KeyFile = "" c.Loggers.LokiClient.BasicAuthLogin = "" c.Loggers.LokiClient.BasicAuthPwd = "" c.Loggers.LokiClient.BasicAuthPwdFile = "" @@ -718,11 +757,15 @@ func (c *Config) SetDefault() { c.Loggers.Statsd.Prefix = PROG_NAME c.Loggers.Statsd.RemoteAddress = LOCALHOST_IP c.Loggers.Statsd.RemotePort = 8125 - c.Loggers.Statsd.Transport = "udp" + c.Loggers.Statsd.Transport = SOCKET_UDP + c.Loggers.Statsd.ConnectTimeout = 5 c.Loggers.Statsd.FlushInterval = 10 - c.Loggers.Statsd.TlsSupport = false + c.Loggers.Statsd.TlsSupport = false // deprecated c.Loggers.Statsd.TlsInsecure = false c.Loggers.Statsd.TlsMinVersion = TLS_v12 + c.Loggers.Statsd.CAFile = "" + c.Loggers.Statsd.CertFile = "" + c.Loggers.Statsd.KeyFile = "" c.Loggers.Statsd.ChannelBufferSize = 65535 c.Loggers.ElasticSearchClient.Enable = false @@ -741,7 +784,10 @@ func (c *Config) SetDefault() { c.Loggers.RedisPub.TlsSupport = false c.Loggers.RedisPub.TlsInsecure = false c.Loggers.RedisPub.TlsMinVersion = TLS_v12 - c.Loggers.RedisPub.Mode = MODE_JSON + c.Loggers.RedisPub.CAFile = "" + c.Loggers.RedisPub.CertFile = "" + c.Loggers.RedisPub.KeyFile = "" + c.Loggers.RedisPub.Mode = MODE_FLATJSON c.Loggers.RedisPub.TextFormat = "" c.Loggers.RedisPub.PayloadDelimiter = "\n" c.Loggers.RedisPub.BufferSize = 100 @@ -757,6 +803,9 @@ func (c *Config) SetDefault() { c.Loggers.KafkaProducer.TlsSupport = false c.Loggers.KafkaProducer.TlsInsecure = false c.Loggers.KafkaProducer.TlsMinVersion = TLS_v12 + c.Loggers.KafkaProducer.CAFile = "" + c.Loggers.KafkaProducer.CertFile = "" + c.Loggers.KafkaProducer.KeyFile = "" c.Loggers.KafkaProducer.SaslSupport = false c.Loggers.KafkaProducer.SaslUsername = "" c.Loggers.KafkaProducer.SaslPassword = "" diff --git a/dnsutils/tls_config.go b/dnsutils/tls_config.go new file mode 100644 index 00000000..d58e4f05 --- /dev/null +++ b/dnsutils/tls_config.go @@ -0,0 +1,73 @@ +package dnsutils + +import ( + "crypto/tls" + "crypto/x509" + "fmt" + "os" +) + +var clientCipherSuites = []uint16{ + tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, + tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, +} + +func IsValidTLS(mode string) bool { + switch mode { + case + TLS_v10, + TLS_v11, + TLS_v12, + TLS_v13: + return true + } + return false +} + +type TlsOptions struct { + CAFile string + CertFile string + KeyFile string + InsecureSkipVerify bool + MinVersion string +} + +func TlsClientConfig(options TlsOptions) (*tls.Config, error) { + + tlsConfig := &tls.Config{ + MinVersion: tls.VersionTLS12, + InsecureSkipVerify: false, + CipherSuites: clientCipherSuites, + } + tlsConfig.InsecureSkipVerify = options.InsecureSkipVerify + + if len(options.CAFile) > 0 { + CAs := x509.NewCertPool() + pemData, err := os.ReadFile(options.CAFile) + if err != nil { + return nil, fmt.Errorf("could not read CA certificate %q: %w", options.CAFile, err) + } + if !CAs.AppendCertsFromPEM(pemData) { + return nil, fmt.Errorf("failed to append certificates from PEM file: %q", options.CAFile) + } + tlsConfig.RootCAs = CAs + } + + if len(options.CertFile) > 0 && len(options.KeyFile) > 0 { + cer, err := tls.LoadX509KeyPair(options.CertFile, options.KeyFile) + if err != nil { + return nil, fmt.Errorf("loading certificate failed: %w", err) + } + tlsConfig.Certificates = []tls.Certificate{cer} + } + + if tlsVersion, ok := TLS_VERSION[options.MinVersion]; ok { + tlsConfig.MinVersion = tlsVersion + } else { + return nil, fmt.Errorf("invalid minimum TLS version: %x", options.MinVersion) + } + + return tlsConfig, nil +} diff --git a/dnsutils/tls_config_test.go b/dnsutils/tls_config_test.go new file mode 100644 index 00000000..540e7f89 --- /dev/null +++ b/dnsutils/tls_config_test.go @@ -0,0 +1,26 @@ +package dnsutils + +import ( + "crypto/tls" + "reflect" + "testing" +) + +func TestConfigClientTLSNoVerify(t *testing.T) { + tlsConfig, err := TlsClientConfig(TlsOptions{InsecureSkipVerify: true, MinVersion: TLS_v12}) + + if err != nil || tlsConfig == nil { + t.Fatal("Unable to configure client TLS", err) + } + + if !reflect.DeepEqual(tlsConfig.CipherSuites, clientCipherSuites) { + t.Fatal("Unexpected client cipher suites") + } + if tlsConfig.MinVersion != tls.VersionTLS12 { + t.Fatal("Unexpected client TLS version") + } + + if tlsConfig.Certificates != nil { + t.Fatal("Somehow client certificates were set") + } +} diff --git a/docs/loggers/logger_dnstap.md b/docs/loggers/logger_dnstap.md index 0f7d2965..a44f6959 100644 --- a/docs/loggers/logger_dnstap.md +++ b/docs/loggers/logger_dnstap.md @@ -1,21 +1,22 @@ # Logger: DNStap Client -DNStap stream logger to a remote tcp destination or unix socket. - -* to remote tcp destination or unix socket -* tls support +DNStap stream logger to a remote tcp/tls destination or unix socket. Options: -* `listen-ip`: (string) remote address -* `listen-port`: (integer) remote tcp port -* `sock-path`: (string) unix socket path +* `transport`: (string) network transport to use: `unix`|`tcp`|`tcp+tls` +* `remote-address`: (string) remote address +* `remote-port`: (integer) remote tcp port +* `sock-path` **DEPRECATED, replaced by remote-address**: (string) unix socket path * `connect-timeout`: (integer) connect timeout in second * `retry-interval`: (integer) interval in second between retry reconnect * `flush-interval`: (integer) interval in second before to flush the buffer -* `tls-support`: (boolean) enable tls +* `tls-support` **DEPRECATED, replaced with tcp+tls flag on transport**: (boolean) enable tls * `tls-insecure`: (boolean) insecure skip verify * `tls-min-version`: (string) min tls version, default to 1.2 +* `ca-file`: (string) provide CA file to verify the server certificate +* `cert-file`: (string) provide client certificate file for mTLS +* `key-file`: (string) provide client private key file for mTLS * `server-id`: (string) server identity * `overwrite-identity`: (boolean) overwrite original identity * `buffer-size`: (integer) how many DNS messages will be buffered before being sent @@ -25,15 +26,17 @@ Default values: ```yaml dnstap: + transport: tcp remote-address: 10.0.0.1 remote-port: 6000 - sock-path: null connect-timeout: 5 retry-interval: 10 flush-interval: 30 - tls-support: false tls-insecure: false tls-min-version: 1.2 + ca-file: "" + cert-file: "" + key-file: "" server-id: "dnscollector" overwrite-identity: false buffer-size: 100 diff --git a/docs/loggers/logger_elasticsearch.md b/docs/loggers/logger_elasticsearch.md index f6b2976e..ab8426fb 100644 --- a/docs/loggers/logger_elasticsearch.md +++ b/docs/loggers/logger_elasticsearch.md @@ -4,6 +4,7 @@ ElasticSearch client to remote ElasticSearch server Options: + - `server`: (string) Elasticsearch server url - `index`: (string) Elasticsearch index - `bulk-size`: (integer) Bulk size to be used for bulk batches diff --git a/docs/loggers/logger_fluentd.md b/docs/loggers/logger_fluentd.md index 996e9595..29cc73f0 100644 --- a/docs/loggers/logger_fluentd.md +++ b/docs/loggers/logger_fluentd.md @@ -9,17 +9,20 @@ Fluentd client to remote server or unix socket. Options: -* `transport`: (string) network transport to use: tcp|unix -* `listen-ip`: (string) remote address -* `listen-port`: (integer) remote tcp port -* `sock-path`: (string) unix socket path +* `transport`: (string) network transport to use: `tcp`|`unix`|`tcp+tls` +* `remote-address`: (string) remote address +* `remote-port`: (integer) remote tcp port +* `sock-path` **DEPRECATED, replaced by remote-address**: (string) unix socket path * `connect-timeout`: (integer) connect timeout in second * `retry-interval`: (integer) interval in second between retry reconnect * `flush-interval`: (integer) interval in second before to flush the buffer * `tag`: (string) tag name -* `tls-support`: (boolean) enable tls +* `tls-support` **DEPRECATED, replaced with tcp+tls flag on transport**: (boolean) enable tls * `tls-insecure`: (boolean) insecure skip verify * `tls-min-version`: (string) min tls version, default to 1.2 +* `ca-file`: (string) provide CA file to verify the server certificate +* `cert-file`: (string) provide client certificate file for mTLS +* `key-file`: (string) provide client private key file for mTLS * `buffer-size`: (integer) how many DNS messages will be buffered before being sent * `chan-buffer-size`: (integer) channel buffer size used on incoming dns message, number of messages before to drop it. @@ -30,14 +33,15 @@ fluentd: transport: tcp remote-address: 127.0.0.1 remote-port: 24224 - sock-path: null connect-timeout: 5 retry-interval: 10 flush-interval: 30 tag: "dns.collector" - tls-support: false tls-insecure: false tls-min-version: 1.2 + ca-file: "" + cert-file: "" + key-file: "" buffer-size: 100 chan-buffer-size: 65535 ``` diff --git a/docs/loggers/logger_influxdb.md b/docs/loggers/logger_influxdb.md index 865241d9..b30beeec 100644 --- a/docs/loggers/logger_influxdb.md +++ b/docs/loggers/logger_influxdb.md @@ -1,5 +1,4 @@ - # Logger: InfluxDB client InfluxDB client to remote InfluxDB server @@ -13,6 +12,9 @@ Options: - `tls-support`: (boolean) enable tls - `tls-insecure`: (boolean) insecure skip verify - `tls-min-version`: (string) min tls version +- `ca-file`: (string) provide CA file to verify the server certificate +- `cert-file`: (string) provide client certificate file for mTLS +- `key-file`: (string) provide client private key file for mTLS - `chan-buffer-size`: (integer) channel buffer size used on incoming dns message, number of messages before to drop it. Default values: @@ -26,5 +28,8 @@ influxdb: tls-support: false tls-insecure: false tls-min-version: 1.2 + ca-file: "" + cert-file: "" + key-file: "" chan-buffer-size: 65535 ``` diff --git a/docs/loggers/logger_kafka.md b/docs/loggers/logger_kafka.md index e5624a23..176baf2a 100644 --- a/docs/loggers/logger_kafka.md +++ b/docs/loggers/logger_kafka.md @@ -4,7 +4,7 @@ Kafka producer Options: -- `remote-ip`: (string) remote address +- `remote-address`: (string) remote address - `remote-port`: (integer) remote tcp port - `connect-timeout`: (integer) connect timeout in second - `retry-interval`: (integer) interval in second between retry reconnect @@ -12,11 +12,14 @@ Options: - `tls-support`: (boolean) enable tls - `tls-insecure`: (boolean) insecure skip verify - `tls-min-version`: (string) min tls version, default to 1.2 +- `ca-file`: (string) provide CA file to verify the server certificate +- `cert-file`: (string) provide client certificate file for mTLS +- `key-file`: (string) provide client private key file for mTLS - `sasl-support`: (boolean) enable SASL - `sasl-username`: (string) SASL username - `sasl-password`: (string) SASL password -- `sasl-mechanism`: (string) SASL mechanism: PLAIN or SCRAM-SHA-512 -- `mode`: (string) output format: text, json, or flat-json +- `sasl-mechanism`: (string) SASL mechanism: `PLAIN` or `SCRAM-SHA-512` +- `mode`: (string) output format: `text`, `json`, or `flat-json` - `buffer-size`: (integer) how many DNS messages will be buffered before being sent - `topic`: (integer) kafka topic to forward messages to - `partition`: (integer) kafka partition @@ -34,6 +37,9 @@ kafkaproducer: tls-support: false tls-insecure: false tls-min-version: 1.2 + ca-file: "" + cert-file: "" + key-file: "" sasl-support: false sasl-mechanism: PLAIN sasl-username: "" diff --git a/docs/loggers/logger_loki.md b/docs/loggers/logger_loki.md index 2a0244f8..b15b5e4c 100644 --- a/docs/loggers/logger_loki.md +++ b/docs/loggers/logger_loki.md @@ -6,15 +6,17 @@ Options: - `server-url`: (string) Loki server url - `job-name`: (string) Job name -- `mode`: (string) output format: text, json, or flat-json +- `mode`: (string) output format: `text`, `json`, or `flat-json` - `flush-interval`: (integer) flush batch every X seconds - `batch-size`: (integer) batch size for log entries in bytes - `retry-interval`: (integer) interval in second between before to retry to send batch - `text-format`: (string) output text format, please refer to the default text format to see all available directives, use this parameter if you want a specific format - `proxy-url`: (string) Proxy URL -- `tls-support`: (boolean) enable tls -- `tls-insecure`: (boolean) insecure skip verify +- `tls-insecure`: (boolean) insecure tls, skip certificate and hostname verify - `tls-min-version`: (string) min tls version +- `ca-file`: (string) provide CA file to verify the server certificate +- `cert-file`: (string) provide client certificate file for mTLS +- `key-file`: (string) provide client private key file for mTLS - `basic-auth-login`: (string) basic auth login - `basic-auth-pwd`: (string) basic auth password - `basic-auth-pwd-file`: (string) path to a file containing the basic auth password @@ -36,6 +38,9 @@ lokiclient: proxy-url: "" tls-insecure: false tls-min-version: 1.2 + ca-file: "" + cert-file: "" + key-file: "" basic-auth-login: "" basic-auth-pwd: "" basic-auth-pwd-file: "" diff --git a/docs/loggers/logger_redis.md b/docs/loggers/logger_redis.md index 784c0b60..145e9630 100644 --- a/docs/loggers/logger_redis.md +++ b/docs/loggers/logger_redis.md @@ -10,18 +10,21 @@ Redis Pub logger Options: -* `transport`: (string) network transport to use: tcp|unix -* `listen-ip`: (string) remote address -* `listen-port`: (integer) remote tcp port -* `sock-path`: (string) unix socket path +* `transport`: (string) network transport to use: `tcp`|`unix`|`tcp+tls` +* `remote-ip`: (string) remote address +* `remote-port`: (integer) remote tcp port +* `sock-path` **DEPRECATED, replaced by remote-address**: (string) unix socket path * `connect-timeout`: (integer) connect timeout in second * `retry-interval`: (integer) interval in second between retry reconnect * `flush-interval`: (integer) interval in second before to flush the buffer -* `tls-support`: (boolean) enable tls -* `tls-insecure`: (boolean) insecure skip verify +* `tls-support` **DEPRECATED, replaced with tcp+tls flag on transport**: (boolean) enable tls +* `tls-insecure`: (boolean) insecure tls, skip certificate and hostname verify * `tls-min-version`: (string) min tls version, default to 1.2 -* `mode`: (string) output format: text, json, or flat-json -* `text-format`: (string) output text format, please refer to the default text format to see all available directives, use this parameter if you want a specific format +* `ca-file`: (string) provide CA file to verify the server certificate +* `cert-file`: (string) provide client certificate file for mTLS +* `key-file`: (string) provide client private key file for mTLS +* `mode`: (string) output format: `text`, `json`, or `flat-json` +* `text-format`: (string) output text format, please refer to the default text format to see all available [directives](../configuration.md#custom-text-format), use this parameter if you want a specific format * `buffer-size`: (integer) how many DNS messages will be buffered before being sent * `redis-channel`: (string) name of the redis pubsub channel to publish into * `chan-buffer-size`: (integer) channel buffer size used on incoming dns message, number of messages before to drop it. @@ -33,14 +36,15 @@ redispub: transport: tcp remote-address: 127.0.0.1 remote-port: 6379 - sock-path: null connect-timeout: 5 retry-interval: 10 flush-interval: 30 - tls-support: false tls-insecure: false tls-min-version: 1.2 - mode: json + ca-file: "" + cert-file: "" + key-file: "" + mode: flat-json text-format: "" buffer-size: 100 redis-channel: dns-collector diff --git a/docs/loggers/logger_scalyr.md b/docs/loggers/logger_scalyr.md index 19eaafee..0ab9a7f4 100644 --- a/docs/loggers/logger_scalyr.md +++ b/docs/loggers/logger_scalyr.md @@ -7,7 +7,7 @@ Options: - `server-url`: (string) Scalyr API Host - `apikey`: (string, required) API Token with Log Write permissions -- `mode`: (string) text, json, or flat-json +- `mode`: (string) `text`, `json`, or `flat-json` - `parser`: (string) When using text or json mode, the name of the parser Scalyr should use - `flush-interval`: (integer) flush batch every X seconds - `batch-size`: (integer) batch size for log entries in bytes @@ -15,6 +15,9 @@ Options: - `proxy-url`: (string) Proxy URL - `tls-insecure`: (boolean) insecure skip verify - `tls-min-version`: (string) min tls version +- `ca-file`: (string) provide CA file to verify the server certificate +- `cert-file`: (string) provide client certificate file for mTLS +- `key-file`: (string) provide client private key file for mTLS - `session-info`: (map) Any "session" or server information for Scalyr. e.g. 'region', 'serverHost'. If 'serverHost' is not included, it is set using the hostname. - `attrs`: (map) Any extra attributes that should be added to the log's fields. - `chan-buffer-size`: (integer) channel buffer size used on incoming dns message, number of messages before to drop it. @@ -38,5 +41,8 @@ scalyrclient: proxy-url: "" tls-insecure: false tls-min-version: 1.2 + ca-file: "" + cert-file: "" + key-file: "" chan-buffer-size: 65535 ``` diff --git a/docs/loggers/logger_statsd.md b/docs/loggers/logger_statsd.md index 1a7c7029..4888e41a 100644 --- a/docs/loggers/logger_statsd.md +++ b/docs/loggers/logger_statsd.md @@ -31,13 +31,17 @@ Gauges: Options: -* `transport`: (string) network transport to use: udp or tcp -* `listen-ip`: (string) remote address -* `listen-port`: (integer) remote tcp port +* `transport`: (string) network transport to use: `udp` | `tcp` | `tcp+tls` +* `remote-address`: (string) remote address +* `remote-port`: (integer) remote tcp port +* `connect-timeout`: (integer) connect timeout in second * `prefix`: (string) statsd prefix name -* `tls-support`: (boolean) enable tls +* `tls-support` **DEPRECATED, replaced with tcp+tls flag on transport**: (boolean) enable tls * `tls-insecure`: (boolean) insecure skip verify * `tls-min-version`: (string) min tls version +* `ca-file`: (string) provide CA file to verify the server certificate +* `cert-file`: (string) provide client certificate file for mTLS +* `key-file`: (string) provide client private key file for mTLS * `chan-buffer-size`: (integer) channel buffer size used on incoming dns message, number of messages before to drop it. Default values: @@ -48,8 +52,10 @@ statsd: remote-address: 127.0.0.1 remote-port: 8125 prefix: "dnscollector" - tls-support: false tls-insecure: false tls-min-version: 1.2 + ca-file: "" + cert-file: "" + key-file: "" chan-buffer-size: 65535 ``` diff --git a/docs/loggers/logger_syslog.md b/docs/loggers/logger_syslog.md index 44162582..582db2b0 100644 --- a/docs/loggers/logger_syslog.md +++ b/docs/loggers/logger_syslog.md @@ -11,15 +11,18 @@ Syslog logger to local syslog system or remote one. Options: * `facility`: (string) Set the syslog logging facility -* `transport`: (string) Transport to use to a remote log daemon or local one. local|tcp|udp|unix|tcp+tls +* `transport`: (string) Transport to use to a remote log daemon or local one. `local`|`tcp`|`udp`|`unix`|`tcp+tls` * `remote-address`: (string) Remote address host:port * `retry-interval`: (integer) interval in second between retry reconnect * `chan-buffer-size`: (integer) channel buffer size used on incoming dns message, number of messages before to drop it. -* `mode`: (string) output format: text, json, or flat-json +* `mode`: (string) output format: `text`, `json`, or `flat-json` * `text-format`: (string) output text format, please refer to the default text format to see all available [directives](../configuration.md#custom-text-format), use this parameter if you want a specific format * `tls-insecure`: (boolean) insecure mode, skip certificate verify * `tls-min-version`: (string) min tls version, default to 1.2 -* `formattter`: (string) Set syslog formatter between `unix`, `rfc3164` or `rfc5424` (default) +* `ca-file`: (string) provide CA file to verify the server certificate +* `cert-file`: (string) provide client certificate file for mTLS +* `key-file`: (string) provide client private key file for mTLS +* `formattter`: (string) Set syslog formatter between `unix`, `rfc3164` or `rfc5424` * `framer`: (string) Set syslog framer: `none` or `rfc5425` * `hostname`: (string) Set syslog hostname * `app-name`: (string) Set syslog program name @@ -39,6 +42,9 @@ syslog: mode: text tls-insecure: false tls-min-version: 1.2 + ca-file: "" + cert-file: "" + key-file: "" formatter: "rfc3164" framer: "" hostname: "" diff --git a/docs/loggers/logger_tcp.md b/docs/loggers/logger_tcp.md index c0d7d74e..3ec8e50c 100644 --- a/docs/loggers/logger_tcp.md +++ b/docs/loggers/logger_tcp.md @@ -10,18 +10,21 @@ Tcp/unix stream client logger. Options: -* `transport`: (string) network transport to use: tcp|unix -* `remote-ip`: (string) remote address +* `transport`: (string) network transport to use: `unix`|`tcp`|`tcp+tls` +* `remote-address`: (string) remote address * `remote-port`: (integer) remote tcp port -* `sock-path`: (string) unix socket path +* `sock-path` **DEPRECATED, replaced by remote-address**: (string) unix socket path * `connect-timeout`: (integer) connect timeout in second * `retry-interval`: (integer) interval in second between retry reconnect * `flush-interval`: (integer) interval in second before to flush the buffer -* `tls-support`: (boolean) enable tls -* `tls-insecure`: (boolean) insecure skip verify +* `tls-support` **DEPRECATED, replaced with tcp+tls flag on transport**: (boolean) enable tls +* `tls-insecure`: (boolean) insecure tls, skip certificate and hostname verify * `tls-min-version`: (string) min tls version, default to 1.2 -* `mode`: (string) output format: text, json, or flat-json -* `text-format`: (string) output text format, please refer to the default text format to see all available directives, use this parameter if you want a specific format +* `ca-file`: (string) provide CA file to verify the server certificate +* `cert-file`: (string) provide client certificate file for mTLS +* `key-file`: (string) provide client private key file for mTLS +* `mode`: (string) output format: `text`, `json`, or `flat-json` +* `text-format`: (string) output text format, please refer to the default text format to see all available [directives](../configuration.md#custom-text-format), use this parameter if you want a specific format * `buffer-size`: (integer) how many DNS messages will be buffered before being sent * `chan-buffer-size`: (integer) channel buffer size used on incoming dns message, number of messages before to drop it. @@ -32,14 +35,15 @@ tcpclient: transport: tcp remote-address: 127.0.0.1 remote-port: 9999 - sock-path: null connect-timeout: 5 retry-interval: 10 flush-interval: 30 - tls-support: false tls-insecure: false tls-min-version: 1.2 - mode: json + ca-file: "" + cert-file: "" + key-file: "" + mode: flat-json text-format: "" buffer-size: 100 chan-buffer-size: 65535 diff --git a/go.mod b/go.mod index 9a615c2a..bda86249 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.21 require ( github.com/Shopify/sarama v1.38.1 github.com/cilium/ebpf v0.12.2 + github.com/dmachard/go-clientsyslog v0.3.0 github.com/dmachard/go-dnstap-protobuf v0.6.0 github.com/dmachard/go-framestream v0.6.0 github.com/dmachard/go-logger v0.3.0 @@ -47,7 +48,6 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/deepmap/oapi-codegen v1.12.4 // indirect github.com/dennwc/varint v1.0.0 // indirect - github.com/dmachard/go-clientsyslog v0.3.0 // indirect github.com/dustin/go-humanize v1.0.0 // indirect github.com/eapache/go-resiliency v1.3.0 // indirect github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6 // indirect diff --git a/go.sum b/go.sum index 9b322aa8..b468fdaa 100644 --- a/go.sum +++ b/go.sum @@ -361,22 +361,11 @@ cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= 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/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4slttB4vD+b9btVEnWgL3Q00OBTzVT8B9C0c= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet/v6 v6.2.0 h1:EpcZ6SR9n28BUGtNJSvlBqf90IpjeFr36Tizxhn/oME= -github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Joker/jade v1.1.3 h1:Qbeh12Vq6BxURXT1qZBRHsDxeURB8ztcL6f3EXSGeHk= -github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= -github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 h1:KkH3I3sJuOLP3TjA/dfr4NAY8bghDwnXiU7cTKxQqo0= -github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= github.com/Shopify/sarama v1.38.1 h1:lqqPUPQZ7zPqYlWpTh+LQ9bhYNu2xJL6k1SJN4WVe2A= github.com/Shopify/sarama v1.38.1/go.mod h1:iwv9a67Ha8VNa+TifujYoWGxWnu2kNVAQdSdZ4X2o5g= github.com/Shopify/toxiproxy/v2 v2.5.0 h1:i4LPT+qrSlKNtQf5QliVjdP08GyAH8+BUIc9gT0eahc= @@ -389,8 +378,6 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= -github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= @@ -404,9 +391,6 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkY github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.44.217 h1:FcWC56MRl+k756aH3qeMQTylSdeJ58WN0iFz3fkyRz0= github.com/aws/aws-sdk-go v1.44.217/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= -github.com/aws/aws-sdk-go v1.44.321 h1:iXwFLxWjZPjYqjPq0EcCs46xX7oDLEELte1+BzgpKk8= -github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= -github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= 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= @@ -415,22 +399,11 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= -github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= -github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= -github.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE= -github.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= 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.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= -github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= -github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= -github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo= -github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= 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= @@ -445,9 +418,6 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= -github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= -github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.4.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= @@ -457,13 +427,9 @@ github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV 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/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deepmap/oapi-codegen v1.3.6/go.mod h1:aBozjEveG+33xPiP55Iw/XbVkhtZHEGLq3nxlX0+hfU= github.com/deepmap/oapi-codegen v1.12.4 h1:pPmn6qI9MuOtCz82WY2Xaw46EQjgvxednXXrP7g5Q2s= github.com/deepmap/oapi-codegen v1.12.4/go.mod h1:3lgHGMu6myQ2vqbbTXH2H1o4eXFTGnFiDaOaKKl5yas= -github.com/deepmap/oapi-codegen v1.16.2 h1:xGHx0dNqYfy9gE8a7AVgVM8Sd5oF9SEgePzP+UPAUXI= -github.com/deepmap/oapi-codegen v1.16.2/go.mod h1:rdYoEA2GE+riuZ91DvpmBX9hJbQpuY9wchXpfQ3n+ho= github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= @@ -481,17 +447,11 @@ github.com/dmachard/go-topmap v0.5.0 h1:zGWTFTwgsOsCIG7NxoJpWBAV7pGqxqUFdLZ+6A+U github.com/dmachard/go-topmap v0.5.0/go.mod h1:v+v595j5h02u2Vf9OOr6StGBCX2i6qMTEy8n0dbArEA= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/dvyukov/go-fuzz v0.0.0-20210103155950-6a8e9d1f2415/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= github.com/eapache/go-resiliency v1.3.0 h1:RRL0nge+cWGlxXbUzJ7yMcq6w2XBEr19dCN6HECGaT0= github.com/eapache/go-resiliency v1.3.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= -github.com/eapache/go-resiliency v1.4.0 h1:3OK9bWpPk5q6pbFAaYSEwD9CLUSHG8bnZuqX2yMt3B0= -github.com/eapache/go-resiliency v1.4.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6 h1:8yY/I9ndfrgrXUbOGObLHKBR4Fl3nZXwM2c7OYTT8hM= github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= -github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 h1:Oy0F4ALJ04o5Qqpdz8XLIpNA3WM/iSIXqxtqo7UGVws= -github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= @@ -503,31 +463,18 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw= -github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/frankban/quicktest v1.14.5 h1:dfYrrRyLtiqT9GyKXgdh+k4inNeTvmGbuSgZ3lx3GhA= github.com/frankban/quicktest v1.14.5/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= 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/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= -github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/getkin/kin-openapi v0.2.0/go.mod h1:V1z9xl9oF5Wt7v32ne4FmiF1alpS4dM6mNzoywPOXlk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= -github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/go-chi/chi v4.0.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= 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= @@ -544,22 +491,12 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= -github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= -github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= -github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.15.5 h1:LEBecTWb/1j5TNY1YYG2RcOUN3R7NLylN+x8TTueE24= -github.com/go-playground/validator/v10 v10.15.5/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.4.0 h1:zgVt4UpGxcqVOw97aRGxT4svlcmdK35fynLNctY32zI= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= -github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= @@ -605,8 +542,6 @@ github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= -github.com/gomarkdown/markdown v0.0.0-20230922112808-5421fefb8386 h1:EcQR3gusLHN46TAD+G+EbaaqJArt5vHhNpXAa12PQf4= -github.com/gomarkdown/markdown v0.0.0-20230922112808-5421fefb8386/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= 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/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= @@ -653,8 +588,6 @@ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= @@ -668,8 +601,6 @@ github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= -github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= @@ -677,31 +608,22 @@ github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+ github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/grafana/dskit v0.0.0-20230201083518-528d8a7d52f2 h1:IOks+FXJ6iO/pfbaVEf4efNw+YzYBYNCkCabyrbkFTM= github.com/grafana/dskit v0.0.0-20230201083518-528d8a7d52f2/go.mod h1:zj+5BNZAVmQafV583uLTAOzRr963KPdEm4d6NPmtbwg= -github.com/grafana/dskit v0.0.0-20231030022856-30221e73f47e h1:78Seyn40QzROIdIyVhbOzaEn1xGl3DC+37zh+ZLOUAo= -github.com/grafana/dskit v0.0.0-20231030022856-30221e73f47e/go.mod h1:8dsy5tQOkeNQyjXpm5mQsbCu3H5uzeBD35MzRQFznKU= github.com/grafana/loki v1.6.2-0.20230503110102-9f809eda70ba h1:vIk29Pg/KQTQVFnBPKvn6Q2nOMMovrNwtBqVTSbIATY= github.com/grafana/loki v1.6.2-0.20230503110102-9f809eda70ba/go.mod h1:UEcmph7z8jSsvhZ9MUMR4Q3Ua/FagTfHZUzwWxv038U= github.com/grafana/loki/pkg/push v0.0.0-20230127102416-571f88bc5765 h1:VXitROTlmZtLzvokNe8ZbUKpmwldM4Hy1zdNRO32jKU= github.com/grafana/loki/pkg/push v0.0.0-20230127102416-571f88bc5765/go.mod h1:DhJMrd2QInI/1CNtTN43BZuTmkccdizW1jZ+F6aHkhY= -github.com/grafana/loki/pkg/push v0.0.0-20231027183250-9366343e18d6 h1:FYQDkw2hZIV/4pdo88eRw+dIKixA6/d6dBaF/fSP6/k= -github.com/grafana/loki/pkg/push v0.0.0-20231027183250-9366343e18d6/go.mod h1:f3JSoxBTPXX5ec4FxxeC19nTBSxoTz+cBgS3cYLMcr0= github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= -github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= github.com/hashicorp/consul/api v1.20.0 h1:9IHTjNVSZ7MIwjlW3N3a7iGiykCMDpxZu8jsxFJh0yc= github.com/hashicorp/consul/api v1.20.0/go.mod h1:nR64eD44KQ59Of/ECwt2vUmIK2DKsDzAwTmwmLl8Wpo= -github.com/hashicorp/consul/api v1.25.1 h1:CqrdhYzc8XZuPnhIYZWH45toM0LB9ZeYr/gvpLVI3PE= -github.com/hashicorp/consul/api v1.25.1/go.mod h1:iiLVwR/htV7mas/sy0O+XSuEnrdBUUydemjxcUrAt4g= github.com/hashicorp/consul/sdk v0.13.1 h1:EygWVWWMczTzXGpO93awkHFzfUka6hLYJ0qhETd+6lY= github.com/hashicorp/consul/sdk v0.13.1/go.mod h1:SW/mM4LbKfqmMvcFu8v+eiQQ7oitXEFeiBe9StxERb0= -github.com/hashicorp/consul/sdk v0.14.1 h1:ZiwE2bKb+zro68sWzZ1SgHF3kRMBZ94TwOCFRF4ylPs= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -710,8 +632,6 @@ github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9n github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v1.4.0 h1:ctuWFGrhFha8BnnzxqeRGidlEcQkDyL5u8J8t5eA11I= github.com/hashicorp/go-hclog v1.4.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= -github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= -github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -728,8 +648,6 @@ github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR3 github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/hashicorp/go-sockaddr v1.0.5 h1:dvk7TIXCZpmfOlM+9mlcrWmWjw/wlKT+VDq2wMvfPJU= -github.com/hashicorp/go-sockaddr v1.0.5/go.mod h1:uoUUmtwU7n9Dv3O4SNLeFvg0SxQ3lyjsj6+CCykpaxI= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -742,8 +660,6 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= -github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= @@ -757,16 +673,10 @@ github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1: github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= -github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/influxdata/influxdb-client-go v1.4.0 h1:+KavOkwhLClHFfYcJMHHnTL5CZQhXJzOm5IKHI9BqJk= github.com/influxdata/influxdb-client-go v1.4.0/go.mod h1:S+oZsPivqbcP1S9ur+T+QqXvrYS3NCZeMQtBoH4D1dw= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf h1:7JTmneyiNEwVBOHSjoMxiWAqB992atOeepeFYegn5RU= -github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/iris-contrib/schema v0.0.6 h1:CPSBLyx2e91H2yJzPuhGuifVRnZBBJ3pCOMbOvPZaTw= -github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= @@ -777,15 +687,11 @@ github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJA github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= github.com/jcmturner/gokrb5/v8 v8.4.3 h1:iTonLeSJOn7MVUtyMT+arAn5AKAPrkilzhGw8wE/Tq8= github.com/jcmturner/gokrb5/v8 v8.4.3/go.mod h1:dqRwJGXznQrzw6cWmyo6kH+E7jksEQG/CyVWsJEsJO0= -github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= -github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= 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= @@ -800,18 +706,6 @@ github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPci 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/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/kataras/blocks v0.0.8 h1:MrpVhoFTCR2v1iOOfGng5VJSILKeZZI+7NGfxEh3SUM= -github.com/kataras/blocks v0.0.8/go.mod h1:9Jm5zx6BB+06NwA+OhTbHW1xkMOYxahnqTN5DveZ2Yg= -github.com/kataras/golog v0.1.9 h1:vLvSDpP7kihFGKFAvBSofYo7qZNULYSHOH2D7rPTKJk= -github.com/kataras/golog v0.1.9/go.mod h1:jlpk/bOaYCyqDqH18pgDHdaJab72yBE6i0O3s30hpWY= -github.com/kataras/iris/v12 v12.2.7 h1:C9KWZmZT5pB5f2ot1XYWDBdi5XeTz0CGweHRXCDARZg= -github.com/kataras/iris/v12 v12.2.7/go.mod h1:mD76k/tIBFy8pHTFIgUPrVrkI4lTKvFbIcfbStJSBnA= -github.com/kataras/pio v0.0.12 h1:o52SfVYauS3J5X08fNjlGS5arXHjW/ItLkyLcKjoH6w= -github.com/kataras/pio v0.0.12/go.mod h1:ODK/8XBhhQ5WqrAhKy+9lTPS7sBf6O3KcLhc9klfRcY= -github.com/kataras/sitemap v0.0.6 h1:w71CRMMKYMJh6LR2wTgnk5hSgjVNB9KL60n5e2KHvLY= -github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= -github.com/kataras/tunnel v0.0.4 h1:sCAqWuJV7nPzGrlb0os3j49lk2JhILT0rID38NHNLpA= -github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -819,10 +713,6 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= -github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= 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= @@ -834,24 +724,13 @@ 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/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= -github.com/labstack/echo/v4 v4.11.2 h1:T+cTLQxWCDfqDEoydYm5kCobjmHwOwcv4OJAPHilmdE= -github.com/labstack/echo/v4 v4.11.2/go.mod h1:UcGuQ8V6ZNRmSweBIJkPvGfwCMIlFmiqrPqiEBfPYws= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= -github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= -github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= -github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= -github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqACtjw= -github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= @@ -866,15 +745,10 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/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/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/microcosm-cc/bluemonday v1.0.26 h1:xbqSvqzQMeEHCqMi64VAs4d8uy6Mequs3rQ0k/Khz58= -github.com/microcosm-cc/bluemonday v1.0.26/go.mod h1:JyzOCs9gkyQyjs+6h10UEVSe02CGwkhd72Xdqh78TWs= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.56 h1:5imZaSeoRNvpM9SzWNhEcP9QliKiz20/dA2QabIGVnE= @@ -918,13 +792,9 @@ github.com/oschwald/maxminddb-golang v1.12.0/go.mod h1:q0Nob5lTCqyQ8WT6FYgS1L7PX github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= -github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.17 h1:kV4Ip+/hUBC+8T6+2EgburRtkE9ef4nbY3f4dFhGjMc= github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= -github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -942,14 +812,12 @@ github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqr github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -965,8 +833,6 @@ github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57J github.com/prometheus/exporter-toolkit v0.8.2/go.mod h1:00shzmJL7KxcsabLWcONwpyNEuWhREOnFqZW7vadFS0= github.com/prometheus/exporter-toolkit v0.9.1 h1:cNkC01riqiOS+kh3zdnNwRsbe/Blh0WwK3ij5rPJ9Sw= github.com/prometheus/exporter-toolkit v0.9.1/go.mod h1:iFlTmFISCix0vyuyBmm0UqOUCTao9+RsAsKJP3YM9ec= -github.com/prometheus/exporter-toolkit v0.10.1-0.20230714054209-2f4150c63f97 h1:oHcfzdJnM/SFppy2aUlvomk37GI33x9vgJULihE5Dt8= -github.com/prometheus/exporter-toolkit v0.10.1-0.20230714054209-2f4150c63f97/go.mod h1:LoBCZeRh+5hX+fSULNyFnagYlQG/gBsyA/deNzROkq8= 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.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= @@ -976,12 +842,8 @@ github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI= github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= -github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= -github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/prometheus/prometheus v0.43.1 h1:Z/Z0S0CoPUVtUnHGokFksWMssSw2Y1Ir9NnWS1pPWU0= github.com/prometheus/prometheus v0.43.1/go.mod h1:2BA14LgBeqlPuzObSEbh+Y+JwLH2GcqDlJKbF2sA6FM= -github.com/prometheus/prometheus v0.47.2 h1:jWcnuQHz1o1Wu3MZ6nMJDuTI0kU5yJp9pkxh8XEkNvI= -github.com/prometheus/prometheus v0.47.2/go.mod h1:J/bmOSjgH7lFxz2gZhrWEZs2i64vMS+HIuZfmYNhJ/M= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= @@ -990,38 +852,25 @@ github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjR github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rs/tzsp v0.0.0-20161230003637-8ce729c826b9 h1:upQjqUCvtoYMwHSXn0eGc1lsVJpEi90u3oMjmLKa9ac= github.com/rs/tzsp v0.0.0-20161230003637-8ce729c826b9/go.mod h1:pFz3aQBXB8wqK0Mnt7iOEgcrpRHgpP+1xNnOy7Ok1Bw= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiyyjYS17cCYRqP13/SHk= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/segmentio/kafka-go v0.4.44 h1:Vjjksniy0WSTZ7CuVJrz1k04UoZeTc77UV6Yyk6tLY4= github.com/segmentio/kafka-go v0.4.44/go.mod h1:HjF6XbOKh0Pjlkr5GVZxt6CsjjwnmhVOfURM5KMd8qg= github.com/sercand/kuberesolver v2.4.0+incompatible h1:WE2OlRf6wjLxHwNkkFLQGaZcVLEXjMjBPjjEU5vksH8= github.com/sercand/kuberesolver v2.4.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ= -github.com/sercand/kuberesolver/v4 v4.0.0 h1:frL7laPDG/lFm5n98ODmWnn+cvPpzlkf3LhzuPhcHP4= -github.com/sercand/kuberesolver/v4 v4.0.0/go.mod h1:F4RGyuRmMAjeXHKL+w4P7AwUnPceEAPAhxUgXZjKgvM= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= 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 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.1 h1:4VhoImhV/Bm0ToFkXFi8hXNXwpDRZ/ynw3amt82mzq0= -github.com/stretchr/objx v0.5.1/go.mod h1:/iHQpkQwBD6DLUmQ4pE+s1TXdob1mORJ4/UFdrifcy0= 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= @@ -1030,43 +879,22 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/tdewolff/minify/v2 v2.20.0 h1:JFoL/Jxnyebf/jw3woqpmwBjSNJYSeU+sTFl9dTMHQ8= -github.com/tdewolff/minify/v2 v2.20.0/go.mod h1:TEE9CWftBwKQLUTZHuH9upjiqlt8zFpQOGxQ81rsG3c= -github.com/tdewolff/parse/v2 v2.7.0 h1:eVeKTV9nQ9BNS0LPlOgrhLXisiAjacaf60aRgSEtnic= -github.com/tdewolff/parse/v2 v2.7.0/go.mod h1:9p2qMIHpjRSTr1qnFxQr+igogyTUTlwvf9awHSm84h8= -github.com/tdewolff/test v1.0.10/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= -github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/uber/jaeger-client-go v2.28.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= -github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.1.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= -github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/vmihailenco/msgpack v4.0.4+incompatible h1:dSLoQfGFAo3F6OoNhwUmLwVgaUXK79GlxNBwueZn0xI= github.com/vmihailenco/msgpack v4.0.4+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= -github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= -github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= -github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= -github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/weaveworks/common v0.0.0-20221201103051-7c2720a9024d h1:9Z/HiqeGN+LOnmotAMpFEQjuXZ4AGAVFG0rC1laP5Go= github.com/weaveworks/common v0.0.0-20221201103051-7c2720a9024d/go.mod h1:Fnq3+U51tMkPRMC6Wr7zKGUeFFYX4YjNrNK50iU0fcE= -github.com/weaveworks/common v0.0.0-20230728070032-dd9e68f319d5 h1:nORobjToZAvi54wcuUXLq+XG2Rsr0XEizy5aHBHvqWQ= -github.com/weaveworks/common v0.0.0-20230728070032-dd9e68f319d5/go.mod h1:rgbeLfJUtEr+G74cwFPR1k/4N0kDeaeSv/qhUNE4hm8= github.com/weaveworks/promrus v1.2.0 h1:jOLf6pe6/vss4qGHjXmGz4oDJQA+AOCqEL3FvvZGz7M= github.com/weaveworks/promrus v1.2.0/go.mod h1:SaE82+OJ91yqjrE1rsvBWVzNZKcHYFtMUyS1+Ogs/KA= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= @@ -1075,27 +903,18 @@ github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= -github.com/yosssi/ace v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA= -github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= 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= go.etcd.io/etcd/api/v3 v3.5.4 h1:OHVyt3TopwtUQ2GKdd5wu3PmmipR4FTwCqoEjSyRdIc= go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= -go.etcd.io/etcd/api/v3 v3.5.10 h1:szRajuUUbLyppkhs9K6BRtjY37l66XQQmw7oZRANE4k= -go.etcd.io/etcd/api/v3 v3.5.10/go.mod h1:TidfmT4Uycad3NM/o25fG3J07odo4GBB9hoxaodFCtI= go.etcd.io/etcd/client/pkg/v3 v3.5.4 h1:lrneYvz923dvC14R54XcA7FXoZ3mlGZAgmwhfm7HqOg= go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.10 h1:kfYIdQftBnbAq8pUWFXfpuuxFSKzlmM5cSn76JByiT0= -go.etcd.io/etcd/client/pkg/v3 v3.5.10/go.mod h1:DYivfIviIuQ8+/lCq4vcxuseg2P2XbHygkKwFo9fc8U= go.etcd.io/etcd/client/v3 v3.5.4 h1:p83BUL3tAYS0OT/r0qglgc3M1JjhM0diV8DSWAhVXv4= go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= -go.etcd.io/etcd/client/v3 v3.5.10 h1:W9TXNZ+oB3MCd/8UjxHTWK5J9Nquw9fQBLJd5ne5/Ao= -go.etcd.io/etcd/client/v3 v3.5.10/go.mod h1:RVeBnDz2PUEZqTpgqwAtUd8nAPf5kjyFyND7P1VkOKc= 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= @@ -1109,37 +928,22 @@ go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= -go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= -go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= -go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= -go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= go4.org/intern v0.0.0-20211027215823-ae77deb06f29 h1:UXLjNohABv4S58tHmeuIZDO6e3mHpW2Dx33gaNt03LE= go4.org/intern v0.0.0-20211027215823-ae77deb06f29/go.mod h1:cS2ma+47FKrLPdXFpr7CuxiTW3eyJbWew4qx0qtQWDA= -go4.org/intern v0.0.0-20230525184215-6c62f75575cb h1:ae7kzL5Cfdmcecbh22ll7lYP3iuUdnfnhiPcSaDgH/8= -go4.org/intern v0.0.0-20230525184215-6c62f75575cb/go.mod h1:Ycrt6raEcnF5FTsLiLKkhBTO6DPX3RCUCUVnks3gFJU= go4.org/unsafe/assume-no-moving-gc v0.0.0-20211027215541-db492cf91b37/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E= go4.org/unsafe/assume-no-moving-gc v0.0.0-20230525183740-e7c30c78aeb2 h1:WJhcL4p+YeDxmZWg141nRm7XC8IDmhz7lk5GpadO1Sg= go4.org/unsafe/assume-no-moving-gc v0.0.0-20230525183740-e7c30c78aeb2/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/arch v0.5.0 h1:jpGode6huXQxcskEIpOCvrU+tzo81b6+oFLUYXWtH/Y= -golang.org/x/arch v0.5.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= 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= @@ -1152,7 +956,6 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20221012134737-56aed061732a/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1170,8 +973,6 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20230307190834-24139beb5833 h1:SChBja7BCQewoTAU7IgvucQKMIXrEpFxNMs0spT3/5s= golang.org/x/exp v0.0.0-20230307190834-24139beb5833/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= -golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= 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= @@ -1197,20 +998,15 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.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.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -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.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/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-20190327091125-710a502c58a2/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= @@ -1239,7 +1035,6 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 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= @@ -1248,7 +1043,6 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 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/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -1263,11 +1057,8 @@ golang.org/x/net v0.0.0-20220725212005-46097bf591d3/go.mod h1:AaygXjzTFtRAg2ttMY golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= 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= @@ -1298,8 +1089,6 @@ golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= -golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= -golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= 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= @@ -1316,8 +1105,6 @@ golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJ 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-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1383,9 +1170,6 @@ golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/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-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1405,19 +1189,14 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/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.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.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -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.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= @@ -1433,7 +1212,6 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.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.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= @@ -1463,7 +1241,6 @@ golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtn 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-20191029041327-9cc4af7d6b2c/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= @@ -1502,14 +1279,10 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/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.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= -golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc= -golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= 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= @@ -1579,8 +1352,6 @@ google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180518175338-11a468237815/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= @@ -1688,12 +1459,6 @@ google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+ google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 h1:DdoeryqhaXp1LtT/emMP1BRJPHHKFi5akj/nbx/zNTA= google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b h1:+YaDE2r2OG8t/z5qmsh7Y+XXwCbvadxxZ0YY6mTdrVA= -google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= -google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b h1:CIC2YMXmIhYw6evmhPxBKJ4fmLbOFtXQN/GV3XOZR8k= -google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b h1:ZlWIi1wSK56/8hn4QcBp/j9M7Gt3U/3hZw3mC7vDICo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= google.golang.org/grpc v1.52.3 h1:pf7sOysg4LdgBqduXveGKrcEwbStiK2rtfghdzlUYDQ= google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= @@ -1719,14 +1484,11 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 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-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/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/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -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/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= @@ -1754,9 +1516,6 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= inet.af/netaddr v0.0.0-20211027220019-c74959edd3b6 h1:acCzuUSQ79tGsM/O50VRFySfMm19IoMKL+sZztZkCxw= inet.af/netaddr v0.0.0-20211027220019-c74959edd3b6/go.mod h1:y3MGhcFMlh0KZPMuXXow8mpjxxAk3yoDNsp4cQz54i8= -inet.af/netaddr v0.0.0-20230525184311-b8eac61e914a h1:1XCVEdxrvL6c0TGOhecLuB7U9zYNdxZEjvOqJreKZiM= -inet.af/netaddr v0.0.0-20230525184311-b8eac61e914a/go.mod h1:e83i32mAQOW1LAqEIweALsuK2Uw4mhQadA5r7b0Wobo= -nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/loggers/dnstapclient.go b/loggers/dnstapclient.go index 7628b299..b13c105f 100644 --- a/loggers/dnstapclient.go +++ b/loggers/dnstapclient.go @@ -25,6 +25,7 @@ type DnstapSender struct { logger *logger.Logger fs *framestream.Fstrm fsReady bool + transport string transportConn net.Conn transportReady chan bool transportReconnect chan bool @@ -58,6 +59,17 @@ func (c *DnstapSender) GetName() string { return c.name } func (c *DnstapSender) SetLoggers(loggers []dnsutils.Worker) {} func (o *DnstapSender) ReadConfig() { + o.transport = o.config.Loggers.Dnstap.Transport + + // begin backward compatibility + if o.config.Loggers.Dnstap.TlsSupport { + o.transport = dnsutils.SOCKET_TLS + } + if len(o.config.Loggers.Dnstap.SockPath) > 0 { + o.transport = dnsutils.SOCKET_UNIX + } + // end + // get hostname or global one if o.config.Loggers.Dnstap.ServerId == "" { o.config.Loggers.Dnstap.ServerId = o.config.GetServerIdentity() @@ -109,46 +121,55 @@ func (o *DnstapSender) Disconnect() { } func (o *DnstapSender) ConnectToRemote() { - - // prepare the address - var address string - var transport string - if len(o.config.Loggers.Dnstap.SockPath) > 0 { - address = o.config.Loggers.Dnstap.SockPath - transport = dnsutils.SOCKET_UNIX - } else { - address = net.JoinHostPort( - o.config.Loggers.Dnstap.RemoteAddress, - strconv.Itoa(o.config.Loggers.Dnstap.RemotePort), - ) - transport = dnsutils.SOCKET_TCP - } - - connTimeout := time.Duration(o.config.Loggers.Dnstap.ConnectTimeout) * time.Second - - // make the connection for { if o.transportConn != nil { o.transportConn.Close() o.transportConn = nil } - o.LogInfo("connecting to %s", address) + address := net.JoinHostPort( + o.config.Loggers.Dnstap.RemoteAddress, + strconv.Itoa(o.config.Loggers.Dnstap.RemotePort), + ) + connTimeout := time.Duration(o.config.Loggers.Dnstap.ConnectTimeout) * time.Second + + // make the connection var conn net.Conn var err error - if o.config.Loggers.Dnstap.TlsSupport { - tlsConfig := &tls.Config{ - InsecureSkipVerify: false, - MinVersion: tls.VersionTLS12, + + switch o.transport { + case dnsutils.SOCKET_UNIX: + address = o.config.Loggers.Dnstap.RemoteAddress + if len(o.config.Loggers.Dnstap.SockPath) > 0 { + address = o.config.Loggers.Dnstap.SockPath } - tlsConfig.InsecureSkipVerify = o.config.Loggers.Dnstap.TlsInsecure - tlsConfig.MinVersion = dnsutils.TLS_VERSION[o.config.Loggers.Dnstap.TlsMinVersion] + o.LogInfo("connecting to %s://%s", o.transport, address) + conn, err = net.DialTimeout(o.transport, address, connTimeout) - dialer := &net.Dialer{Timeout: connTimeout} - conn, err = tls.DialWithDialer(dialer, transport, address, tlsConfig) - } else { + case dnsutils.SOCKET_TCP: + o.LogInfo("connecting to %s://%s", o.transport, address) + conn, err = net.DialTimeout(o.transport, address, connTimeout) - conn, err = net.DialTimeout(transport, address, connTimeout) + case dnsutils.SOCKET_TLS: + o.LogInfo("connecting to %s://%s", o.transport, address) + + var tlsConfig *tls.Config + + tlsOptions := dnsutils.TlsOptions{ + InsecureSkipVerify: o.config.Loggers.Dnstap.TlsInsecure, + MinVersion: o.config.Loggers.Dnstap.TlsMinVersion, + CAFile: o.config.Loggers.Dnstap.CAFile, + CertFile: o.config.Loggers.Dnstap.CertFile, + KeyFile: o.config.Loggers.Dnstap.KeyFile, + } + + tlsConfig, err = dnsutils.TlsClientConfig(tlsOptions) + if err == nil { + dialer := &net.Dialer{Timeout: connTimeout} + conn, err = tls.DialWithDialer(dialer, dnsutils.SOCKET_TCP, address, tlsConfig) + } + default: + o.logger.Fatal("logger=dnstap - invalid transport:", o.transport) } // something is wrong during connection ? diff --git a/loggers/fluentd.go b/loggers/fluentd.go index f7dcc25d..290d32fd 100644 --- a/loggers/fluentd.go +++ b/loggers/fluentd.go @@ -2,6 +2,8 @@ package loggers import ( "crypto/tls" + "errors" + "io" "net" "strconv" "time" @@ -17,11 +19,14 @@ type FluentdClient struct { doneProcess chan bool stopRun chan bool doneRun chan bool + stopRead chan bool + doneRead chan bool inputChan chan dnsutils.DnsMessage outputChan chan dnsutils.DnsMessage config *dnsutils.Config configChan chan *dnsutils.Config logger *logger.Logger + transport string transportConn net.Conn transportReady chan bool transportReconnect chan bool @@ -36,6 +41,8 @@ func NewFluentdClient(config *dnsutils.Config, logger *logger.Logger, name strin doneProcess: make(chan bool), stopRun: make(chan bool), doneRun: make(chan bool), + stopRead: make(chan bool), + doneRead: make(chan bool), inputChan: make(chan dnsutils.DnsMessage, config.Loggers.Fluentd.ChannelBufferSize), outputChan: make(chan dnsutils.DnsMessage, config.Loggers.Fluentd.ChannelBufferSize), transportReady: make(chan bool), @@ -56,9 +63,16 @@ func (c *FluentdClient) GetName() string { return c.name } func (c *FluentdClient) SetLoggers(loggers []dnsutils.Worker) {} func (o *FluentdClient) ReadConfig() { - if !dnsutils.IsValidTLS(o.config.Loggers.Fluentd.TlsMinVersion) { - o.logger.Fatal("logger=fluentd - invalid tls min version") + o.transport = o.config.Loggers.Fluentd.Transport + + // begin backward compatibility + if o.config.Loggers.Fluentd.TlsSupport { + o.transport = dnsutils.SOCKET_TLS + } + if len(o.config.Loggers.Fluentd.SockPath) > 0 { + o.transport = dnsutils.SOCKET_UNIX } + // end } func (o *FluentdClient) ReloadConfig(config *dnsutils.Config) { @@ -83,6 +97,10 @@ func (o *FluentdClient) Stop() { o.stopRun <- true <-o.doneRun + o.LogInfo("stopping to read...") + o.stopRead <- true + <-o.doneRead + o.LogInfo("stopping to process...") o.stopProcess <- true <-o.doneProcess @@ -95,41 +113,77 @@ func (o *FluentdClient) Disconnect() { } } -func (o *FluentdClient) ConnectToRemote() { - // prepare the address - var address string - if len(o.config.Loggers.Fluentd.SockPath) > 0 { - address = o.config.Loggers.Fluentd.SockPath - } else { - address = o.config.Loggers.Fluentd.RemoteAddress + ":" + strconv.Itoa(o.config.Loggers.Fluentd.RemotePort) - } +func (o *FluentdClient) ReadFromConnection() { + buffer := make([]byte, 4096) + + go func() { + for { + _, err := o.transportConn.Read(buffer) + if err != nil { + if errors.Is(err, io.EOF) || errors.Is(err, net.ErrClosed) { + o.LogInfo("read from connection terminated") + break + } + o.LogError("Error on reading: %s", err.Error()) + } + // We just discard the data + } + }() - connTimeout := time.Duration(o.config.Loggers.Dnstap.ConnectTimeout) * time.Second + // block goroutine until receive true event in stopRead channel + <-o.stopRead + o.doneRead <- true + + o.LogInfo("read goroutine terminated") +} - // make the connection +func (o *FluentdClient) ConnectToRemote() { for { if o.transportConn != nil { o.transportConn.Close() o.transportConn = nil } + address := o.config.Loggers.Fluentd.RemoteAddress + ":" + strconv.Itoa(o.config.Loggers.Fluentd.RemotePort) + connTimeout := time.Duration(o.config.Loggers.Fluentd.ConnectTimeout) * time.Second + // make the connection - o.LogInfo("connecting to %s", address) - //var conn net.Conn + var conn net.Conn var err error - if o.config.Loggers.Fluentd.TlsSupport { - tlsConfig := &tls.Config{ - InsecureSkipVerify: false, - MinVersion: tls.VersionTLS12, + + switch o.transport { + case dnsutils.SOCKET_UNIX: + address = o.config.Loggers.Fluentd.RemoteAddress + if len(o.config.Loggers.Fluentd.SockPath) > 0 { + address = o.config.Loggers.Fluentd.SockPath } + o.LogInfo("connecting to %s://%s", o.transport, address) + conn, err = net.DialTimeout(o.transport, address, connTimeout) + + case dnsutils.SOCKET_TCP: + o.LogInfo("connecting to %s://%s", o.transport, address) + conn, err = net.DialTimeout(o.transport, address, connTimeout) + + case dnsutils.SOCKET_TLS: + o.LogInfo("connecting to %s://%s", o.transport, address) - tlsConfig.InsecureSkipVerify = o.config.Loggers.Fluentd.TlsInsecure - tlsConfig.MinVersion = dnsutils.TLS_VERSION[o.config.Loggers.Fluentd.TlsMinVersion] + var tlsConfig *tls.Config - dialer := &net.Dialer{Timeout: connTimeout} - o.transportConn, err = tls.DialWithDialer(dialer, o.config.Loggers.Fluentd.Transport, address, tlsConfig) - } else { - o.transportConn, err = net.DialTimeout(o.config.Loggers.Fluentd.Transport, address, connTimeout) + tlsOptions := dnsutils.TlsOptions{ + InsecureSkipVerify: o.config.Loggers.Fluentd.TlsInsecure, + MinVersion: o.config.Loggers.Fluentd.TlsMinVersion, + CAFile: o.config.Loggers.Fluentd.CAFile, + CertFile: o.config.Loggers.Fluentd.CertFile, + KeyFile: o.config.Loggers.Fluentd.KeyFile, + } + + tlsConfig, err = dnsutils.TlsClientConfig(tlsOptions) + if err == nil { + dialer := &net.Dialer{Timeout: connTimeout} + conn, err = tls.DialWithDialer(dialer, dnsutils.SOCKET_TCP, address, tlsConfig) + } + default: + o.logger.Fatal("logger=fluent - invalid transport:", o.transport) } // something is wrong during connection ? @@ -140,6 +194,8 @@ func (o *FluentdClient) ConnectToRemote() { continue } + o.transportConn = conn + // block until framestream is ready o.transportReady <- true @@ -240,7 +296,7 @@ func (o *FluentdClient) Process() { bufferDm := []dnsutils.DnsMessage{} // init flust timer for buffer - flushInterval := time.Duration(o.config.Loggers.TcpClient.FlushInterval) * time.Second + flushInterval := time.Duration(o.config.Loggers.Fluentd.FlushInterval) * time.Second flushTimer := time.NewTimer(flushInterval) o.LogInfo("ready to process") @@ -256,6 +312,9 @@ PROCESS_LOOP: o.LogInfo("connected") o.writerReady = true + // read from the connection until we stop + go o.ReadFromConnection() + // incoming dns message to process case dm, opened := <-o.outputChan: if !opened { @@ -273,7 +332,7 @@ PROCESS_LOOP: bufferDm = append(bufferDm, dm) // buffer is full ? - if len(bufferDm) >= o.config.Loggers.TcpClient.BufferSize { + if len(bufferDm) >= o.config.Loggers.Fluentd.BufferSize { o.FlushBuffer(&bufferDm) } diff --git a/loggers/fluentd_test.go b/loggers/fluentd_test.go index 01fa297e..80bf8f3b 100644 --- a/loggers/fluentd_test.go +++ b/loggers/fluentd_test.go @@ -29,7 +29,7 @@ func Test_FluentdClient(t *testing.T) { g := NewFluentdClient(cfg, logger.New(false), "test") // fake msgpack receiver - fakeRcvr, err := net.Listen(tc.transport, ":24224") + fakeRcvr, err := net.Listen(tc.transport, tc.address) if err != nil { t.Fatal(err) } @@ -66,6 +66,10 @@ func Test_FluentdClient(t *testing.T) { if dm.DNS.Qname != dmRcv.DNS.Qname { t.Errorf("qname error want %s, got %s", dm.DNS.Qname, dmRcv.DNS.Qname) } + + // stop all + fakeRcvr.Close() + g.Stop() }) } } diff --git a/loggers/influxdb.go b/loggers/influxdb.go index 4db38055..0c03b966 100644 --- a/loggers/influxdb.go +++ b/loggers/influxdb.go @@ -1,7 +1,6 @@ package loggers import ( - "crypto/tls" "time" "github.com/dmachard/go-dnscollector/dnsutils" @@ -52,11 +51,7 @@ func (c *InfluxDBClient) GetName() string { return c.name } func (c *InfluxDBClient) SetLoggers(loggers []dnsutils.Worker) {} -func (o *InfluxDBClient) ReadConfig() { - if !dnsutils.IsValidTLS(o.config.Loggers.InfluxDB.TlsMinVersion) { - o.logger.Fatal("logger=influxdb - invalid tls min version") - } -} +func (o *InfluxDBClient) ReadConfig() {} func (o *InfluxDBClient) ReloadConfig(config *dnsutils.Config) { o.LogInfo("reload configuration!") @@ -139,13 +134,18 @@ func (o *InfluxDBClient) Process() { opts := influxdb2.DefaultOptions() opts.SetUseGZip(true) if o.config.Loggers.InfluxDB.TlsSupport { - tlsConfig := &tls.Config{ - InsecureSkipVerify: false, - MinVersion: tls.VersionTLS12, + tlsOptions := dnsutils.TlsOptions{ + InsecureSkipVerify: o.config.Loggers.InfluxDB.TlsInsecure, + MinVersion: o.config.Loggers.InfluxDB.TlsMinVersion, + CAFile: o.config.Loggers.InfluxDB.CAFile, + CertFile: o.config.Loggers.InfluxDB.CertFile, + KeyFile: o.config.Loggers.InfluxDB.KeyFile, } - tlsConfig.InsecureSkipVerify = o.config.Loggers.InfluxDB.TlsInsecure - tlsConfig.MinVersion = dnsutils.TLS_VERSION[o.config.Loggers.InfluxDB.TlsMinVersion] + tlsConfig, err := dnsutils.TlsClientConfig(tlsOptions) + if err != nil { + o.logger.Fatal("logger=influxdb - tls config failed:", err) + } opts.SetTLSConfig(tlsConfig) } diff --git a/loggers/kafkaproducer.go b/loggers/kafkaproducer.go index 8744efb8..57503659 100644 --- a/loggers/kafkaproducer.go +++ b/loggers/kafkaproducer.go @@ -3,7 +3,6 @@ package loggers import ( "bytes" "context" - "crypto/tls" "encoding/json" "strconv" "strings" @@ -62,11 +61,6 @@ func (c *KafkaProducer) GetName() string { return c.name } func (c *KafkaProducer) SetLoggers(loggers []dnsutils.Worker) {} func (o *KafkaProducer) ReadConfig() { - - if o.config.Loggers.RedisPub.TlsSupport && !dnsutils.IsValidTLS(o.config.Loggers.RedisPub.TlsMinVersion) { - o.logger.Fatal("logger to kafka - invalid tls min version") - } - if len(o.config.Loggers.RedisPub.TextFormat) > 0 { o.textFormat = strings.Fields(o.config.Loggers.RedisPub.TextFormat) } else { @@ -131,13 +125,18 @@ func (o *KafkaProducer) ConnectToKafka(ctx context.Context, readyTimer *time.Tim // enable TLS if o.config.Loggers.KafkaProducer.TlsSupport { - tlsConfig := &tls.Config{ - MinVersion: tls.VersionTLS12, - InsecureSkipVerify: false, + tlsOptions := dnsutils.TlsOptions{ + InsecureSkipVerify: o.config.Loggers.KafkaProducer.TlsInsecure, + MinVersion: o.config.Loggers.KafkaProducer.TlsMinVersion, + CAFile: o.config.Loggers.KafkaProducer.CAFile, + CertFile: o.config.Loggers.KafkaProducer.CertFile, + KeyFile: o.config.Loggers.KafkaProducer.KeyFile, } - tlsConfig.InsecureSkipVerify = o.config.Loggers.TcpClient.TlsInsecure - tlsConfig.MinVersion = dnsutils.TLS_VERSION[o.config.Loggers.TcpClient.TlsMinVersion] + tlsConfig, err := dnsutils.TlsClientConfig(tlsOptions) + if err != nil { + o.logger.Fatal("logger=kafka - tls config failed:", err) + } dialer.TLS = tlsConfig } diff --git a/loggers/lokiclient.go b/loggers/lokiclient.go index 95b22a10..d804a5e6 100644 --- a/loggers/lokiclient.go +++ b/loggers/lokiclient.go @@ -4,7 +4,6 @@ import ( "bufio" "bytes" "context" - "crypto/tls" "encoding/json" "fmt" "io" @@ -115,10 +114,6 @@ func (c *LokiClient) GetName() string { return c.name } func (c *LokiClient) SetLoggers(loggers []dnsutils.Worker) {} func (o *LokiClient) ReadConfig() { - if !dnsutils.IsValidTLS(o.config.Loggers.LokiClient.TlsMinVersion) { - o.logger.Fatal("logger=loki - invalid tls min version") - } - if len(o.config.Loggers.LokiClient.TextFormat) > 0 { o.textFormat = strings.Fields(o.config.Loggers.LokiClient.TextFormat) } else { @@ -126,12 +121,18 @@ func (o *LokiClient) ReadConfig() { } // tls client config - tlsConfig := &tls.Config{ - MinVersion: tls.VersionTLS12, - InsecureSkipVerify: false, + tlsOptions := dnsutils.TlsOptions{ + InsecureSkipVerify: o.config.Loggers.LokiClient.TlsInsecure, + MinVersion: o.config.Loggers.LokiClient.TlsMinVersion, + CAFile: o.config.Loggers.LokiClient.CAFile, + CertFile: o.config.Loggers.LokiClient.CertFile, + KeyFile: o.config.Loggers.LokiClient.KeyFile, + } + + tlsConfig, err := dnsutils.TlsClientConfig(tlsOptions) + if err != nil { + o.logger.Fatal("logger=loki - tls config failed:", err) } - tlsConfig.InsecureSkipVerify = o.config.Loggers.LokiClient.TlsInsecure - tlsConfig.MinVersion = dnsutils.TLS_VERSION[o.config.Loggers.LokiClient.TlsMinVersion] // prepare http client tr := &http.Transport{ @@ -145,7 +146,7 @@ func (o *LokiClient) ReadConfig() { if len(o.config.Loggers.LokiClient.ProxyURL) > 0 { proxyURL, err := url.Parse(o.config.Loggers.LokiClient.ProxyURL) if err != nil { - o.logger.Fatal("unable to parse proxy url: ", err) + o.logger.Fatal("logger=loki - unable to parse proxy url: ", err) } tr.Proxy = http.ProxyURL(proxyURL) } @@ -155,7 +156,7 @@ func (o *LokiClient) ReadConfig() { if o.config.Loggers.LokiClient.BasicAuthPwdFile != "" { content, err := os.ReadFile(o.config.Loggers.LokiClient.BasicAuthPwdFile) if err != nil { - o.logger.Fatal("unable to load password from file: ", err) + o.logger.Fatal("logger=loki - unable to load password from file: ", err) } o.config.Loggers.LokiClient.BasicAuthPwd = string(content) } @@ -407,7 +408,7 @@ func (o *LokiClient) SendEntries(buf []byte) { } post = post.WithContext(ctx) post.Header.Set("Content-Type", "application/x-protobuf") - post.Header.Set("User-Agent", "dnscollector") + post.Header.Set("User-Agent", o.config.GetServerIdentity()) if len(o.config.Loggers.LokiClient.TenantId) > 0 { post.Header.Set("X-Scope-OrgID", o.config.Loggers.LokiClient.TenantId) } diff --git a/loggers/redispub.go b/loggers/redispub.go index 3907bd01..60a5f940 100644 --- a/loggers/redispub.go +++ b/loggers/redispub.go @@ -6,6 +6,7 @@ import ( "crypto/tls" "encoding/json" "errors" + "io" "net" "strconv" "strings" @@ -21,8 +22,8 @@ type RedisPub struct { doneProcess chan bool stopRun chan bool doneRun chan bool - stopReceive chan bool - doneReceive chan bool + stopRead chan bool + doneRead chan bool inputChan chan dnsutils.DnsMessage outputChan chan dnsutils.DnsMessage config *dnsutils.Config @@ -30,6 +31,7 @@ type RedisPub struct { logger *logger.Logger textFormat []string name string + transport string transportWriter *bufio.Writer transportConn net.Conn transportReady chan bool @@ -44,6 +46,8 @@ func NewRedisPub(config *dnsutils.Config, logger *logger.Logger, name string) *R doneProcess: make(chan bool), stopRun: make(chan bool), doneRun: make(chan bool), + stopRead: make(chan bool), + doneRead: make(chan bool), inputChan: make(chan dnsutils.DnsMessage, config.Loggers.RedisPub.ChannelBufferSize), outputChan: make(chan dnsutils.DnsMessage, config.Loggers.RedisPub.ChannelBufferSize), transportReady: make(chan bool), @@ -65,9 +69,16 @@ func (c *RedisPub) SetLoggers(loggers []dnsutils.Worker) {} func (o *RedisPub) ReadConfig() { - if o.config.Loggers.RedisPub.TlsSupport && !dnsutils.IsValidTLS(o.config.Loggers.RedisPub.TlsMinVersion) { - o.logger.Fatal("logger=redispub - invalid tls min version") + o.transport = o.config.Loggers.RedisPub.Transport + + // begin backward compatibility + if o.config.Loggers.RedisPub.TlsSupport { + o.transport = dnsutils.SOCKET_TLS + } + if len(o.config.Loggers.RedisPub.SockPath) > 0 { + o.transport = dnsutils.SOCKET_UNIX } + // end if len(o.config.Loggers.RedisPub.TextFormat) > 0 { o.textFormat = strings.Fields(o.config.Loggers.RedisPub.TextFormat) @@ -98,13 +109,13 @@ func (o *RedisPub) Stop() { o.stopRun <- true <-o.doneRun + o.LogInfo("stopping to receive...") + o.stopRead <- true + <-o.doneRead + o.LogInfo("stopping to process...") o.stopProcess <- true <-o.doneProcess - - o.LogInfo("stopping to receive...") - o.stopReceive <- true - <-o.doneReceive } func (o *RedisPub) Disconnect() { @@ -115,61 +126,76 @@ func (o *RedisPub) Disconnect() { } func (o *RedisPub) ReadFromConnection() { - buf := make([]byte, 4096) + buffer := make([]byte, 4096) - for { - select { - // Stop signal received, exit the goroutine - case <-o.stopReceive: - o.doneReceive <- true - return - default: - _, err := o.transportConn.Read(buf) + go func() { + for { + _, err := o.transportConn.Read(buffer) if err != nil { - var netErr net.Error - if errors.As(err, &netErr) && netErr.Timeout() { - continue + if errors.Is(err, io.EOF) || errors.Is(err, net.ErrClosed) { + o.LogInfo("read from connection terminated") + break } - o.LogError("Error reading from connection: %s", err.Error()) - return + o.LogError("Error on reading: %s", err.Error()) } // We just discard the data } - } + }() + + // block goroutine until receive true event in stopRead channel + <-o.stopRead + o.doneRead <- true + + o.LogInfo("read goroutine terminated") } func (o *RedisPub) ConnectToRemote() { - // prepare the address - var address string - if len(o.config.Loggers.RedisPub.SockPath) > 0 { - address = o.config.Loggers.RedisPub.SockPath - } else { - address = o.config.Loggers.RedisPub.RemoteAddress + ":" + strconv.Itoa(o.config.Loggers.RedisPub.RemotePort) - } - connTimeout := time.Duration(o.config.Loggers.RedisPub.ConnectTimeout) * time.Second - for { if o.transportConn != nil { o.transportConn.Close() o.transportConn = nil } - // make the connection - o.LogInfo("connecting to %s", address) + address := o.config.Loggers.RedisPub.RemoteAddress + ":" + strconv.Itoa(o.config.Loggers.RedisPub.RemotePort) + connTimeout := time.Duration(o.config.Loggers.RedisPub.ConnectTimeout) * time.Second + var conn net.Conn var err error - if o.config.Loggers.RedisPub.TlsSupport { - tlsConfig := &tls.Config{ - MinVersion: tls.VersionTLS12, - InsecureSkipVerify: false, + + switch o.transport { + case dnsutils.SOCKET_UNIX: + address = o.config.Loggers.RedisPub.RemoteAddress + if len(o.config.Loggers.RedisPub.SockPath) > 0 { + address = o.config.Loggers.RedisPub.SockPath + } + o.LogInfo("connecting to %s://%s", o.transport, address) + conn, err = net.DialTimeout(o.transport, address, connTimeout) + + case dnsutils.SOCKET_TCP: + o.LogInfo("connecting to %s://%s", o.transport, address) + conn, err = net.DialTimeout(o.transport, address, connTimeout) + + case dnsutils.SOCKET_TLS: + o.LogInfo("connecting to %s://%s", o.transport, address) + + var tlsConfig *tls.Config + + tlsOptions := dnsutils.TlsOptions{ + InsecureSkipVerify: o.config.Loggers.RedisPub.TlsInsecure, + MinVersion: o.config.Loggers.RedisPub.TlsMinVersion, + CAFile: o.config.Loggers.RedisPub.CAFile, + CertFile: o.config.Loggers.RedisPub.CertFile, + KeyFile: o.config.Loggers.RedisPub.KeyFile, } - tlsConfig.InsecureSkipVerify = o.config.Loggers.RedisPub.TlsInsecure - tlsConfig.MinVersion = dnsutils.TLS_VERSION[o.config.Loggers.RedisPub.TlsMinVersion] - dialer := &net.Dialer{Timeout: connTimeout} - conn, err = tls.DialWithDialer(dialer, o.config.Loggers.RedisPub.Transport, address, tlsConfig) - } else { - conn, err = net.DialTimeout(o.config.Loggers.RedisPub.Transport, address, connTimeout) + tlsConfig, err = dnsutils.TlsClientConfig(tlsOptions) + if err == nil { + dialer := &net.Dialer{Timeout: connTimeout} + conn, err = tls.DialWithDialer(dialer, dnsutils.SOCKET_TCP, address, tlsConfig) + } + + default: + o.logger.Fatal("logger=redispub - invalid transport:", o.transport) } // something is wrong during connection ? diff --git a/loggers/redispub_test.go b/loggers/redispub_test.go index b176622e..43b4cdcc 100644 --- a/loggers/redispub_test.go +++ b/loggers/redispub_test.go @@ -81,6 +81,10 @@ func Test_RedisPubRun(t *testing.T) { if !pattern2.MatchString(line) { t.Errorf("redis error want %s, got: %s", pattern2, line) } + + // stop all + fakeRcvr.Close() + g.Stop() }) } } diff --git a/loggers/scalyr.go b/loggers/scalyr.go index b849d1e9..2a7d97b5 100644 --- a/loggers/scalyr.go +++ b/loggers/scalyr.go @@ -3,7 +3,6 @@ package loggers import ( "bytes" "context" - "crypto/tls" "encoding/json" "fmt" "io" @@ -111,18 +110,19 @@ func (c *ScalyrClient) ReadConfig() { c.flush = time.NewTicker(time.Duration(flushInterval) * time.Second) } - tlsMinVersion := "TLS_v12" - if dnsutils.IsValidTLS(tlsMinVersion) { - tlsMinVersion = c.config.Loggers.ScalyrClient.TlsMinVersion + // tls client config + tlsOptions := dnsutils.TlsOptions{ + InsecureSkipVerify: c.config.Loggers.ScalyrClient.TlsInsecure, + MinVersion: c.config.Loggers.ScalyrClient.TlsMinVersion, + CAFile: c.config.Loggers.ScalyrClient.CAFile, + CertFile: c.config.Loggers.ScalyrClient.CertFile, + KeyFile: c.config.Loggers.ScalyrClient.KeyFile, } - // tls client config - tlsConfig := &tls.Config{ - MinVersion: tls.VersionTLS12, - InsecureSkipVerify: false, + tlsConfig, err := dnsutils.TlsClientConfig(tlsOptions) + if err != nil { + c.logger.Fatal("unable to parse tls confgi: ", err) } - tlsConfig.InsecureSkipVerify = c.config.Loggers.ScalyrClient.TlsInsecure - tlsConfig.MinVersion = dnsutils.TLS_VERSION[tlsMinVersion] // prepare http client tr := &http.Transport{ diff --git a/loggers/statsd.go b/loggers/statsd.go index 39522153..72376f55 100644 --- a/loggers/statsd.go +++ b/loggers/statsd.go @@ -303,22 +303,37 @@ PROCESS_LOOP: case <-t2.C: address := o.config.Loggers.Statsd.RemoteAddress + ":" + strconv.Itoa(o.config.Loggers.Statsd.RemotePort) + connTimeout := time.Duration(o.config.Loggers.Statsd.ConnectTimeout) * time.Second // make the connection - o.LogInfo("dial to %s", address) var conn net.Conn var err error - if o.config.Loggers.Statsd.TlsSupport { - tlsConfig := &tls.Config{ - MinVersion: tls.VersionTLS12, - InsecureSkipVerify: false, + + switch o.config.Loggers.Statsd.Transport { + case dnsutils.SOCKET_TCP, dnsutils.SOCKET_UDP: + o.LogInfo("connecting to %s://%s", o.config.Loggers.Statsd.Transport, address) + conn, err = net.DialTimeout(o.config.Loggers.Statsd.Transport, address, connTimeout) + + case dnsutils.SOCKET_TLS: + o.LogInfo("connecting to %s://%s", o.config.Loggers.Statsd.Transport, address) + + var tlsConfig *tls.Config + + tlsOptions := dnsutils.TlsOptions{ + InsecureSkipVerify: o.config.Loggers.Statsd.TlsInsecure, + MinVersion: o.config.Loggers.Statsd.TlsMinVersion, + CAFile: o.config.Loggers.Statsd.CAFile, + CertFile: o.config.Loggers.Statsd.CertFile, + KeyFile: o.config.Loggers.Statsd.KeyFile, } - tlsConfig.InsecureSkipVerify = o.config.Loggers.Statsd.TlsInsecure - tlsConfig.MinVersion = dnsutils.TLS_VERSION[o.config.Loggers.Statsd.TlsMinVersion] - conn, err = tls.Dial(o.config.Loggers.Statsd.Transport, address, tlsConfig) - } else { - conn, err = net.Dial(o.config.Loggers.Statsd.Transport, address) + tlsConfig, err = dnsutils.TlsClientConfig(tlsOptions) + if err == nil { + dialer := &net.Dialer{Timeout: connTimeout} + conn, err = tls.DialWithDialer(dialer, dnsutils.SOCKET_TCP, address, tlsConfig) + } + default: + o.logger.Fatal("logger=statsd - invalid transport:", o.config.Loggers.Statsd.Transport) } // something is wrong during connection ? diff --git a/loggers/syslog.go b/loggers/syslog.go index 7428acf4..540e4513 100644 --- a/loggers/syslog.go +++ b/loggers/syslog.go @@ -151,8 +151,6 @@ func (o *Syslog) Stop() { } func (o *Syslog) ConnectToRemote() { - //connTimeout := time.Duration(o.config.Loggers.Dnstap.ConnectTimeout) * time.Second - for { if o.syslogWriter != nil { o.syslogWriter.Close() @@ -160,6 +158,7 @@ func (o *Syslog) ConnectToRemote() { } var logWriter *syslog.Writer + var tlsConfig *tls.Config var err error switch o.config.Loggers.Syslog.Transport { @@ -167,27 +166,32 @@ func (o *Syslog) ConnectToRemote() { o.LogInfo("connecting to local syslog...") logWriter, err = syslog.New(o.facility|o.severity, "") case dnsutils.SOCKET_UNIX, dnsutils.SOCKET_UDP, dnsutils.SOCKET_TCP: - o.LogInfo("connecting to syslog %s://%s ...", + o.LogInfo("connecting to %s://%s ...", o.config.Loggers.Syslog.Transport, o.config.Loggers.Syslog.RemoteAddress) logWriter, err = syslog.Dial(o.config.Loggers.Syslog.Transport, o.config.Loggers.Syslog.RemoteAddress, o.facility|o.severity, o.config.Loggers.Syslog.Tag) case dnsutils.SOCKET_TLS: - o.LogInfo("connecting to syslog %s://%s ...", + o.LogInfo("connecting to %s://%s ...", o.config.Loggers.Syslog.Transport, o.config.Loggers.Syslog.RemoteAddress) - tlsConfig := &tls.Config{ - MinVersion: tls.VersionTLS12, - InsecureSkipVerify: false, + + tlsOptions := dnsutils.TlsOptions{ + InsecureSkipVerify: o.config.Loggers.Syslog.TlsInsecure, + MinVersion: o.config.Loggers.Syslog.TlsMinVersion, + CAFile: o.config.Loggers.Syslog.CAFile, + CertFile: o.config.Loggers.Syslog.CertFile, + KeyFile: o.config.Loggers.Syslog.KeyFile, } - tlsConfig.InsecureSkipVerify = o.config.Loggers.Syslog.TlsInsecure - tlsConfig.MinVersion = dnsutils.TLS_VERSION[o.config.Loggers.Syslog.TlsMinVersion] - logWriter, err = syslog.DialWithTLSConfig(o.config.Loggers.Syslog.Transport, - o.config.Loggers.Syslog.RemoteAddress, o.facility|o.severity, - o.config.Loggers.Syslog.Tag, - tlsConfig) + tlsConfig, err = dnsutils.TlsClientConfig(tlsOptions) + if err == nil { + logWriter, err = syslog.DialWithTLSConfig(o.config.Loggers.Syslog.Transport, + o.config.Loggers.Syslog.RemoteAddress, o.facility|o.severity, + o.config.Loggers.Syslog.Tag, + tlsConfig) + } default: o.logger.Fatal("invalid syslog transport: ", o.config.Loggers.Syslog.Transport) } diff --git a/loggers/tcpclient.go b/loggers/tcpclient.go index 16d1bd27..b4024b34 100644 --- a/loggers/tcpclient.go +++ b/loggers/tcpclient.go @@ -4,6 +4,8 @@ import ( "bufio" "crypto/tls" "encoding/json" + "errors" + "io" "net" "strconv" "strings" @@ -19,6 +21,8 @@ type TcpClient struct { doneProcess chan bool stopRun chan bool doneRun chan bool + stopRead chan bool + doneRead chan bool inputChan chan dnsutils.DnsMessage outputChan chan dnsutils.DnsMessage config *dnsutils.Config @@ -26,6 +30,7 @@ type TcpClient struct { logger *logger.Logger textFormat []string name string + transport string transportWriter *bufio.Writer transportConn net.Conn transportReady chan bool @@ -40,6 +45,8 @@ func NewTcpClient(config *dnsutils.Config, logger *logger.Logger, name string) * doneProcess: make(chan bool), stopRun: make(chan bool), doneRun: make(chan bool), + stopRead: make(chan bool), + doneRead: make(chan bool), inputChan: make(chan dnsutils.DnsMessage, config.Loggers.TcpClient.ChannelBufferSize), outputChan: make(chan dnsutils.DnsMessage, config.Loggers.TcpClient.ChannelBufferSize), transportReady: make(chan bool), @@ -60,9 +67,16 @@ func (c *TcpClient) GetName() string { return c.name } func (c *TcpClient) SetLoggers(loggers []dnsutils.Worker) {} func (o *TcpClient) ReadConfig() { - if !dnsutils.IsValidTLS(o.config.Loggers.TcpClient.TlsMinVersion) { - o.logger.Fatal("logger tcp - invalid tls min version") + o.transport = o.config.Loggers.TcpClient.Transport + + // begin backward compatibility + if o.config.Loggers.TcpClient.TlsSupport { + o.transport = dnsutils.SOCKET_TLS + } + if len(o.config.Loggers.TcpClient.SockPath) > 0 { + o.transport = dnsutils.SOCKET_UNIX } + // end if len(o.config.Loggers.TcpClient.TextFormat) > 0 { o.textFormat = strings.Fields(o.config.Loggers.TcpClient.TextFormat) @@ -93,6 +107,10 @@ func (o *TcpClient) Stop() { o.stopRun <- true <-o.doneRun + o.LogInfo("stopping to read...") + o.stopRead <- true + <-o.doneRead + o.LogInfo("stopping to process...") o.stopProcess <- true <-o.doneProcess @@ -105,38 +123,77 @@ func (o *TcpClient) Disconnect() { } } -func (o *TcpClient) ConnectToRemote() { - // prepare the address - var address string - if len(o.config.Loggers.TcpClient.SockPath) > 0 { - address = o.config.Loggers.TcpClient.SockPath - } else { - address = o.config.Loggers.TcpClient.RemoteAddress + ":" + strconv.Itoa(o.config.Loggers.TcpClient.RemotePort) - } - connTimeout := time.Duration(o.config.Loggers.TcpClient.ConnectTimeout) * time.Second +func (o *TcpClient) ReadFromConnection() { + buffer := make([]byte, 4096) + + go func() { + for { + _, err := o.transportConn.Read(buffer) + if err != nil { + if errors.Is(err, io.EOF) || errors.Is(err, net.ErrClosed) { + o.LogInfo("read from connection terminated") + break + } + o.LogError("Error on reading: %s", err.Error()) + } + // We just discard the data + } + }() + + // block goroutine until receive true event in stopRead channel + <-o.stopRead + o.doneRead <- true + o.LogInfo("read goroutine terminated") +} + +func (o *TcpClient) ConnectToRemote() { for { if o.transportConn != nil { o.transportConn.Close() o.transportConn = nil } + address := o.config.Loggers.TcpClient.RemoteAddress + ":" + strconv.Itoa(o.config.Loggers.TcpClient.RemotePort) + connTimeout := time.Duration(o.config.Loggers.TcpClient.ConnectTimeout) * time.Second + // make the connection - o.LogInfo("connecting to %s", address) var conn net.Conn var err error - if o.config.Loggers.TcpClient.TlsSupport { - tlsConfig := &tls.Config{ - MinVersion: tls.VersionTLS12, - InsecureSkipVerify: false, + + switch o.transport { + case dnsutils.SOCKET_UNIX: + address = o.config.Loggers.TcpClient.RemoteAddress + if len(o.config.Loggers.TcpClient.SockPath) > 0 { + address = o.config.Loggers.TcpClient.SockPath + } + o.LogInfo("connecting to %s://%s", o.transport, address) + conn, err = net.DialTimeout(o.transport, address, connTimeout) + + case dnsutils.SOCKET_TCP: + o.LogInfo("connecting to %s://%s", o.transport, address) + conn, err = net.DialTimeout(o.transport, address, connTimeout) + + case dnsutils.SOCKET_TLS: + o.LogInfo("connecting to %s://%s", o.transport, address) + + var tlsConfig *tls.Config + + tlsOptions := dnsutils.TlsOptions{ + InsecureSkipVerify: o.config.Loggers.TcpClient.TlsInsecure, + MinVersion: o.config.Loggers.TcpClient.TlsMinVersion, + CAFile: o.config.Loggers.TcpClient.CAFile, + CertFile: o.config.Loggers.TcpClient.CertFile, + KeyFile: o.config.Loggers.TcpClient.KeyFile, } - tlsConfig.InsecureSkipVerify = o.config.Loggers.TcpClient.TlsInsecure - tlsConfig.MinVersion = dnsutils.TLS_VERSION[o.config.Loggers.TcpClient.TlsMinVersion] - dialer := &net.Dialer{Timeout: connTimeout} - conn, err = tls.DialWithDialer(dialer, o.config.Loggers.TcpClient.Transport, address, tlsConfig) - } else { - conn, err = net.DialTimeout(o.config.Loggers.TcpClient.Transport, address, connTimeout) + tlsConfig, err = dnsutils.TlsClientConfig(tlsOptions) + if err == nil { + dialer := &net.Dialer{Timeout: connTimeout} + conn, err = tls.DialWithDialer(dialer, dnsutils.SOCKET_TCP, address, tlsConfig) + } + default: + o.logger.Fatal("logger=tcpclient - invalid transport:", o.transport) } // something is wrong during connection ? @@ -249,7 +306,7 @@ func (o *TcpClient) Process() { bufferDm := []dnsutils.DnsMessage{} // init flust timer for buffer - flushInterval := time.Duration(o.config.Loggers.TcpClient.FlushInterval) * time.Second + flushInterval := time.Duration(o.config.Loggers.Fluentd.FlushInterval) * time.Second flushTimer := time.NewTimer(flushInterval) // init remote conn @@ -270,6 +327,9 @@ PROCESS_LOOP: o.transportWriter = bufio.NewWriter(o.transportConn) o.writerReady = true + // read from the connection until we stop + go o.ReadFromConnection() + // incoming dns message to process case dm, opened := <-o.outputChan: if !opened { diff --git a/loggers/tcpclient_test.go b/loggers/tcpclient_test.go index 03bc9f95..efd12767 100644 --- a/loggers/tcpclient_test.go +++ b/loggers/tcpclient_test.go @@ -36,6 +36,8 @@ func Test_TcpClientRun(t *testing.T) { cfg.Loggers.TcpClient.FlushInterval = 1 cfg.Loggers.TcpClient.BufferSize = 0 cfg.Loggers.TcpClient.Mode = tc.mode + cfg.Loggers.TcpClient.RemoteAddress = "127.0.0.1" + cfg.Loggers.TcpClient.RemotePort = 9999 g := NewTcpClient(cfg, logger.New(false), "test") @@ -73,8 +75,12 @@ func Test_TcpClientRun(t *testing.T) { pattern := regexp.MustCompile(tc.pattern) if !pattern.MatchString(line) { - t.Errorf("syslog error want %s, got: %s", tc.pattern, line) + t.Errorf("tcp error want %s, got: %s", tc.pattern, line) } + + // stop all + fakeRcvr.Close() + g.Stop() }) } } diff --git a/testsdata/certs/ca.crt b/testsdata/certs/ca.crt new file mode 100644 index 00000000..33b1414e --- /dev/null +++ b/testsdata/certs/ca.crt @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIIDyzCCArMCFFAqleYbCESdNX1TxODvs9no/qhDMA0GCSqGSIb3DQEBCwUAMIGh +MQswCQYDVQQGEwJGUjESMBAGA1UECAwJTm9ybWFuZGllMQ0wCwYDVQQHDARDYWVu +MRUwEwYDVQQKDAxETlNjb2xsZWN0b3IxDDAKBgNVBAsMA0ROUzEjMCEGA1UEAwwa +dHJ1c3RlZGNhLmRuc2NvbGxlY3Rvci5kZXYxJTAjBgkqhkiG9w0BCQEWFmFkbWlu +QGRuc2NvbGxlY3Rvci5kZXYwHhcNMjMxMTAxMTkyMjMwWhcNMzMxMDI5MTkyMjMw +WjCBoTELMAkGA1UEBhMCRlIxEjAQBgNVBAgMCU5vcm1hbmRpZTENMAsGA1UEBwwE +Q2FlbjEVMBMGA1UECgwMRE5TY29sbGVjdG9yMQwwCgYDVQQLDANETlMxIzAhBgNV +BAMMGnRydXN0ZWRjYS5kbnNjb2xsZWN0b3IuZGV2MSUwIwYJKoZIhvcNAQkBFhZh +ZG1pbkBkbnNjb2xsZWN0b3IuZGV2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA+k/41ckZ3HOSMlCRBnTyHmcPjZ0EjMOJMQz6drLPCN9yobemxGsbhJ4R +DDmt+WeGnbk+GLyOaFyLwICH3BKvO1f7czQvCBoxnzVQqQjKOAT2gjblrA/OlfnU +fp0np/MkRbp+1wGYqSjTP6TtUVpy4GckpyaaH+ReV7vDSMlPAwI7ni61EPtQyUop +6BpqrKaoJo51BxrqaoQlvY2Hy794Pj3sgMNUcEVnrp8J19pd+rWmrMX82mgRpLyh +koDndphZEdVCB2S6441UGWsSux9FC9tTOr15aXmJ/5DUBCl12Uz2VWzMKVyYo2nh +/oUppZV02TZjqvVMqJDgntl6/JzFlwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQBh +8XfMwVqqqkfowIcVqiAyblEnAR0ERbjJeutZPXC6yFjkF0WddLEwxSoFK6dRFfxC +BHR8h8vNF1kyBW51qy3gMdSwZBHiTaEjXxoIA0QilEHY9hPPVp0JP/5QbLMM9dlp +NAAv519mclzZPUdF1IYQtnx8PcX1idg9a3OTjXVcdrrbo7NR5nsB4ls+JDe9EZBE +T03Zu0LyoUkRZhSxbc4Vr+QirtBVlyu4Alh+6SSg7UwOk5LpqYwVNIGnFUPLMBvO +LuZcIK7YuxKIgumFeF7jDSdc48UF+dRw73QLpkhR8eXlHSehrZA0cjPIOkUKXoY3 +PDv/yyR2yPDAAlvkXADg +-----END CERTIFICATE----- diff --git a/testsdata/certs/ca.key b/testsdata/certs/ca.key new file mode 100644 index 00000000..68ac92c7 --- /dev/null +++ b/testsdata/certs/ca.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQD6T/jVyRncc5Iy +UJEGdPIeZw+NnQSMw4kxDPp2ss8I33Kht6bEaxuEnhEMOa35Z4aduT4YvI5oXIvA +gIfcEq87V/tzNC8IGjGfNVCpCMo4BPaCNuWsD86V+dR+nSen8yRFun7XAZipKNM/ +pO1RWnLgZySnJpof5F5Xu8NIyU8DAjueLrUQ+1DJSinoGmqspqgmjnUHGupqhCW9 +jYfLv3g+PeyAw1RwRWeunwnX2l36taasxfzaaBGkvKGSgOd2mFkR1UIHZLrjjVQZ +axK7H0UL21M6vXlpeYn/kNQEKXXZTPZVbMwpXJijaeH+hSmllXTZNmOq9UyokOCe +2Xr8nMWXAgMBAAECggEAI4HRof3fYcKxI9sC34AaUk67SZLS8ObR4LffFZRiwvbz +a1ZCXU12P1cuwuWxtJXHZjs/QEILD2nFVz7ERucNnWTrIdnuq/8PN+7XrMq26MBn +eWwxIzmwy9x/FKDVXcEjTZLZaEVtMt28LaSHF4m1jviCngVfSpPaACb92ibYQuw3 +2EJK3RqxrAfT44VUg8gdJxq4cv6f2Kx/fhqjRnRvkv6URogqisa5Vbf0mQYA7KM7 +afGPJZOMYenTH4V889aT7yuzX2X9Ujroel1yV5DY2FlI1ojYnaOW6mTomqCUkfrk +uptQ2qBVOOdRbnTTukFYz1aNhzRfzQBq/FyfF2bWZQKBgQD+X2/g7HOSjVDgwiND +EriGQsh8ZjfvCJdLfW8nkIoOzb401n+NdvNITA9wRGFS/5WLdYecQeU8ZyVzGHBh +GFxpDGSzx2xjVUGODFcxBcxs5LGuyMRAqQEDk/p4tlAzX1SPqESgOb62CyXfV2b+ +QQrZNi/sTC5aHkPEXdFC2LgI9QKBgQD76eK4WMDHZeKuDIddw5OllKKAczNI8lzC +Yvoq8bS3O+0S/UN8bqLKNsFEtPSQCXtV9jAKrQHV/DKZyy+rk2FTXmimuk7fK7TS +jypqSu2iN0S00jKFxh/B3B+FDLDCvkcHJlHPHAr960MGCEahYze0jYzL8ZvBTpuz +twa4RTcs2wKBgQDq2nqVFDpwaIDvws6DstkjPK2WDVo/G5N0Y08pHE4a9OJULmZ9 +2gEsEu1+HeQtmUQdClo2brCTYDg3V60KOE+5vXOMeOcdny1zVPl7jXr8XvmeAkcP +2/nPr+RlZw4NIEsWh6k0tZvav9grqKqyvKKjgWAlrwBsu9ydhHEcYrMnsQKBgQC3 +q4yhShyshW2j5wCfbaRt+pQMwXGoAwV8uTubKgXP/0JYMQ4OYIASnZ+GX8Vca31g +bJIUhpWrFikylsGYAGnaph/5SCePccdyKe4L97uRJWjTydoKTS0EZGEa2eja5G7X +GKpXLiQZhHmmoUwWCUgpPXdljzA33f+KJa0hl12mNwKBgBAeytz9bzWrK5QqXr0g +lss6GDI7tK+VeCi2a5IDOE4Mgvl5dX79fxhvgjtT1oc4K4JN8oFA4+Y/P/khZ3jv +JCXMcgGC8YJ2cD2A7rBwG09ORfLLgY5Jha1+wGfNu4dWtugNovflNHyKUDPnnVfD +ruzFSUNgmN8ilg0mvSif9iR9 +-----END PRIVATE KEY----- diff --git a/testsdata/certs/client.crt b/testsdata/certs/client.crt new file mode 100644 index 00000000..da2282f1 --- /dev/null +++ b/testsdata/certs/client.crt @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIIDyDCCArACFHLjKhuNZEN5cgVU/TJvmZb64xYPMA0GCSqGSIb3DQEBCwUAMIGh +MQswCQYDVQQGEwJGUjESMBAGA1UECAwJTm9ybWFuZGllMQ0wCwYDVQQHDARDYWVu +MRUwEwYDVQQKDAxETlNjb2xsZWN0b3IxDDAKBgNVBAsMA0ROUzEjMCEGA1UEAwwa +dHJ1c3RlZGNhLmRuc2NvbGxlY3Rvci5kZXYxJTAjBgkqhkiG9w0BCQEWFmFkbWlu +QGRuc2NvbGxlY3Rvci5kZXYwHhcNMjMxMTAxMTkyNDQxWhcNMzMxMDI5MTkyNDQx +WjCBnjELMAkGA1UEBhMCRlIxEjAQBgNVBAgMCU5vcm1hbmRpZTENMAsGA1UEBwwE +Q2FlbjEVMBMGA1UECgwMRE5TY29sbGVjdG9yMQwwCgYDVQQLDANETlMxIDAeBgNV +BAMMF2NsaWVudC5kbnNjb2xsZWN0b3IuZGV2MSUwIwYJKoZIhvcNAQkBFhZhZG1p +bkBkbnNjb2xsZWN0b3IuZGV2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArCyiT2D6R1OZylhk/JCZ+9Zfl+lzpIASTxGDAKG1nVns2AdPgD0GlmSn76KG +l4yAR83qovkJQT56YGjaJqXEs7336DPCyGqLUtzjh2QWcdaLV3RmvkQTWbi4mp85 +cw+TUVK0fQpfvh/hZU2V2OI3+4oS8tUZTUldPfibiGNBzPx2Gq8nqxGxh2+7IBfC +EcmfA/5JbUENI8A8G0HaIzPOv30uHGlwN5PZTr2H6lbHOpB++J7k889WdIs3hgRv +EZEgSFhvCrsrRX29Mz3xyyy8X94hHJV85GYIz9wfZlbjDKNb8jplDTxWoboyg9cw +6eboFZ0PsFcxQaSdJPZHGJFjHwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQDjSn0P +pbz+Ck/e/otHwKE0G55QIOdGBcXkhAL3YXZBG28rGwtTZLUlWU11xd0ViXvATulW +yUf2OxTtqtxz6ZWh1IaGCj4icZgocfDLe6yLMZnm3FAw5fipiWtMWnLoe0VjUgjl +XtdDe7hdi/Pa4Zz2jn2GebjYLzLGEmuklUioVB/hzm5/CgIeK9OdTGLNvBtcxL+E +F2hx0hihCbaG6R53SuEInhaLFBVr9LZ10WCDv9fdoSNwf8czCZq54/Cq+VGiKTgh ++DS5M5hSBxuo3bJvOUxV5GKUAJClE1xZQetz1RCo2VqWNbmtPslzeXJ1ZvL6Ey3J +co948SGcsrpi1qRn +-----END CERTIFICATE----- diff --git a/testsdata/certs/client.key b/testsdata/certs/client.key new file mode 100644 index 00000000..0b8b5836 --- /dev/null +++ b/testsdata/certs/client.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCsLKJPYPpHU5nK +WGT8kJn71l+X6XOkgBJPEYMAobWdWezYB0+APQaWZKfvooaXjIBHzeqi+QlBPnpg +aNompcSzvffoM8LIaotS3OOHZBZx1otXdGa+RBNZuLianzlzD5NRUrR9Cl++H+Fl +TZXY4jf7ihLy1RlNSV09+JuIY0HM/HYaryerEbGHb7sgF8IRyZ8D/kltQQ0jwDwb +QdojM86/fS4caXA3k9lOvYfqVsc6kH74nuTzz1Z0izeGBG8RkSBIWG8KuytFfb0z +PfHLLLxf3iEclXzkZgjP3B9mVuMMo1vyOmUNPFahujKD1zDp5ugVnQ+wVzFBpJ0k +9kcYkWMfAgMBAAECggEAC+MoW7GsO14kHp/cF8IGF6iqlfWk1IU707YM+kSv94q8 +uwJE32uXN61Vw5+likjFl0Tk1SwQ6FkfdZDtCuu5Y9g9tGGqf6WM3q495Ab+3mI7 +4aW5mEZhTaRe09zNcx/EAe04upoLl+K3Ra7F0KEh0LNXm+jRo+U+U6farop9LGFe +6bgdesWvq2VrCM4eSPb4E1xoEjX1VwgyEE4vAcdMAowbSQBXVVFAmDVrCdyQR17E +5FC/MuIL9Du8obtYWgFcgRKI/pX5q53QwW4rGUJXGQrKiyFK7zUUwnj469R+Hmiv +GJcqKUBW7ndVrFwUO64LnQCQQBo9AGSdVyOES7YbNQKBgQDVG5hIvzaaqyL+WuzS +tW7TQyDYzYLE82itWVJ5lzg54yLw+PMltwZr5GJaFHFfFpIv5WLYMyHpd8Y1rbJ2 +US2HDFVLeWs3s45J4aoATmDBFkk1d4xtXrBPIE9TWoh8pI4vxbvsNYuNX1e9WmcN +SRn9NyIYW/KJQg0s4m4ym3MbKwKBgQDO0/BIn1ErCO8M45QWSk1AwQ36JVQc7VWZ +r6zTRunpyoifT9IKGXluunVl1KLfxpUldU1om2EpAQyVllplmqPvZR9Wr+5yJ7kP +Kf9VZ+7Schs4HzZpoUyu5TpmLnuyf5K8GUfq+zYUc4Z1+KLFIWSVOmhM5uPCX+NN +1mcb5ZVN3QKBgQCW+wDt8UKfW8XkDMkiE1acKD/6Ocd+/7BWuCS9bkxwfqJ/tPCW +9M+A2wJvLXKQ2q3hbxOTds582NW9q/z25FZsCmnXmgNDKFwTreRCaUUVJ1PgpH0B +84bX2F07AbYXEIKICAA2vkzLcRP5XDYMbJEUG951AZeYdQpelWFbS1TGlwKBgESh +mWNP0oxYO5LoVbSL1VS+exfdmSq8KqKD4/J73pTgyzMqNoV5bI0svFYdGCrvZ4B1 +i0lB/hywJ2/f44FBrlJ7GMoYOSSSP9tjUUIS6fHVQWj/Gnw0tRB4KkfL9uoFYTif +nvi/gXOJ3j15UvHdIdZO+ltCZqOSVAf5NF/ScBfVAoGAT8t1ELlsr2IJWgbm6k3Q +7Wgxl0rCBJiNEhC+oCU7dexDo5jYHTZ9fSiOF54xxYfFOrEsyZYUjXM3QHi4suKr +titzjWtCLyxvNd6+aLfM0PhOsSJJd5WGiPYnvvwOAASmYiKOgDQr98z0xt/ODjBs +DlU9acy42t8I9ijJvLLap0A= +-----END PRIVATE KEY----- diff --git a/testsdata/certs/server.crt b/testsdata/certs/server.crt new file mode 100644 index 00000000..b3950905 --- /dev/null +++ b/testsdata/certs/server.crt @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIE9zCCA9+gAwIBAgIUbNgGGY1YBPyELmFO3mDgbyFAAqcwDQYJKoZIhvcNAQEL +BQAwgaExCzAJBgNVBAYTAkZSMRIwEAYDVQQIDAlOb3JtYW5kaWUxDTALBgNVBAcM +BENhZW4xFTATBgNVBAoMDEROU2NvbGxlY3RvcjEMMAoGA1UECwwDRE5TMSMwIQYD +VQQDDBp0cnVzdGVkY2EuZG5zY29sbGVjdG9yLmRldjElMCMGCSqGSIb3DQEJARYW +YWRtaW5AZG5zY29sbGVjdG9yLmRldjAeFw0yMzExMDExOTIzMzJaFw0zMzEwMjkx +OTIzMzJaMIGeMQswCQYDVQQGEwJGUjESMBAGA1UECAwJTm9ybWFuZGllMQ0wCwYD +VQQHDARDYWVuMRUwEwYDVQQKDAxETlNjb2xsZWN0b3IxDDAKBgNVBAsMA0ROUzEg +MB4GA1UEAwwXc2VydmVyLmRuc2NvbGxlY3Rvci5kZXYxJTAjBgkqhkiG9w0BCQEW +FmFkbWluQGRuc2NvbGxlY3Rvci5kZXYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDPODZnJo36ImVa/Dt1CPuhm38qQZlX/8mg10JrE49YkcvTExDb6/2t +q9dzjUiG9+K+1buBTAYXFr1kO1NRLkWDNpdALqN5YVo1TTxUPKGTrRt0MXo1qJaK +LLuRnDKrC2C2cBvrA9HlaGTb0nx0Zmna7h4r8TKAL5W8k5dUnlmpsc6KOEr2hsXr +unMNVleHvnBYIxapET+olGS8fl5j7xAyqFz0Rc887YfsrNu+r845A6THthKzRFgN +6uBCBetVBx0uSVs2HB4djJLYw8DQXGQkMo6kyMLd+I/ikXfXi1ZThFnJsRYyJ39o +6s19H7QCZ5EgmjFzMCzY7/laL5nyGW5TAgMBAAGjggEmMIIBIjAzBgNVHREELDAq +ghdzZXJ2ZXIuZG5zY29sbGVjdG9yLmRldoIJbG9jYWxob3N0hwR/AAABMB0GA1Ud +DgQWBBRgZkplOUkohcgQirVFGjYd+NGoxjCBywYDVR0jBIHDMIHAoYGnpIGkMIGh +MQswCQYDVQQGEwJGUjESMBAGA1UECAwJTm9ybWFuZGllMQ0wCwYDVQQHDARDYWVu +MRUwEwYDVQQKDAxETlNjb2xsZWN0b3IxDDAKBgNVBAsMA0ROUzEjMCEGA1UEAwwa +dHJ1c3RlZGNhLmRuc2NvbGxlY3Rvci5kZXYxJTAjBgkqhkiG9w0BCQEWFmFkbWlu +QGRuc2NvbGxlY3Rvci5kZXaCFFAqleYbCESdNX1TxODvs9no/qhDMA0GCSqGSIb3 +DQEBCwUAA4IBAQBckWnazPMbdgU4F2Vk7BY2wFbj+rRDsmGbmcQNf55FvDAbD+E7 +yLi+Go7WfDt8Lt3bWa/wp596op1SmiGAfhcEWR7ij0+C1yVxFCkizcCVxgNNOVTr +Aif2xM3JNz4SdrRO9+rcZRWuV62FEts/927RvjUSPJcBZdHyK7KCQLhlBjILsBVK +440n5/GHl2podrbS+XXZVpeixTTVGQXzPEUk8o2rhV59urXIpwgs9Brf2y2o83i2 +Nn6QjJd0D2atDWskN2Zpx7yh3Zq+7lKxZ6o5xORgoek5uzwKog1xpGOvT+BMEzKi +WXLzl3FIWZfOJKtOz/cmqW2Jbcrs6E8t02G1 +-----END CERTIFICATE----- diff --git a/testsdata/certs/server.key b/testsdata/certs/server.key new file mode 100644 index 00000000..310e3190 --- /dev/null +++ b/testsdata/certs/server.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDPODZnJo36ImVa +/Dt1CPuhm38qQZlX/8mg10JrE49YkcvTExDb6/2tq9dzjUiG9+K+1buBTAYXFr1k +O1NRLkWDNpdALqN5YVo1TTxUPKGTrRt0MXo1qJaKLLuRnDKrC2C2cBvrA9HlaGTb +0nx0Zmna7h4r8TKAL5W8k5dUnlmpsc6KOEr2hsXrunMNVleHvnBYIxapET+olGS8 +fl5j7xAyqFz0Rc887YfsrNu+r845A6THthKzRFgN6uBCBetVBx0uSVs2HB4djJLY +w8DQXGQkMo6kyMLd+I/ikXfXi1ZThFnJsRYyJ39o6s19H7QCZ5EgmjFzMCzY7/la +L5nyGW5TAgMBAAECggEAFziFYCnB3zXbhcaeIw9Oo115cpLHTEUtowh8OOOIPLSZ +0p1gVkSruLp4+knqxrUgg6IP0P1j8VJrBsBfJcm5oGqNqHORfhiasz5kdEwXDyVm +3i5tM3Yg6Hr6yeZnByPPQqJtfnh/HOYF51w+9gxD8HSejO4KarLqZKdlXeYgxhMj +IfSJawZnCRpoHjeUj3tzpsltfp8P01cmzX6kuRe9dOTNiDvaDvr0EOhVPfNd/7od +JHMlaWAk+Z7C6j82wWO49FT1RpB00A3kz4ZNjr+MYYkX6A6CfG/VCYD3fmm1ROq+ +UpRduq52yJ2U9m+81d8omyZN6yM6uVg5xYMHz2ZLgQKBgQDjHbmGeIVtwUw46nVT +ShzRDOPgB3VxyWqk2QhgzjSqsVyciprz8hL3BZ5+SHisjOjyZc5dqa+5dergMOTw +XhkG+4GhGTZ9n/pTXJnwIP7HkPXcQMRlGSYr7sffSDyK61+SqYbm6+P13qTYOK6I +6AvPRzWQTouKG9t0kLu/pl1b7QKBgQDpkrYk/tkdnvJeFp6Mo7I+ulZ9LtXc2Mjo +cO9/0zPBFz9lmvqIXsHrZlhUUambtU2PS5XvKbxGsGj5nilPuBk6umHibQLKTYMF +A04ra2xIUcqXBYlMGPV576yPGZV/mlbcabElRLkrCUjUx1iDllCn1YbklCZiKS2C +E74f7YsrPwKBgBSj6uxxn46t9oNlq2v6XEwTY9JEW0QQDgUVRFGn69lnbQc9AYAS +C+8vL4xCgdUMqU7+OZcBiNrOAJ6HUwcVRikASnOdmvonw9Q3ojXUidMRNYbiy/Z0 +Jqfvd3KvWfE2GuV1SrFJ1tnNdiXAYPxIOmqICjInMT9H8NXTIXz1XZ6xAoGBALSM +TrWsNWIbMlgeffJSuv6YBTEA2hm7jRl36vnQ5UmV0dCViqGNNbLjytVqxoNxEwH4 +OG7FwR6XUJ3bby2LLh1iYzWmdCiy39spIeyYPfxtFP/GLMog5Oebp7R530Diqc/4 +9xDK3aNxqtWnPjmBINmLSZk5F657DA1ne2issw37AoGBAMeCoGcmwEtfI/W2CcYU +t8xgAEt8XMDwQ/nu5JnV+8hGCaZDjuZVfnivRUYb1MAV0mcFhpGqLcX8vTJlbyFS ++1yAFseX8FQY3F/gsP/CT2qWV17LeYaQF3GLgjOx3zzyhOBxE08YY34EF6gURj6M +KpvBpSfRAPM9IKW0FlJWDnyY +-----END PRIVATE KEY-----