/*
|
|
* System info
|
|
*/
|
|
package helper
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"log"
|
|
"os/exec"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
func CpuUsage() string {
|
|
cmd := exec.Command("ps", "aux")
|
|
var out bytes.Buffer
|
|
cmd.Stdout = &out
|
|
err := cmd.Run()
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
|
|
var all float64
|
|
for {
|
|
line, err := out.ReadString('\n')
|
|
if err != nil {
|
|
break
|
|
}
|
|
tokens := strings.Split(line, " ")
|
|
ft := make([]string, 0)
|
|
for _, t := range tokens {
|
|
if t != "" && t != "\t" {
|
|
ft = append(ft, t)
|
|
}
|
|
}
|
|
|
|
if ft[2] == "%CPU" {
|
|
continue
|
|
}
|
|
cpu, err := strconv.ParseFloat(ft[2], 64)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
all += cpu
|
|
}
|
|
return fmt.Sprintf("%.2f", all)
|
|
}
|
|
|
|
/*
|
|
* disk usage of path/disk
|
|
*/
|
|
//func DiskUsage(path string) map[string]string {
|
|
// mDisk := make(map[string]string)
|
|
// sFs := syscall.Statfs_t{}
|
|
// Err := syscall.Statfs(path, &sFs)
|
|
// if Err != nil {
|
|
// log.Println("ERROR", "170060|查询磁盘使用情况出错", Err.Error())
|
|
// return mDisk
|
|
// }
|
|
// All := sFs.Blocks * uint64(sFs.Bsize) / 1024 / 1024
|
|
// Free := sFs.Bfree * uint64(sFs.Bsize) / 1024 / 1024
|
|
// mDisk["All"] = strconv.FormatUint(All, 10)
|
|
// mDisk["Free"] = strconv.FormatUint(Free, 10)
|
|
// mDisk["Used"] = strconv.FormatUint((All - Free), 10)
|
|
// return mDisk
|
|
//}
|
|
|
|
//func MemStat() map[string]string {
|
|
// //系统占用,仅linux/mac下有效
|
|
// //system memory usage
|
|
// mMem := make(map[string]string)
|
|
// sysInfo := new(syscall.Sysinfo_t)
|
|
// Err := syscall.Sysinfo(sysInfo)
|
|
// if Err == nil {
|
|
// All := sysInfo.Totalram / 1024 / 1024
|
|
// Free := sysInfo.Freeram / 1024 / 1024
|
|
// Swap := sysInfo.Totalswap / 1024 / 1024
|
|
// SwapFree := sysInfo.Freeswap / 1024 / 1024
|
|
// mMem["All"] = strconv.FormatUint(All, 10) //* uint64(syscall.Getpagesize())
|
|
// mMem["Free"] = strconv.FormatUint(Free, 10) //* uint64(syscall.Getpagesize())
|
|
// mMem["Used"] = strconv.FormatUint(All-Free, 10)
|
|
// mMem["Swap"] = strconv.FormatUint(Swap, 10)
|
|
// mMem["SwapFree"] = strconv.FormatUint(SwapFree, 10)
|
|
// mMem["SwapUsed"] = strconv.FormatUint(Swap-SwapFree, 10)
|
|
// day := sysInfo.Uptime / 86400
|
|
// hour := sysInfo.Uptime % 86400 / 3600
|
|
// minute := sysInfo.Uptime % 86400 % 3600 / 60
|
|
// tTime := time.Now().Unix() - sysInfo.Uptime
|
|
// tNow := time.Unix(tTime, 10)
|
|
// mMem["StartTime"] = tNow.Format("2006") + "-" + tNow.Format("01") + "-" + tNow.Format("02") + " " + tNow.Format("15") + ":" + tNow.Format("04") + ":" + tNow.Format("05")
|
|
// mMem["Runtime"] = strconv.FormatInt(day, 10) + "天" + strconv.FormatInt(hour, 10) + "小时" + strconv.FormatInt(minute, 10) + "分钟"
|
|
//
|
|
// } else {
|
|
// log.Println("ERROR", "170060|查询内存使用情况出错", Err.Error())
|
|
// }
|
|
// return mMem
|
|
//}
|
|
|
|
|
|
/**
|
|
* IO读写
|
|
*/
|
|
func IoUsage() map[string]string {
|
|
cmd := exec.Command("iostat")
|
|
var out bytes.Buffer
|
|
cmd.Stdout = &out
|
|
err := cmd.Run()
|
|
mIo := make(map[string]string)
|
|
if err != nil {
|
|
log.Println("ERROR", "170061|系统命令iostat 执行错误", err.Error())
|
|
return mIo
|
|
}
|
|
for {
|
|
line, err := out.ReadString('\n')
|
|
if err != nil {
|
|
break
|
|
}
|
|
tokens := strings.Split(line, " ")
|
|
ft := make([]string, 0)
|
|
for _, t := range tokens {
|
|
if t != "" && t != "\t" {
|
|
fi := strings.Trim(t, "\n\t")
|
|
ft = append(ft, fi)
|
|
}
|
|
}
|
|
if ft[0] == "sda" {
|
|
mIo["ReadSpd"] = ft[2]
|
|
mIo["WriteSpd"] = ft[3]
|
|
mIo["Read"] = ft[4]
|
|
mIo["Write"] = ft[5]
|
|
}
|
|
}
|
|
return mIo
|
|
}
|
|
|
|
/**
|
|
*文件系统使用率
|
|
*/
|
|
|
|
func FileUsage() []interface{} {
|
|
cmd := exec.Command("df", "-h")
|
|
var out bytes.Buffer
|
|
cmd.Stdout = &out
|
|
err := cmd.Run()
|
|
mList := make([]interface{}, 0)
|
|
if err != nil {
|
|
log.Println("ERROR", "170061|系统命令df -h执行错误", err.Error())
|
|
return mList
|
|
}
|
|
var mRet map[string]string
|
|
for {
|
|
line, err := out.ReadString('\n')
|
|
if err != nil {
|
|
break
|
|
}
|
|
tokens := strings.Split(line, " ")
|
|
ft := make([]string, 0)
|
|
for _, t := range tokens {
|
|
if t != "" && t != "\t" {
|
|
fi := strings.Trim(t, "\n\t")
|
|
ft = append(ft, fi)
|
|
}
|
|
}
|
|
if ft[0] != "Filesystem" {
|
|
mRet = make(map[string]string)
|
|
mRet["FileSystem"] = ft[0]
|
|
mRet["All"] = ft[1]
|
|
mRet["Used"] = ft[2]
|
|
mRet["Free"] = ft[3]
|
|
mRet["UsePercent"] = ft[4]
|
|
mRet["Mounted"] = ft[5]
|
|
mList = append(mList, mRet)
|
|
}
|
|
}
|
|
return mList
|
|
}
|
|
|
|
/**
|
|
*系统负载1 5 10 分钟
|
|
*/
|
|
func LoadAverage() map[string]string {
|
|
|
|
cmd := exec.Command("uptime")
|
|
var out bytes.Buffer
|
|
cmd.Stdout = &out
|
|
err := cmd.Run()
|
|
mRet := make(map[string]string)
|
|
|
|
if err != nil {
|
|
log.Println("ERROR", "170061|系统命令uptime执行错误", err.Error())
|
|
return mRet
|
|
}
|
|
|
|
sLine, err := out.ReadString('\n')
|
|
|
|
if err != nil {
|
|
log.Println("ERROR", "170060|读取系统负载数据出错", err.Error())
|
|
return mRet
|
|
}
|
|
//正则表达获取1 5 15 分钟系统负载数据
|
|
sRegs := "\\d+\\.\\d+"
|
|
|
|
sReg := regexp.MustCompile(sRegs)
|
|
|
|
sLoadAverage := sReg.FindAllString(sLine, 3)
|
|
|
|
if len(sLoadAverage) >= 3 {
|
|
mRet["OneMin"] = sLoadAverage[0]
|
|
|
|
mRet["FivMin"] = sLoadAverage[1]
|
|
|
|
mRet["TenfivMin"] = sLoadAverage[2]
|
|
} else {
|
|
return mRet
|
|
}
|
|
return mRet
|
|
}
|
|
|
|
/**
|
|
*网卡使用情况
|
|
*/
|
|
func NetUsage() []interface{} {
|
|
|
|
var Net struct {
|
|
NetCard string
|
|
Rbytes string
|
|
Rpackets string
|
|
Rerrors string
|
|
Rpck string
|
|
Sbytes string
|
|
Spackets string
|
|
Serrors string
|
|
Spck string
|
|
}
|
|
cmd := exec.Command("ifconfig")
|
|
var out bytes.Buffer
|
|
cmd.Stdout = &out
|
|
err := cmd.Run()
|
|
aNetList := make([]interface{}, 0)
|
|
if err != nil {
|
|
log.Println("ERROR", "170060|查询网卡使用情况出错", err.Error())
|
|
return aNetList
|
|
}
|
|
for {
|
|
line, err := out.ReadString('\n')
|
|
if err != nil {
|
|
break
|
|
}
|
|
tokens := strings.Split(line, " ")
|
|
ft := make([]string, 0)
|
|
for _, t := range tokens {
|
|
if t != "" && t != "\t" {
|
|
fi := strings.Trim(t, "\n\t")
|
|
ft = append(ft, fi)
|
|
}
|
|
}
|
|
if ft[0] != "" {
|
|
if ft[1] == "Link" {
|
|
Net.NetCard = ft[0]
|
|
sPck := NetBytes(ft[0])
|
|
if len(sPck) >= 2 {
|
|
Net.Rpck = sPck[0]
|
|
Net.Spck = sPck[1]
|
|
} else {
|
|
Net.Rpck = "0.0"
|
|
Net.Spck = "0.0"
|
|
}
|
|
}
|
|
if ft[0] == "RX" {
|
|
if strings.Contains(ft[1], "packets") {
|
|
sPackets := strings.SplitAfter(ft[1], ":")
|
|
Net.Rpackets = sPackets[1]
|
|
sErrors := strings.SplitAfter(ft[2], ":")
|
|
Net.Rerrors = sErrors[1]
|
|
}
|
|
if strings.Contains(ft[1], "bytes") {
|
|
rBytes := strings.SplitAfter(ft[1], ":")
|
|
Net.Rbytes = rBytes[1]
|
|
sBytes := strings.SplitAfter(ft[5], ":")
|
|
Net.Sbytes = sBytes[1]
|
|
aNetList = append(aNetList, Net)
|
|
}
|
|
}
|
|
if ft[0] == "TX" {
|
|
if strings.Contains(ft[1], "packets") {
|
|
sPackets := strings.SplitAfter(ft[1], ":")
|
|
Net.Spackets = sPackets[1]
|
|
sErrors := strings.SplitAfter(ft[2], ":")
|
|
Net.Serrors = sErrors[1]
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
return aNetList
|
|
}
|
|
|
|
/**
|
|
*网卡实时流量
|
|
*/
|
|
func NetBytes(Iface string) []string {
|
|
aBytesInfo := make([]string, 0)
|
|
cmd := exec.Command("sar", "-n", "DEV", "1", "1")
|
|
var out bytes.Buffer
|
|
cmd.Stdout = &out
|
|
err := cmd.Run()
|
|
if err != nil {
|
|
log.Println("ERROR", "170060|查询实时流量情况出错", err.Error())
|
|
return aBytesInfo
|
|
}
|
|
for {
|
|
line, err := out.ReadString('\n')
|
|
if err != nil {
|
|
break
|
|
}
|
|
tokens := strings.Split(line, " ")
|
|
ft := make([]string, 0)
|
|
for _, t := range tokens {
|
|
if t != "" && t != "\t" {
|
|
fi := strings.Trim(t, "\n\t")
|
|
ft = append(ft, fi)
|
|
}
|
|
}
|
|
if ft[0] == "Average:" {
|
|
if ft[1] == Iface {
|
|
aBytesInfo = append(aBytesInfo, ft[2])
|
|
aBytesInfo = append(aBytesInfo, ft[3])
|
|
}
|
|
}
|
|
}
|
|
return aBytesInfo
|
|
}
|
|
|
|
/**
|
|
*网络配置
|
|
*/
|
|
func GetNetConfig() []interface{} {
|
|
|
|
aNetCard := make([]interface{}, 0)
|
|
cmd := exec.Command("cat", "/etc/network/interfaces")
|
|
var out bytes.Buffer
|
|
cmd.Stdout = &out
|
|
err := cmd.Run()
|
|
if err != nil {
|
|
log.Println("ERROR", "170050|查询网卡配置信息出错", err.Error())
|
|
return aNetCard
|
|
}
|
|
var mNetConfig map[string]string
|
|
mNetConfig = make(map[string]string)
|
|
|
|
for {
|
|
|
|
line, err := out.ReadString('\n')
|
|
if err != nil {
|
|
break
|
|
}
|
|
nline := strings.Replace(line, "\t", " ", -1)
|
|
tokens := strings.Split(nline, " ")
|
|
ft := make([]string, 0)
|
|
|
|
for _, t := range tokens {
|
|
if t != "" {
|
|
fi := strings.Trim(t, "\n")
|
|
ft = append(ft, fi)
|
|
}
|
|
}
|
|
|
|
switch ft[0] {
|
|
case "auto":
|
|
|
|
if len(ft) < 2 {
|
|
ft = append(ft, " ")
|
|
}
|
|
if ft[1] != "lo" {
|
|
mNetConfig["NetCard"] = ft[1]
|
|
}
|
|
|
|
case "netmask":
|
|
|
|
if len(ft) < 2 {
|
|
ft = append(ft, " ")
|
|
}
|
|
mNetConfig["NetMask"] = ft[1]
|
|
|
|
case "gateway":
|
|
|
|
if len(ft) < 2 {
|
|
ft = append(ft, " ")
|
|
}
|
|
mNetConfig["GateWay"] = ft[1]
|
|
|
|
case "address":
|
|
|
|
if len(ft) < 2 {
|
|
ft = append(ft, " ")
|
|
}
|
|
mNetConfig["Ip"] = ft[1]
|
|
|
|
case "dns-nameservers":
|
|
|
|
if len(ft) < 2 {
|
|
ft = append(ft, "")
|
|
}
|
|
mNetConfig["Dns"] = ft[1]
|
|
|
|
case "dns-nameserver":
|
|
|
|
if len(ft) < 2 {
|
|
ft = append(ft, "")
|
|
}
|
|
mNetConfig["Dns"] = ft[1]
|
|
}
|
|
|
|
if len(mNetConfig) == 5 {
|
|
aNetCard = append(aNetCard, mNetConfig)
|
|
mNetConfig = make(map[string]string)
|
|
}
|
|
|
|
}
|
|
|
|
return aNetCard
|
|
}
|
|
|
|
/**
|
|
*修改网络配置
|
|
*/
|
|
func PutNetConfig(mString map[string]string) error {
|
|
|
|
bFile, err := ioutil.ReadFile("/etc/network/interfaces")
|
|
|
|
if err != nil {
|
|
log.Println("ERROR", "170050|读取网卡配置文件出错", err.Error())
|
|
return err
|
|
}
|
|
|
|
var sName, sRegs string
|
|
var Reg *regexp.Regexp
|
|
mNetCard := make(map[string]string, 0)
|
|
for i, v := range mString {
|
|
var err error
|
|
if v == "" {
|
|
err = errors.New("参数值为空")
|
|
return err
|
|
}
|
|
switch i {
|
|
case "Ip":
|
|
mNetCard["address"] = v
|
|
case "GateWay":
|
|
mNetCard["gateway"] = v
|
|
case "Dns":
|
|
mNetCard["dns-nameserver"] = v
|
|
case "NetMask":
|
|
mNetCard["netmask"] = v
|
|
}
|
|
}
|
|
|
|
for i, v := range mNetCard {
|
|
sName = i
|
|
sRegs = sName + "\\s+\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"
|
|
Reg = regexp.MustCompile(sRegs)
|
|
bOld := Reg.Find(bFile)
|
|
bFile = bytes.Replace(bFile, bOld, []byte(i+" "+v), 1)
|
|
}
|
|
|
|
err = ioutil.WriteFile("/etc/network/interfaces", bFile, 644)
|
|
|
|
if err != nil {
|
|
panic(err)
|
|
log.Println("ERROR", "170051|写入网卡配置文件出错", err.Error())
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|