github.com/hazelops/ize@v1.1.12-0.20230915191306-97d7c0e48f11/internal/commands/aws_profile.go (about) 1 package commands 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 8 "github.com/pterm/pterm" 9 "github.com/spf13/cobra" 10 "github.com/spf13/viper" 11 ) 12 13 func NewCmdAWSProfile() *cobra.Command { 14 cmd := &cobra.Command{ 15 Use: "aws-profile", 16 Short: "Configure aws profile", 17 DisableFlagsInUseLine: true, 18 Long: "Configure new aws profile from environment variables", 19 RunE: func(cmd *cobra.Command, args []string) error { 20 cmd.SilenceUsage = true 21 22 credentialsPath, err := ConfigureAwsProfile() 23 if err != nil { 24 return err 25 } 26 27 pterm.Success.Printfln("AWS profile `%s` added to %s", viper.GetString("AWS_PROFILE"), credentialsPath) 28 29 return nil 30 }, 31 } 32 33 return cmd 34 } 35 36 func ConfigureAwsProfile() (string, error) { 37 homeDirPath, err := os.UserHomeDir() 38 39 aws := filepath.Join(homeDirPath, ".aws") 40 awsCredentialsPath := filepath.Join(aws, "credentials") 41 42 _, err = os.Stat(aws) 43 if os.IsNotExist(err) { 44 err := os.MkdirAll(aws, 0755) 45 if err != nil { 46 return "", err 47 } 48 } 49 50 var f *os.File 51 52 _, err = os.Stat(awsCredentialsPath) 53 if os.IsNotExist(err) { 54 f, err = os.OpenFile(awsCredentialsPath, os.O_RDWR|os.O_CREATE, 0600) 55 if err != nil { 56 return awsCredentialsPath, fmt.Errorf("can't open file: %w", err) 57 } 58 } else { 59 f, err = os.OpenFile(filepath.Join(awsCredentialsPath), os.O_RDWR|os.O_APPEND, 0600) 60 if err != nil { 61 return awsCredentialsPath, fmt.Errorf("can't open file: %w", err) 62 } 63 } 64 65 defer func() { 66 cerr := f.Close() 67 if err == nil { 68 err = cerr 69 } 70 }() 71 72 ak := os.Getenv("AWS_ACCESS_KEY_ID") 73 sk := os.Getenv("AWS_SECRET_ACCESS_KEY") 74 r := viper.GetString("AWS_REGION") 75 p := viper.GetString("AWS_PROFILE") 76 if ak == "" || sk == "" || r == "" || p == "" { 77 return awsCredentialsPath, fmt.Errorf("AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION, AWS_PROFILE must be set") 78 } 79 80 _, err = f.WriteString(fmt.Sprintf("[%v]\naws_access_key_id = %v\naws_secret_access_key = %v\nregion = %v\n\n", p, ak, sk, r)) 81 if err != nil { 82 return awsCredentialsPath, fmt.Errorf("can't write to %s", filepath.Join(awsCredentialsPath)) 83 } 84 85 return awsCredentialsPath, nil 86 }