handle_linux.go 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. package mokuai
  2. import (
  3. "fmt"
  4. "net"
  5. "os/exec"
  6. "regexp"
  7. "runtime"
  8. "strconv"
  9. "strings"
  10. "time"
  11. )
  12. // 网速使用
  13. type Net_dev struct {
  14. Ifc_bytes_r float64 //1 Receive接收(下行)字节数 ,单位 Byte 。 1Byte(B)=8bit(b)
  15. Ifc_packets_r float64 //2 接收的正确包量
  16. Ifc_bytes_t float64 //9 Transmit发出(上行)字节数 ,单位 Byte 。 1Byte(B)=8bit(b)
  17. Ifc_packets_t float64 //10 发出的正确包量
  18. Ifc_bytes_r_a int64 // Receive接收(下行)总字节数(总流量) ,单位 Byte 。 1Byte(B)=8bit(b)
  19. Ifc_bytes_t_a int64 // Transmit发出(下行)总字节数(总流量) ,单位 Byte 。 1Byte(B)=8bit(b)
  20. }
  21. // 获取机器唯一UUID ID
  22. func OS_Linux_GetUuid() string {
  23. return File_ReadStr("/sys/class/dmi/id/product_uuid")
  24. }
  25. // 获取linux版本
  26. func OS_Linux_GetLinuxVersion() string {
  27. return File_ReadStr("/proc/version")
  28. }
  29. // linux下运行shell指令 仅支持一行
  30. func OS_Linux_RunSh(args ...string) string {
  31. cmdStr := strings.Join(args, " ")
  32. // fmt.Println("cmdStr >",cmdStr)
  33. cmd := exec.Command("/bin/bash", "-c", cmdStr)
  34. opBytes, err := cmd.Output()
  35. // fmt.Print("cmdStr ",opBytes,string(opBytes))
  36. if err != nil {
  37. if err.Error() == "exit status 1" {
  38. return Text_DelOuterSpace(string(opBytes))
  39. } else {
  40. return "Error:" + string(err.Error())
  41. }
  42. }
  43. return Text_DelOuterSpace(string(opBytes))
  44. }
  45. // linux下运行shell指令 仅支持一行 带错误输出
  46. func OS_Linux_RunShWithErr(args ...string) (text, errText string) {
  47. cmdStr := strings.Join(args, " ")
  48. // fmt.Println("cmdStr >",cmdStr)
  49. cmd := exec.Command("/bin/bash", "-c", cmdStr)
  50. var out bytes.Buffer
  51. var stderr bytes.Buffer
  52. cmd.Stdout = &out
  53. cmd.Stderr = &stderr
  54. err := cmd.Run()
  55. if err != nil {
  56. return Text_DelOuterSpace(out.String()), err.Error() + "\n" + stderr.String()
  57. } else {
  58. return Text_DelOuterSpace(out.String()), ""
  59. }
  60. }
  61. // 获取linux默认出口网卡名
  62. func OS_Linux_GetDefNet() string {
  63. lin := OS_Linux_RunSh("ip route |grep 'default'")
  64. lin = Text_GetBetween(lin, "dev ", " ")
  65. return lin
  66. }
  67. // 获取Linux 唯一不变机器sn 默认网卡、系统UUID相关联
  68. func OS_Linux_GetSn() string {
  69. a, _ := net.InterfaceByName(OS_Linux_GetDefNet())
  70. HardwareAddr := a.HardwareAddr.String()
  71. SwSecret := "yw"
  72. // fmt.Println("-->HardwareAddr:", HardwareAddr+"-->GetUuid:"+GetUuid()+"-->SwSecret:"+SwSecret)
  73. return Code_GetMd5(OS_Linux_GetUuid() + SwSecret + HardwareAddr)
  74. }
  75. // 获取linux当前内存使用率
  76. // memTotal : 内存总量,单位 Byte(B) ; used : 当前使用率,单位% ; used_true : 当前实际使用率,单位%
  77. func OS_Linux_MemGetRate() (memTotal, used, used_true string) {
  78. a := File_ReadStr("/proc/meminfo")
  79. r, _ := regexp.Compile("(MemTotal|MemFree|Buffers|Cached):.*")
  80. b := r.FindAllString(a, 4)
  81. r, _ = regexp.Compile("[0-9]+")
  82. memTotal = r.FindString(b[0])
  83. MemTotal, _ := strconv.ParseFloat(r.FindString(b[0]), 64)
  84. MemFree, _ := strconv.ParseFloat(r.FindString(b[1]), 64)
  85. Buffers, _ := strconv.ParseFloat(r.FindString(b[2]), 64)
  86. Cached, _ := strconv.ParseFloat(r.FindString(b[3]), 64)
  87. //有5%的误差
  88. MemAvailable := (MemFree + Buffers + Cached) * 0.95
  89. Used := fmt.Sprintf("%.2f", (1-MemFree/MemTotal)*100)
  90. TrueUsed := fmt.Sprintf("%.2f", (1-MemAvailable/MemTotal)*100)
  91. return memTotal, Used, TrueUsed
  92. }
  93. // 获取linux当前CPU使用率 。 s 秒 间隔的时间长度
  94. func OS_Linux_CpuGetRate(s int) string {
  95. if s < 1 {
  96. s = 1
  97. }
  98. c1 := File_ReadStr("/proc/stat")
  99. r, _ := regexp.Compile("cpu .*")
  100. c1 = r.FindString(c1)
  101. time.Sleep(time.Duration(s) * time.Second)
  102. c2 := File_ReadStr("/proc/stat")
  103. c2 = r.FindString(c2)
  104. tmp1 := []string{}
  105. tmp2 := []string{}
  106. tmp1 = strings.Fields(c1)
  107. tmp2 = strings.Fields(c2)
  108. var c1_total, c2_total, c1_free, c2_free float64
  109. c1_total, c2_total, c1_free, c2_free = 0, 0, 0, 0
  110. var c_tmp, c_tmp2 float64
  111. for i := 0; i < len(tmp1); i++ {
  112. c_tmp, _ = strconv.ParseFloat(tmp1[i], 64)
  113. c_tmp2, _ = strconv.ParseFloat(tmp2[i], 64)
  114. c1_total += c_tmp
  115. c2_total += c_tmp2
  116. }
  117. c1_free, _ = strconv.ParseFloat(tmp1[4], 64)
  118. c2_free, _ = strconv.ParseFloat(tmp2[4], 64)
  119. idle := (c2_free - c1_free) / (c2_total - c1_total)
  120. used := (1 - idle) * 100
  121. return fmt.Sprintf("%.3f", used)
  122. }
  123. // 获取linux当前CPU核数
  124. func OS_Linux_CpuGetNum() string {
  125. a := runtime.NumCPU()
  126. return strconv.Itoa(a)
  127. }
  128. /*
  129. 获取linux CPU信息
  130. 返回值: CpuModel:CPU型号 ; CpuPHY:物理cpu个数 ; CpuCores: CPU核数 ; CpuThread: CPU(逻辑)线程数
  131. */
  132. func OS_Linux_Cpu_info() (CpuModel string, CpuPHY, CpuCores, CpuThread int) {
  133. a1 := File_ReadStr("/proc/cpuinfo")
  134. cpuPHY_zu := []string{}
  135. cpuCores_zu := []string{}
  136. cpuThread_zu := []string{}
  137. linzu := Text_GetSplitText(a1, "\n")
  138. for _, v := range linzu {
  139. if v == "" {
  140. continue
  141. }
  142. // CPU 型号
  143. if Text_FindKeyword(Text_GetLeftText(v, ":"), "model name") != -1 {
  144. CpuModel = strings.TrimSpace(Text_GetRightText(v, ":"))
  145. continue
  146. }
  147. if Text_FindKeyword(Text_GetLeftText(v, ":"), "physical id") != -1 {
  148. s := 0
  149. for _, v1 := range cpuPHY_zu {
  150. if v1 == strings.TrimSpace(Text_GetRightText(v, ":")) {
  151. s = 1
  152. break
  153. }
  154. }
  155. if s == 0 {
  156. cpuPHY_zu = append(cpuPHY_zu, strings.TrimSpace(Text_GetRightText(v, ":")))
  157. }
  158. continue
  159. }
  160. if Text_FindKeyword(Text_GetLeftText(v, ":"), "cpu cores") != -1 {
  161. s := 0
  162. for _, v1 := range cpuCores_zu {
  163. if v1 == strings.TrimSpace(Text_GetRightText(v, ":")) {
  164. s = 1
  165. break
  166. }
  167. }
  168. if s == 0 {
  169. cpuCores_zu = append(cpuCores_zu, strings.TrimSpace(Text_GetRightText(v, ":")))
  170. }
  171. continue
  172. }
  173. if Text_FindKeyword(Text_GetLeftText(v, ":"), "siblings") != -1 {
  174. s := 0
  175. for _, v1 := range cpuThread_zu {
  176. if v1 == strings.TrimSpace(Text_GetRightText(v, ":")) {
  177. s = 1
  178. break
  179. }
  180. }
  181. if s == 0 {
  182. cpuThread_zu = append(cpuThread_zu, strings.TrimSpace(Text_GetRightText(v, ":")))
  183. }
  184. continue
  185. }
  186. }
  187. // 整理
  188. CpuPHY = len(cpuPHY_zu)
  189. all := 0
  190. for _, v := range cpuCores_zu {
  191. i, _ := strconv.Atoi(v)
  192. all += i
  193. }
  194. CpuCores = all
  195. all = 0
  196. for _, v := range cpuThread_zu {
  197. i, _ := strconv.Atoi(v)
  198. all += i
  199. }
  200. CpuThread = all
  201. return
  202. }
  203. // 获取linux当前系统负载系数。 返回格式: 1、5、15分钟内的平均进程数,正在运行的进程数/进程总数,最近运行的进程ID号 (0.00 0.02 0.01 1/201 24781)
  204. func OS_Linux_GetSystemAvg() string {
  205. return File_ReadStr("/proc/loadavg")
  206. }
  207. // 获取linux当前tcp连接数
  208. func OS_Linux_GetTcp() string {
  209. str := File_ReadStr("/proc/net/tcp")
  210. i := strings.Count(str, "\n")
  211. return strconv.Itoa(i)
  212. }
  213. // 获取linux当前udp连接数
  214. func OS_Linux_GetUdp() string {
  215. str := File_ReadStr("/proc/net/udp")
  216. i := strings.Count(str, "\n")
  217. return strconv.Itoa(i)
  218. }
  219. // 获取linux实时网速 。 s 秒 间隔的时间长度 ,返回网卡及对应的上下行实时流量 .返回单位见 Net_dev
  220. func Os_Linux_NetRealSpeed(s int) (inter map[string]Net_dev) {
  221. if s < 1 {
  222. s = 1
  223. }
  224. a1 := File_ReadStr("/proc/net/dev")
  225. rt := make(map[string]Net_dev)
  226. rt2 := make(map[string]Net_dev)
  227. var nt Net_dev
  228. tmp := strings.Split(a1, "\n")
  229. tmp2 := []string{}
  230. for i := 2; i < len(tmp); i++ {
  231. tmp2 = strings.Fields(tmp[i])
  232. // fmt.Println("tmp2",tmp2)
  233. if len(tmp2) > 0 {
  234. nt.Ifc_bytes_r, _ = strconv.ParseFloat(tmp2[1], 64)
  235. nt.Ifc_packets_r, _ = strconv.ParseFloat(tmp2[2], 64)
  236. nt.Ifc_bytes_t, _ = strconv.ParseFloat(tmp2[9], 64)
  237. nt.Ifc_packets_t, _ = strconv.ParseFloat(tmp2[10], 64)
  238. tmp2[0] = strings.Replace(tmp2[0], ":", "", 1)
  239. rt[tmp2[0]] = nt
  240. }
  241. }
  242. time.Sleep(time.Duration(s) * time.Second)
  243. s1 := float64(s)
  244. a2 := File_ReadStr("/proc/net/dev")
  245. tmp = strings.Split(a2, "\n")
  246. tmp2 = []string{}
  247. for i := 2; i < len(tmp); i++ {
  248. tmp2 = strings.Fields(tmp[i])
  249. if len(tmp2) > 0 {
  250. nt.Ifc_bytes_r, _ = strconv.ParseFloat(tmp2[1], 64)
  251. nt.Ifc_packets_r, _ = strconv.ParseFloat(tmp2[2], 64)
  252. nt.Ifc_bytes_t, _ = strconv.ParseFloat(tmp2[9], 64)
  253. nt.Ifc_packets_t, _ = strconv.ParseFloat(tmp2[10], 64)
  254. i64, _ := strconv.ParseInt(tmp2[1], 10, 64)
  255. nt.Ifc_bytes_r_a = i64
  256. i64, _ = strconv.ParseInt(tmp2[9], 10, 64)
  257. nt.Ifc_bytes_t_a = i64
  258. tmp2[0] = strings.Replace(tmp2[0], ":", "", 1)
  259. rt2[tmp2[0]] = nt
  260. }
  261. }
  262. inter = make(map[string]Net_dev)
  263. for k := range rt {
  264. Ifc_bytes_r := (rt2[k].Ifc_bytes_r - rt[k].Ifc_bytes_r) / s1 / 1024
  265. Ifc_packets_r := (rt2[k].Ifc_packets_r - rt[k].Ifc_packets_r) / s1
  266. Ifc_bytes_t := (rt2[k].Ifc_bytes_t - rt[k].Ifc_bytes_t) / s1 / 1024
  267. Ifc_packets_t := (rt2[k].Ifc_packets_t - rt[k].Ifc_packets_t) / s1
  268. 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}
  269. }
  270. return inter
  271. }