// Returns only one InfoStat on FreeBSD. The information regarding core // count, however is accurate and it is assumed that all InfoStat attributes // are the same across CPUs. func Info() ([]InfoStat, error) { const dmesgBoot = "/var/run/dmesg.boot" lines, _ := common.ReadLines(dmesgBoot) c := InfoStat{} var vals []string var err error if vals, err = common.DoSysctrl("hw.clockrate"); err != nil { return nil, err } if c.Mhz, err = strconv.ParseFloat(vals[0], 64); err != nil { return nil, fmt.Errorf("Unable to parse FreeBSD CPU clock rate: %v", err) } c.CPU = int32(c.Mhz) if vals, err = common.DoSysctrl("hw.ncpu"); err != nil { return nil, err } var i64 int64 if i64, err = strconv.ParseInt(vals[0], 10, 32); err != nil { return nil, fmt.Errorf("Unable to parse FreeBSD cores: %v", err) } c.Cores = int32(i64) if vals, err = common.DoSysctrl("hw.model"); err != nil { return nil, err } c.ModelName = strings.Join(vals, " ") for _, line := range lines { if matches := regexp.MustCompile(`Origin\s*=\s*"(.+)"\s+Id\s*=\s*(.+)\s+Family\s*=\s*(.+)\s+Model\s*=\s*(.+)\s+Stepping\s*=\s*(.+)`).FindStringSubmatch(line); matches != nil { c.VendorID = matches[1] c.Family = matches[3] c.Model = matches[4] t, err := strconv.ParseInt(matches[5], 10, 32) if err != nil { return nil, fmt.Errorf("Unable to parse FreeBSD CPU stepping information from %q: %v", line, err) } c.Stepping = int32(t) } else if matches := regexp.MustCompile(`Features=.+<(.+)>`).FindStringSubmatch(line); matches != nil { for _, v := range strings.Split(matches[1], ",") { c.Flags = append(c.Flags, strings.ToLower(v)) } } else if matches := regexp.MustCompile(`Features2=[a-f\dx]+<(.+)>`).FindStringSubmatch(line); matches != nil { for _, v := range strings.Split(matches[1], ",") { c.Flags = append(c.Flags, strings.ToLower(v)) } } } return []InfoStat{c}, nil }
func HostInfo() (*HostInfoStat, error) { ret := &HostInfoStat{ OS: runtime.GOOS, PlatformFamily: "freebsd", } hostname, err := os.Hostname() if err == nil { 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 { ret.Uptime = t } } return ret, nil }
// VirtualMemory returns VirtualmemoryStat. func VirtualMemory() (*VirtualMemoryStat, error) { ret := &VirtualMemoryStat{} p, err := getPageSize() if err != nil { return nil, err } t, err := common.DoSysctrl("hw.memsize") if err != nil { return nil, err } total, err := strconv.ParseUint(t[0], 10, 64) if err != nil { return nil, err } err = getVmStat(p, ret) if err != nil { return nil, err } ret.Available = ret.Free + ret.Cached ret.Total = total ret.Used = ret.Total - ret.Free ret.UsedPercent = float64(ret.Total-ret.Available) / float64(ret.Total) * 100.0 return ret, nil }
func Avg() (*AvgStat, error) { values, err := common.DoSysctrl("vm.loadavg") if err != nil { return nil, err } load1, err := strconv.ParseFloat(values[0], 64) if err != nil { return nil, err } load5, err := strconv.ParseFloat(values[1], 64) if err != nil { return nil, err } load15, err := strconv.ParseFloat(values[2], 64) if err != nil { return nil, err } ret := &AvgStat{ Load1: float64(load1), Load5: float64(load5), Load15: float64(load15), } return ret, nil }
func Times(percpu bool) ([]TimesStat, error) { var ret []TimesStat var sysctlCall string var ncpu int if percpu { sysctlCall = "kern.cp_times" ncpu, _ = Counts(true) } else { sysctlCall = "kern.cp_time" ncpu = 1 } cpuTimes, err := common.DoSysctrl(sysctlCall) if err != nil { return ret, err } for i := 0; i < ncpu; i++ { offset := CPUStates * i user, err := strconv.ParseFloat(cpuTimes[CPUser+offset], 64) if err != nil { return ret, err } nice, err := strconv.ParseFloat(cpuTimes[CPNice+offset], 64) if err != nil { return ret, err } sys, err := strconv.ParseFloat(cpuTimes[CPSys+offset], 64) if err != nil { return ret, err } idle, err := strconv.ParseFloat(cpuTimes[CPIdle+offset], 64) if err != nil { return ret, err } intr, err := strconv.ParseFloat(cpuTimes[CPIntr+offset], 64) if err != nil { return ret, err } c := TimesStat{ User: float64(user / ClocksPerSec), Nice: float64(nice / ClocksPerSec), System: float64(sys / ClocksPerSec), Idle: float64(idle / ClocksPerSec), Irq: float64(intr / ClocksPerSec), } if !percpu { c.CPU = "cpu-total" } else { c.CPU = fmt.Sprintf("cpu%d", i) } ret = append(ret, c) } return ret, nil }
func Info() (*InfoStat, error) { ret := &InfoStat{ OS: runtime.GOOS, } hostname, err := os.Hostname() if err == nil { ret.Hostname = hostname } platform, family, version, err := PlatformInformation() if err == nil { ret.Platform = platform ret.PlatformFamily = family ret.PlatformVersion = version } kernelVersion, err := KernelVersion() if err == nil { ret.KernelVersion = kernelVersion } system, role, err := Virtualization() if err == nil { ret.VirtualizationSystem = system ret.VirtualizationRole = role } boot, err := BootTime() if err == nil { ret.BootTime = boot ret.Uptime = uptime(boot) } if numProcs, err := common.NumProcs(); err == nil { 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 }
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 Info() (*InfoStat, error) { ret := &InfoStat{ OS: runtime.GOOS, PlatformFamily: "darwin", } hostname, err := os.Hostname() if err == nil { ret.Hostname = hostname } platform, family, version, err := PlatformInformation() if err == nil { ret.Platform = platform ret.PlatformFamily = family ret.PlatformVersion = version ret.KernelVersion = version } system, role, err := Virtualization() if err == nil { ret.VirtualizationSystem = system ret.VirtualizationRole = role } boot, err := BootTime() if err == nil { ret.BootTime = boot ret.Uptime = uptime(boot) } procs, err := process.Pids() if err == nil { 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 }
// SwapMemory returns swapinfo. func SwapMemory() (*SwapMemoryStat, error) { var ret *SwapMemoryStat swapUsage, err := common.DoSysctrl("vm.swapusage") if err != nil { return ret, err } total := strings.Replace(swapUsage[2], "M", "", 1) used := strings.Replace(swapUsage[5], "M", "", 1) free := strings.Replace(swapUsage[8], "M", "", 1) total_v, err := strconv.ParseFloat(total, 64) if err != nil { return nil, err } used_v, err := strconv.ParseFloat(used, 64) if err != nil { return nil, err } free_v, err := strconv.ParseFloat(free, 64) if err != nil { return nil, err } u := float64(0) if total_v != 0 { u = ((total_v - free_v) / total_v) * 100.0 } // vm.swapusage shows "M", multiply 1000 ret = &SwapMemoryStat{ Total: uint64(total_v * 1000), Used: uint64(used_v * 1000), Free: uint64(free_v * 1000), UsedPercent: u, } return ret, nil }
func VirtualMemory() (*VirtualMemoryStat, error) { pageSize, err := common.DoSysctrl("vm.stats.vm.v_page_size") if err != nil { return nil, err } p, err := strconv.ParseUint(pageSize[0], 10, 64) if err != nil { return nil, err } pageCount, err := common.DoSysctrl("vm.stats.vm.v_page_count") if err != nil { return nil, err } free, err := common.DoSysctrl("vm.stats.vm.v_free_count") if err != nil { return nil, err } active, err := common.DoSysctrl("vm.stats.vm.v_active_count") if err != nil { return nil, err } inactive, err := common.DoSysctrl("vm.stats.vm.v_inactive_count") if err != nil { return nil, err } cache, err := common.DoSysctrl("vm.stats.vm.v_cache_count") if err != nil { return nil, err } buffer, err := common.DoSysctrl("vfs.bufspace") if err != nil { return nil, err } wired, err := common.DoSysctrl("vm.stats.vm.v_wire_count") if err != nil { return nil, err } parsed := make([]uint64, 0, 7) vv := []string{ pageCount[0], free[0], active[0], inactive[0], cache[0], buffer[0], wired[0], } for _, target := range vv { t, err := strconv.ParseUint(target, 10, 64) if err != nil { return nil, err } parsed = append(parsed, t) } ret := &VirtualMemoryStat{ Total: parsed[0] * p, Free: parsed[1] * p, Active: parsed[2] * p, Inactive: parsed[3] * p, Cached: parsed[4] * p, Buffers: parsed[5], Wired: parsed[6] * p, } ret.Available = ret.Inactive + ret.Cached + ret.Free ret.Used = ret.Active + ret.Wired + ret.Cached ret.UsedPercent = float64(ret.Total-ret.Available) / float64(ret.Total) * 100.0 return ret, nil }