69 lines
1.0 KiB
Go
69 lines
1.0 KiB
Go
|
// +build !windows
|
||
|
|
||
|
package host
|
||
|
|
||
|
import (
|
||
|
"strings"
|
||
|
"syscall"
|
||
|
|
||
|
"golang.org/x/sys/unix"
|
||
|
)
|
||
|
|
||
|
// uname returns the syscall like `uname -a`
|
||
|
func uname() string {
|
||
|
u := &unix.Utsname{}
|
||
|
err := unix.Uname(u)
|
||
|
if err != nil {
|
||
|
return err.Error()
|
||
|
}
|
||
|
|
||
|
uname := strings.Join([]string{
|
||
|
nullStr(u.Machine[:]),
|
||
|
nullStr(u.Nodename[:]),
|
||
|
nullStr(u.Release[:]),
|
||
|
nullStr(u.Sysname[:]),
|
||
|
nullStr(u.Version[:]),
|
||
|
}, " ")
|
||
|
|
||
|
return uname
|
||
|
}
|
||
|
|
||
|
func etcHosts() string {
|
||
|
return slurp("/etc/hosts")
|
||
|
}
|
||
|
|
||
|
func resolvConf() string {
|
||
|
return slurp("/etc/resolv.conf")
|
||
|
}
|
||
|
|
||
|
func nullStr(bs []byte) string {
|
||
|
// find the null byte
|
||
|
var i int
|
||
|
var b byte
|
||
|
for i, b = range bs {
|
||
|
if b == 0 {
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return string(bs[:i])
|
||
|
}
|
||
|
|
||
|
type df struct {
|
||
|
s *syscall.Statfs_t
|
||
|
}
|
||
|
|
||
|
func makeDf(path string) (*df, error) {
|
||
|
var s syscall.Statfs_t
|
||
|
err := syscall.Statfs(path, &s)
|
||
|
return &df{s: &s}, err
|
||
|
}
|
||
|
|
||
|
func (d *df) total() uint64 {
|
||
|
return d.s.Blocks * uint64(d.s.Bsize)
|
||
|
}
|
||
|
|
||
|
func (d *df) available() uint64 {
|
||
|
return d.s.Bavail * uint64(d.s.Bsize)
|
||
|
}
|