github.com/criteo/command-launcher@v0.0.0-20230407142452-fb616f546e98/internal/config/settings.go (about) 1 package config 2 3 import ( 4 "fmt" 5 "strings" 6 "time" 7 8 log "github.com/sirupsen/logrus" 9 "github.com/spf13/viper" 10 ) 11 12 const ( 13 LOG_ENABLED_KEY = "LOG_ENABLED" 14 LOG_LEVEL_KEY = "LOG_LEVEL" 15 SELF_UPDATE_ENABLED_KEY = "SELF_UPDATE_ENABLED" 16 SELF_UPDATE_TIMEOUT_KEY = "SELF_UPDATE_TIMEOUT" 17 SELF_UPDATE_LATEST_VERSION_URL_KEY = "SELF_UPDATE_LATEST_VERSION_URL" 18 SELF_UPDATE_BASE_URL_KEY = "SELF_UPDATE_BASE_URL" 19 COMMAND_UPDATE_ENABLED_KEY = "COMMAND_UPDATE_ENABLED" 20 COMMAND_REPOSITORY_BASE_URL_KEY = "COMMAND_REPOSITORY_BASE_URL" 21 LOCAL_COMMAND_REPOSITORY_DIRNAME_KEY = "LOCAL_COMMAND_REPOSITORY_DIRNAME" 22 USAGE_METRICS_ENABLED_KEY = "USAGE_METRICS_ENABLED" 23 METRIC_GRAPHITE_HOST_KEY = "METRIC_GRAPHITE_HOST" 24 DEBUG_FLAGS_KEY = "DEBUG_FLAGS" 25 DROPIN_FOLDER_KEY = "DROPIN_FOLDER" 26 CI_ENABLED_KEY = "CI_ENABLED" 27 PACKAGE_LOCK_FILE_KEY = "PACKAGE_LOCK_FILE" 28 ENABLE_USER_CONSENT_KEY = "ENABLE_USER_CONSENT" 29 USER_CONSENT_LIFE_KEY = "USER_CONSENT_LIFE" 30 SYSTEM_PACKAGE_KEY = "SYSTEM_PACKAGE" // the system package name 31 SYSTEM_PACKAGE_PUBLIC_KEY_KEY = "SYSTEM_PACKAGE_PUBLIC_KEY" // the public key to verify system package 32 SYSTEM_PACKAGE_PUBLIC_KEY_FILE_KEY = "SYSTEM_PACKAGE_PUBLIC_KEY_FILE" // the public key file to verify system package 33 VERIFY_PACKAGE_CHECKSUM_KEY = "VERIFY_PACKAGE_CHECKSUM" 34 VERIFY_PACKAGE_SIGNATURE_KEY = "VERIFY_PACKAGE_SIGNATURE" 35 EXTRA_REMOTES_KEY = "EXTRA_REMOTES" 36 EXTRA_REMOTE_BASE_URL_KEY = "REMOTE_BASE_URL" 37 EXTRA_REMOTE_REPOSITORY_DIR_KEY = "REPOSITORY_DIR" 38 EXTRA_REMOTE_SYNC_POLICY_KEY = "SYNC_POLICY" 39 ENABLE_PACKAGE_SETUP_HOOK_KEY = "ENABLE_PACKAGE_SETUP_HOOK" 40 41 // internal commands are the commands with start partition number > INTERNAL_START_PARTITION 42 INTERNAL_COMMAND_ENABLED_KEY = "INTERNAL_COMMAND_ENABLED" 43 // experimental commands are the commands with start partition number > EXPERIMENTAL_START_PARTITION 44 EXPERIMENTAL_COMMAND_ENABLED_KEY = "EXPERIMENTAL_COMMAND_ENABLED" 45 ) 46 47 type ExtraRemote struct { 48 Name string `mapstructure:"name" json:"name"` 49 RemoteBaseUrl string `mapstructure:"remote_base_url" json:"remote_base_url"` 50 RepositoryDir string `mapstructure:"repository_dir" json:"repository_dir"` 51 SyncPolicy string `mapstructure:"sync_policy" json:"sync_policy"` 52 } 53 54 var SettingKeys []string 55 56 func init() { 57 SettingKeys = append([]string{}, 58 LOG_ENABLED_KEY, 59 LOG_LEVEL_KEY, 60 SELF_UPDATE_ENABLED_KEY, 61 SELF_UPDATE_TIMEOUT_KEY, 62 SELF_UPDATE_LATEST_VERSION_URL_KEY, 63 SELF_UPDATE_BASE_URL_KEY, 64 COMMAND_UPDATE_ENABLED_KEY, 65 COMMAND_REPOSITORY_BASE_URL_KEY, 66 LOCAL_COMMAND_REPOSITORY_DIRNAME_KEY, 67 USAGE_METRICS_ENABLED_KEY, 68 METRIC_GRAPHITE_HOST_KEY, 69 DEBUG_FLAGS_KEY, 70 DROPIN_FOLDER_KEY, 71 CI_ENABLED_KEY, 72 PACKAGE_LOCK_FILE_KEY, 73 INTERNAL_COMMAND_ENABLED_KEY, 74 EXPERIMENTAL_COMMAND_ENABLED_KEY, 75 ENABLE_USER_CONSENT_KEY, 76 USER_CONSENT_LIFE_KEY, 77 SYSTEM_PACKAGE_KEY, 78 SYSTEM_PACKAGE_PUBLIC_KEY_FILE_KEY, 79 ENABLE_PACKAGE_SETUP_HOOK_KEY, 80 ) 81 } 82 83 func SetSettingValue(key string, value string) error { 84 upperKey := strings.ToUpper(key) 85 switch upperKey { 86 case LOG_ENABLED_KEY: 87 return setBooleanConfig(upperKey, value) 88 case LOG_LEVEL_KEY: 89 return setLogLevelConfig(value) 90 case SELF_UPDATE_ENABLED_KEY: 91 return setBooleanConfig(upperKey, value) 92 case SELF_UPDATE_TIMEOUT_KEY: 93 return setDurationConfig(upperKey, value) 94 case SELF_UPDATE_BASE_URL_KEY: 95 return setStringConfig(upperKey, value) 96 case SELF_UPDATE_LATEST_VERSION_URL_KEY: 97 return setStringConfig(upperKey, value) 98 case COMMAND_UPDATE_ENABLED_KEY: 99 return setBooleanConfig(upperKey, value) 100 case COMMAND_REPOSITORY_BASE_URL_KEY: 101 return setStringConfig(upperKey, value) 102 case LOCAL_COMMAND_REPOSITORY_DIRNAME_KEY: 103 return setStringConfig(upperKey, value) 104 case USAGE_METRICS_ENABLED_KEY: 105 return setBooleanConfig(upperKey, value) 106 case METRIC_GRAPHITE_HOST_KEY: 107 return setStringConfig(upperKey, value) 108 case DEBUG_FLAGS_KEY: 109 return setStringConfig(upperKey, value) 110 case DROPIN_FOLDER_KEY: 111 return setStringConfig(upperKey, value) 112 case CI_ENABLED_KEY: 113 return setBooleanConfig(upperKey, value) 114 case PACKAGE_LOCK_FILE_KEY: 115 return setStringConfig(upperKey, value) 116 case EXPERIMENTAL_COMMAND_ENABLED_KEY: 117 return setBooleanConfig(upperKey, value) 118 case INTERNAL_COMMAND_ENABLED_KEY: 119 return setBooleanConfig(upperKey, value) 120 case ENABLE_USER_CONSENT_KEY: 121 return setBooleanConfig(upperKey, value) 122 case USER_CONSENT_LIFE_KEY: 123 return setDurationConfig(upperKey, value) 124 case SYSTEM_PACKAGE_KEY: 125 return setStringConfig(upperKey, value) 126 case SYSTEM_PACKAGE_PUBLIC_KEY_KEY: 127 return setStringConfig(upperKey, value) 128 case SYSTEM_PACKAGE_PUBLIC_KEY_FILE_KEY: 129 return setStringConfig(upperKey, value) 130 case VERIFY_PACKAGE_CHECKSUM_KEY: 131 return setBooleanConfig(upperKey, value) 132 case VERIFY_PACKAGE_SIGNATURE_KEY: 133 return setBooleanConfig(upperKey, value) 134 case ENABLE_PACKAGE_SETUP_HOOK_KEY: 135 return setBooleanConfig(upperKey, value) 136 } 137 138 return fmt.Errorf("unsupported config %s", key) 139 } 140 141 func AddRemote(name, repoDir, remoteBaseUrl string, syncPolicy string) error { 142 remotes := []ExtraRemote{} 143 err := viper.UnmarshalKey(EXTRA_REMOTES_KEY, &remotes) 144 if err != nil { 145 return err 146 } 147 148 if syncPolicy != "never" && syncPolicy != "hourly" && 149 syncPolicy != "daily" && syncPolicy != "weekly" && 150 syncPolicy != "monthly" && syncPolicy != "always" { 151 syncPolicy = "always" 152 } 153 154 for _, remote := range remotes { 155 if remote.RemoteBaseUrl == remoteBaseUrl || remote.Name == name { 156 return fmt.Errorf("remote already exists") 157 } 158 } 159 160 remotes = append(remotes, ExtraRemote{ 161 Name: name, 162 RemoteBaseUrl: remoteBaseUrl, 163 RepositoryDir: repoDir, 164 SyncPolicy: syncPolicy, 165 }) 166 viper.Set(EXTRA_REMOTES_KEY, remotes) 167 168 return nil 169 } 170 171 func RemoveRemote(name string) error { 172 remotes := []ExtraRemote{} 173 err := viper.UnmarshalKey(EXTRA_REMOTES_KEY, &remotes) 174 if err != nil { 175 return err 176 } 177 178 new_remotes := []ExtraRemote{} 179 for _, remote := range remotes { 180 if remote.Name != name { 181 new_remotes = append(new_remotes, remote) 182 } 183 } 184 185 viper.Set(EXTRA_REMOTES_KEY, new_remotes) 186 return nil 187 } 188 189 func Remotes() ([]ExtraRemote, error) { 190 remotes := []ExtraRemote{} 191 err := viper.UnmarshalKey(EXTRA_REMOTES_KEY, &remotes) 192 if err != nil { 193 return remotes, err 194 } 195 return remotes, nil 196 } 197 198 func setBooleanConfig(key string, value string) error { 199 if value == "true" { 200 viper.Set(key, true) 201 return nil 202 } else if value == "false" { 203 viper.Set(key, false) 204 return nil 205 } 206 return fmt.Errorf("invalid format for boolean type") 207 } 208 209 func setDurationConfig(key string, value string) error { 210 d, _ := time.ParseDuration(value) 211 viper.Set(key, d) 212 return nil 213 } 214 215 func setStringConfig(key string, value string) error { 216 viper.Set(key, value) 217 return nil 218 } 219 220 func setLogLevelConfig(value string) error { 221 _, err := log.ParseLevel(strings.ToLower(value)) 222 if err == nil { 223 viper.Set(LOG_LEVEL_KEY, strings.ToLower(value)) 224 } 225 return err 226 }