From fbffb040f91c47425ec96bc9cc0c8aed27c7e6b7 Mon Sep 17 00:00:00 2001 From: Patrick Sanders Date: Wed, 30 Dec 2020 10:53:51 -0800 Subject: [PATCH] Move service logic to separate command (#31) --- README.md | 14 ++- challenge/challenge.go | 5 +- cmd/completion.go | 2 +- cmd/credential_process.go | 2 +- cmd/docs.go | 3 +- cmd/ecs_credential_provider.go | 7 +- cmd/file.go | 10 +- cmd/metadata.go | 4 +- cmd/root.go | 149 ++++++++++++++++++------------ cmd/service.go | 126 +++++++++++++++++++++++++ cmd/svc.go | 64 ------------- cmd/vars.go | 2 +- config/config.go | 25 ++++- config/embedded.go | 4 + creds/consoleme.go | 53 +---------- example-config.yaml | 9 +- go.mod | 20 ++-- go.sum | 62 +++++++------ handlers/credentialsHandler.go | 7 +- handlers/ecsCredentialsHandler.go | 8 -- handlers/middleware.go | 6 +- main.go | 9 -- util/util.go | 6 -- 23 files changed, 327 insertions(+), 270 deletions(-) create mode 100644 cmd/service.go delete mode 100644 cmd/svc.go diff --git a/README.md b/README.md index 46f339f..30ed7a8 100644 --- a/README.md +++ b/README.md @@ -15,15 +15,19 @@ This README contains developer documentation. Weep user documentation can be fou Weep can be compiled with an embedded configuration (See the Building section below), or it can get its configuration from a YAML-formatted file. We've included an example config file in [example-config.yaml](example-config.yaml). -Weep searches for a configuration file in the following locations: +Weep searches for a configuration in the following locations: -- `./.weep.yaml` +- embedded configuration (see below) +- `/etc/weep/weep.yaml` +- `~/.config/weep/weep.yaml` - `~/.weep.yaml` -- `~/.config/weep/.weep.yaml` +- `./weep.yaml` -You can also specify a config file as a CLI arg: +Multiple configurations in these locations **will be merged**. -``` +You can also specify a config file as a CLI arg. This configuration will be used exclusively and will not be merged with other configurations: + +```bash weep --config somethingdifferent.yaml list ``` diff --git a/challenge/challenge.go b/challenge/challenge.go index a0d823e..484df58 100644 --- a/challenge/challenge.go +++ b/challenge/challenge.go @@ -221,10 +221,7 @@ func RefreshChallenge() error { } } if user == "" { - log.Fatalf( - "Invalid configuration. You must define challenge_settings.user as the user you wish to authenticate" + - " as.", - ) + return fmt.Errorf("invalid configuration: challenge_settings.user must be set") } var consoleMeChallengeGeneratorEndpoint = fmt.Sprintf( "%s/noauth/v1/challenge_generator/%s", diff --git a/cmd/completion.go b/cmd/completion.go index 3b70e67..9d12e16 100644 --- a/cmd/completion.go +++ b/cmd/completion.go @@ -17,9 +17,9 @@ package cmd import ( - "log" "os" + log "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) diff --git a/cmd/credential_process.go b/cmd/credential_process.go index 011de39..feea6b3 100644 --- a/cmd/credential_process.go +++ b/cmd/credential_process.go @@ -22,7 +22,7 @@ import ( "time" "github.com/netflix/weep/util" - ini "gopkg.in/ini.v1" + "gopkg.in/ini.v1" "github.com/netflix/weep/creds" log "github.com/sirupsen/logrus" diff --git a/cmd/docs.go b/cmd/docs.go index 64f38e1..8954b65 100644 --- a/cmd/docs.go +++ b/cmd/docs.go @@ -17,8 +17,7 @@ package cmd import ( - "log" - + log "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/spf13/cobra/doc" ) diff --git a/cmd/ecs_credential_provider.go b/cmd/ecs_credential_provider.go index 7b8c50b..f8d933b 100644 --- a/cmd/ecs_credential_provider.go +++ b/cmd/ecs_credential_provider.go @@ -20,7 +20,6 @@ import ( "fmt" "net" "net/http" - "os" "github.com/spf13/viper" @@ -46,8 +45,7 @@ func runEcsMetadata(cmd *cobra.Command, args []string) error { ipaddress := net.ParseIP(ecsProviderListenAddr) if ipaddress == nil { - fmt.Println("Invalid IP: ", ecsProviderListenAddr) - os.Exit(1) + return fmt.Errorf("invalid IP: %s", ecsProviderListenAddr) } listenAddr := fmt.Sprintf("%s:%d", ipaddress, ecsProviderListenPort) @@ -64,7 +62,6 @@ func runEcsMetadata(cmd *cobra.Command, args []string) error { // Check for interrupt signal and exit cleanly <-shutdown - log.Print("Shutdown signal received, exiting weep...") - + log.Print("Shutdown signal received, stopping server...") return nil } diff --git a/cmd/file.go b/cmd/file.go index 41fc145..3f69e5c 100644 --- a/cmd/file.go +++ b/cmd/file.go @@ -18,14 +18,14 @@ package cmd import ( "fmt" - "os" "path" - ini "gopkg.in/ini.v1" + "gopkg.in/ini.v1" "github.com/mitchellh/go-homedir" "github.com/netflix/weep/creds" "github.com/netflix/weep/util" + log "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) @@ -60,8 +60,7 @@ func runFile(cmd *cobra.Command, args []string) error { func getDefaultCredentialsFile() string { home, err := homedir.Dir() if err != nil { - fmt.Printf("couldn't get default directory!") - os.Exit(1) + log.Fatal("couldn't get default directory") } return path.Join(home, ".aws", "credentials") } @@ -69,8 +68,7 @@ func getDefaultCredentialsFile() string { func getDefaultAwsConfigFile() string { home, err := homedir.Dir() if err != nil { - fmt.Printf("couldn't get default directory!") - os.Exit(1) + log.Fatal("couldn't get default directory") } return path.Join(home, ".aws", "config") } diff --git a/cmd/metadata.go b/cmd/metadata.go index b23398b..81770e1 100644 --- a/cmd/metadata.go +++ b/cmd/metadata.go @@ -20,7 +20,6 @@ import ( "fmt" "net" "net/http" - "os" "github.com/netflix/weep/cache" @@ -60,8 +59,7 @@ func runMetadata(cmd *cobra.Command, args []string) error { ipaddress := net.ParseIP(metadataListenAddr) if ipaddress == nil { - fmt.Println("Invalid IP: ", metadataListenAddr) - os.Exit(1) + return fmt.Errorf("Invalid IP: %s", metadataListenAddr) } listenAddr := fmt.Sprintf("%s:%d", ipaddress, metadataListenPort) diff --git a/cmd/root.go b/cmd/root.go index 3f1780a..a6ca3e6 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -17,17 +17,13 @@ package cmd import ( - "fmt" + "io" "os" "os/signal" - "path" - "runtime" - "strings" + "path/filepath" "syscall" - "github.com/netflix/weep/util" - - "github.com/mattn/go-isatty" + "github.com/kardianos/service" "github.com/mitchellh/go-homedir" "github.com/netflix/weep/config" @@ -52,83 +48,90 @@ func init() { rootCmd.PersistentFlags().StringVarP(&cfgFile, "config", "c", "", "config file (default is $HOME/.weep.yaml)") rootCmd.PersistentFlags().StringSliceVarP(&assumeRole, "assume-role", "A", make([]string, 0), "one or more roles to assume after retrieving credentials") rootCmd.PersistentFlags().StringVar(&logFormat, "log-format", "", "log format (json or tty)") + rootCmd.PersistentFlags().StringVar(&logFile, "log-file", viper.GetString("log_file"), "log file path") rootCmd.PersistentFlags().StringVar(&logLevel, "log-level", "", "log level (debug, info, warn)") - rootCmd.PersistentFlags().BoolVarP(&runAsService, "svc", "s", false, "run weep as a service") } func Execute() { shutdown = make(chan os.Signal, 1) done = make(chan int, 1) - signal.Notify(shutdown, syscall.SIGINT, syscall.SIGTERM) - if runAsService { - RunService() - } else { - if err := rootCmd.Execute(); err != nil { - _, _ = fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } + signal.Notify(shutdown, syscall.SIGINT, syscall.SIGTERM, os.Interrupt) + + if err := rootCmd.Execute(); err != nil { + rootCmd.PrintErr(err) } } +// initConfig reads in configs by precedence, with later configs overriding earlier: +// - embedded +// - /etc/weep/weep.yaml +// - ~/.config/weep/weep.yaml +// - ~/.weep.yaml +// - ./weep.yaml +// If a config file is specified via CLI arg, it will be read exclusively and not merged with other +// configuration. func initConfig() { + home, err := homedir.Dir() + if err != nil { + log.Fatal(err) + } + viper.SetConfigType("yaml") + + // Read in explicitly defined config file if cfgFile != "" { viper.SetConfigFile(cfgFile) - } else { - home, err := homedir.Dir() + err = viper.ReadInConfig() if err != nil { - fmt.Println(err) - os.Exit(1) + log.Fatalf("could not open config file %s: %v", cfgFile, err) } - viper.SetConfigType("yaml") - viper.SetConfigName(".weep") - viper.AddConfigPath(".") - viper.AddConfigPath(home) - viper.AddConfigPath(home + "/.config/weep/") + return } + // Read embedded config if available if err := config.ReadEmbeddedConfig(); err != nil { log.Debugf("unable to read embedded config: %v; falling back to config file", err) } - if err := viper.ReadInConfig(); err != nil { - if _, ok := err.(viper.ConfigFileNotFoundError); ok && config.EmbeddedConfigFile != "" { - log.Debugf("no config file found, trying to use embedded config") - } else if isatty.IsTerminal(os.Stdout.Fd()) { - err = util.FirstRunPrompt() - if err != nil { - log.Fatalf("config bootstrap failed: %v", err) - } - } else { - log.Debugf("unable to read config file: %v", err) - } - } + // Read in config from etc + viper.SetConfigName("weep") + viper.AddConfigPath("/etc/weep/") + _ = viper.MergeInConfig() + + // Read in config from config dir + viper.SetConfigName("weep") + viper.AddConfigPath(home + "/.config/weep/") + _ = viper.MergeInConfig() + + // Read in config from home dir + viper.SetConfigName(".weep") + viper.AddConfigPath(home) + _ = viper.MergeInConfig() + + // Read in config from current directory + viper.SetConfigName("weep") + viper.AddConfigPath(".") + _ = viper.MergeInConfig() + + // TODO: revisit first-run setup + //if err := viper.MergeInConfig(); err != nil { + // if _, ok := err.(viper.ConfigFileNotFoundError); ok && config.EmbeddedConfigFile != "" { + // log.Debugf("no config file found, trying to use embedded config") + // } else if isatty.IsTerminal(os.Stdout.Fd()) { + // err = util.FirstRunPrompt() + // if err != nil { + // log.Fatalf("config bootstrap failed: %v", err) + // } + // } else { + // log.Debugf("unable to read config file: %v", err) + // } + //} - log.Debugf("found config at %s", viper.ConfigFileUsed()) if err := viper.Unmarshal(&config.Config); err != nil { log.Fatalf("unable to decode config into struct: %v", err) } } func initLogging() { - // Set the log format. Default to Text - if logFormat == "json" { - log.SetFormatter(&log.JSONFormatter{ - CallerPrettyfier: func(f *runtime.Frame) (string, string) { - s := strings.Split(f.Function, ".") - funcName := s[len(s)-1] - return funcName, fmt.Sprintf("%s:%d", path.Base(f.File), f.Line) - }, - }) - } else { - log.SetFormatter(&log.TextFormatter{ - CallerPrettyfier: func(f *runtime.Frame) (string, string) { - s := strings.Split(f.Function, ".") - funcName := s[len(s)-1] - return funcName, fmt.Sprintf("%s:%d", path.Base(f.File), f.Line) - }, - }) - } - // Set the log level and default to INFO switch logLevel { case "error": @@ -140,4 +143,36 @@ func initLogging() { default: log.SetLevel(log.InfoLevel) } + + log.Debug("configuring logging") + + // Set the log format. Default to Text + if logFormat == "json" { + log.SetFormatter(&log.JSONFormatter{}) + } else { + log.SetFormatter(&log.TextFormatter{}) + } + + logDir := filepath.Dir(logFile) + if _, err := os.Stat(logDir); os.IsNotExist(err) { + log.Debugf("attempting to create log directory %s", logDir) + err := os.MkdirAll(logDir, os.ModePerm) + if err != nil { + log.Errorf("could not create log directory") + } + } + + var w io.Writer + file, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) + if err != nil { + log.Errorf("could not open %s for logging, defaulting to stderr: %v", logFile, err) + log.SetOutput(os.Stderr) + w = os.Stderr + } else if service.Interactive() { + w = io.MultiWriter(os.Stderr, file) + } else { + w = file + } + log.SetOutput(w) + log.Debug("logging configured") } diff --git a/cmd/service.go b/cmd/service.go new file mode 100644 index 0000000..b27a9dd --- /dev/null +++ b/cmd/service.go @@ -0,0 +1,126 @@ +package cmd + +import ( + "os" + + "github.com/spf13/viper" + + "github.com/kardianos/service" + log "github.com/sirupsen/logrus" + "github.com/spf13/cobra" +) + +var ( + svcLogger service.Logger + svcConfig *service.Config + svcProgram *program + weepService service.Service +) + +func init() { + weepServiceControl.Args = cobra.MinimumNArgs(1) + rootCmd.AddCommand(weepServiceControl) +} + +var weepServiceControl = &cobra.Command{ + Use: "service [start|stop|restart|install|uninstall|run]", + Short: "Install or control weep as a system service", + RunE: runWeepServiceControl, +} + +func runWeepServiceControl(cmd *cobra.Command, args []string) error { + initService() + if len(args[0]) > 0 { + // hijack a run command and run the service + if args[0] == "run" { + go weepService.Run() + <-done + return nil + } + err := service.Control(weepService, args[0]) + if err != nil { + return err + } + cmd.Printf("successfully ran service %s\n", args[0]) + } + log.Debug("sending done signal") + done <- 0 + return nil +} + +type program struct{} + +func (p *program) Start(s service.Service) error { + go p.run() + return nil +} + +func (p *program) run() { + log.Info("starting weep service!") + exitCode := 0 + args := viper.GetStringSlice("service.args") + switch command := viper.GetString("service.command"); command { + case "ecs_credential_provider": + err := runEcsMetadata(nil, args) + if err != nil { + log.Error(err) + exitCode = 1 + } + case "metadata": + err := runMetadata(nil, args) + if err != nil { + log.Error(err) + exitCode = 1 + } + default: + log.Error("unknown command: ", command) + exitCode = 1 + } + log.Debug("sending done signal") + done <- exitCode +} + +func (p *program) Stop(s service.Service) error { + // Send an interrupt to the shutdown channel so everything will clean itself up + // This is seemingly only necessary on Windows, but it shouldn't hurt anything on other platforms. + log.Debug("got service stop, sending interrupt") + shutdown <- os.Interrupt + + // Wait for whatever is running to signal that it's done + log.Debug("waiting for done signal") + <-done + return nil +} + +func initService() { + var err error + + svcProgram = &program{} + + svcConfig = &service.Config{ + Name: "weep", + DisplayName: "Weep", + Description: "The ConsoleMe CLI", + Arguments: []string{"service", "run"}, + } + + weepService, err = service.New(svcProgram, svcConfig) + if err != nil { + log.Fatal(err) + } + + errs := make(chan error, 5) + svcLogger, err = weepService.Logger(errs) + if err != nil { + log.Fatal(err) + } + + go func() { + for { + err := <-errs + if err != nil { + _ = svcLogger.Error(err) + } + } + }() +} diff --git a/cmd/svc.go b/cmd/svc.go deleted file mode 100644 index ef780c6..0000000 --- a/cmd/svc.go +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cmd - -import ( - "github.com/kardianos/service" - log "github.com/sirupsen/logrus" -) - -var svcLogger service.Logger - -type program struct{} - -func (p *program) Start(s service.Service) error { - go p.run() - return nil -} - -func (p *program) run() { - _ = rootCmd.Execute() - done <- 0 -} - -func (p *program) Stop(s service.Service) error { - <-done - return nil -} - -func RunService() { - svcConfig := &service.Config{ - Name: "Weep", - DisplayName: "Weep", - Description: "The ConsoleMe CLI", - } - - prg := &program{} - s, err := service.New(prg, svcConfig) - if err != nil { - log.Fatal(err) - } - svcLogger, err = s.Logger(nil) - if err != nil { - log.Fatal(err) - } - err = s.Run() - if err != nil { - _ = svcLogger.Error(err) - } - done <- 0 -} diff --git a/cmd/vars.go b/cmd/vars.go index 1e2cc89..4b3d84e 100644 --- a/cmd/vars.go +++ b/cmd/vars.go @@ -33,8 +33,8 @@ var ( ecsProviderListenPort int cfgFile string logLevel string + logFile string logFormat string - runAsService bool shutdown chan os.Signal done chan int ) diff --git a/config/config.go b/config/config.go index 26d7ebe..8ee833e 100644 --- a/config/config.go +++ b/config/config.go @@ -16,14 +16,37 @@ package config -import "github.com/spf13/viper" +import ( + "path/filepath" + "runtime" + + "github.com/spf13/viper" +) func init() { // Set default configuration values here + viper.SetTypeByDefaultValue(true) + viper.SetDefault("log_file", getDefaultLogFile()) viper.SetDefault("mtls_settings.old_cert_message", "mTLS certificate is too old, please refresh mtls certificate") viper.SetDefault("server.http_timeout", 20) viper.SetDefault("server.metadata_port", 9090) viper.SetDefault("server.ecs_credential_provider_port", 9091) + viper.SetDefault("service.command", "ecs_credential_provider") + viper.SetDefault("service.args", []string{}) +} + +func getDefaultLogFile() string { + switch os := runtime.GOOS; os { + case "darwin": + return filepath.Join("tmp", "weep.log") + case "linux": + return filepath.Join("tmp", "weep.log") + case "windows": + path, _ := filepath.Abs(filepath.FromSlash("/programdata/weep/weep.log")) + return path + default: + return "" + } } var ( diff --git a/config/embedded.go b/config/embedded.go index d784497..221e265 100644 --- a/config/embedded.go +++ b/config/embedded.go @@ -37,9 +37,13 @@ func ReadEmbeddedConfig() error { } defer f.Close() + v := viper.New() err = viper.ReadConfig(f) if err != nil { return errors.Wrap(err, "could not read embedded config") } + if err := viper.MergeConfigMap(v.AllSettings()); err != nil { + return errors.Wrap(err, "could not merge embedded config") + } return nil } diff --git a/creds/consoleme.go b/creds/consoleme.go index 61dbbc5..cf37c14 100644 --- a/creds/consoleme.go +++ b/creds/consoleme.go @@ -26,18 +26,10 @@ import ( "net/http" "net/url" "runtime" - "strings" "syscall" "time" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/sts" werrors "github.com/netflix/weep/errors" - "github.com/netflix/weep/util" - "github.com/spf13/viper" "github.com/netflix/weep/challenge" @@ -96,7 +88,7 @@ func GetClient() (*Client, error) { return client, err } } else { - log.Fatal("Authentication method unsupported or not provided.") + return nil, fmt.Errorf("Authentication method unsupported or not provided.") } return client, nil @@ -271,49 +263,6 @@ func (c *Client) GetRoleCredentials(role string, ipRestrict bool) (*AwsCredentia return credentialsResponse.Credentials, nil } -func getRoleArnFromCredentials(c *credentials.Value) (string, error) { - sess, err := session.NewSession(&aws.Config{ - Credentials: credentials.NewStaticCredentials( - c.AccessKeyID, - c.SecretAccessKey, - c.SessionToken), - }) - util.CheckError(err) - svc := sts.New(sess) - input := &sts.GetCallerIdentityInput{} - - result, err := svc.GetCallerIdentity(input) - if err != nil { - if aerr, ok := err.(awserr.Error); ok { - switch aerr.Code() { - default: - fmt.Println(aerr.Error()) - } - } else { - // Print the error, cast err to awserr.Error to get the Code and - // Message from an error. - fmt.Println(err.Error()) - } - return "", err - } - // Replace assumed role ARN with role ARN, if possible - // arn:aws:sts::123456789012:assumed-role/exampleInstanceProfile/user@example.com -> - // arn:aws:iam::123456789012:role/exampleInstanceProfile - Role := strings.Replace(*result.Arn, ":sts:", ":iam:", 1) - Role = strings.Replace(Role, ":assumed-role/", ":role/", 1) - // result.UserId looks like AROAIEBAVBLAH:user@example.com - splittedUserId := strings.Split(*result.UserId, ":") - if len(splittedUserId) > 1 { - sessionName := splittedUserId[1] - Role = strings.Replace( - Role, - fmt.Sprintf("/%s", sessionName), - "", - 1) - } - return Role, nil -} - func defaultTransport() *http.Transport { timeout := time.Duration(viper.GetInt("server.http_timeout")) * time.Second return &http.Transport{ diff --git a/example-config.yaml b/example-config.yaml index f422d85..fedf62a 100644 --- a/example-config.yaml +++ b/example-config.yaml @@ -1,13 +1,20 @@ consoleme_url: https://path_to_consoleme:port authentication_method: mtls # challenge or mtls +log_level: info +log_file: /path/to/log/file server: http_timeout: 20 metadata_port: 9090 ecs_credential_provider_port: 9091 +service: + command: ecs_credential_provider + args: + - --log-level + - debug #challenge_settings: # (Optional) Username can be provided. If it is not provided, user will be prompted on first authentication attempt # user: you@example.com mtls_settings: # only needed if authentication_method is mtls - old_cert_message: Metatron certificate is too old, please run [refresh command] + old_cert_message: mTLS certificate is too old, please run [refresh command] cert: mtls.crt key: mtls.key cafile: mtlsCA.pem diff --git a/go.mod b/go.mod index 037ec46..9d6ba1c 100644 --- a/go.mod +++ b/go.mod @@ -3,28 +3,30 @@ module github.com/netflix/weep go 1.15 require ( - github.com/aws/aws-sdk-go v1.34.9 + github.com/aws/aws-sdk-go v1.36.7 github.com/fsnotify/fsnotify v1.4.9 // indirect + github.com/gobuffalo/here v0.6.2 // indirect github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b - github.com/gorilla/mux v1.7.4 + github.com/gorilla/mux v1.8.0 github.com/kardianos/service v1.2.0 + github.com/lunixbochs/vtclean v1.0.0 // indirect github.com/magiconair/properties v1.8.4 // indirect github.com/manifoldco/promptui v0.8.0 github.com/markbates/pkger v0.17.1 - github.com/mattn/go-isatty v0.0.12 + github.com/mattn/go-colorable v0.1.8 // indirect github.com/mitchellh/go-homedir v1.1.0 - github.com/mitchellh/mapstructure v1.3.3 // indirect + github.com/mitchellh/mapstructure v1.4.0 // indirect github.com/pelletier/go-toml v1.8.1 // indirect github.com/pkg/errors v0.9.1 - github.com/sirupsen/logrus v1.6.0 - github.com/spf13/afero v1.4.1 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/sirupsen/logrus v1.7.0 + github.com/spf13/afero v1.5.1 // indirect github.com/spf13/cast v1.3.1 // indirect github.com/spf13/cobra v1.1.1 github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/viper v1.7.1 - golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc // indirect - golang.org/x/sys v0.0.0-20201029080932-201ba4db2418 // indirect + golang.org/x/sys v0.0.0-20201211090839-8ad439b19e0f // indirect golang.org/x/text v0.3.4 // indirect gopkg.in/ini.v1 v1.62.0 - gopkg.in/yaml.v2 v2.3.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/go.sum b/go.sum index b26d868..49a3d49 100644 --- a/go.sum +++ b/go.sum @@ -34,8 +34,8 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310 h1:BUAU3CGlLvorLI26FmByPp2eC2qla6E1Tw+scpcg/to= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aws/aws-sdk-go v1.34.9 h1:cUGBW9CVdi0mS7K1hDzxIqTpfeWhpoQiguq81M1tjK0= -github.com/aws/aws-sdk-go v1.34.9/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.36.7 h1:XoJPAjKoqvdL531XGWxKYn5eGX/xMoXzMN5fBtoyfSY= +github.com/aws/aws-sdk-go v1.36.7/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= @@ -87,12 +87,12 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gobuffalo/here v0.6.0 h1:hYrd0a6gDmWxBM4TnrGw8mQg24iSVoIkHEk7FodQcBI= github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= +github.com/gobuffalo/here v0.6.2 h1:ZtCqC7F9ou3moLbYfHM1Tj+gwHGgWhjyRjVjsir9BE0= +github.com/gobuffalo/here v0.6.2/go.mod h1:D75Sq0p2BVHdgQu3vCRsXbg85rx943V19urJpqAVWjI= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -127,8 +127,8 @@ github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= -github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 h1:Iju5GlWwrvL6UBg4zJJt3btmonfrMlCDdsejg4CZE7c= @@ -177,8 +177,10 @@ github.com/hashicorp/serf v0.8.2 h1:YZ7UKsJv+hKjqGVUUbtE3HNj79Eln2oQ75tniF6iPt0= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jmespath/go-jmespath v0.3.0 h1:OS12ieG61fsCg5+qLJ+SsW9NicxNkg3b25OyT2yCeUc= -github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +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/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs= @@ -199,20 +201,22 @@ github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= 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 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a h1:weJVJJRzAJBFRlAiJQROKQs8oC9vOxvm4rZmBBk0ONw= github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= +github.com/lunixbochs/vtclean v1.0.0 h1:xu2sLAri4lGiovBDQKxl5mrXyESr3gUr5m5SM5+LVb8= +github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.4 h1:8KGKTcQQGm0Kv7vEbKFErAoAOFyyacLStRtQSeYtvkY= @@ -223,6 +227,8 @@ github.com/markbates/pkger v0.17.1 h1:/MKEtWqtc0mZvu9OinB9UzVN9iYCwLWuyUv4Bw+PCn github.com/markbates/pkger v0.17.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -246,8 +252,8 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.3.3 h1:SzB1nHZ2Xi+17FP0zVQBHIZqvwRN9408fJO8h+eeNA8= -github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.0 h1:7ks8ZkOP5/ujthUsT07rNv+nkLXCQWKNHuwzOAesEks= +github.com/mitchellh/mapstructure v1.4.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= @@ -292,6 +298,8 @@ github.com/rogpeppe/go-internal v1.3.0 h1:RR9dF3JtopPvtkroDZuVD7qquD0bnHlKSqaQhg github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +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 h1:UFr9zpz4xgTnIE5yIMtWAMngCdZ9p/+q6lTbgelo80M= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= @@ -299,8 +307,8 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= @@ -311,8 +319,8 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1 github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.4.1 h1:asw9sl74539yqavKaglDM5hFpdJVK0Y5Dr/JOgQ89nQ= -github.com/spf13/afero v1.4.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.5.1 h1:VHu76Lk0LSP1x254maIu2bplkWpfBWI+B+6fdoZprcg= +github.com/spf13/afero v1.5.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= @@ -401,10 +409,8 @@ golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2 h1:CCH4IOTTfewWjGOlSp+zGcjutRKlBEZQ6wTn8ozI/nI= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc h1:zK/HqS5bZxDptfPJNq8v7vJfXtkU7r9TLIoSr1bXaP4= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= @@ -425,18 +431,18 @@ golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201029080932-201ba4db2418 h1:HlFl4V6pEMziuLXyRkm5BIYq1y1GAbb02pRlWvI54OM= -golang.org/x/sys v0.0.0-20201029080932-201ba4db2418/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201211090839-8ad439b19e0f h1:QdHQnPce6K4XQewki9WNbG5KOROuDzqO3NaYjI1cXJ0= +golang.org/x/sys v0.0.0-20201211090839-8ad439b19e0f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -498,6 +504,8 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= @@ -513,8 +521,8 @@ gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/handlers/credentialsHandler.go b/handlers/credentialsHandler.go index 37587f3..d536389 100644 --- a/handlers/credentialsHandler.go +++ b/handlers/credentialsHandler.go @@ -21,7 +21,6 @@ import ( "encoding/json" "fmt" "net/http" - "os" "github.com/netflix/weep/cache" log "github.com/sirupsen/logrus" @@ -38,13 +37,11 @@ func CredentialsHandler(w http.ResponseWriter, r *http.Request) { c, err := cache.GlobalCache.GetDefault() if err != nil { - log.Fatalf("could not get credentials from cache: %e", err) - os.Exit(1) + log.Errorf("could not get credentials from cache: %e", err) } credentials, err := c.Retrieve() if err != nil { - log.Fatalf("could not get credentials: %e", err) - os.Exit(1) + log.Errorf("could not get credentials: %e", err) } credentialResponse := metadata.MetaDataCredentialResponse{ diff --git a/handlers/ecsCredentialsHandler.go b/handlers/ecsCredentialsHandler.go index 55b6458..591d5d2 100644 --- a/handlers/ecsCredentialsHandler.go +++ b/handlers/ecsCredentialsHandler.go @@ -32,8 +32,6 @@ import ( log "github.com/sirupsen/logrus" ) -var credentialMap = make(map[string]*creds.AwsCredentials) - // parseAssumeRoleQuery extracts the assume query string argument, splits it on commas, validates that each element // is an ARN, and returns a slice of ARN strings. func parseAssumeRoleQuery(r *http.Request) ([]string, error) { @@ -56,12 +54,6 @@ func parseAssumeRoleQuery(r *http.Request) ([]string, error) { return roles, nil } -// getCacheSlug returns a string unique to a particular combination of a role and chain of roles to assume. -func getCacheSlug(role string, assume []string) string { - elements := append([]string{role}, assume...) - return strings.Join(elements, "/") -} - func ECSMetadataServiceCredentialsHandler(w http.ResponseWriter, r *http.Request) { var client, err = creds.GetClient() if err != nil { diff --git a/handlers/middleware.go b/handlers/middleware.go index 38fb479..526aafc 100644 --- a/handlers/middleware.go +++ b/handlers/middleware.go @@ -33,15 +33,15 @@ func MetaDataServiceMiddleware(next http.HandlerFunc) http.HandlerFunc { w.Header().Set("Server", "EC2ws") w.Header().Set("Content-Type", "text/plain") - ua := string(r.Header.Get("User-Agent")) + ua := r.Header.Get("User-Agent") metadataVersion := 1 - token_ttl := r.Header.Get("X-Aws-Ec2-Metadata-Token-Ttl-Seconds") + tokenTtl := r.Header.Get("X-Aws-Ec2-Metadata-Token-Ttl-Seconds") token := r.Header.Get("X-aws-ec2-metadata-token") // If either of these request headers exist, we can be reasonably confident that the request is for IMDSv2. // `X-Aws-Ec2-Metadata-Token-Ttl-Seconds` is used when requesting a token // `X-aws-ec2-metadata-token` is used to pass the token to the metadata service // Weep uses a static token, and does not perform any token validation. - if token != "" || token_ttl != "" { + if token != "" || tokenTtl != "" { metadataVersion = 2 } diff --git a/main.go b/main.go index 69af277..a12b753 100644 --- a/main.go +++ b/main.go @@ -17,18 +17,9 @@ package main import ( - "os" - "github.com/netflix/weep/cmd" - - log "github.com/sirupsen/logrus" ) -func init() { - // Output to stdout instead of the default stderr - log.SetOutput(os.Stdout) -} - func main() { cmd.Execute() } diff --git a/util/util.go b/util/util.go index 7b5626a..7f87641 100644 --- a/util/util.go +++ b/util/util.go @@ -84,12 +84,6 @@ func (a AwsArn) ArnString() string { return fmt.Sprintf("%s:%s:%s:%s:%s:%s/%s", a.Arn, a.Partition, a.Service, a.Region, a.AccountId, a.ResourceType, a.Resource) } -func CheckError(err error) { - if err != nil { - log.Fatal(err) - } -} - func FileExists(path string) bool { _, err := os.Stat(path) return err == nil