sysinfo.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. package main
  2. import (
  3. "strconv"
  4. "strings"
  5. "time"
  6. "github.com/shirou/gopsutil/cpu"
  7. "github.com/shirou/gopsutil/disk"
  8. "github.com/shirou/gopsutil/mem"
  9. "github.com/shirou/gopsutil/net"
  10. "github.com/shirou/gopsutil/process"
  11. "lc/common/protocol"
  12. )
  13. func SysInfoStat(seq uint64) {
  14. var si protocol.SysInfo
  15. si.Appinfo.Name = appname
  16. si.Appinfo.Version = version
  17. //CPU信息
  18. var cpuinfo protocol.CpuInfo
  19. if is, err := cpu.Info(); err == nil && len(is) > 0 {
  20. cpuinfo.Cpus = len(is)
  21. cpuinfo.Cores = int(is[0].Cores)
  22. cpuinfo.ModelName = is[0].ModelName
  23. if percent, err := cpu.Percent(time.Second*10, false); err == nil && len(percent) > 0 {
  24. cpuinfo.Percent = Precision(percent[0], 1, false)
  25. }
  26. si.Cpuinfo = &cpuinfo
  27. }
  28. //内存信息
  29. var meminfo protocol.MemInfo
  30. if vms, err := mem.VirtualMemory(); err == nil {
  31. meminfo.Total = vms.Total / (1024 * 1024)
  32. meminfo.Available = vms.Available / (1024 * 1024)
  33. meminfo.Used = vms.Used / (1024 * 1024)
  34. meminfo.Percent = Precision(vms.UsedPercent, 1, false)
  35. si.Meminfo = &meminfo
  36. }
  37. //硬盘信息
  38. var diskinfos []protocol.DiskInfo
  39. if parts, err := disk.Partitions(true); err == nil {
  40. for _, v := range parts {
  41. var diskinfo protocol.DiskInfo
  42. diskinfo.Mountpoint = v.Mountpoint
  43. diskinfo.Device = v.Device
  44. diskinfo.Fstype = v.Fstype
  45. if di, err := disk.Usage(v.Mountpoint); err == nil {
  46. diskinfo.Path = di.Path
  47. diskinfo.Total = di.Total / (1024 * 1024)
  48. diskinfo.Free = di.Free / (1024 * 1024)
  49. diskinfo.Used = di.Used / (1024 * 1024)
  50. diskinfo.Percent = Precision(di.UsedPercent, 1, false)
  51. }
  52. diskinfos = append(diskinfos, diskinfo)
  53. }
  54. si.Diskinfos = diskinfos
  55. }
  56. //网卡信息
  57. var ifss []protocol.LcInterfaces
  58. if iss, err := net.Interfaces(); err == nil {
  59. for _, v := range iss {
  60. var up = false
  61. var ipv4 = ""
  62. for _, v1 := range v.Flags {
  63. if v1 == "up" {
  64. up = true
  65. }
  66. }
  67. for _, v2 := range v.Addrs {
  68. if strings.Contains(v2.Addr, ".") {
  69. if strlist := strings.Split(v2.Addr, "/"); len(strlist) > 0 {
  70. ipv4 = strlist[0]
  71. }
  72. }
  73. }
  74. if up && ipv4 != "" && v.HardwareAddr != "" {
  75. var ifs protocol.LcInterfaces
  76. ifs.Name = v.Name
  77. ifs.HardwareAddr = v.HardwareAddr
  78. ifs.Addr = ipv4
  79. if sts, err := net.IOCounters(true); err == nil {
  80. for _, vv := range sts {
  81. if v.Name == vv.Name {
  82. ifs.Recv = vv.BytesRecv / (1024 * 1024)
  83. ifs.Sent = vv.BytesSent / (1024 * 1024)
  84. ifs.PacketsRecv = vv.PacketsRecv
  85. ifs.PacketsSent = vv.PacketsSent
  86. ifss = append(ifss, ifs)
  87. break
  88. }
  89. }
  90. }
  91. }
  92. }
  93. si.Ifs = ifss
  94. }
  95. //监听端口,连接信息
  96. if arr, err := net.Connections("inet4"); err == nil {
  97. var tcpListen []protocol.ConnectionInfo
  98. var tcpConn []protocol.ConnectionInfo
  99. var udp []protocol.ConnectionInfo
  100. for _, v := range arr {
  101. laddr := v.Laddr.IP + ":" + strconv.Itoa(int(v.Laddr.Port))
  102. raddr := v.Raddr.IP + ":" + strconv.Itoa(int(v.Raddr.Port))
  103. x := protocol.ConnectionInfo{
  104. Type: v.Type,
  105. Laddr: laddr,
  106. Raddr: raddr,
  107. Status: v.Status,
  108. Pid: v.Pid,
  109. }
  110. if v.Type == 1 { //TCP
  111. if v.Status == "LISTEN" { //TCP监听信息
  112. tcpListen = append(tcpListen, x)
  113. } else { //TCP连接信息
  114. tcpConn = append(tcpConn, x)
  115. }
  116. } else if v.Type == 2 { //UDP
  117. udp = append(udp, x)
  118. }
  119. }
  120. si.TcpListen = tcpListen
  121. si.TcpConn = tcpConn
  122. si.Udp = udp
  123. }
  124. //进程cpu和内存
  125. var pis []protocol.ProcessInfo
  126. ps, _ := process.Processes()
  127. for _, v := range ps {
  128. var pi protocol.ProcessInfo
  129. if cpup, err := v.CPUPercent(); err == nil {
  130. pi.Cpu = Precision(cpup, 1, false)
  131. }
  132. if mp, err := v.MemoryPercent(); err == nil {
  133. pi.Mem = Precision(float64(mp), 1, false)
  134. }
  135. if nm, err := v.Name(); err == nil {
  136. pi.Name = nm
  137. }
  138. pi.Pid = v.Pid
  139. pis = append(pis, pi)
  140. }
  141. si.Pis = pis
  142. var obj protocol.Pack_SysInfo
  143. if str, err := obj.EnCode(appConfig.GID, appConfig.GID, seq, si); err == nil {
  144. GetMQTTMgr().Publish(GetTopic(protocol.DT_GATEWAY, appConfig.GID, protocol.TP_GW_SYS_ACK), str, 0, ToCloud)
  145. }
  146. return
  147. }