github.com/misfo/deis@v1.0.1-0.20141111224634-e0eee0392b8a/deisctl/config/config.go (about) 1 package config 2 3 import ( 4 "encoding/base64" 5 "fmt" 6 "io/ioutil" 7 "strings" 8 ) 9 10 // Config runs the config subcommand 11 func Config(args map[string]interface{}) error { 12 err := setConfigFlags(args) 13 if err != nil { 14 return err 15 } 16 return doConfig(args) 17 } 18 19 // CheckConfig looks for a value at a keyspace path 20 // and returns an error if a value is not found 21 func CheckConfig(root string, k string) error { 22 23 client, err := getEtcdClient() 24 if err != nil { 25 return err 26 } 27 28 _, err = doConfigGet(client, root, []string{k}) 29 if err != nil { 30 return err 31 } 32 33 return nil 34 } 35 36 // Flags for config package 37 var Flags struct { 38 } 39 40 func setConfigFlags(args map[string]interface{}) error { 41 return nil 42 } 43 44 func doConfig(args map[string]interface{}) error { 45 client, err := getEtcdClient() 46 if err != nil { 47 return err 48 } 49 50 rootPath := "/deis/" + args["<target>"].(string) + "/" 51 52 var vals []string 53 if args["set"] == true { 54 vals, err = doConfigSet(client, rootPath, args["<key=val>"].([]string)) 55 } else { 56 vals, err = doConfigGet(client, rootPath, args["<key>"].([]string)) 57 } 58 if err != nil { 59 return err 60 } 61 62 // print results 63 for _, v := range vals { 64 fmt.Printf("%v\n", v) 65 } 66 return nil 67 } 68 69 func doConfigSet(client *etcdClient, root string, kvs []string) ([]string, error) { 70 var result []string 71 72 for _, kv := range kvs { 73 74 // split k/v from args 75 split := strings.Split(kv, "=") 76 if len(split) != 2 { 77 return result, fmt.Errorf("invalid argument: %v", kv) 78 } 79 k, v := split[0], split[1] 80 81 // prepare path and value 82 path := root + k 83 var val string 84 85 // special handling for sshKey 86 if path == "/deis/platform/sshPrivateKey" { 87 b64, err := readSSHPrivateKey(v) 88 if err != nil { 89 return result, err 90 } 91 val = b64 92 } else { 93 val = v 94 } 95 96 // set key/value in etcd 97 ret, err := client.Set(path, val) 98 if err != nil { 99 return result, err 100 } 101 result = append(result, ret) 102 103 } 104 return result, nil 105 } 106 107 func doConfigGet(client *etcdClient, root string, keys []string) ([]string, error) { 108 var result []string 109 for _, k := range keys { 110 val, err := client.Get(root + k) 111 if err != nil { 112 return result, err 113 } 114 result = append(result, val) 115 } 116 return result, nil 117 } 118 119 // readSSHPrivateKey reads the key file and returns a base64 encoded string 120 func readSSHPrivateKey(path string) (string, error) { 121 122 bytes, err := ioutil.ReadFile(path) 123 if err != nil { 124 return "", err 125 } 126 127 return base64.StdEncoding.EncodeToString(bytes), nil 128 }