1
0
mirror of https://github.com/shirou/gopsutil.git synced 2025-04-29 13:49:21 +08:00
shirou_gopsutil/host_linux.go

73 lines
1.2 KiB
Go
Raw Normal View History

2014-04-22 17:38:47 +09:00
// +build linux,amd64
2014-04-18 21:28:00 +09:00
2014-04-22 09:44:22 +09:00
package gopsutil
2014-04-18 21:28:00 +09:00
import (
2014-04-22 17:38:47 +09:00
"bytes"
2014-04-22 17:39:51 +09:00
"encoding/binary"
2014-04-22 17:38:47 +09:00
"io/ioutil"
2014-04-18 21:28:00 +09:00
"os"
"syscall"
2014-04-22 17:38:47 +09:00
"unsafe"
2014-04-18 21:28:00 +09:00
)
func HostInfo() (HostInfoStat, error) {
ret := HostInfoStat{}
2014-04-22 09:48:48 +09:00
2014-04-18 21:28:00 +09:00
hostname, err := os.Hostname()
ret.Hostname = hostname
2014-04-22 09:48:48 +09:00
if err != nil {
return ret, err
}
return ret, nil
}
2014-04-22 17:38:47 +09:00
func Boot_time() (int64, error) {
2014-04-22 09:48:48 +09:00
sysinfo := &syscall.Sysinfo_t{}
if err := syscall.Sysinfo(sysinfo); err != nil {
return 0, err
2014-04-22 09:48:48 +09:00
}
return sysinfo.Uptime, nil
2014-04-18 21:28:00 +09:00
}
2014-04-22 17:38:47 +09:00
func Users() ([]UserStat, error) {
utmpfile := "/var/run/utmp"
ret := make([]UserStat, 0)
file, err := os.Open(utmpfile)
if err != nil {
return ret, err
}
buf, err := ioutil.ReadAll(file)
if err != nil {
return ret, err
}
u := utmp{}
entrySize := int(unsafe.Sizeof(u))
count := len(buf) / entrySize
for i := 0; i < count; i++ {
b := buf[i*entrySize : i*entrySize+entrySize]
2014-04-22 17:39:51 +09:00
var u utmp
br := bytes.NewReader(b)
err := binary.Read(br, binary.LittleEndian, &u)
2014-04-22 17:38:47 +09:00
if err != nil {
continue
}
user := UserStat{
2014-04-22 17:39:51 +09:00
User: byteToString(u.Ut_user[:]),
2014-04-22 17:38:47 +09:00
Terminal: byteToString(u.Ut_line[:]),
2014-04-22 17:39:51 +09:00
Host: byteToString(u.Ut_host[:]),
Started: int(u.Ut_tv.Tv_sec),
2014-04-22 17:38:47 +09:00
}
ret = append(ret, user)
}
return ret, nil
}