This is an automated email from the ASF dual-hosted git repository.

rohit pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cloudstack-cloudmonkey.git


The following commit(s) were added to refs/heads/master by this push:
     new dd613c3  config: Fixes #35 fix panic due to inappropriate config 
loading
dd613c3 is described below

commit dd613c303eab81b806f65f0c6f9062e8fce8ccd5
Author: Rohit Yadav <[email protected]>
AuthorDate: Sat Dec 8 03:20:38 2018 +0530

    config: Fixes #35 fix panic due to inappropriate config loading
    
    Signed-off-by: Rohit Yadav <[email protected]>
---
 cmk.go           |  2 +-
 config/config.go | 51 ++++++++++++++++++++++++++++++++++++---------------
 2 files changed, 37 insertions(+), 16 deletions(-)

diff --git a/cmk.go b/cmk.go
index fad4f49..83e8b7e 100644
--- a/cmk.go
+++ b/cmk.go
@@ -63,7 +63,7 @@ func main() {
        }
 
        if *profile != "" {
-               cfg.UpdateConfig("profile", *profile, false)
+               cfg.LoadProfile(*profile)
        }
 
        cli.SetConfig(cfg)
diff --git a/config/config.go b/config/config.go
index f0eafad..56f7c37 100644
--- a/config/config.go
+++ b/config/config.go
@@ -28,8 +28,8 @@ import (
        "time"
 
        "github.com/gofrs/flock"
-       "github.com/mitchellh/go-homedir"
-       "gopkg.in/ini.v1"
+       homedir "github.com/mitchellh/go-homedir"
+       ini "gopkg.in/ini.v1"
 )
 
 // Output formats
@@ -150,6 +150,11 @@ func newHTTPClient(cfg *Config) *http.Client {
        return client
 }
 
+func setActiveProfile(cfg *Config, profile *ServerProfile) {
+       cfg.ActiveProfile = profile
+       cfg.ActiveProfile.Client = newHTTPClient(cfg)
+}
+
 func reloadConfig(cfg *Config) *Config {
        fileLock := flock.New(path.Join(getDefaultConfigDir(), "lock"))
        err := fileLock.Lock()
@@ -162,6 +167,18 @@ func reloadConfig(cfg *Config) *Config {
        return cfg
 }
 
+func readConfig(cfg *Config) *ini.File {
+       conf, err := ini.LoadSources(ini.LoadOptions{
+               IgnoreInlineComment: true,
+       }, cfg.ConfigFile)
+
+       if err != nil {
+               fmt.Printf("Fail to read config file: %v", err)
+               os.Exit(1)
+       }
+       return conf
+}
+
 func saveConfig(cfg *Config) *Config {
        if _, err := os.Stat(cfg.Dir); err != nil {
                os.Mkdir(cfg.Dir, 0700)
@@ -177,18 +194,10 @@ func saveConfig(cfg *Config) *Config {
                conf.SaveTo(cfg.ConfigFile)
        }
 
-       // Read config
-       conf, err := ini.LoadSources(ini.LoadOptions{
-               IgnoreInlineComment: true,
-       }, cfg.ConfigFile)
-
-       if err != nil {
-               fmt.Printf("Fail to read config file: %v", err)
-               os.Exit(1)
-       }
+       conf := readConfig(cfg)
 
        core, err := conf.GetSection(ini.DEFAULT_SECTION)
-       if core == nil {
+       if core == nil || err != nil {
                defaultCore := defaultCoreConfig()
                section, _ := conf.NewSection(ini.DEFAULT_SECTION)
                section.ReflectFrom(&defaultCore)
@@ -209,7 +218,7 @@ func saveConfig(cfg *Config) *Config {
                activeProfile := defaultProfile()
                section, _ := conf.NewSection(cfg.Core.ProfileName)
                section.ReflectFrom(&activeProfile)
-               cfg.ActiveProfile = &activeProfile
+               setActiveProfile(cfg, &activeProfile)
        } else {
                // Write
                if cfg.ActiveProfile != nil {
@@ -218,7 +227,7 @@ func saveConfig(cfg *Config) *Config {
                // Update
                profile := new(ServerProfile)
                conf.Section(cfg.Core.ProfileName).MapTo(profile)
-               cfg.ActiveProfile = profile
+               setActiveProfile(cfg, profile)
        }
        // Save
        conf.SaveTo(cfg.ConfigFile)
@@ -232,10 +241,22 @@ func saveConfig(cfg *Config) *Config {
                profiles = append(profiles, profile.Name())
        }
 
-       cfg.ActiveProfile.Client = newHTTPClient(cfg)
        return cfg
 }
 
+// LoadProfile loads an existing profile
+func (c *Config) LoadProfile(name string) {
+       conf := readConfig(c)
+       section, err := conf.GetSection(name)
+       if err != nil || section == nil {
+               fmt.Printf("Unable to load profile '%s': %v", name, err)
+               os.Exit(1)
+       }
+       profile := new(ServerProfile)
+       conf.Section(name).MapTo(profile)
+       setActiveProfile(c, profile)
+}
+
 // UpdateConfig updates and saves config
 func (c *Config) UpdateConfig(key string, value string, update bool) {
        switch key {

Reply via email to