github.com/Ilhicas/nomad@v1.0.4-0.20210304152020-e86851182bc3/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 // makeEnvRedactSet creates a set of well known environment variables that should be 91 // redacted in the output 92 func makeEnvRedactSet() map[string]struct{} { 93 // Duplicated from config.DefaultEnvBlacklist in order to avoid an import cycle 94 configDefault := []string{ 95 "CONSUL_TOKEN", 96 "CONSUL_HTTP_TOKEN", 97 "VAULT_TOKEN", 98 "AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_SESSION_TOKEN", 99 "GOOGLE_APPLICATION_CREDENTIALS", 100 } 101 102 set := make(map[string]struct{}) 103 for _, e := range configDefault { 104 set[e] = struct{}{} 105 } 106 107 return set 108 } 109 110 // slurp returns the file contents as a string, returning an error string 111 func slurp(path string) string { 112 fh, err := os.Open(path) 113 if err != nil { 114 return err.Error() 115 } 116 117 bs, err := ioutil.ReadAll(fh) 118 if err != nil { 119 return err.Error() 120 } 121 122 return string(bs) 123 }