Merge pull request #237 from sean-/f-host-id

Add HostID to Host
pull/238/head
shirou 9 years ago committed by GitHub
commit 1cc18d94d9

@ -25,7 +25,7 @@ type InfoStat struct {
PlatformVersion string `json:"platformVersion"` PlatformVersion string `json:"platformVersion"`
VirtualizationSystem string `json:"virtualizationSystem"` VirtualizationSystem string `json:"virtualizationSystem"`
VirtualizationRole string `json:"virtualizationRole"` // guest or host VirtualizationRole string `json:"virtualizationRole"` // guest or host
HostID string `json:"hostid"` // ex: uuid
} }
type UserStat struct { type UserStat struct {

@ -56,6 +56,11 @@ func Info() (*InfoStat, error) {
ret.Procs = uint64(len(procs)) ret.Procs = uint64(len(procs))
} }
values, err := common.DoSysctrl("kern.uuid")
if err == nil && len(values) == 1 && values[0] != "" {
ret.HostID = values[0]
}
return ret, nil return ret, nil
} }

@ -59,6 +59,11 @@ func Info() (*InfoStat, error) {
ret.Procs = uint64(len(procs)) ret.Procs = uint64(len(procs))
} }
values, err := common.DoSysctrl("kern.hostuuid")
if err == nil && len(values) == 1 && values[0] != "" {
ret.HostID = values[0]
}
return ret, nil return ret, nil
} }

@ -61,6 +61,22 @@ func Info() (*InfoStat, error) {
ret.Procs = numProcs ret.Procs = numProcs
} }
sysProductUUID := common.HostSys("class/dmi/id/product_uuid")
switch {
case common.PathExists(sysProductUUID):
lines, err := common.ReadLines(sysProductUUID)
if err == nil && len(lines) > 0 && lines[0] != "" {
ret.HostID = lines[0]
break
}
fallthrough
default:
values, err := common.DoSysctrl("kernel.random.boot_id")
if err == nil && len(values) == 1 && values[0] != "" {
ret.HostID = values[0]
}
}
return ret, nil return ret, nil
} }

@ -66,8 +66,9 @@ func TestHostInfoStat_String(t *testing.T) {
OS: "linux", OS: "linux",
Platform: "ubuntu", Platform: "ubuntu",
BootTime: 1447040000, BootTime: 1447040000,
HostID: "edfd25ff-3c9c-b1a4-e660-bd826495ad35",
} }
e := `{"hostname":"test","uptime":3000,"bootTime":1447040000,"procs":100,"os":"linux","platform":"ubuntu","platformFamily":"","platformVersion":"","virtualizationSystem":"","virtualizationRole":""}` e := `{"hostname":"test","uptime":3000,"bootTime":1447040000,"procs":100,"os":"linux","platform":"ubuntu","platformFamily":"","platformVersion":"","virtualizationSystem":"","virtualizationRole":"","hostid":"edfd25ff-3c9c-b1a4-e660-bd826495ad35"}`
if e != fmt.Sprintf("%v", v) { if e != fmt.Sprintf("%v", v) {
t.Errorf("HostInfoStat string is invalid: %v", v) t.Errorf("HostInfoStat string is invalid: %v", v)
} }

@ -26,7 +26,7 @@ import (
var ( var (
Timeout = 3 * time.Second Timeout = 3 * time.Second
TimeoutErr = errors.New("Command timed out.") ErrTimeout = errors.New("Command timed out.")
) )
type Invoker interface { type Invoker interface {
@ -338,6 +338,6 @@ func WaitTimeout(c *exec.Cmd, timeout time.Duration) error {
} }
// wait for the command to return after killing it // wait for the command to return after killing it
<-done <-done
return TimeoutErr return ErrTimeout
} }
} }

@ -2,7 +2,31 @@
package common package common
import "os" import (
"os"
"os/exec"
"strings"
)
func DoSysctrl(mib string) ([]string, error) {
err := os.Setenv("LC_ALL", "C")
if err != nil {
return []string{}, err
}
sysctl, err := exec.LookPath("/sbin/sysctl")
if err != nil {
return []string{}, err
}
out, err := exec.Command(sysctl, "-n", mib).Output()
if err != nil {
return []string{}, err
}
v := strings.Replace(string(out), "{ ", "", 1)
v = strings.Replace(string(v), " }", "", 1)
values := strings.Fields(string(v))
return values, nil
}
func NumProcs() (uint64, error) { func NumProcs() (uint64, error) {
f, err := os.Open(HostProc()) f, err := os.Open(HostProc())

Loading…
Cancel
Save