github.com/hazelops/ize@v1.1.12-0.20230915191306-97d7c0e48f11/internal/commands/mfa.go (about)

     1  package commands
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/aws/aws-sdk-go/service/iam"
     7  	"github.com/hazelops/ize/internal/config"
     8  	"github.com/spf13/cobra"
     9  )
    10  
    11  type MfaOptions struct {
    12  	Config *config.Project
    13  }
    14  
    15  func NewMfaFlags(project *config.Project) *MfaOptions {
    16  	return &MfaOptions{
    17  		Config: project,
    18  	}
    19  }
    20  
    21  func NewCmdMfa(project *config.Project) *cobra.Command {
    22  	o := NewMfaFlags(project)
    23  
    24  	cmd := &cobra.Command{
    25  		Use:   "mfa",
    26  		Short: "Generate a list of exports for your shell to use ize with MFA-enabled AWS account",
    27  		RunE: func(cmd *cobra.Command, args []string) error {
    28  			cmd.SilenceUsage = true
    29  			err := o.Complete()
    30  			if err != nil {
    31  				return err
    32  			}
    33  
    34  			err = o.Run()
    35  			if err != nil {
    36  				return err
    37  			}
    38  
    39  			return nil
    40  		},
    41  	}
    42  
    43  	return cmd
    44  }
    45  
    46  func (o *MfaOptions) Complete() error {
    47  	return nil
    48  }
    49  
    50  func (o *MfaOptions) Run() error {
    51  	devices, err := iam.New(o.Config.Session).ListMFADevices(&iam.ListMFADevicesInput{})
    52  	if err != nil {
    53  		return err
    54  	}
    55  
    56  	if len(devices.MFADevices) == 0 {
    57  		return fmt.Errorf("MFA hasn't configured\n")
    58  	}
    59  
    60  	v, err := o.Config.Session.Config.Credentials.Get()
    61  	if err != nil {
    62  		return err
    63  	}
    64  
    65  	fmt.Printf("export AWS_SECRET_ACCESS_KEY=%s && \\ \nexport AWS_SESSION_TOKEN=%s && \\ \nexport AWS_ACCESS_KEY_ID=%s\n",
    66  		v.SecretAccessKey, v.SessionToken, v.AccessKeyID,
    67  	)
    68  
    69  	return nil
    70  }