diff --git a/cmd/cloudinit/authorize_ssh_keys.go b/cmd/cloudinit/authorize_ssh_keys.go index dccfbc90..52946129 100644 --- a/cmd/cloudinit/authorize_ssh_keys.go +++ b/cmd/cloudinit/authorize_ssh_keys.go @@ -14,7 +14,7 @@ func authorizeSSHKeys(user string, authorizedKeys []string, name string) { cmd.Stderr = os.Stderr err := cmd.Run() if err != nil { - log.Fatal(err.Error()) + log.WithFields(log.Fields{"err": err, "user": user, "auth_key": authorizedKey}).Error("Error updating SSH authorized_keys") } } } diff --git a/cmd/cloudinit/cloudinit.go b/cmd/cloudinit/cloudinit.go index e3322462..7a076cc6 100644 --- a/cmd/cloudinit/cloudinit.go +++ b/cmd/cloudinit/cloudinit.go @@ -100,7 +100,8 @@ func saveFiles(cloudConfigBytes, scriptBytes []byte, metadata datasource.Metadat func currentDatasource() (datasource.Datasource, error) { cfg, err := rancherConfig.LoadConfig() if err != nil { - log.Fatalf("Failed to read rancher config %v", err) + log.WithFields(log.Fields{"err": err}).Error("Failed to read rancher config") + return nil, err } dss := getDatasources(cfg) @@ -208,15 +209,22 @@ func saveCloudConfig() error { return err } } else if config.IsCloudConfig(userData) { - // nothing to do + if rancherConfig.ReadConfig(userDataBytes) == nil { + log.WithFields(log.Fields{"cloud-config": userData}).Warn("Failed to parse cloud-config, not saving.") + userDataBytes = []byte{} + } } else { log.Errorf("Unrecognized cloud-init\n%s", userData) userDataBytes = []byte{} } - if userDataBytes, scriptBytes, err = mergeBaseConfig(userDataBytes, scriptBytes); err != nil { + userDataBytesMerged, scriptBytes, err := mergeBaseConfig(userDataBytes, scriptBytes) + if err != nil { log.Errorf("Failed to merge base config: %v", err) - return err + } else if rancherConfig.ReadConfig(userDataBytesMerged) == nil { + log.WithFields(log.Fields{"cloud-config": userData}).Warn("Failed to parse merged cloud-config, not merging.") + } else { + userDataBytes = userDataBytesMerged } return saveFiles(userDataBytes, scriptBytes, metadata) @@ -268,7 +276,7 @@ func executeCloudConfig() error { if cc.Hostname != "" { //set hostname if err := hostname.SetHostname(cc.Hostname); err != nil { - log.Fatal(err) + log.WithFields(log.Fields{"err": err, "hostname": cc.Hostname}).Error("Error setting hostname") } } @@ -290,7 +298,8 @@ func executeCloudConfig() error { f := system.File{File: file} fullPath, err := system.WriteFile(&f, "/") if err != nil { - log.Fatal(err) + log.WithFields(log.Fields{"err": err, "path": fullPath}).Error("Error writing file") + continue } log.Printf("Wrote file %s to filesystem", fullPath) } @@ -306,14 +315,14 @@ func Main() { if save { err := saveCloudConfig() if err != nil { - log.Fatalf("Failed to save cloud config: %v", err) + log.WithFields(log.Fields{"err": err}).Error("Failed to save cloud-config") } } if execute { err := executeCloudConfig() if err != nil { - log.Fatalf("Failed to save cloud config: %v", err) + log.WithFields(log.Fields{"err": err}).Error("Failed to execute cloud-config") } } } diff --git a/cmd/control/config.go b/cmd/control/config.go index a711d66e..f8a403ec 100644 --- a/cmd/control/config.go +++ b/cmd/control/config.go @@ -101,7 +101,7 @@ func imagesFromConfig(cfg *config.CloudConfig) []string { func runImages(c *cli.Context) { configFile := c.String("input") - cfg := config.ReadConfig(configFile) + cfg := config.ReadConfig(nil, configFile) if cfg == nil { log.Fatalf("Could not read config from file %v", configFile) } @@ -165,12 +165,12 @@ func configGet(c *cli.Context) { cfg, err := config.LoadConfig() if err != nil { - log.Panicln(err) + log.WithFields(log.Fields{"err": err}).Fatal("config get: failed to load config") } val, err := cfg.Get(arg) if err != nil { - log.WithFields(log.Fields{"cfg": cfg, "arg": arg, "val": val}).Panicln(err) + log.WithFields(log.Fields{"cfg": cfg, "key": arg, "val": val, "err": err}).Fatal("config get: failed to retrieve value") } printYaml := false diff --git a/config/config.go b/config/config.go index 03c5cf13..2867d385 100644 --- a/config/config.go +++ b/config/config.go @@ -49,7 +49,7 @@ func (c *CloudConfig) Merge(bytes []byte) error { func LoadConfig() (*CloudConfig, error) { cfg := NewConfig() if err := cfg.Reload(); err != nil { - log.WithFields(log.Fields{"cfg": cfg}).Panicln(err) + log.WithFields(log.Fields{"cfg": cfg, "err": err}).Error("Failed to reload config") return nil, err } @@ -67,18 +67,22 @@ func LoadConfig() (*CloudConfig, error) { } func (c *CloudConfig) merge(values map[interface{}]interface{}) error { + t := &CloudConfig{} + if err := util.Convert(values, t); err != nil { + return err + } return util.Convert(values, c) } func (c *CloudConfig) readFiles() error { data, err := readConfig(nil, CloudConfigFile, LocalConfigFile, PrivateConfigFile) if err != nil { - log.Panicln(err) + log.WithFields(log.Fields{"err": err}).Error("Error reading config files") return err } if err := c.merge(data); err != nil { - log.WithFields(log.Fields{"cfg": c, "data": data}).Panicln(err) + log.WithFields(log.Fields{"cfg": c, "data": data, "err": err}).Error("Error merging config data") return err } @@ -89,7 +93,7 @@ func (c *CloudConfig) readCmdline() error { log.Debug("Reading config cmdline") cmdLine, err := ioutil.ReadFile("/proc/cmdline") if err != nil { - log.Panicln(err) + log.WithFields(log.Fields{"err": err}).Error("Failed to read kernel params") return err } @@ -102,8 +106,7 @@ func (c *CloudConfig) readCmdline() error { cmdLineObj := parseCmdline(strings.TrimSpace(string(cmdLine))) if err := c.merge(cmdLineObj); err != nil { - log.WithFields(log.Fields{"cfg": c, "cmdLine": cmdLine, "data": cmdLineObj}).Panicln(err) - return err + log.WithFields(log.Fields{"cfg": c, "cmdLine": cmdLine, "data": cmdLineObj, "err": err}).Warn("Error adding kernel params to config") } return nil } @@ -129,7 +132,7 @@ func Dump(private, full bool) (string, error) { return "", err } - if err := c.readGlobals(); err != nil { + if err := c.readCmdline(); err != nil { return "", err } @@ -158,16 +161,10 @@ func (c *CloudConfig) amendNils() error { return nil } -func (c *CloudConfig) readGlobals() error { - return util.ShortCircuit( - c.readCmdline, - ) -} - func (c *CloudConfig) Reload() error { return util.ShortCircuit( c.readFiles, - c.readGlobals, + c.readCmdline, c.amendNils, ) } diff --git a/config/default.go b/config/default.go index cb25de72..48f98c6f 100644 --- a/config/default.go +++ b/config/default.go @@ -1,13 +1,15 @@ package config func NewConfig() *CloudConfig { - return ReadConfig(OsConfigFile) + return ReadConfig(nil, OsConfigFile) } -func ReadConfig(file string) *CloudConfig { - if data, err := readConfig(nil, file); err == nil { +func ReadConfig(bytes []byte, files ...string) *CloudConfig { + if data, err := readConfig(bytes, files...); err == nil { c := &CloudConfig{} - c.merge(data) + if err := c.merge(data); err != nil { + return nil + } c.amendNils() return c } else { diff --git a/init/init.go b/init/init.go index 43bc801a..6d4b2855 100644 --- a/init/init.go +++ b/init/init.go @@ -168,8 +168,10 @@ func RunInit() error { } if cfg.Rancher.Debug { - cfgString, _ := config.Dump(false, true) - if cfgString != "" { + cfgString, err := config.Dump(false, true) + if err != nil { + log.WithFields(log.Fields{"err": err}).Error("Error serializing config") + } else { log.Debugf("Config: %s", cfgString) } } diff --git a/util/util.go b/util/util.go index e4482b75..6eb8e7d8 100644 --- a/util/util.go +++ b/util/util.go @@ -155,7 +155,7 @@ func RandSeq(n int) string { func Convert(from, to interface{}) error { bytes, err := yaml.Marshal(from) if err != nil { - log.WithFields(log.Fields{"from": from}).Panicln(err) + log.WithFields(log.Fields{"from": from, "err": err}).Warn("Error serializing to YML") return err }