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  }