Godep save: gopsutil
This commit is contained in:
parent
00ee2529bc
commit
dcd1c6766c
|
@ -123,6 +123,11 @@
|
||||||
"ImportPath": "github.com/matttproud/golang_protobuf_extensions/pbutil",
|
"ImportPath": "github.com/matttproud/golang_protobuf_extensions/pbutil",
|
||||||
"Rev": "fc2b8d3a73c4867e51861bbdd5ae3c1f0869dd6a"
|
"Rev": "fc2b8d3a73c4867e51861bbdd5ae3c1f0869dd6a"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "github.com/mreiferson/go-snappystream",
|
||||||
|
"Comment": "v0.2.3",
|
||||||
|
"Rev": "028eae7ab5c4c9e2d1cb4c4ca1e53259bbe7e504"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/naoina/go-stringutil",
|
"ImportPath": "github.com/naoina/go-stringutil",
|
||||||
"Rev": "360db0db4b01d34e12a2ec042c09e7d37fece761"
|
"Rev": "360db0db4b01d34e12a2ec042c09e7d37fece761"
|
||||||
|
@ -131,6 +136,11 @@
|
||||||
"ImportPath": "github.com/naoina/toml",
|
"ImportPath": "github.com/naoina/toml",
|
||||||
"Rev": "5811abcabb29d6af0fdf060f96d328962bd3cd5e"
|
"Rev": "5811abcabb29d6af0fdf060f96d328962bd3cd5e"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "github.com/nsqio/go-nsq",
|
||||||
|
"Comment": "v1.0.5-6-g2118015",
|
||||||
|
"Rev": "2118015c120962edc5d03325c680daf3163a8b5f"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/pborman/uuid",
|
"ImportPath": "github.com/pborman/uuid",
|
||||||
"Rev": "ca53cad383cad2479bbba7f7a1a05797ec1386e4"
|
"Rev": "ca53cad383cad2479bbba7f7a1a05797ec1386e4"
|
||||||
|
@ -181,11 +191,6 @@
|
||||||
"Comment": "1.0.0-161-g3303647",
|
"Comment": "1.0.0-161-g3303647",
|
||||||
"Rev": "3303647209557312e5db51450ea8bbdef56d5176"
|
"Rev": "3303647209557312e5db51450ea8bbdef56d5176"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"ImportPath": "github.com/shirou/gopsutil/host",
|
|
||||||
"Comment": "1.0.0-161-g3303647",
|
|
||||||
"Rev": "3303647209557312e5db51450ea8bbdef56d5176"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/shirou/gopsutil/load",
|
"ImportPath": "github.com/shirou/gopsutil/load",
|
||||||
"Comment": "1.0.0-161-g3303647",
|
"Comment": "1.0.0-161-g3303647",
|
||||||
|
@ -271,16 +276,6 @@
|
||||||
{
|
{
|
||||||
"ImportPath": "gopkg.in/yaml.v2",
|
"ImportPath": "gopkg.in/yaml.v2",
|
||||||
"Rev": "7ad95dd0798a40da1ccdff6dff35fd177b5edf40"
|
"Rev": "7ad95dd0798a40da1ccdff6dff35fd177b5edf40"
|
||||||
},
|
|
||||||
{
|
|
||||||
"ImportPath": "github.com/mreiferson/go-snappystream",
|
|
||||||
"Comment": "v0.2.3",
|
|
||||||
"Rev": "028eae7ab5c4c9e2d1cb4c4ca1e53259bbe7e504"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ImportPath": "github.com/nsqio/go-nsq",
|
|
||||||
"Comment": "v1.0.5-6-g2118015",
|
|
||||||
"Rev": "2118015c120962edc5d03325c680daf3163a8b5f"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
package host
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
)
|
|
||||||
|
|
||||||
// A HostInfoStat describes the host status.
|
|
||||||
// This is not in the psutil but it useful.
|
|
||||||
type HostInfoStat struct {
|
|
||||||
Hostname string `json:"hostname"`
|
|
||||||
Uptime uint64 `json:"uptime"`
|
|
||||||
Procs uint64 `json:"procs"` // number of processes
|
|
||||||
OS string `json:"os"` // ex: freebsd, linux
|
|
||||||
Platform string `json:"platform"` // ex: ubuntu, linuxmint
|
|
||||||
PlatformFamily string `json:"platform_family"` // ex: debian, rhel
|
|
||||||
PlatformVersion string `json:"platform_version"`
|
|
||||||
VirtualizationSystem string `json:"virtualization_system"`
|
|
||||||
VirtualizationRole string `json:"virtualization_role"` // guest or host
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
type UserStat struct {
|
|
||||||
User string `json:"user"`
|
|
||||||
Terminal string `json:"terminal"`
|
|
||||||
Host string `json:"host"`
|
|
||||||
Started int `json:"started"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h HostInfoStat) String() string {
|
|
||||||
s, _ := json.Marshal(h)
|
|
||||||
return string(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (u UserStat) String() string {
|
|
||||||
s, _ := json.Marshal(u)
|
|
||||||
return string(s)
|
|
||||||
}
|
|
|
@ -1,139 +0,0 @@
|
||||||
// +build darwin
|
|
||||||
|
|
||||||
package host
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/binary"
|
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
|
||||||
"os/exec"
|
|
||||||
"runtime"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"unsafe"
|
|
||||||
|
|
||||||
common "github.com/shirou/gopsutil/common"
|
|
||||||
)
|
|
||||||
|
|
||||||
func HostInfo() (*HostInfoStat, error) {
|
|
||||||
ret := &HostInfoStat{
|
|
||||||
OS: runtime.GOOS,
|
|
||||||
PlatformFamily: "darwin",
|
|
||||||
}
|
|
||||||
|
|
||||||
hostname, err := os.Hostname()
|
|
||||||
if err != nil {
|
|
||||||
return ret, err
|
|
||||||
}
|
|
||||||
ret.Hostname = hostname
|
|
||||||
|
|
||||||
platform, family, version, err := GetPlatformInformation()
|
|
||||||
if err == nil {
|
|
||||||
ret.Platform = platform
|
|
||||||
ret.PlatformFamily = family
|
|
||||||
ret.PlatformVersion = version
|
|
||||||
}
|
|
||||||
system, role, err := GetVirtualization()
|
|
||||||
if err == nil {
|
|
||||||
ret.VirtualizationSystem = system
|
|
||||||
ret.VirtualizationRole = role
|
|
||||||
}
|
|
||||||
|
|
||||||
values, err := common.DoSysctrl("kern.boottime")
|
|
||||||
if err == nil {
|
|
||||||
// ex: { sec = 1392261637, usec = 627534 } Thu Feb 13 12:20:37 2014
|
|
||||||
v := strings.Replace(values[2], ",", "", 1)
|
|
||||||
t, err := strconv.ParseUint(v, 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
return ret, err
|
|
||||||
}
|
|
||||||
ret.Uptime = t
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func BootTime() (uint64, error) {
|
|
||||||
values, err := common.DoSysctrl("kern.boottime")
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
// ex: { sec = 1392261637, usec = 627534 } Thu Feb 13 12:20:37 2014
|
|
||||||
v := strings.Replace(values[2], ",", "", 1)
|
|
||||||
|
|
||||||
boottime, err := strconv.ParseInt(v, 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return uint64(boottime), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func Users() ([]UserStat, error) {
|
|
||||||
utmpfile := "/var/run/utmpx"
|
|
||||||
var ret []UserStat
|
|
||||||
|
|
||||||
file, err := os.Open(utmpfile)
|
|
||||||
if err != nil {
|
|
||||||
return ret, err
|
|
||||||
}
|
|
||||||
|
|
||||||
buf, err := ioutil.ReadAll(file)
|
|
||||||
if err != nil {
|
|
||||||
return ret, err
|
|
||||||
}
|
|
||||||
|
|
||||||
u := Utmpx{}
|
|
||||||
entrySize := int(unsafe.Sizeof(u))
|
|
||||||
count := len(buf) / entrySize
|
|
||||||
|
|
||||||
for i := 0; i < count; i++ {
|
|
||||||
b := buf[i*entrySize : i*entrySize+entrySize]
|
|
||||||
|
|
||||||
var u Utmpx
|
|
||||||
br := bytes.NewReader(b)
|
|
||||||
err := binary.Read(br, binary.LittleEndian, &u)
|
|
||||||
if err != nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if u.Type != 7 { // skip if not USERPROCESS
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
user := UserStat{
|
|
||||||
User: common.IntToString(u.User[:]),
|
|
||||||
Terminal: common.IntToString(u.Line[:]),
|
|
||||||
Host: common.IntToString(u.Host[:]),
|
|
||||||
Started: int(u.Tv.Sec),
|
|
||||||
}
|
|
||||||
ret = append(ret, user)
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret, nil
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetPlatformInformation() (string, string, string, error) {
|
|
||||||
platform := ""
|
|
||||||
family := ""
|
|
||||||
version := ""
|
|
||||||
|
|
||||||
out, err := exec.Command("uname", "-s").Output()
|
|
||||||
if err == nil {
|
|
||||||
platform = strings.ToLower(strings.TrimSpace(string(out)))
|
|
||||||
}
|
|
||||||
|
|
||||||
out, err = exec.Command("uname", "-r").Output()
|
|
||||||
if err == nil {
|
|
||||||
version = strings.ToLower(strings.TrimSpace(string(out)))
|
|
||||||
}
|
|
||||||
|
|
||||||
return platform, family, version, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetVirtualization() (string, string, error) {
|
|
||||||
system := ""
|
|
||||||
role := ""
|
|
||||||
|
|
||||||
return system, role, nil
|
|
||||||
}
|
|
|
@ -1,19 +0,0 @@
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
|
||||||
// cgo -godefs types_darwin.go
|
|
||||||
|
|
||||||
package host
|
|
||||||
|
|
||||||
type Utmpx struct {
|
|
||||||
User [256]int8
|
|
||||||
Id [4]int8
|
|
||||||
Line [32]int8
|
|
||||||
Pid int32
|
|
||||||
Type int16
|
|
||||||
Pad_cgo_0 [6]byte
|
|
||||||
Tv Timeval
|
|
||||||
Host [256]int8
|
|
||||||
Pad [16]uint32
|
|
||||||
}
|
|
||||||
type Timeval struct {
|
|
||||||
Sec int32
|
|
||||||
}
|
|
|
@ -1,185 +0,0 @@
|
||||||
// +build freebsd
|
|
||||||
|
|
||||||
package host
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/binary"
|
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
|
||||||
"os/exec"
|
|
||||||
"runtime"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"unsafe"
|
|
||||||
|
|
||||||
common "github.com/shirou/gopsutil/common"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
UTNameSize = 16 /* see MAXLOGNAME in <sys/param.h> */
|
|
||||||
UTLineSize = 8
|
|
||||||
UTHostSize = 16
|
|
||||||
)
|
|
||||||
|
|
||||||
func HostInfo() (*HostInfoStat, error) {
|
|
||||||
ret := &HostInfoStat{
|
|
||||||
OS: runtime.GOOS,
|
|
||||||
PlatformFamily: "freebsd",
|
|
||||||
}
|
|
||||||
|
|
||||||
hostname, err := os.Hostname()
|
|
||||||
if err != nil {
|
|
||||||
return ret, err
|
|
||||||
}
|
|
||||||
ret.Hostname = hostname
|
|
||||||
|
|
||||||
platform, family, version, err := GetPlatformInformation()
|
|
||||||
if err == nil {
|
|
||||||
ret.Platform = platform
|
|
||||||
ret.PlatformFamily = family
|
|
||||||
ret.PlatformVersion = version
|
|
||||||
}
|
|
||||||
system, role, err := GetVirtualization()
|
|
||||||
if err == nil {
|
|
||||||
ret.VirtualizationSystem = system
|
|
||||||
ret.VirtualizationRole = role
|
|
||||||
}
|
|
||||||
|
|
||||||
values, err := common.DoSysctrl("kern.boottime")
|
|
||||||
if err == nil {
|
|
||||||
// ex: { sec = 1392261637, usec = 627534 } Thu Feb 13 12:20:37 2014
|
|
||||||
v := strings.Replace(values[2], ",", "", 1)
|
|
||||||
t, err := strconv.ParseUint(v, 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
return ret, err
|
|
||||||
}
|
|
||||||
ret.Uptime = t
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func BootTime() (int64, error) {
|
|
||||||
values, err := common.DoSysctrl("kern.boottime")
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
// ex: { sec = 1392261637, usec = 627534 } Thu Feb 13 12:20:37 2014
|
|
||||||
v := strings.Replace(values[2], ",", "", 1)
|
|
||||||
|
|
||||||
boottime, err := strconv.ParseInt(v, 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return boottime, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func Users() ([]UserStat, error) {
|
|
||||||
utmpfile := "/var/run/utx.active"
|
|
||||||
if !common.PathExists(utmpfile) {
|
|
||||||
utmpfile = "/var/run/utmp" // before 9.0
|
|
||||||
return getUsersFromUtmp(utmpfile)
|
|
||||||
}
|
|
||||||
|
|
||||||
var ret []UserStat
|
|
||||||
file, err := os.Open(utmpfile)
|
|
||||||
if err != nil {
|
|
||||||
return ret, err
|
|
||||||
}
|
|
||||||
|
|
||||||
buf, err := ioutil.ReadAll(file)
|
|
||||||
if err != nil {
|
|
||||||
return ret, err
|
|
||||||
}
|
|
||||||
|
|
||||||
u := Utmpx{}
|
|
||||||
entrySize := int(unsafe.Sizeof(u)) - 3
|
|
||||||
entrySize = 197 // TODO: why should 197
|
|
||||||
count := len(buf) / entrySize
|
|
||||||
|
|
||||||
for i := 0; i < count; i++ {
|
|
||||||
b := buf[i*entrySize : i*entrySize+entrySize]
|
|
||||||
var u Utmpx
|
|
||||||
br := bytes.NewReader(b)
|
|
||||||
err := binary.Read(br, binary.LittleEndian, &u)
|
|
||||||
if err != nil || u.Type != 4 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
sec := (binary.LittleEndian.Uint32(u.Tv.Sec[:])) / 2 // TODO:
|
|
||||||
user := UserStat{
|
|
||||||
User: common.IntToString(u.User[:]),
|
|
||||||
Terminal: common.IntToString(u.Line[:]),
|
|
||||||
Host: common.IntToString(u.Host[:]),
|
|
||||||
Started: int(sec),
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = append(ret, user)
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret, nil
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetPlatformInformation() (string, string, string, error) {
|
|
||||||
platform := ""
|
|
||||||
family := ""
|
|
||||||
version := ""
|
|
||||||
|
|
||||||
out, err := exec.Command("uname", "-s").Output()
|
|
||||||
if err == nil {
|
|
||||||
platform = strings.ToLower(strings.TrimSpace(string(out)))
|
|
||||||
}
|
|
||||||
|
|
||||||
out, err = exec.Command("uname", "-r").Output()
|
|
||||||
if err == nil {
|
|
||||||
version = strings.ToLower(strings.TrimSpace(string(out)))
|
|
||||||
}
|
|
||||||
|
|
||||||
return platform, family, version, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetVirtualization() (string, string, error) {
|
|
||||||
system := ""
|
|
||||||
role := ""
|
|
||||||
|
|
||||||
return system, role, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// before 9.0
|
|
||||||
func getUsersFromUtmp(utmpfile string) ([]UserStat, error) {
|
|
||||||
var ret []UserStat
|
|
||||||
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]
|
|
||||||
var u Utmp
|
|
||||||
br := bytes.NewReader(b)
|
|
||||||
err := binary.Read(br, binary.LittleEndian, &u)
|
|
||||||
if err != nil || u.Time == 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
user := UserStat{
|
|
||||||
User: common.IntToString(u.Name[:]),
|
|
||||||
Terminal: common.IntToString(u.Line[:]),
|
|
||||||
Host: common.IntToString(u.Host[:]),
|
|
||||||
Started: int(u.Time),
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = append(ret, user)
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret, nil
|
|
||||||
}
|
|
|
@ -1,41 +0,0 @@
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
|
||||||
// cgo -godefs types_freebsd.go
|
|
||||||
|
|
||||||
package host
|
|
||||||
|
|
||||||
const (
|
|
||||||
sizeofPtr = 0x8
|
|
||||||
sizeofShort = 0x2
|
|
||||||
sizeofInt = 0x4
|
|
||||||
sizeofLong = 0x8
|
|
||||||
sizeofLongLong = 0x8
|
|
||||||
)
|
|
||||||
|
|
||||||
type (
|
|
||||||
_C_short int16
|
|
||||||
_C_int int32
|
|
||||||
_C_long int64
|
|
||||||
_C_long_long int64
|
|
||||||
)
|
|
||||||
|
|
||||||
type Utmp struct {
|
|
||||||
Line [8]int8
|
|
||||||
Name [16]int8
|
|
||||||
Host [16]int8
|
|
||||||
Time int32
|
|
||||||
}
|
|
||||||
type Utmpx struct {
|
|
||||||
Type int16
|
|
||||||
Tv Timeval
|
|
||||||
Id [8]int8
|
|
||||||
Pid int32
|
|
||||||
User [32]int8
|
|
||||||
Line [16]int8
|
|
||||||
Host [125]int8
|
|
||||||
// Host [128]int8
|
|
||||||
// X__ut_spare [64]int8
|
|
||||||
}
|
|
||||||
type Timeval struct {
|
|
||||||
Sec [4]byte
|
|
||||||
Usec [3]byte
|
|
||||||
}
|
|
|
@ -1,402 +0,0 @@
|
||||||
// +build linux
|
|
||||||
|
|
||||||
package host
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/binary"
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
|
||||||
"os/exec"
|
|
||||||
"regexp"
|
|
||||||
"runtime"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"unsafe"
|
|
||||||
|
|
||||||
common "github.com/shirou/gopsutil/common"
|
|
||||||
)
|
|
||||||
|
|
||||||
type LSB struct {
|
|
||||||
ID string
|
|
||||||
Release string
|
|
||||||
Codename string
|
|
||||||
Description string
|
|
||||||
}
|
|
||||||
|
|
||||||
func HostInfo() (*HostInfoStat, error) {
|
|
||||||
hostname, err := os.Hostname()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
ret := &HostInfoStat{
|
|
||||||
Hostname: hostname,
|
|
||||||
OS: runtime.GOOS,
|
|
||||||
}
|
|
||||||
|
|
||||||
platform, family, version, err := GetPlatformInformation()
|
|
||||||
if err == nil {
|
|
||||||
ret.Platform = platform
|
|
||||||
ret.PlatformFamily = family
|
|
||||||
ret.PlatformVersion = version
|
|
||||||
}
|
|
||||||
system, role, err := GetVirtualization()
|
|
||||||
if err == nil {
|
|
||||||
ret.VirtualizationSystem = system
|
|
||||||
ret.VirtualizationRole = role
|
|
||||||
}
|
|
||||||
uptime, err := BootTime()
|
|
||||||
if err == nil {
|
|
||||||
ret.Uptime = uptime
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// BootTime returns the system boot time expressed in seconds since the epoch.
|
|
||||||
func BootTime() (uint64, error) {
|
|
||||||
lines, err := common.ReadLines("/proc/stat")
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
for _, line := range lines {
|
|
||||||
if strings.HasPrefix(line, "btime") {
|
|
||||||
f := strings.Fields(line)
|
|
||||||
if len(f) != 2 {
|
|
||||||
return 0, fmt.Errorf("wrong btime format")
|
|
||||||
}
|
|
||||||
b, err := strconv.ParseInt(f[1], 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
return uint64(b), nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0, fmt.Errorf("could not find btime")
|
|
||||||
}
|
|
||||||
|
|
||||||
func Users() ([]UserStat, error) {
|
|
||||||
utmpfile := "/var/run/utmp"
|
|
||||||
|
|
||||||
file, err := os.Open(utmpfile)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
buf, err := ioutil.ReadAll(file)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
u := utmp{}
|
|
||||||
entrySize := int(unsafe.Sizeof(u))
|
|
||||||
count := len(buf) / entrySize
|
|
||||||
|
|
||||||
ret := make([]UserStat, 0, count)
|
|
||||||
|
|
||||||
for i := 0; i < count; i++ {
|
|
||||||
b := buf[i*entrySize : i*entrySize+entrySize]
|
|
||||||
|
|
||||||
var u utmp
|
|
||||||
br := bytes.NewReader(b)
|
|
||||||
err := binary.Read(br, binary.LittleEndian, &u)
|
|
||||||
if err != nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
user := UserStat{
|
|
||||||
User: common.IntToString(u.User[:]),
|
|
||||||
Terminal: common.IntToString(u.Line[:]),
|
|
||||||
Host: common.IntToString(u.Host[:]),
|
|
||||||
Started: int(u.Tv.TvSec),
|
|
||||||
}
|
|
||||||
ret = append(ret, user)
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret, nil
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func getLSB() (*LSB, error) {
|
|
||||||
ret := &LSB{}
|
|
||||||
if common.PathExists("/etc/lsb-release") {
|
|
||||||
contents, err := common.ReadLines("/etc/lsb-release")
|
|
||||||
if err != nil {
|
|
||||||
return ret, err // return empty
|
|
||||||
}
|
|
||||||
for _, line := range contents {
|
|
||||||
field := strings.Split(line, "=")
|
|
||||||
if len(field) < 2 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
switch field[0] {
|
|
||||||
case "DISTRIB_ID":
|
|
||||||
ret.ID = field[1]
|
|
||||||
case "DISTRIB_RELEASE":
|
|
||||||
ret.Release = field[1]
|
|
||||||
case "DISTRIB_CODENAME":
|
|
||||||
ret.Codename = field[1]
|
|
||||||
case "DISTRIB_DESCRIPTION":
|
|
||||||
ret.Description = field[1]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if common.PathExists("/usr/bin/lsb_release") {
|
|
||||||
out, err := exec.Command("/usr/bin/lsb_release").Output()
|
|
||||||
if err != nil {
|
|
||||||
return ret, err
|
|
||||||
}
|
|
||||||
for _, line := range strings.Split(string(out), "\n") {
|
|
||||||
field := strings.Split(line, ":")
|
|
||||||
if len(field) < 2 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
switch field[0] {
|
|
||||||
case "Distributor ID":
|
|
||||||
ret.ID = field[1]
|
|
||||||
case "Release":
|
|
||||||
ret.Release = field[1]
|
|
||||||
case "Codename":
|
|
||||||
ret.Codename = field[1]
|
|
||||||
case "Description":
|
|
||||||
ret.Description = field[1]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetPlatformInformation() (platform string, family string, version string, err error) {
|
|
||||||
|
|
||||||
lsb, err := getLSB()
|
|
||||||
if err != nil {
|
|
||||||
lsb = &LSB{}
|
|
||||||
}
|
|
||||||
|
|
||||||
if common.PathExists("/etc/oracle-release") {
|
|
||||||
platform = "oracle"
|
|
||||||
contents, err := common.ReadLines("/etc/oracle-release")
|
|
||||||
if err == nil {
|
|
||||||
version = getRedhatishVersion(contents)
|
|
||||||
}
|
|
||||||
} else if common.PathExists("/etc/enterprise-release") {
|
|
||||||
platform = "oracle"
|
|
||||||
contents, err := common.ReadLines("/etc/enterprise-release")
|
|
||||||
if err == nil {
|
|
||||||
version = getRedhatishVersion(contents)
|
|
||||||
}
|
|
||||||
} else if common.PathExists("/etc/debian_version") {
|
|
||||||
if lsb.ID == "Ubuntu" {
|
|
||||||
platform = "ubuntu"
|
|
||||||
version = lsb.Release
|
|
||||||
} else if lsb.ID == "LinuxMint" {
|
|
||||||
platform = "linuxmint"
|
|
||||||
version = lsb.Release
|
|
||||||
} else {
|
|
||||||
if common.PathExists("/usr/bin/raspi-config") {
|
|
||||||
platform = "raspbian"
|
|
||||||
} else {
|
|
||||||
platform = "debian"
|
|
||||||
}
|
|
||||||
contents, err := common.ReadLines("/etc/debian_version")
|
|
||||||
if err == nil {
|
|
||||||
version = contents[0]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if common.PathExists("/etc/redhat-release") {
|
|
||||||
contents, err := common.ReadLines("/etc/redhat-release")
|
|
||||||
if err == nil {
|
|
||||||
version = getRedhatishVersion(contents)
|
|
||||||
platform = getRedhatishPlatform(contents)
|
|
||||||
}
|
|
||||||
} else if common.PathExists("/etc/system-release") {
|
|
||||||
contents, err := common.ReadLines("/etc/system-release")
|
|
||||||
if err == nil {
|
|
||||||
version = getRedhatishVersion(contents)
|
|
||||||
platform = getRedhatishPlatform(contents)
|
|
||||||
}
|
|
||||||
} else if common.PathExists("/etc/gentoo-release") {
|
|
||||||
platform = "gentoo"
|
|
||||||
contents, err := common.ReadLines("/etc/gentoo-release")
|
|
||||||
if err == nil {
|
|
||||||
version = getRedhatishVersion(contents)
|
|
||||||
}
|
|
||||||
} else if common.PathExists("/etc/SuSE-release") {
|
|
||||||
contents, err := common.ReadLines("/etc/SuSE-release")
|
|
||||||
if err == nil {
|
|
||||||
version = getSuseVersion(contents)
|
|
||||||
platform = getSusePlatform(contents)
|
|
||||||
}
|
|
||||||
// TODO: slackware detecion
|
|
||||||
} else if common.PathExists("/etc/arch-release") {
|
|
||||||
platform = "arch"
|
|
||||||
// TODO: exherbo detection
|
|
||||||
} else if lsb.ID == "RedHat" {
|
|
||||||
platform = "redhat"
|
|
||||||
version = lsb.Release
|
|
||||||
} else if lsb.ID == "Amazon" {
|
|
||||||
platform = "amazon"
|
|
||||||
version = lsb.Release
|
|
||||||
} else if lsb.ID == "ScientificSL" {
|
|
||||||
platform = "scientific"
|
|
||||||
version = lsb.Release
|
|
||||||
} else if lsb.ID == "XenServer" {
|
|
||||||
platform = "xenserver"
|
|
||||||
version = lsb.Release
|
|
||||||
} else if lsb.ID != "" {
|
|
||||||
platform = strings.ToLower(lsb.ID)
|
|
||||||
version = lsb.Release
|
|
||||||
}
|
|
||||||
|
|
||||||
switch platform {
|
|
||||||
case "debian", "ubuntu", "linuxmint", "raspbian":
|
|
||||||
family = "debian"
|
|
||||||
case "fedora":
|
|
||||||
family = "fedora"
|
|
||||||
case "oracle", "centos", "redhat", "scientific", "enterpriseenterprise", "amazon", "xenserver", "cloudlinux", "ibm_powerkvm":
|
|
||||||
family = "rhel"
|
|
||||||
case "suse", "opensuse":
|
|
||||||
family = "suse"
|
|
||||||
case "gentoo":
|
|
||||||
family = "gentoo"
|
|
||||||
case "slackware":
|
|
||||||
family = "slackware"
|
|
||||||
case "arch":
|
|
||||||
family = "arch"
|
|
||||||
case "exherbo":
|
|
||||||
family = "exherbo"
|
|
||||||
}
|
|
||||||
|
|
||||||
return platform, family, version, nil
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func getRedhatishVersion(contents []string) string {
|
|
||||||
c := strings.ToLower(strings.Join(contents, ""))
|
|
||||||
|
|
||||||
if strings.Contains(c, "rawhide") {
|
|
||||||
return "rawhide"
|
|
||||||
}
|
|
||||||
if matches := regexp.MustCompile(`release (\d[\d.]*)`).FindStringSubmatch(c); matches != nil {
|
|
||||||
return matches[1]
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func getRedhatishPlatform(contents []string) string {
|
|
||||||
c := strings.ToLower(strings.Join(contents, ""))
|
|
||||||
|
|
||||||
if strings.Contains(c, "red hat") {
|
|
||||||
return "redhat"
|
|
||||||
}
|
|
||||||
f := strings.Split(c, " ")
|
|
||||||
|
|
||||||
return f[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
func getSuseVersion(contents []string) string {
|
|
||||||
version := ""
|
|
||||||
for _, line := range contents {
|
|
||||||
if matches := regexp.MustCompile(`VERSION = ([\d.]+)`).FindStringSubmatch(line); matches != nil {
|
|
||||||
version = matches[1]
|
|
||||||
} else if matches := regexp.MustCompile(`PATCHLEVEL = ([\d]+)`).FindStringSubmatch(line); matches != nil {
|
|
||||||
version = version + "." + matches[1]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return version
|
|
||||||
}
|
|
||||||
|
|
||||||
func getSusePlatform(contents []string) string {
|
|
||||||
c := strings.ToLower(strings.Join(contents, ""))
|
|
||||||
if strings.Contains(c, "opensuse") {
|
|
||||||
return "opensuse"
|
|
||||||
}
|
|
||||||
return "suse"
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetVirtualization() (string, string, error) {
|
|
||||||
var system string
|
|
||||||
var role string
|
|
||||||
|
|
||||||
if common.PathExists("/proc/xen") {
|
|
||||||
system = "xen"
|
|
||||||
role = "guest" // assume guest
|
|
||||||
|
|
||||||
if common.PathExists("/proc/xen/capabilities") {
|
|
||||||
contents, err := common.ReadLines("/proc/xen/capabilities")
|
|
||||||
if err == nil {
|
|
||||||
if common.StringsHas(contents, "control_d") {
|
|
||||||
role = "host"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if common.PathExists("/proc/modules") {
|
|
||||||
contents, err := common.ReadLines("/proc/modules")
|
|
||||||
if err == nil {
|
|
||||||
if common.StringsContains(contents, "kvm") {
|
|
||||||
system = "kvm"
|
|
||||||
role = "host"
|
|
||||||
} else if common.StringsContains(contents, "vboxdrv") {
|
|
||||||
system = "vbox"
|
|
||||||
role = "host"
|
|
||||||
} else if common.StringsContains(contents, "vboxguest") {
|
|
||||||
system = "vbox"
|
|
||||||
role = "guest"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if common.PathExists("/proc/cpuinfo") {
|
|
||||||
contents, err := common.ReadLines("/proc/cpuinfo")
|
|
||||||
if err == nil {
|
|
||||||
if common.StringsHas(contents, "QEMU Virtual CPU") ||
|
|
||||||
common.StringsHas(contents, "Common KVM processor") ||
|
|
||||||
common.StringsHas(contents, "Common 32-bit KVM processor") {
|
|
||||||
system = "kvm"
|
|
||||||
role = "guest"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if common.PathExists("/proc/bc/0") {
|
|
||||||
system = "openvz"
|
|
||||||
role = "host"
|
|
||||||
} else if common.PathExists("/proc/vz") {
|
|
||||||
system = "openvz"
|
|
||||||
role = "guest"
|
|
||||||
}
|
|
||||||
|
|
||||||
// not use dmidecode because it requires root
|
|
||||||
|
|
||||||
if common.PathExists("/proc/self/status") {
|
|
||||||
contents, err := common.ReadLines("/proc/self/status")
|
|
||||||
if err == nil {
|
|
||||||
|
|
||||||
if common.StringsHas(contents, "s_context:") ||
|
|
||||||
common.StringsHas(contents, "VxID:") {
|
|
||||||
system = "linux-vserver"
|
|
||||||
}
|
|
||||||
// TODO: guest or host
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if common.PathExists("/proc/self/cgroup") {
|
|
||||||
contents, err := common.ReadLines("/proc/self/cgroup")
|
|
||||||
if err == nil {
|
|
||||||
if common.StringsHas(contents, "lxc") ||
|
|
||||||
common.StringsHas(contents, "docker") {
|
|
||||||
system = "lxc"
|
|
||||||
role = "guest"
|
|
||||||
} else if common.PathExists("/usr/bin/lxc-version") { // TODO: which
|
|
||||||
system = "lxc"
|
|
||||||
role = "host"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return system, role, nil
|
|
||||||
}
|
|
|
@ -1,44 +0,0 @@
|
||||||
// ATTENTION - FILE MANUAL FIXED AFTER CGO.
|
|
||||||
// Fixed line: Tv _Ctype_struct_timeval -> Tv UtTv
|
|
||||||
// Created by cgo -godefs, MANUAL FIXED
|
|
||||||
// cgo -godefs types_linux.go
|
|
||||||
|
|
||||||
package host
|
|
||||||
|
|
||||||
const (
|
|
||||||
sizeofPtr = 0x4
|
|
||||||
sizeofShort = 0x2
|
|
||||||
sizeofInt = 0x4
|
|
||||||
sizeofLong = 0x4
|
|
||||||
sizeofLongLong = 0x8
|
|
||||||
)
|
|
||||||
|
|
||||||
type (
|
|
||||||
_C_short int16
|
|
||||||
_C_int int32
|
|
||||||
_C_long int32
|
|
||||||
_C_long_long int64
|
|
||||||
)
|
|
||||||
|
|
||||||
type utmp struct {
|
|
||||||
Type int16
|
|
||||||
Pad_cgo_0 [2]byte
|
|
||||||
Pid int32
|
|
||||||
Line [32]int8
|
|
||||||
Id [4]int8
|
|
||||||
User [32]int8
|
|
||||||
Host [256]int8
|
|
||||||
Exit exit_status
|
|
||||||
Session int32
|
|
||||||
Tv UtTv
|
|
||||||
Addr_v6 [4]int32
|
|
||||||
X__unused [20]int8
|
|
||||||
}
|
|
||||||
type exit_status struct {
|
|
||||||
Termination int16
|
|
||||||
Exit int16
|
|
||||||
}
|
|
||||||
type UtTv struct {
|
|
||||||
TvSec int32
|
|
||||||
TvUsec int32
|
|
||||||
}
|
|
|
@ -1,42 +0,0 @@
|
||||||
// Created by cgo -godefs - DO NOT EDIT
|
|
||||||
// cgo -godefs types_linux.go
|
|
||||||
|
|
||||||
package host
|
|
||||||
|
|
||||||
const (
|
|
||||||
sizeofPtr = 0x8
|
|
||||||
sizeofShort = 0x2
|
|
||||||
sizeofInt = 0x4
|
|
||||||
sizeofLong = 0x8
|
|
||||||
sizeofLongLong = 0x8
|
|
||||||
)
|
|
||||||
|
|
||||||
type (
|
|
||||||
_C_short int16
|
|
||||||
_C_int int32
|
|
||||||
_C_long int64
|
|
||||||
_C_long_long int64
|
|
||||||
)
|
|
||||||
|
|
||||||
type utmp struct {
|
|
||||||
Type int16
|
|
||||||
Pad_cgo_0 [2]byte
|
|
||||||
Pid int32
|
|
||||||
Line [32]int8
|
|
||||||
Id [4]int8
|
|
||||||
User [32]int8
|
|
||||||
Host [256]int8
|
|
||||||
Exit exit_status
|
|
||||||
Session int32
|
|
||||||
Tv UtTv
|
|
||||||
Addr_v6 [4]int32
|
|
||||||
X__glibc_reserved [20]int8
|
|
||||||
}
|
|
||||||
type exit_status struct {
|
|
||||||
Termination int16
|
|
||||||
Exit int16
|
|
||||||
}
|
|
||||||
type UtTv struct {
|
|
||||||
TvSec int32
|
|
||||||
TvUsec int32
|
|
||||||
}
|
|
|
@ -1,42 +0,0 @@
|
||||||
// +build linux
|
|
||||||
// +build arm
|
|
||||||
|
|
||||||
package host
|
|
||||||
|
|
||||||
const (
|
|
||||||
sizeofPtr = 0x8
|
|
||||||
sizeofShort = 0x2
|
|
||||||
sizeofInt = 0x4
|
|
||||||
sizeofLong = 0x8
|
|
||||||
sizeofLongLong = 0x8
|
|
||||||
)
|
|
||||||
|
|
||||||
type (
|
|
||||||
_C_short int16
|
|
||||||
_C_int int32
|
|
||||||
_C_long int64
|
|
||||||
_C_long_long int64
|
|
||||||
)
|
|
||||||
|
|
||||||
type utmp struct {
|
|
||||||
Type int16
|
|
||||||
Pad_cgo_0 [2]byte
|
|
||||||
Pid int32
|
|
||||||
Line [32]int8
|
|
||||||
Id [4]int8
|
|
||||||
User [32]int8
|
|
||||||
Host [256]int8
|
|
||||||
Exit exit_status
|
|
||||||
Session int32
|
|
||||||
Tv UtTv
|
|
||||||
Addr_v6 [4]int32
|
|
||||||
X__glibc_reserved [20]int8
|
|
||||||
}
|
|
||||||
type exit_status struct {
|
|
||||||
Termination int16
|
|
||||||
Exit int16
|
|
||||||
}
|
|
||||||
type UtTv struct {
|
|
||||||
TvSec int32
|
|
||||||
TvUsec int32
|
|
||||||
}
|
|
|
@ -1,61 +0,0 @@
|
||||||
// +build linux
|
|
||||||
|
|
||||||
package host
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestGetRedhatishVersion(t *testing.T) {
|
|
||||||
var ret string
|
|
||||||
c := []string{"Rawhide"}
|
|
||||||
ret = getRedhatishVersion(c)
|
|
||||||
if ret != "rawhide" {
|
|
||||||
t.Errorf("Could not get version rawhide: %v", ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
c = []string{"Fedora release 15 (Lovelock)"}
|
|
||||||
ret = getRedhatishVersion(c)
|
|
||||||
if ret != "15" {
|
|
||||||
t.Errorf("Could not get version fedora: %v", ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
c = []string{"Enterprise Linux Server release 5.5 (Carthage)"}
|
|
||||||
ret = getRedhatishVersion(c)
|
|
||||||
if ret != "5.5" {
|
|
||||||
t.Errorf("Could not get version redhat enterprise: %v", ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
c = []string{""}
|
|
||||||
ret = getRedhatishVersion(c)
|
|
||||||
if ret != "" {
|
|
||||||
t.Errorf("Could not get version with no value: %v", ret)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestGetRedhatishPlatform(t *testing.T) {
|
|
||||||
var ret string
|
|
||||||
c := []string{"red hat"}
|
|
||||||
ret = getRedhatishPlatform(c)
|
|
||||||
if ret != "redhat" {
|
|
||||||
t.Errorf("Could not get platform redhat: %v", ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
c = []string{"Fedora release 15 (Lovelock)"}
|
|
||||||
ret = getRedhatishPlatform(c)
|
|
||||||
if ret != "fedora" {
|
|
||||||
t.Errorf("Could not get platform fedora: %v", ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
c = []string{"Enterprise Linux Server release 5.5 (Carthage)"}
|
|
||||||
ret = getRedhatishPlatform(c)
|
|
||||||
if ret != "enterprise" {
|
|
||||||
t.Errorf("Could not get platform redhat enterprise: %v", ret)
|
|
||||||
}
|
|
||||||
|
|
||||||
c = []string{""}
|
|
||||||
ret = getRedhatishPlatform(c)
|
|
||||||
if ret != "" {
|
|
||||||
t.Errorf("Could not get platform with no value: %v", ret)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,67 +0,0 @@
|
||||||
package host
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestHostInfo(t *testing.T) {
|
|
||||||
v, err := HostInfo()
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("error %v", err)
|
|
||||||
}
|
|
||||||
empty := &HostInfoStat{}
|
|
||||||
if v == empty {
|
|
||||||
t.Errorf("Could not get hostinfo %v", v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestBoot_time(t *testing.T) {
|
|
||||||
v, err := BootTime()
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("error %v", err)
|
|
||||||
}
|
|
||||||
if v == 0 {
|
|
||||||
t.Errorf("Could not get boot time %v", v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestUsers(t *testing.T) {
|
|
||||||
v, err := Users()
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("error %v", err)
|
|
||||||
}
|
|
||||||
empty := UserStat{}
|
|
||||||
for _, u := range v {
|
|
||||||
if u == empty {
|
|
||||||
t.Errorf("Could not Users %v", v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestHostInfoStat_String(t *testing.T) {
|
|
||||||
v := HostInfoStat{
|
|
||||||
Hostname: "test",
|
|
||||||
Uptime: 3000,
|
|
||||||
Procs: 100,
|
|
||||||
OS: "linux",
|
|
||||||
Platform: "ubuntu",
|
|
||||||
}
|
|
||||||
e := `{"hostname":"test","uptime":3000,"procs":100,"os":"linux","platform":"ubuntu","platform_family":"","platform_version":"","virtualization_system":"","virtualization_role":""}`
|
|
||||||
if e != fmt.Sprintf("%v", v) {
|
|
||||||
t.Errorf("HostInfoStat string is invalid: %v", v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestUserStat_String(t *testing.T) {
|
|
||||||
v := UserStat{
|
|
||||||
User: "user",
|
|
||||||
Terminal: "term",
|
|
||||||
Host: "host",
|
|
||||||
Started: 100,
|
|
||||||
}
|
|
||||||
e := `{"user":"user","terminal":"term","host":"host","started":100}`
|
|
||||||
if e != fmt.Sprintf("%v", v) {
|
|
||||||
t.Errorf("UserStat string is invalid: %v", v)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,123 +0,0 @@
|
||||||
// +build windows
|
|
||||||
|
|
||||||
package host
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
"fmt"
|
|
||||||
"time"
|
|
||||||
"runtime"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/StackExchange/wmi"
|
|
||||||
|
|
||||||
common "github.com/shirou/gopsutil/common"
|
|
||||||
process "github.com/shirou/gopsutil/process"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
procGetSystemTimeAsFileTime = common.Modkernel32.NewProc("GetSystemTimeAsFileTime")
|
|
||||||
osInfo *Win32_OperatingSystem
|
|
||||||
)
|
|
||||||
|
|
||||||
type Win32_OperatingSystem struct {
|
|
||||||
Version string
|
|
||||||
Caption string
|
|
||||||
ProductType uint32
|
|
||||||
BuildNumber string
|
|
||||||
LastBootUpTime time.Time
|
|
||||||
}
|
|
||||||
|
|
||||||
func HostInfo() (*HostInfoStat, error) {
|
|
||||||
hostname, err := os.Hostname()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
ret := &HostInfoStat{
|
|
||||||
Hostname: hostname,
|
|
||||||
OS: runtime.GOOS,
|
|
||||||
}
|
|
||||||
|
|
||||||
platform, family, version, err := GetPlatformInformation()
|
|
||||||
if err == nil {
|
|
||||||
ret.Platform = platform
|
|
||||||
ret.PlatformFamily = family
|
|
||||||
ret.PlatformVersion = version
|
|
||||||
} else {
|
|
||||||
return ret, err
|
|
||||||
}
|
|
||||||
|
|
||||||
ret.Uptime, err = BootTime()
|
|
||||||
if err != nil {
|
|
||||||
return ret, err
|
|
||||||
}
|
|
||||||
|
|
||||||
procs, err := process.Pids()
|
|
||||||
if err != nil {
|
|
||||||
return ret, err
|
|
||||||
}
|
|
||||||
|
|
||||||
ret.Procs = uint64(len(procs))
|
|
||||||
|
|
||||||
return ret, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetOSInfo() (Win32_OperatingSystem, error) {
|
|
||||||
var dst []Win32_OperatingSystem
|
|
||||||
q := wmi.CreateQuery(&dst, "")
|
|
||||||
err := wmi.Query(q, &dst)
|
|
||||||
if err != nil {
|
|
||||||
return Win32_OperatingSystem{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
osInfo = &dst[0]
|
|
||||||
|
|
||||||
return dst[0], nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func BootTime() (uint64, error) {
|
|
||||||
if osInfo == nil {
|
|
||||||
_, err := GetOSInfo()
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
now := time.Now()
|
|
||||||
t := osInfo.LastBootUpTime.Local()
|
|
||||||
return uint64(now.Sub(t).Seconds()), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetPlatformInformation() (platform string, family string, version string, err error) {
|
|
||||||
if osInfo == nil {
|
|
||||||
_, err = GetOSInfo()
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Platform
|
|
||||||
platform = strings.Trim(osInfo.Caption, " ")
|
|
||||||
|
|
||||||
// PlatformFamily
|
|
||||||
switch osInfo.ProductType {
|
|
||||||
case 1:
|
|
||||||
family = "Standalone Workstation"
|
|
||||||
case 2:
|
|
||||||
family = "Server (Domain Controller)"
|
|
||||||
case 3:
|
|
||||||
family = "Server"
|
|
||||||
}
|
|
||||||
|
|
||||||
// Platform Version
|
|
||||||
version = fmt.Sprintf("%s Build %s", osInfo.Version, osInfo.BuildNumber)
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func Users() ([]UserStat, error) {
|
|
||||||
|
|
||||||
var ret []UserStat
|
|
||||||
|
|
||||||
return ret, nil
|
|
||||||
}
|
|
|
@ -1,17 +0,0 @@
|
||||||
// +build ignore
|
|
||||||
// plus hand editing about timeval
|
|
||||||
|
|
||||||
/*
|
|
||||||
Input to cgo -godefs.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package host
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <utmpx.h>
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
type Utmpx C.struct_utmpx
|
|
||||||
type Timeval C.struct_timeval
|
|
|
@ -1,43 +0,0 @@
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
/*
|
|
||||||
Input to cgo -godefs.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package host
|
|
||||||
|
|
||||||
/*
|
|
||||||
#define KERNEL
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <utmpx.h>
|
|
||||||
|
|
||||||
enum {
|
|
||||||
sizeofPtr = sizeof(void*),
|
|
||||||
};
|
|
||||||
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
// Machine characteristics; for internal use.
|
|
||||||
|
|
||||||
const (
|
|
||||||
sizeofPtr = C.sizeofPtr
|
|
||||||
sizeofShort = C.sizeof_short
|
|
||||||
sizeofInt = C.sizeof_int
|
|
||||||
sizeofLong = C.sizeof_long
|
|
||||||
sizeofLongLong = C.sizeof_longlong
|
|
||||||
)
|
|
||||||
|
|
||||||
// Basic types
|
|
||||||
|
|
||||||
type (
|
|
||||||
_C_short C.short
|
|
||||||
_C_int C.int
|
|
||||||
_C_long C.long
|
|
||||||
_C_long_long C.longlong
|
|
||||||
)
|
|
||||||
|
|
||||||
type Utmp C.struct_utmp
|
|
||||||
type Utmpx C.struct_utmpx
|
|
||||||
type Timeval C.struct_timeval
|
|
|
@ -1,45 +0,0 @@
|
||||||
// +build ignore
|
|
||||||
|
|
||||||
/*
|
|
||||||
Input to cgo -godefs.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package host
|
|
||||||
|
|
||||||
/*
|
|
||||||
#define KERNEL
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <utmp.h>
|
|
||||||
|
|
||||||
enum {
|
|
||||||
sizeofPtr = sizeof(void*),
|
|
||||||
};
|
|
||||||
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
|
|
||||||
// Machine characteristics; for internal use.
|
|
||||||
|
|
||||||
const (
|
|
||||||
sizeofPtr = C.sizeofPtr
|
|
||||||
sizeofShort = C.sizeof_short
|
|
||||||
sizeofInt = C.sizeof_int
|
|
||||||
sizeofLong = C.sizeof_long
|
|
||||||
sizeofLongLong = C.sizeof_longlong
|
|
||||||
)
|
|
||||||
|
|
||||||
// Basic types
|
|
||||||
|
|
||||||
type (
|
|
||||||
_C_short C.short
|
|
||||||
_C_int C.int
|
|
||||||
_C_long C.long
|
|
||||||
_C_long_long C.longlong
|
|
||||||
)
|
|
||||||
|
|
||||||
type utmp C.struct_utmp
|
|
||||||
type exit_status C.struct_exit_status
|
|
||||||
type UtTv struct {
|
|
||||||
TvSec int32
|
|
||||||
TvUsec int32
|
|
||||||
}
|
|
Loading…
Reference in New Issue