github.com/elopio/cli@v6.21.2-0.20160902224010-ea909d1fdb2f+incompatible/utils/config/config.go (about)

     1  package config
     2  
     3  import (
     4  	"encoding/json"
     5  	"io/ioutil"
     6  	"os"
     7  	"path/filepath"
     8  	"strconv"
     9  	"strings"
    10  	"time"
    11  
    12  	"code.cloudfoundry.org/cli/utils/sortutils"
    13  )
    14  
    15  const (
    16  	DefaultStagingTimeout = 15 * time.Minute
    17  	DefaultStartupTimeout = 5 * time.Minute
    18  	// DefaultPingerThrottle = 5 * time.Second
    19  
    20  	DefaultTarget       = "https://api.bosh-lite.com"
    21  	DefaultColorEnabled = "true"
    22  	DefaultLocale       = ""
    23  )
    24  
    25  func LoadConfig() (*Config, error) {
    26  	filePath := defaultFilePath()
    27  
    28  	var config Config
    29  	if _, err := os.Stat(filePath); os.IsNotExist(err) {
    30  		config = Config{
    31  			configFile: CFConfig{
    32  				Target:       DefaultTarget,
    33  				ColorEnabled: DefaultColorEnabled,
    34  			},
    35  		}
    36  	} else {
    37  		file, err := ioutil.ReadFile(filePath)
    38  		if err != nil {
    39  			return nil, err
    40  		}
    41  
    42  		err = json.Unmarshal(file, &config.configFile)
    43  		if err != nil {
    44  			return nil, err
    45  		}
    46  	}
    47  
    48  	config.env = EnvOverride{
    49  		BinaryName:       os.Args[0],
    50  		CFColor:          os.Getenv("CF_COLOR"),
    51  		CFPluginHome:     os.Getenv("CF_PLUGIN_HOME"),
    52  		CFStagingTimeout: os.Getenv("CF_STAGING_TIMEOUT"),
    53  		CFStartupTimeout: os.Getenv("CF_STARTUP_TIMEOUT"),
    54  		CFTrace:          os.Getenv("CF_TRACE"),
    55  		HTTPSProxy:       os.Getenv("https_proxy"),
    56  		Lang:             os.Getenv("LANG"),
    57  		LCAll:            os.Getenv("LC_ALL"),
    58  	}
    59  
    60  	pluginFilePath := filepath.Join(config.PluginHome(), "config.json")
    61  	if _, err := os.Stat(pluginFilePath); os.IsNotExist(err) {
    62  		config.pluginConfig = PluginsConfig{}
    63  	} else {
    64  		file, err := ioutil.ReadFile(pluginFilePath)
    65  		if err != nil {
    66  			return nil, err
    67  		}
    68  
    69  		err = json.Unmarshal(file, &config.pluginConfig)
    70  		if err != nil {
    71  			return nil, err
    72  		}
    73  	}
    74  
    75  	return &config, nil
    76  }
    77  
    78  type Config struct {
    79  	configFile   CFConfig
    80  	env          EnvOverride
    81  	pluginConfig PluginsConfig
    82  }
    83  
    84  type CFConfig struct {
    85  	ConfigVersion            int                `json:"ConfigVersion"`
    86  	Target                   string             `json:"Target"`
    87  	APIVersion               string             `json:"APIVersion"`
    88  	AuthorizationEndpoint    string             `json:"AuthorizationEndpoint"`
    89  	LoggregatorEndpoint      string             `json:"LoggregatorEndPoint"`
    90  	DopplerEndpoint          string             `json:"DopplerEndPoint"`
    91  	UAAEndpoint              string             `json:"UaaEndpoint"`
    92  	RoutingAPIEndpoint       string             `json:"RoutingAPIEndpoint"`
    93  	AccessToken              string             `json:"AccessToken"`
    94  	SSHOAuthClient           string             `json:"SSHOAuthClient"`
    95  	RefreshToken             string             `json:"RefreshToken"`
    96  	OrganizationFields       OrganizationFields `json:"OrganizationFields"`
    97  	SpaceFields              SpaceFields        `json:"SpaceFields"`
    98  	SSLDisabled              bool               `json:"SSLDisabled"`
    99  	AsyncTimeout             int                `json:"AsyncTimeout"`
   100  	Trace                    string             `json:"Trace"`
   101  	ColorEnabled             string             `json:"ColorEnabled"`
   102  	Locale                   string             `json:"Locale"`
   103  	PluginRepos              []PluginRepos      `json:"PluginRepos"`
   104  	MinCLIVersion            string             `json:"MinCLIVersion"`
   105  	MinRecommendedCLIVersion string             `json:"MinRecommendedCLIVersion"`
   106  }
   107  
   108  type OrganizationFields struct {
   109  	GUID            string          `json:"GUID"`
   110  	Name            string          `json:"Name"`
   111  	QuotaDefinition QuotaDefinition `json:"QuotaDefinition"`
   112  }
   113  
   114  type QuotaDefinition struct {
   115  	GUID                    string `json:"guid"`
   116  	Name                    string `json:"name"`
   117  	MemoryLimit             int    `json:"memory_limit"`
   118  	InstanceMemoryLimit     int    `json:"instance_memory_limit"`
   119  	TotalRoutes             int    `json:"total_routes"`
   120  	TotalServices           int    `json:"total_services"`
   121  	NonBasicServicesAllowed bool   `json:"non_basic_services_allowed"`
   122  	AppInstanceLimit        int    `json:"app_instance_limit"`
   123  	TotalReservedRoutePorts int    `json:"total_reserved_route_ports"`
   124  }
   125  
   126  type SpaceFields struct {
   127  	GUID     string `json:"GUID"`
   128  	Name     string `json:"Name"`
   129  	AllowSSH bool   `json:"AllowSSH"`
   130  }
   131  
   132  type PluginRepos struct {
   133  	Name string `json:"Name"`
   134  	URL  string `json:"URL"`
   135  }
   136  
   137  type EnvOverride struct {
   138  	BinaryName       string
   139  	CFColor          string
   140  	CFHome           string
   141  	CFPluginHome     string
   142  	CFStagingTimeout string
   143  	CFStartupTimeout string
   144  	CFTrace          string
   145  	HTTPSProxy       string
   146  	Lang             string
   147  	LCAll            string
   148  }
   149  
   150  type PluginsConfig struct {
   151  	Plugins map[string]PluginConfig `json:"Plugins"`
   152  }
   153  
   154  type PluginConfig struct {
   155  	Location string         `json:"Location"`
   156  	Version  PluginVersion  `json:"Version"`
   157  	Commands PluginCommands `json:"Commands"`
   158  }
   159  
   160  type PluginVersion struct {
   161  	Major int `json:"Major"`
   162  	Minor int `json:"Minor"`
   163  	Build int `json:"Build"`
   164  }
   165  
   166  type PluginCommands []PluginCommand
   167  
   168  func (p PluginCommands) Len() int               { return len(p) }
   169  func (p PluginCommands) Swap(i int, j int)      { p[i], p[j] = p[j], p[i] }
   170  func (p PluginCommands) Less(i int, j int) bool { return sortutils.SortAlphabetic(p[i].Name, p[j].Name) }
   171  
   172  type PluginCommand struct {
   173  	Name         string             `json:"Name"`
   174  	Alias        string             `json:"Alias"`
   175  	HelpText     string             `json:"HelpText"`
   176  	UsageDetails PluginUsageDetails `json:"UsageDetails"`
   177  }
   178  
   179  type PluginUsageDetails struct {
   180  	Usage   string            `json:"Usage"`
   181  	Options map[string]string `json:"Options"`
   182  }
   183  
   184  type ColorSetting int
   185  
   186  const (
   187  	ColorDisbled ColorSetting = iota
   188  	ColorEnabled
   189  	ColorAuto
   190  )
   191  
   192  func (config *Config) ColorEnabled() ColorSetting {
   193  	if config.env.CFColor != "" {
   194  		val, err := strconv.ParseBool(config.env.CFColor)
   195  		if err == nil {
   196  			return config.boolToColorSetting(val)
   197  		}
   198  	}
   199  
   200  	val, err := strconv.ParseBool(config.configFile.ColorEnabled)
   201  	if err != nil {
   202  		return ColorEnabled
   203  	}
   204  	return config.boolToColorSetting(val)
   205  }
   206  
   207  func (_ *Config) boolToColorSetting(val bool) ColorSetting {
   208  	if val {
   209  		return ColorEnabled
   210  	}
   211  
   212  	return ColorDisbled
   213  }
   214  
   215  func (conf *Config) Target() string {
   216  	return conf.configFile.Target
   217  }
   218  
   219  func (config *Config) PluginHome() string {
   220  	if config.env.CFPluginHome != "" {
   221  		return filepath.Join(config.env.CFPluginHome, ".cf", "plugins")
   222  	}
   223  
   224  	return filepath.Join(homeDirectory(), ".cf", "plugins")
   225  }
   226  
   227  func (config *Config) PluginConfig() map[string]PluginConfig {
   228  	return config.pluginConfig.Plugins
   229  }
   230  
   231  func (config *Config) StagingTimeout() time.Duration {
   232  	if config.env.CFStagingTimeout != "" {
   233  		val, err := strconv.ParseInt(config.env.CFStagingTimeout, 10, 64)
   234  		if err == nil {
   235  			return time.Duration(val) * time.Minute
   236  		}
   237  	}
   238  
   239  	return DefaultStagingTimeout
   240  }
   241  
   242  func (config *Config) StartupTimeout() time.Duration {
   243  	if config.env.CFStartupTimeout != "" {
   244  		val, err := strconv.ParseInt(config.env.CFStartupTimeout, 10, 64)
   245  		if err == nil {
   246  			return time.Duration(val) * time.Minute
   247  		}
   248  	}
   249  
   250  	return DefaultStartupTimeout
   251  }
   252  
   253  func (config *Config) HTTPSProxy() string {
   254  	if config.env.HTTPSProxy != "" {
   255  		return config.env.HTTPSProxy
   256  	}
   257  
   258  	return ""
   259  }
   260  
   261  func (config *Config) Locale() string {
   262  	if config.configFile.Locale != "" {
   263  		return config.configFile.Locale
   264  	}
   265  
   266  	if config.env.LCAll != "" {
   267  		return config.convertLocale(config.env.LCAll)
   268  	}
   269  
   270  	if config.env.Lang != "" {
   271  		return config.convertLocale(config.env.Lang)
   272  	}
   273  
   274  	return DefaultLocale
   275  }
   276  
   277  func (config *Config) BinaryName() string {
   278  	return config.env.BinaryName
   279  }
   280  
   281  func (config *Config) convertLocale(local string) string {
   282  	lang := strings.Split(local, ".")[0]
   283  	return strings.Replace(lang, "_", "-", -1)
   284  }