diff options
| author | Mitchell Riedstra <mitch@riedstra.dev> | 2022-11-21 00:00:55 -0500 |
|---|---|---|
| committer | Mitchell Riedstra <mitch@riedstra.dev> | 2022-11-21 00:01:06 -0500 |
| commit | 35f9d0a511653604764dd8a033ac9cba00248443 (patch) | |
| tree | 9fc3d12a4d7a48abb1a25aefbb0a36181534e4a9 /main.go | |
| parent | 15f0d12bf1475b5c77121abd2c0f6d0a06791dc2 (diff) | |
| download | dpw-ssm-35f9d0a511653604764dd8a033ac9cba00248443.tar.gz dpw-ssm-35f9d0a511653604764dd8a033ac9cba00248443.tar.xz | |
Diffstat (limited to 'main.go')
| -rw-r--r-- | main.go | 124 |
1 files changed, 57 insertions, 67 deletions
@@ -1,3 +1,5 @@ +// Very basic program to interact with the AWS SSM Parameter Store +// to let you use it as a basic key/value store for arbitrary data. package main import ( @@ -5,7 +7,7 @@ import ( "fmt" "log" "os" - "regexp" + "sort" "strings" "riedstra.dev/go/dpw-ssm/store" @@ -15,91 +17,78 @@ import ( "github.com/aws/aws-sdk-go/service/ssm" ) -const SSM_MAX_SIZE = 4096 - -// ((16^4)*4096)/1024/1024 -// If we ever need more than 256 MB in parameter store, we've done something -// very wrong. -const SSM_KEY_FORMAT = "%s-%04X" // - var ( - KMS_KEY_ID *string = nil - VersionString = "development" + VersionString = "development" svc *ssm.SSM Logger = log.New(os.Stderr, "", 0) - trimRegex = regexp.MustCompile("-[0-9A-E][0-9A-E][0-9A-E][0-9A-E]$") keyPrefix = os.Getenv("DPW_SSM_PREFIX") ) +func getPath(params []string) string { + if len(params) != 1 { + Logger.Printf("Params provided: '%s'", params) + Logger.Fatal("Expected exactly one parameter, the path") + } + return keyPrefix + params[0] +} + func listParams(params []string) { info, err := store.GetInfo(svc) if err != nil { Logger.Fatal(err) } + s := []string{} for key, _ := range info.ByKey { + s = append(s, key) + } + sort.Strings(s) + + for _, key := range s { // Skip over things that aren't prefixed... if keyPrefix != "" && !strings.HasPrefix(key, keyPrefix) { continue } fmt.Println(strings.TrimPrefix(key, keyPrefix)) } - - os.Exit(0) } func insertParam(params []string) { - if len(params) != 1 { - Logger.Printf("Params provided: '%s'", params) - Logger.Fatal("Expected exactly one parameter, the path") - } - path := keyPrefix + params[0] + path := getPath(params) err := store.InsertParam(svc, os.Stdin, path) if err != nil { Logger.Fatalf("While inserting: '%s': %s", path, err) } - - os.Exit(0) } func showParam(params []string) { - if len(params) != 1 { - Logger.Printf("Params provided: '%s'", params) - Logger.Fatal("Expected exactly one parameter, the path") - } - path := keyPrefix + params[0] + path := getPath(params) err := store.GetParam(svc, os.Stdout, path) if err != nil { Logger.Fatalf("Encountered: %s\n", err) } - - os.Exit(0) } func removeParam(params []string) { - if len(params) != 1 { - Logger.Printf("Params provided: '%s'", params) - Logger.Fatal("Expected exactly one parameter, the path") - } - path := keyPrefix + params[0] + path := getPath(params) err := store.RemoveParam(svc, path) if err != nil { Logger.Fatalf("Encountered: %s\n", err) } - - os.Exit(0) } func help() { fmt.Printf(` dpw-ssm: An AWS SSM backend for the dynamic password manager. -https://git.riedstra.dev/mitch/dpw/about/ This can be used directly, but for interactive use 'dpw' is encouraged. +AWS console: +https://%s.console.aws.amazon.com/systems-manager/parameters + Available commands: list @@ -111,14 +100,14 @@ Debugging environment variables: DPW_SSM_DEBUG=YES # Enable extended logging -Environment variables: +Example of available environment variables: DPW_SSM_PREFIX=<prefix for all keys> DPW_SSM_KMS_KEY_ID=<KMS KEY ID> # Optional DPW_SSM_TAGS='{"json":"encoded","set":"of","key":"value","pairs":"..."}' version: %s -`, VersionString) +`, os.Getenv("AWS_REGION"), VersionString) os.Exit(0) } @@ -135,15 +124,7 @@ func setRegion() { } } -func main() { - if os.Getenv("DPW_SSM_DEBUG") != "" { - Logger = log.New(os.Stderr, "", log.LstdFlags|log.Lshortfile) - } - - if os.Getenv("DPW_SSM_KMS_KEY_ID") != "" { - store.KMS_KEY_ID = aws.String(os.Getenv("DPW_SSM_KMS_KEY_ID")) - } - +func setupTags() { ssm_tags_json := os.Getenv("DPW_SSM_TAGS") if ssm_tags_json != "" { tags := map[string]string{} @@ -159,32 +140,41 @@ func main() { } } } +} + +func main() { + if os.Getenv("DPW_SSM_DEBUG") != "" { + Logger = log.New(os.Stderr, "", log.LstdFlags|log.Lshortfile) + } + + if os.Getenv("DPW_SSM_KMS_KEY_ID") != "" { + store.KMS_KEY_ID = aws.String(os.Getenv("DPW_SSM_KMS_KEY_ID")) + } + setupTags() setRegion() ses := session.Must(session.NewSession()) svc = ssm.New(ses) - for n, arg := range os.Args[1:] { - switch arg { - case "list": - listParams(os.Args[n+2:]) - break - case "insert": - insertParam(os.Args[n+2:]) - break - case "show": - showParam(os.Args[n+2:]) - break - case "rm": - removeParam(os.Args[n+2:]) - break - case "init": - fmt.Fprintln(os.Stderr, "No init process is necessary") - break - default: - fmt.Fprintf(os.Stderr, "Unknown argument: '%s'\n", arg) - help() - } + switch os.Args[1] { + case "list": + listParams(os.Args[2:]) + break + case "insert": + insertParam(os.Args[2:]) + break + case "show": + showParam(os.Args[2:]) + break + case "rm": + removeParam(os.Args[2:]) + break + case "init": + fmt.Fprintln(os.Stderr, "No init process is necessary") + break + default: + fmt.Fprintf(os.Stderr, "Unknown argument: '%s'\n", os.Args[1]) + help() } } |
