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 }