github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/command/agent/host/host.go (about) 1 package host 2 3 import ( 4 "io/ioutil" 5 "os" 6 "strings" 7 ) 8 9 type HostData struct { 10 OS string 11 Network []map[string]string 12 ResolvConf string 13 Hosts string 14 Environment map[string]string 15 Disk map[string]DiskUsage 16 } 17 18 type DiskUsage struct { 19 DiskMB int64 20 UsedMB int64 21 } 22 23 func MakeHostData() (*HostData, error) { 24 du := make(map[string]DiskUsage) 25 for _, path := range mountedPaths() { 26 u, err := diskUsage(path) 27 if err != nil { 28 continue 29 } 30 du[path] = u 31 } 32 33 return &HostData{ 34 OS: uname(), 35 Network: network(), 36 ResolvConf: resolvConf(), 37 Hosts: etcHosts(), 38 Environment: environment(), 39 Disk: du, 40 }, nil 41 } 42 43 // diskUsage calculates the DiskUsage 44 func diskUsage(path string) (du DiskUsage, err error) { 45 s, err := makeDf(path) 46 if err != nil { 47 return du, err 48 } 49 50 disk := float64(s.total()) 51 // Bavail is blocks available to unprivileged users, Bfree includes reserved blocks 52 free := float64(s.available()) 53 used := disk - free 54 mb := float64(1048576) 55 56 disk = disk / mb 57 used = used / mb 58 59 du.DiskMB = int64(disk) 60 du.UsedMB = int64(used) 61 return du, nil 62 } 63 64 var ( 65 envRedactSet = makeEnvRedactSet() 66 ) 67 68 // environment returns the process environment in a map 69 func environment() map[string]string { 70 env := make(map[string]string) 71 72 for _, e := range os.Environ() { 73 s := strings.SplitN(e, "=", 2) 74 k := s[0] 75 up := strings.ToUpper(k) 76 v := s[1] 77 78 _, redact := envRedactSet[k] 79 if redact || 80 strings.Contains(up, "TOKEN") || 81 strings.Contains(up, "SECRET") { 82 v = "<redacted>" 83 } 84 85 env[k] = v 86 } 87 return env 88 } 89 90 // DefaultEnvDenyList is the default set of environment variables that are 91 // filtered when passing the environment variables of the host to the task. 92 // 93 // Update https://www.nomadproject.io/docs/configuration/client#env-denylist 94 // whenever this is changed. 95 var DefaultEnvDenyList = []string{ 96 "CONSUL_TOKEN", 97 "CONSUL_HTTP_TOKEN", 98 "VAULT_TOKEN", 99 "NOMAD_LICENSE", 100 "AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_SESSION_TOKEN", 101 "GOOGLE_APPLICATION_CREDENTIALS", 102 } 103 104 // makeEnvRedactSet creates a set of well known environment variables that should be 105 // redacted in the output 106 func makeEnvRedactSet() map[string]struct{} { 107 set := make(map[string]struct{}) 108 for _, e := range DefaultEnvDenyList { 109 set[e] = struct{}{} 110 } 111 112 return set 113 } 114 115 // slurp returns the file contents as a string, returning an error string 116 func slurp(path string) string { 117 fh, err := os.Open(path) 118 if err != nil { 119 return err.Error() 120 } 121 122 bs, err := ioutil.ReadAll(fh) 123 if err != nil { 124 return err.Error() 125 } 126 127 return string(bs) 128 }