feat templater: Add 'pass' lookup function
This introduces support for looking up secret values in the 'pass' command line tool (https://www.passwordstore.org/). Values like passwords can be interpolated from pass and even more complex structures like certificates for Kubernetes Secrets can be retrieved and base64- encoded as necessary. Fixes #2
This commit is contained in:
		
							parent
							
								
									4713d565d3
								
							
						
					
					
						commit
						2f6e008121
					
				
					 3 changed files with 40 additions and 0 deletions
				
			
		|  | @ -1,4 +1,11 @@ | ||||||
| --- | --- | ||||||
|  | apiVersion: v1 | ||||||
|  | kind: Secret | ||||||
|  | metadata: | ||||||
|  |   name: secret-certificate | ||||||
|  | data: | ||||||
|  |   cert.pem: {{ passLookup "my/secret/certificate" | b64enc }} | ||||||
|  | --- | ||||||
| apiVersion: extensions/v1beta1 | apiVersion: extensions/v1beta1 | ||||||
| kind: Deployment | kind: Deployment | ||||||
| metadata: | metadata: | ||||||
|  |  | ||||||
							
								
								
									
										32
									
								
								templater/pass.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								templater/pass.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,32 @@ | ||||||
|  | // This file contains the implementation of a template function for retrieving variables from 'pass', the standard UNIX | ||||||
|  | // password manager. | ||||||
|  | package templater | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"os" | ||||||
|  | 	"os/exec" | ||||||
|  | 
 | ||||||
|  | 	"github.com/polydawn/meep" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type PassError struct { | ||||||
|  | 	meep.TraitAutodescribing | ||||||
|  | 	meep.TraitCausable | ||||||
|  | 	Output string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func GetFromPass(key string) (string, error) { | ||||||
|  | 	fmt.Fprintf(os.Stderr, "Attempting to look up %s in pass\n", key) | ||||||
|  | 	pass := exec.Command("pass", "show", key) | ||||||
|  | 
 | ||||||
|  | 	output, err := pass.CombinedOutput() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", meep.New( | ||||||
|  | 			&PassError{Output: string(output)}, | ||||||
|  | 			meep.Cause(err), | ||||||
|  | 		) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return string(output), nil | ||||||
|  | } | ||||||
|  | @ -158,6 +158,7 @@ func templateFuncs() template.FuncMap { | ||||||
| 		b, _ := json.Marshal(data) | 		b, _ := json.Marshal(data) | ||||||
| 		return string(b) | 		return string(b) | ||||||
| 	} | 	} | ||||||
|  | 	m["passLookup"] = GetFromPass | ||||||
| 
 | 
 | ||||||
| 	return m | 	return m | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue