1
0
mirror of https://github.com/rancher/os.git synced 2025-06-24 22:11:33 +00:00
os/cmd/control/config.go

141 lines
2.3 KiB
Go
Raw Normal View History

2015-02-17 21:31:37 +00:00
package control
import (
"fmt"
"io/ioutil"
2015-02-17 22:32:15 +00:00
"strings"
2015-02-17 21:31:37 +00:00
log "github.com/Sirupsen/logrus"
2015-02-17 22:32:15 +00:00
"gopkg.in/yaml.v2"
2015-02-17 21:31:37 +00:00
"github.com/codegangsta/cli"
"github.com/rancherio/os/config"
"github.com/rancherio/os/docker"
)
func configSubcommands() []cli.Command {
return []cli.Command{
{
2015-02-17 22:32:15 +00:00
Name: "get",
Usage: "get value",
Action: configGet,
2015-02-17 21:31:37 +00:00
},
{
Name: "import",
Usage: "list values",
},
{
Name: "export",
Usage: "dump full configuration",
Flags: []cli.Flag{
cli.StringFlag{
Name: "output, o",
Usage: "File to which to save",
},
cli.BoolFlag{
Name: "full",
Usage: "Include full configuration, not just writable fields",
},
},
Action: configSave,
},
}
}
2015-02-17 22:32:15 +00:00
func configGet(c *cli.Context) {
cfg, err := config.LoadConfig()
if err != nil {
log.Fatal(err)
}
content, err := cfg.Dump()
if err != nil {
log.Fatal(err)
}
data := make(map[interface{}]interface{})
yaml.Unmarshal([]byte(content), data)
arg := c.Args().Get(0)
if arg == "" {
fmt.Println("")
return
}
parts := strings.Split(arg, ".")
2015-02-17 23:03:56 +00:00
val := lookupVal(parts, data)
printYaml := false
switch val.(type) {
case []interface{}:
printYaml = true
case map[interface{}]interface{}:
printYaml = true
}
if printYaml {
bytes, err := yaml.Marshal(val)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(bytes))
} else {
fmt.Println(val)
}
}
func lookupVal(parts []string, data map[interface{}]interface{}) interface{} {
2015-02-17 22:32:15 +00:00
for i, part := range parts {
2015-02-17 23:03:56 +00:00
val, ok := data[part]
if !ok {
2015-02-17 22:32:15 +00:00
break
}
2015-02-17 23:03:56 +00:00
if i+1 == len(parts) {
return val
}
newData, ok := val.(map[interface{}]interface{})
if !ok {
break
}
data = newData
2015-02-17 22:32:15 +00:00
}
2015-02-17 23:03:56 +00:00
return ""
2015-02-17 22:32:15 +00:00
}
2015-02-17 21:31:37 +00:00
func configSave(c *cli.Context) {
cfg, err := config.LoadConfig()
if err != nil {
log.Fatal(err)
}
2015-02-17 22:32:15 +00:00
//TODO: why doesn't this work
2015-02-17 21:31:37 +00:00
for _, c := range cfg.SystemContainers {
container := docker.NewContainer("", &c)
if container.Err != nil {
log.Fatalf("Failed to parse [%s] : %v", c.Cmd, container.Err)
}
}
if !c.Bool("full") {
cfg.ClearReadOnly()
}
content, err := cfg.Dump()
output := c.String("output")
if output == "" {
fmt.Println(content)
} else {
err := ioutil.WriteFile(output, []byte(content), 0400)
if err != nil {
log.Fatal(err)
}
}
}