@@ -47,12 +47,6 @@ var Version string
4747func main () {
4848 flag .Usage = func () { fmt .Fprintf (os .Stderr , "%s\n " , USAGE ) }
4949
50- if len (os .Args ) == 1 {
51- flag .Usage ()
52- os .Exit (0 )
53- return
54- }
55-
5650 var (
5751 verboseFlag , versionFlag , humanOutputFlag bool
5852 configFilenameFlag string
@@ -67,18 +61,21 @@ func main() {
6761 flag .Parse ()
6862
6963 argv := flag .Args ()
64+ if len (argv ) == 0 {
65+ flag .Usage ()
66+ os .Exit (0 )
67+ }
7068
7169 slog .Debug ("flags" ,
7270 "version" , versionFlag ,
7371 "human" , humanOutputFlag ,
74- "confg " , configFilenameFlag ,
72+ "config " , configFilenameFlag ,
7573 "argv" , argv ,
7674 )
7775
7876 if versionFlag {
7977 slog .Info ("sesame" , "version" , Version )
8078 os .Exit (0 )
81- return
8279 }
8380
8481 var logHandler slog.Handler
@@ -111,11 +108,10 @@ func main() {
111108
112109 var cfg Configuration
113110 if err := toml .Unmarshal (configData , & cfg ); err != nil {
114- slog .Error ("unmashaling toml configuration" , "err" , err )
111+ slog .Error ("unmarshaling toml configuration" , "err" , err )
115112 return
116113 }
117114
118- // Expand environment variables part of prefix or secrets
119115 cfg .Prefix = os .ExpandEnv (cfg .Prefix )
120116 for idx , item := range cfg .Secrets {
121117 cfg .Secrets [idx ] = os .ExpandEnv (item )
@@ -129,49 +125,54 @@ func main() {
129125 }
130126
131127 env := os .Environ ()
132-
133128 client := ssm .NewFromConfig (awscfg )
134129
135130 nextToken := ""
136131 for {
137132 data , err := client .GetParametersByPath (ctx , & ssm.GetParametersByPathInput {
138- Path : & cfg .Prefix ,
139- NextToken : aws .String (nextToken ),
140- Recursive : aws .Bool (true ),
133+ Path : & cfg .Prefix ,
134+ NextToken : aws .String (nextToken ),
135+ Recursive : aws .Bool (true ),
136+ WithDecryption : aws .Bool (true ),
141137 })
142138 if err != nil {
143139 slog .Error ("error fetching parameters by path" , "err" , err )
144- continue
140+ break
145141 }
146142
147143 for _ , param := range data .Parameters {
144+ if param .Value == nil {
145+ continue
146+ }
148147 name := parameterToEnv (param .Name )
149148 env = append (env , fmt .Sprintf ("%s=%s" , name , * param .Value ))
150149 }
151150
152- if * data .NextToken != "" {
151+ if data . NextToken != nil && * data .NextToken != "" {
153152 nextToken = * data .NextToken
154153 continue
155154 }
156155 break
157156 }
158157
159- // Secrets, requested in batches of max 10 paths
160158 for _ , chunk := range chunked (cfg .Secrets ) {
161159 data , err := client .GetParameters (ctx , & ssm.GetParametersInput {
162- Names : chunk ,
160+ Names : chunk ,
161+ WithDecryption : aws .Bool (true ),
163162 })
164163 if err != nil {
165164 slog .Error ("error fetching parameters" , "err" , err )
166165 continue
167166 }
168167 for _ , param := range data .Parameters {
168+ if param .Value == nil {
169+ continue
170+ }
169171 name := parameterToEnv (param .Name )
170172 env = append (env , fmt .Sprintf ("%s=%s" , name , * param .Value ))
171173 }
172174 }
173175
174- // exec(1) and give up control
175176 if err := syscall .Exec (argv [0 ], argv [1 :], env ); err != nil {
176177 slog .Error ("error executing command" , "cmd" , argv , "err" , err )
177178 os .Exit (1 )
@@ -181,28 +182,26 @@ func main() {
181182var parameterNameRx * regexp.Regexp = regexp .MustCompile ("/([^/]+)$" )
182183
183184func parameterToEnv (name * string ) string {
184- return parameterNameRx .FindString (* name )
185+ if name == nil {
186+ return ""
187+ }
188+ if m := parameterNameRx .FindStringSubmatch (* name ); len (m ) > 1 {
189+ return m [1 ]
190+ }
191+ return ""
185192}
186193
187- // chunked, split a slice in multiple slices containing up to 10 elements of
188- // the original slice. The input slice is modified.
189194func chunked (slice []string ) [][]string {
190195 chunkSize := 10
191196 var chunks [][]string
192- for {
193- if len (slice ) == 0 {
194- break
195- }
196-
197- // necessary check to avoid slicing beyond
198- // slice capacity
197+ for len (slice ) != 0 {
199198 if len (slice ) < chunkSize {
200199 chunkSize = len (slice )
201200 }
202-
203- chunks = append (chunks , slice [0 :chunkSize ])
201+ c := make ([]string , chunkSize )
202+ copy (c , slice [:chunkSize ])
203+ chunks = append (chunks , c )
204204 slice = slice [chunkSize :]
205205 }
206-
207206 return chunks
208207}
0 commit comments