-
Notifications
You must be signed in to change notification settings - Fork 5
/
extract_encryption_key.go
102 lines (84 loc) · 2 KB
/
extract_encryption_key.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
package cfbackup
import (
"fmt"
"io"
"io/ioutil"
"os"
"path"
"strings"
"github.com/xchapter7x/goutil/itertools"
"gopkg.in/yaml.v1"
)
type cc struct {
Db_encryption_key string
}
type property struct {
Cc cc
}
type job struct {
Name string
Properties property
}
type jobs []job
type yamlkey struct {
Jobs jobs
}
func (s yamlkey) EncryptionKey() (key string, err error) {
if job, err := s.Jobs.Contains("cloud_controller"); err == nil {
key = job.Properties.Cc.Db_encryption_key
}
if key == "" {
err = fmt.Errorf("empty key error")
}
return
}
func ExtractEncryptionKey(dest io.Writer, deploymentDir string) (err error) {
var flist []os.FileInfo
if flist, err = ioutil.ReadDir(deploymentDir); err == nil {
yamlfilename := getYamlFilename(flist)
yamlfilepath := path.Join(deploymentDir, yamlfilename)
err = writeKey(dest, yamlfilepath)
}
return
}
func (jobs jobs) Contains(value string) (job, error) {
for p, v := range jobs {
if strings.Contains(v.Name, value) {
return jobs[p], nil
}
}
return job{}, fmt.Errorf("job not found")
}
func namefilter(i, v interface{}) (ok bool) {
file := v.(os.FileInfo)
filename := file.Name()
ok = (strings.HasPrefix(filename, "cf-") && strings.HasSuffix(filename, ".yml"))
return
}
func getYamlFilename(filelist []os.FileInfo) (filename string) {
var (
file os.FileInfo
idx int
)
if out := itertools.Filter(filelist, namefilter); len(out) > 0 {
itertools.PairUnPack(<-out, &idx, &file)
filename = file.Name()
}
return
}
func writeKey(dest io.Writer, yamlfilepath string) (err error) {
var encryptionKey string
if encryptionKey, err = getKeyFromFile(yamlfilepath); err == nil {
_, err = dest.Write([]byte(encryptionKey))
}
return
}
func getKeyFromFile(yamlfilepath string) (encryptionKey string, err error) {
var filebytes []byte
keyparse := yamlkey{}
if filebytes, err = ioutil.ReadFile(yamlfilepath); err == nil {
err = yaml.Unmarshal(filebytes, &keyparse)
encryptionKey, err = keyparse.EncryptionKey()
}
return
}