master
go 109 lines 2.22 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package nagios
4
5 import (
6 "fmt"
7 "maps"
8 "os"
9 "os/user"
10 "runtime"
11 "sort"
12 )
13
14 func buildRunEnv(workingDir string, jobEnv map[string]string, macroEnv map[string]string) []string {
15 merged := buildExecutionBaselineEnv(workingDir)
16 for k, v := range jobEnv {
17 merged[k] = replaceMacro(v, macroEnv)
18 }
19 maps.Copy(merged, macroEnv)
20
21 keys := make([]string, 0, len(merged))
22 for k := range merged {
23 keys = append(keys, k)
24 }
25 sort.Strings(keys)
26
27 out := make([]string, 0, len(keys))
28 for _, k := range keys {
29 out = append(out, fmt.Sprintf("%s=%s", k, merged[k]))
30 }
31 return out
32 }
33
34 func buildExecutionBaselineEnv(workingDir string) map[string]string {
35 if runtime.GOOS == "windows" {
36 return buildWindowsExecutionBaselineEnv()
37 }
38 return buildUnixExecutionBaselineEnv(workingDir)
39 }
40
41 func buildUnixExecutionBaselineEnv(workingDir string) map[string]string {
42 env := make(map[string]string)
43 setEnvFromProcess(env, "PATH", "PATH")
44 setEnvFromProcess(env, "TZ", "TZ")
45 setEnvFromProcess(env, "TZDIR", "TZDIR")
46 setWorkingDirEnv(env, workingDir)
47
48 tmpdir := os.Getenv("TMPDIR")
49 if tmpdir == "" {
50 tmpdir = os.TempDir()
51 }
52 if tmpdir != "" {
53 env["TMPDIR"] = tmpdir
54 }
55
56 if u, err := user.Current(); err == nil {
57 if u.Username != "" {
58 env["USER"] = u.Username
59 env["LOGNAME"] = u.Username
60 }
61 if u.HomeDir != "" {
62 env["HOME"] = u.HomeDir
63 }
64 } else {
65 setEnvFromProcess(env, "USER", "USER")
66 setEnvFromProcess(env, "LOGNAME", "LOGNAME")
67 setEnvFromProcess(env, "HOME", "HOME")
68 }
69
70 env["SHELL"] = "/bin/sh"
71 env["LC_ALL"] = "C"
72 return env
73 }
74
75 func buildWindowsExecutionBaselineEnv() map[string]string {
76 env := make(map[string]string)
77 for _, key := range []string{
78 "PATH",
79 "TMP",
80 "TEMP",
81 "USERPROFILE",
82 "HOMEDRIVE",
83 "HOMEPATH",
84 "SystemRoot",
85 "WINDIR",
86 "ComSpec",
87 "PATHEXT",
88 "TZ",
89 } {
90 setEnvFromProcess(env, key, key)
91 }
92 return env
93 }
94
95 func setEnvFromProcess(dst map[string]string, dstKey, srcKey string) {
96 if value := os.Getenv(srcKey); value != "" {
97 dst[dstKey] = value
98 }
99 }
100
101 func setWorkingDirEnv(dst map[string]string, workingDir string) {
102 if workingDir != "" {
103 dst["PWD"] = workingDir
104 return
105 }
106 if cwd, err := os.Getwd(); err == nil && cwd != "" {
107 dst["PWD"] = cwd
108 }
109 }