|
|
- /*
- * 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
- }
|