1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
// Author: arnej
package prog
import (
"os"
"strings"
"github.com/vespa-engine/vespa/client/go/internal/admin/trace"
)
func (p *Spec) Setenv(k, v string) {
p.Env[k] = v
}
func (p *Spec) Getenv(k string) string {
if v, ok := p.Env[k]; ok {
return v
}
return os.Getenv(k)
}
func (spec *Spec) EffectiveEnv() []string {
envMap := make(map[string]string)
addToMap := func(kv string) {
for idx, elem := range kv {
if elem == '=' {
k := kv[:idx]
envMap[k] = kv
return
}
}
trace.Trace("invalid entry in os.Environ():", kv)
envMap[kv] = kv
}
for _, entry := range os.Environ() {
addToMap(entry)
}
for k, v := range spec.Env {
trace.Trace("add to environment:", k, "=", v)
envMap[k] = k + "=" + v
}
envVec := make([]string, len(envMap))
idx := 0
for _, val := range envMap {
envVec[idx] = val
idx++
}
return envVec
}
func (spec *Spec) ConsiderFallback(varName, varValue string) {
if spec.Getenv(varName) == "" && varValue != "" {
spec.Setenv(varName, varValue)
}
}
func (spec *Spec) ConsiderEnvFallback(targetVar, fallbackVar string) {
spec.ConsiderFallback(targetVar, spec.Getenv(fallbackVar))
}
func (p *Spec) MatchesListEnv(envVarName string) bool {
return p.matchesListString(p.Getenv(envVarName))
}
func (p *Spec) matchesListString(env string) bool {
if env == "all" {
trace.Debug(p.Program, "always matching in:", env)
return true
}
parts := strings.Fields(env)
for _, part := range parts {
if p.BaseName == part {
trace.Debug(p.Program, "has basename matching in:", env)
return true
}
trace.Debug("checking matching:", p.BaseName, "!=", part)
}
return false
}
func (p *Spec) ValueFromListEnv(envVarName string) string {
return p.valueFromListString(p.Getenv(envVarName))
}
func (p *Spec) valueFromListString(env string) string {
parts := strings.Fields(env)
for _, part := range parts {
idx := strings.Index(part, "=")
if idx <= 0 {
trace.Trace("expected key=value, but got:", part)
continue
}
partName := part[:idx]
idx++
partValue := part[idx:]
if p.BaseName == partName || partName == "all" {
trace.Debug(p.Program, "has basename matching in:", env)
return partValue
}
trace.Debug("checking matching:", p.BaseName, "!=", part)
}
return ""
}
|