github.com/argoproj/argo-cd/v3@v3.2.1/util/config/env.go (about) 1 package config 2 3 import ( 4 "encoding/csv" 5 "errors" 6 "os" 7 "strconv" 8 "strings" 9 10 "github.com/kballard/go-shellquote" 11 log "github.com/sirupsen/logrus" 12 ) 13 14 var flags map[string]string 15 16 func init() { 17 err := LoadFlags() 18 if err != nil { 19 log.Fatal(err) 20 } 21 } 22 23 func LoadFlags() error { 24 flags = make(map[string]string) 25 26 opts, err := shellquote.Split(os.Getenv("ARGOCD_OPTS")) 27 if err != nil { 28 return err 29 } 30 31 var key string 32 for _, opt := range opts { 33 switch { 34 case strings.HasPrefix(opt, "--"): 35 if key != "" { 36 flags[key] = "true" 37 } 38 key = strings.TrimPrefix(opt, "--") 39 case key != "": 40 flags[key] = opt 41 key = "" 42 default: 43 return errors.New("ARGOCD_OPTS invalid at '" + opt + "'") 44 } 45 } 46 if key != "" { 47 flags[key] = "true" 48 } 49 // pkg shellquota doesn't recognize `=` so that the opts in format `foo=bar` could not work. 50 // issue ref: https://github.com/argoproj/argo-cd/issues/6822 51 for k, v := range flags { 52 if strings.Contains(k, "=") && v == "true" { 53 kv := strings.SplitN(k, "=", 2) 54 actualKey, actualValue := kv[0], kv[1] 55 if _, ok := flags[actualKey]; !ok { 56 flags[actualKey] = actualValue 57 } 58 } 59 } 60 return nil 61 } 62 63 func GetFlag(key, fallback string) string { 64 val, ok := flags[key] 65 if ok { 66 return val 67 } 68 return fallback 69 } 70 71 func GetBoolFlag(key string) bool { 72 return GetFlag(key, "false") == "true" 73 } 74 75 func GetIntFlag(key string, fallback int) int { 76 val, ok := flags[key] 77 if !ok { 78 return fallback 79 } 80 81 v, err := strconv.Atoi(val) 82 if err != nil { 83 log.Fatal(err) 84 } 85 return v 86 } 87 88 func GetStringSliceFlag(key string, fallback []string) []string { 89 val, ok := flags[key] 90 if !ok { 91 return fallback 92 } 93 94 if val == "" { 95 return []string{} 96 } 97 stringReader := strings.NewReader(val) 98 csvReader := csv.NewReader(stringReader) 99 v, err := csvReader.Read() 100 if err != nil { 101 log.Fatal(err) 102 } 103 return v 104 }