github.com/techend/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  }