123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312 |
- package mokuai
- import (
- "fmt"
- "net"
- "os/exec"
- "regexp"
- "runtime"
- "strconv"
- "strings"
- "time"
- )
- // 网速使用
- type Net_dev struct {
- Ifc_bytes_r float64 //1 Receive接收(下行)字节数 ,单位 Byte 。 1Byte(B)=8bit(b)
- Ifc_packets_r float64 //2 接收的正确包量
- Ifc_bytes_t float64 //9 Transmit发出(上行)字节数 ,单位 Byte 。 1Byte(B)=8bit(b)
- Ifc_packets_t float64 //10 发出的正确包量
- Ifc_bytes_r_a int64 // Receive接收(下行)总字节数(总流量) ,单位 Byte 。 1Byte(B)=8bit(b)
- Ifc_bytes_t_a int64 // Transmit发出(下行)总字节数(总流量) ,单位 Byte 。 1Byte(B)=8bit(b)
- }
- // 获取机器唯一UUID ID
- func OS_Linux_GetUuid() string {
- return File_ReadStr("/sys/class/dmi/id/product_uuid")
- }
- // 获取linux版本
- func OS_Linux_GetLinuxVersion() string {
- return File_ReadStr("/proc/version")
- }
- // linux下运行shell指令 仅支持一行
- func OS_Linux_RunSh(args ...string) string {
- cmdStr := strings.Join(args, " ")
- // fmt.Println("cmdStr >",cmdStr)
- cmd := exec.Command("/bin/bash", "-c", cmdStr)
- opBytes, err := cmd.Output()
- // fmt.Print("cmdStr ",opBytes,string(opBytes))
- if err != nil {
- if err.Error() == "exit status 1" {
- return Text_DelOuterSpace(string(opBytes))
- } else {
- return "Error:" + string(err.Error())
- }
- }
- return Text_DelOuterSpace(string(opBytes))
- }
- // linux下运行shell指令 仅支持一行 带错误输出
- func OS_Linux_RunShWithErr(args ...string) (text, errText string) {
- cmdStr := strings.Join(args, " ")
- // fmt.Println("cmdStr >",cmdStr)
- cmd := exec.Command("/bin/bash", "-c", cmdStr)
- var out bytes.Buffer
- var stderr bytes.Buffer
- cmd.Stdout = &out
- cmd.Stderr = &stderr
- err := cmd.Run()
- if err != nil {
- return Text_DelOuterSpace(out.String()), err.Error() + "\n" + stderr.String()
- } else {
- return Text_DelOuterSpace(out.String()), ""
- }
- }
- // 获取linux默认出口网卡名
- func OS_Linux_GetDefNet() string {
- lin := OS_Linux_RunSh("ip route |grep 'default'")
- lin = Text_GetBetween(lin, "dev ", " ")
- return lin
- }
- // 获取Linux 唯一不变机器sn 默认网卡、系统UUID相关联
- func OS_Linux_GetSn() string {
- a, _ := net.InterfaceByName(OS_Linux_GetDefNet())
- HardwareAddr := a.HardwareAddr.String()
- SwSecret := "yw"
- // fmt.Println("-->HardwareAddr:", HardwareAddr+"-->GetUuid:"+GetUuid()+"-->SwSecret:"+SwSecret)
- return Code_GetMd5(OS_Linux_GetUuid() + SwSecret + HardwareAddr)
- }
- // 获取linux当前内存使用率
- // memTotal : 内存总量,单位 Byte(B) ; used : 当前使用率,单位% ; used_true : 当前实际使用率,单位%
- func OS_Linux_MemGetRate() (memTotal, used, used_true string) {
- a := File_ReadStr("/proc/meminfo")
- r, _ := regexp.Compile("(MemTotal|MemFree|Buffers|Cached):.*")
- b := r.FindAllString(a, 4)
- r, _ = regexp.Compile("[0-9]+")
- memTotal = r.FindString(b[0])
- MemTotal, _ := strconv.ParseFloat(r.FindString(b[0]), 64)
- MemFree, _ := strconv.ParseFloat(r.FindString(b[1]), 64)
- Buffers, _ := strconv.ParseFloat(r.FindString(b[2]), 64)
- Cached, _ := strconv.ParseFloat(r.FindString(b[3]), 64)
- //有5%的误差
- MemAvailable := (MemFree + Buffers + Cached) * 0.95
- Used := fmt.Sprintf("%.2f", (1-MemFree/MemTotal)*100)
- TrueUsed := fmt.Sprintf("%.2f", (1-MemAvailable/MemTotal)*100)
- return memTotal, Used, TrueUsed
- }
- // 获取linux当前CPU使用率 。 s 秒 间隔的时间长度
- func OS_Linux_CpuGetRate(s int) string {
- if s < 1 {
- s = 1
- }
- c1 := File_ReadStr("/proc/stat")
- r, _ := regexp.Compile("cpu .*")
- c1 = r.FindString(c1)
- time.Sleep(time.Duration(s) * time.Second)
- c2 := File_ReadStr("/proc/stat")
- c2 = r.FindString(c2)
- tmp1 := []string{}
- tmp2 := []string{}
- tmp1 = strings.Fields(c1)
- tmp2 = strings.Fields(c2)
- var c1_total, c2_total, c1_free, c2_free float64
- c1_total, c2_total, c1_free, c2_free = 0, 0, 0, 0
- var c_tmp, c_tmp2 float64
- for i := 0; i < len(tmp1); i++ {
- c_tmp, _ = strconv.ParseFloat(tmp1[i], 64)
- c_tmp2, _ = strconv.ParseFloat(tmp2[i], 64)
- c1_total += c_tmp
- c2_total += c_tmp2
- }
- c1_free, _ = strconv.ParseFloat(tmp1[4], 64)
- c2_free, _ = strconv.ParseFloat(tmp2[4], 64)
- idle := (c2_free - c1_free) / (c2_total - c1_total)
- used := (1 - idle) * 100
- return fmt.Sprintf("%.3f", used)
- }
- // 获取linux当前CPU核数
- func OS_Linux_CpuGetNum() string {
- a := runtime.NumCPU()
- return strconv.Itoa(a)
- }
- /*
- 获取linux CPU信息
- 返回值: CpuModel:CPU型号 ; CpuPHY:物理cpu个数 ; CpuCores: CPU核数 ; CpuThread: CPU(逻辑)线程数
- */
- func OS_Linux_Cpu_info() (CpuModel string, CpuPHY, CpuCores, CpuThread int) {
- a1 := File_ReadStr("/proc/cpuinfo")
- cpuPHY_zu := []string{}
- cpuCores_zu := []string{}
- cpuThread_zu := []string{}
- linzu := Text_GetSplitText(a1, "\n")
- for _, v := range linzu {
- if v == "" {
- continue
- }
- // CPU 型号
- if Text_FindKeyword(Text_GetLeftText(v, ":"), "model name") != -1 {
- CpuModel = strings.TrimSpace(Text_GetRightText(v, ":"))
- continue
- }
- if Text_FindKeyword(Text_GetLeftText(v, ":"), "physical id") != -1 {
- s := 0
- for _, v1 := range cpuPHY_zu {
- if v1 == strings.TrimSpace(Text_GetRightText(v, ":")) {
- s = 1
- break
- }
- }
- if s == 0 {
- cpuPHY_zu = append(cpuPHY_zu, strings.TrimSpace(Text_GetRightText(v, ":")))
- }
- continue
- }
- if Text_FindKeyword(Text_GetLeftText(v, ":"), "cpu cores") != -1 {
- s := 0
- for _, v1 := range cpuCores_zu {
- if v1 == strings.TrimSpace(Text_GetRightText(v, ":")) {
- s = 1
- break
- }
- }
- if s == 0 {
- cpuCores_zu = append(cpuCores_zu, strings.TrimSpace(Text_GetRightText(v, ":")))
- }
- continue
- }
- if Text_FindKeyword(Text_GetLeftText(v, ":"), "siblings") != -1 {
- s := 0
- for _, v1 := range cpuThread_zu {
- if v1 == strings.TrimSpace(Text_GetRightText(v, ":")) {
- s = 1
- break
- }
- }
- if s == 0 {
- cpuThread_zu = append(cpuThread_zu, strings.TrimSpace(Text_GetRightText(v, ":")))
- }
- continue
- }
- }
- // 整理
- CpuPHY = len(cpuPHY_zu)
- all := 0
- for _, v := range cpuCores_zu {
- i, _ := strconv.Atoi(v)
- all += i
- }
- CpuCores = all
- all = 0
- for _, v := range cpuThread_zu {
- i, _ := strconv.Atoi(v)
- all += i
- }
- CpuThread = all
- return
- }
- // 获取linux当前系统负载系数。 返回格式: 1、5、15分钟内的平均进程数,正在运行的进程数/进程总数,最近运行的进程ID号 (0.00 0.02 0.01 1/201 24781)
- func OS_Linux_GetSystemAvg() string {
- return File_ReadStr("/proc/loadavg")
- }
- // 获取linux当前tcp连接数
- func OS_Linux_GetTcp() string {
- str := File_ReadStr("/proc/net/tcp")
- i := strings.Count(str, "\n")
- return strconv.Itoa(i)
- }
- // 获取linux当前udp连接数
- func OS_Linux_GetUdp() string {
- str := File_ReadStr("/proc/net/udp")
- i := strings.Count(str, "\n")
- return strconv.Itoa(i)
- }
- // 获取linux实时网速 。 s 秒 间隔的时间长度 ,返回网卡及对应的上下行实时流量 .返回单位见 Net_dev
- func Os_Linux_NetRealSpeed(s int) (inter map[string]Net_dev) {
- if s < 1 {
- s = 1
- }
- a1 := File_ReadStr("/proc/net/dev")
- rt := make(map[string]Net_dev)
- rt2 := make(map[string]Net_dev)
- var nt Net_dev
- tmp := strings.Split(a1, "\n")
- tmp2 := []string{}
- for i := 2; i < len(tmp); i++ {
- tmp2 = strings.Fields(tmp[i])
- // fmt.Println("tmp2",tmp2)
- if len(tmp2) > 0 {
- nt.Ifc_bytes_r, _ = strconv.ParseFloat(tmp2[1], 64)
- nt.Ifc_packets_r, _ = strconv.ParseFloat(tmp2[2], 64)
- nt.Ifc_bytes_t, _ = strconv.ParseFloat(tmp2[9], 64)
- nt.Ifc_packets_t, _ = strconv.ParseFloat(tmp2[10], 64)
- tmp2[0] = strings.Replace(tmp2[0], ":", "", 1)
- rt[tmp2[0]] = nt
- }
- }
- time.Sleep(time.Duration(s) * time.Second)
- s1 := float64(s)
- a2 := File_ReadStr("/proc/net/dev")
- tmp = strings.Split(a2, "\n")
- tmp2 = []string{}
- for i := 2; i < len(tmp); i++ {
- tmp2 = strings.Fields(tmp[i])
- if len(tmp2) > 0 {
- nt.Ifc_bytes_r, _ = strconv.ParseFloat(tmp2[1], 64)
- nt.Ifc_packets_r, _ = strconv.ParseFloat(tmp2[2], 64)
- nt.Ifc_bytes_t, _ = strconv.ParseFloat(tmp2[9], 64)
- nt.Ifc_packets_t, _ = strconv.ParseFloat(tmp2[10], 64)
- i64, _ := strconv.ParseInt(tmp2[1], 10, 64)
- nt.Ifc_bytes_r_a = i64
- i64, _ = strconv.ParseInt(tmp2[9], 10, 64)
- nt.Ifc_bytes_t_a = i64
- tmp2[0] = strings.Replace(tmp2[0], ":", "", 1)
- rt2[tmp2[0]] = nt
- }
- }
- inter = make(map[string]Net_dev)
- for k := range rt {
- Ifc_bytes_r := (rt2[k].Ifc_bytes_r - rt[k].Ifc_bytes_r) / s1 / 1024
- Ifc_packets_r := (rt2[k].Ifc_packets_r - rt[k].Ifc_packets_r) / s1
- Ifc_bytes_t := (rt2[k].Ifc_bytes_t - rt[k].Ifc_bytes_t) / s1 / 1024
- Ifc_packets_t := (rt2[k].Ifc_packets_t - rt[k].Ifc_packets_t) / s1
- inter[k] = Net_dev{Ifc_bytes_r: Ifc_bytes_r, Ifc_packets_r: Ifc_packets_r, Ifc_bytes_t: Ifc_bytes_t, Ifc_packets_t: Ifc_packets_t, Ifc_bytes_r_a: rt2[k].Ifc_bytes_r_a, Ifc_bytes_t_a: rt2[k].Ifc_bytes_t_a}
- }
- return inter
- }
|