1
0
mirror of https://github.com/shirou/gopsutil.git synced 2025-04-28 13:48:49 +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-30 16:16:07 +09:00
func BootTime() (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"
2014-04-30 16:16:07 +09:00
var ret []UserStat
2014-04-22 17:38:47 +09:00
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-30 16:16:07 +09:00
User: byteToString(u.UtUser[:]),
Terminal: byteToString(u.UtLine[:]),
Host: byteToString(u.UtHost[:]),
Started: int(u.UtTv.TvSec),
2014-04-22 17:38:47 +09:00
}
ret = append(ret, user)
}
return ret, nil
}