-
Notifications
You must be signed in to change notification settings - Fork 5
/
configure.go
104 lines (90 loc) · 3.15 KB
/
configure.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package cmd
import (
"os"
"path/filepath"
"github.com/chanzuckerberg/aws-oidc/pkg/aws_config_client"
"github.com/chanzuckerberg/go-misc/oidc_cli/oidc_impl"
oidc_client "github.com/chanzuckerberg/go-misc/oidc_cli/oidc_impl/client"
"github.com/mitchellh/go-homedir"
"github.com/pkg/errors"
"github.com/spf13/cobra"
"gopkg.in/ini.v1"
)
var configURL string
var printOnly bool
var defaultRegion string
var defaultRoleName string
func init() {
// required flags
configureCmd.Flags().StringVar(&clientID, "client-id", "", "CLIENT_ID generated from the OIDC application")
configureCmd.Flags().StringVar(&issuerURL, "issuer-url", "", "The URL that hosts the OIDC identity provider")
configureCmd.Flags().StringVar(&configURL, "config-url", "", "The URL of the config generation site.")
configureCmd.MarkFlagRequired("client-id") // nolint:errcheck
configureCmd.MarkFlagRequired("issuer-url") // nolint:errcheck
configureCmd.MarkFlagRequired("config-url") // nolint:errcheck
// optional flags
configureCmd.Flags().BoolVar(
&printOnly,
"print-only",
false,
`Set this flag if you don't want aws-oidc to modify your ~/.aws/config directly.
You can then configure your ~/.aws/config with the output.`,
)
configureCmd.Flags().StringVar(&defaultRegion, "default-region", "", "Region to configure for all profiles")
configureCmd.Flags().StringVar(&defaultRoleName, "default-role-name", "", "Default role to configure for all profiles")
rootCmd.AddCommand(configureCmd)
}
var configureCmd = &cobra.Command{
Use: "configure",
Short: "aws-oidc configure",
Long: "Configure helps you configure your aws config. Depends on a config generation service running.",
RunE: func(cmd *cobra.Command, args []string) error {
token, err := oidc_impl.GetToken(
cmd.Context(),
clientID,
issuerURL,
oidc_client.SetSuccessMessage(successMessage),
)
if err != nil {
return err
}
config, err := aws_config_client.RequestConfig(cmd.Context(), token, configURL)
if err != nil {
return err
}
survey := &aws_config_client.Survey{}
completer := aws_config_client.NewCompleter(
survey,
config,
defaultRegion,
defaultRoleName,
)
// TODO(el): should this be configurable?
awsConfigPath, err := homedir.Expand("~/.aws/config")
if err != nil {
return errors.Wrap(err, "Could not parse aws config file path")
}
// create .aws dir if not present
awsConfigDirPath := filepath.Dir(awsConfigPath)
err = os.MkdirAll(awsConfigDirPath, 0775)
if err != nil {
return errors.Wrap(err, "could not create dir %s")
}
// LooseLoad ignores the aws config file if missing
originalConfig, err := ini.LooseLoad(awsConfigPath)
if err != nil {
return errors.Wrap(err, "could not open aws config")
}
// We allow users to print aws config directly to stdout if they want
// instead of us directly trying to modify their aws config
if printOnly {
return completer.Complete(originalConfig, &aws_config_client.AWSConfigSTDOUTWriter{})
}
awsConfigWriter := aws_config_client.NewAWSConfigFileWriter(awsConfigPath)
err = completer.Complete(originalConfig, awsConfigWriter)
if err != nil {
return err
}
return awsConfigWriter.Finalize()
},
}