github.com/versent/saml2aws@v2.17.0+incompatible/cmd/saml2aws/commands/script.go (about) 1 package commands 2 3 import ( 4 "fmt" 5 "os" 6 "text/template" 7 "time" 8 9 "github.com/pkg/errors" 10 "github.com/versent/saml2aws/pkg/awsconfig" 11 "github.com/versent/saml2aws/pkg/flags" 12 ) 13 14 const bashTmpl = `export AWS_ACCESS_KEY_ID="{{ .AWSAccessKey }}" 15 export AWS_SECRET_ACCESS_KEY="{{ .AWSSecretKey }}" 16 export AWS_SESSION_TOKEN="{{ .AWSSessionToken }}" 17 export AWS_SECURITY_TOKEN="{{ .AWSSecurityToken }}" 18 export SAML2AWS_PROFILE="{{ .ProfileName }}" 19 ` 20 21 const fishTmpl = `set -gx AWS_ACCESS_KEY_ID {{ .AWSAccessKey }} 22 set -gx AWS_SECRET_ACCESS_KEY {{ .AWSSecretKey }} 23 set -gx AWS_SESSION_TOKEM {{ .AWSSessionToken }} 24 set -gx AWS_SECURITY_TOKEN {{ .AWSSecurityToken }} 25 set -gx SAML2AWS_PROFILE {{ .ProfileName }} 26 " 27 ` 28 29 const powershellTmpl = `$env:AWS_ACCESS_KEY_ID='{{ .AWSAccessKey }}' 30 $env:AWS_SECRET_ACCESS_KEY='{{ .AWSSecretKey }}' 31 $env:AWS_SESSION_TOKEN='{{ .AWSSessionToken }}' 32 $env:AWS_SECURITY_TOKEN='{{ .AWSSecurityToken }}' 33 $env:SAML2AWS_PROFILE='{{ .ProfileName }}' 34 ` 35 36 // Script will emit a bash script that will export environment variables 37 func Script(execFlags *flags.LoginExecFlags, shell string) error { 38 account, err := buildIdpAccount(execFlags) 39 if err != nil { 40 return errors.Wrap(err, "error building login details") 41 } 42 43 sharedCreds := awsconfig.NewSharedCredentials(account.Profile) 44 45 // this checks if the credentials file has been created yet 46 // can only really be triggered if saml2aws exec is run on a new 47 // system prior to creating $HOME/.aws 48 exist, err := sharedCreds.CredsExists() 49 if err != nil { 50 return errors.Wrap(err, "error loading credentials") 51 } 52 if !exist { 53 fmt.Println("unable to load credentials, login required to create them") 54 return nil 55 } 56 57 awsCreds, err := sharedCreds.Load() 58 if err != nil { 59 return errors.Wrap(err, "error loading credentials") 60 } 61 62 if awsCreds.Expires.Sub(time.Now()) < 0 { 63 return errors.New("error aws credentials have expired") 64 } 65 66 // annoymous struct to pass to template 67 data := struct { 68 ProfileName string 69 *awsconfig.AWSCredentials 70 }{ 71 account.Profile, 72 awsCreds, 73 } 74 75 err = buildTmpl(shell, data) 76 if err != nil { 77 return errors.Wrap(err, "error generating template") 78 } 79 80 return nil 81 } 82 83 func buildTmpl(shell string, data interface{}) error { 84 t := template.New("envvar_script") 85 86 var err error 87 88 switch shell { 89 case "bash": 90 t, err = t.Parse(bashTmpl) 91 case "powershell": 92 t, err = t.Parse(powershellTmpl) 93 case "fish": 94 t, err = t.Parse(fishTmpl) 95 } 96 97 if err != nil { 98 return err 99 } 100 101 return t.Execute(os.Stdout, data) 102 }