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  }