| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- package main
- import (
- "strconv"
- "strings"
- "time"
- "github.com/shirou/gopsutil/cpu"
- "github.com/shirou/gopsutil/disk"
- "github.com/shirou/gopsutil/mem"
- "github.com/shirou/gopsutil/net"
- "github.com/shirou/gopsutil/process"
- "lc/common/protocol"
- )
- func SysInfoStat(seq uint64) {
- var si protocol.SysInfo
- si.Appinfo.Name = appname
- si.Appinfo.Version = version
- //CPU信息
- var cpuinfo protocol.CpuInfo
- if is, err := cpu.Info(); err == nil && len(is) > 0 {
- cpuinfo.Cpus = len(is)
- cpuinfo.Cores = int(is[0].Cores)
- cpuinfo.ModelName = is[0].ModelName
- if percent, err := cpu.Percent(time.Second*10, false); err == nil && len(percent) > 0 {
- cpuinfo.Percent = Precision(percent[0], 1, false)
- }
- si.Cpuinfo = &cpuinfo
- }
- //内存信息
- var meminfo protocol.MemInfo
- if vms, err := mem.VirtualMemory(); err == nil {
- meminfo.Total = vms.Total / (1024 * 1024)
- meminfo.Available = vms.Available / (1024 * 1024)
- meminfo.Used = vms.Used / (1024 * 1024)
- meminfo.Percent = Precision(vms.UsedPercent, 1, false)
- si.Meminfo = &meminfo
- }
- //硬盘信息
- var diskinfos []protocol.DiskInfo
- if parts, err := disk.Partitions(true); err == nil {
- for _, v := range parts {
- var diskinfo protocol.DiskInfo
- diskinfo.Mountpoint = v.Mountpoint
- diskinfo.Device = v.Device
- diskinfo.Fstype = v.Fstype
- if di, err := disk.Usage(v.Mountpoint); err == nil {
- diskinfo.Path = di.Path
- diskinfo.Total = di.Total / (1024 * 1024)
- diskinfo.Free = di.Free / (1024 * 1024)
- diskinfo.Used = di.Used / (1024 * 1024)
- diskinfo.Percent = Precision(di.UsedPercent, 1, false)
- }
- diskinfos = append(diskinfos, diskinfo)
- }
- si.Diskinfos = diskinfos
- }
- //网卡信息
- var ifss []protocol.LcInterfaces
- if iss, err := net.Interfaces(); err == nil {
- for _, v := range iss {
- var up = false
- var ipv4 = ""
- for _, v1 := range v.Flags {
- if v1 == "up" {
- up = true
- }
- }
- for _, v2 := range v.Addrs {
- if strings.Contains(v2.Addr, ".") {
- if strlist := strings.Split(v2.Addr, "/"); len(strlist) > 0 {
- ipv4 = strlist[0]
- }
- }
- }
- if up && ipv4 != "" && v.HardwareAddr != "" {
- var ifs protocol.LcInterfaces
- ifs.Name = v.Name
- ifs.HardwareAddr = v.HardwareAddr
- ifs.Addr = ipv4
- if sts, err := net.IOCounters(true); err == nil {
- for _, vv := range sts {
- if v.Name == vv.Name {
- ifs.Recv = vv.BytesRecv / (1024 * 1024)
- ifs.Sent = vv.BytesSent / (1024 * 1024)
- ifs.PacketsRecv = vv.PacketsRecv
- ifs.PacketsSent = vv.PacketsSent
- ifss = append(ifss, ifs)
- break
- }
- }
- }
- }
- }
- si.Ifs = ifss
- }
- //监听端口,连接信息
- if arr, err := net.Connections("inet4"); err == nil {
- var tcpListen []protocol.ConnectionInfo
- var tcpConn []protocol.ConnectionInfo
- var udp []protocol.ConnectionInfo
- for _, v := range arr {
- laddr := v.Laddr.IP + ":" + strconv.Itoa(int(v.Laddr.Port))
- raddr := v.Raddr.IP + ":" + strconv.Itoa(int(v.Raddr.Port))
- x := protocol.ConnectionInfo{
- Type: v.Type,
- Laddr: laddr,
- Raddr: raddr,
- Status: v.Status,
- Pid: v.Pid,
- }
- if v.Type == 1 { //TCP
- if v.Status == "LISTEN" { //TCP监听信息
- tcpListen = append(tcpListen, x)
- } else { //TCP连接信息
- tcpConn = append(tcpConn, x)
- }
- } else if v.Type == 2 { //UDP
- udp = append(udp, x)
- }
- }
- si.TcpListen = tcpListen
- si.TcpConn = tcpConn
- si.Udp = udp
- }
- //进程cpu和内存
- var pis []protocol.ProcessInfo
- ps, _ := process.Processes()
- for _, v := range ps {
- var pi protocol.ProcessInfo
- if cpup, err := v.CPUPercent(); err == nil {
- pi.Cpu = Precision(cpup, 1, false)
- }
- if mp, err := v.MemoryPercent(); err == nil {
- pi.Mem = Precision(float64(mp), 1, false)
- }
- if nm, err := v.Name(); err == nil {
- pi.Name = nm
- }
- pi.Pid = v.Pid
- pis = append(pis, pi)
- }
- si.Pis = pis
- var obj protocol.Pack_SysInfo
- if str, err := obj.EnCode(appConfig.GID, appConfig.GID, seq, si); err == nil {
- GetMQTTMgr().Publish(GetTopic(protocol.DT_GATEWAY, appConfig.GID, protocol.TP_GW_SYS_ACK), str, 0, ToCloud)
- }
- return
- }
|