aboutsummaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'main.go')
-rw-r--r--main.go124
1 files changed, 57 insertions, 67 deletions
diff --git a/main.go b/main.go
index 4e11d21..96323a5 100644
--- a/main.go
+++ b/main.go
@@ -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()
}
}