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  }