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  }