package licence import ( "os/exec" "sort" "strconv" "strings" "github.com/shirou/gopsutil/cpu" psnet "github.com/shirou/gopsutil/net" // "github.com/shirou/gopsutil/host" // "github.com/shirou/gopsutil/disk" ) func GetMachineCode() string { var machineInfo []string // CPU if cnt, err := cpu.Counts(true); err == nil { machineInfo = append(machineInfo, "cpuCounts:"+strconv.Itoa(cnt)) if cnt > 0 { if c, err := cpu.Info(); err == nil { machineInfo = append(machineInfo, "cpuModelName:"+c[0].ModelName) } } } /* // Disk if diskInfo, err := disk.Partitions(false); err == nil { for _, d := range diskInfo { diskSerialNumber := disk.GetDiskSerialNumber(d.Device) machineInfo = append(machineInfo, diskSerialNumber) } } // Host if host, err := host.Info(); err == nil { machineInfo = append(machineInfo, host.HostID) }*/ // Net if net, err := psnet.Interfaces(); err == nil { // 获取虚拟网卡 cmd := exec.Command("/bin/sh", "-c", "ls /sys/devices/virtual/net/") cmdResult, _ := cmd.Output() vNets := string(cmdResult) for _, iface := range net { // 排除lo, 和虚拟接口 if iface.MTU == 1500 && !VNetFilter(&iface) && !strings.Contains(vNets, iface.Name) { machineInfo = append(machineInfo, "mac:"+iface.HardwareAddr) } } } sort.Strings(machineInfo) // fmt.Println("machineInfo", machineInfo) return GetMd5String(strings.Join(machineInfo, "-|-"), true, false) } func VNetFilter(iface *psnet.InterfaceStat) bool { if iface.HardwareAddr == "" { return true } vNetNamePrefix := [...]string{ "docker", "br-", "veth", "Npcap", "VirtualBox", "dummy", } for _, v := range vNetNamePrefix { if strings.HasPrefix(iface.Name, v) { return true } } /* 暂时放弃过滤虚拟机MAC,会导致运行在虚拟机时,机器码不包含MAC地址的问题。如果不允许服务运行在虚拟机,再启用并提示警告 vNetAddrPrefix := [...]string{ "00:05:69", //vmware1 "00:0C:29", //vmware2 "00:50:56", //vmware3 "00:1c:14", //vmware4 "00:1C:42", //parallels1 "00:03:FF", //microsoft virtual pc "00:0F:4B", //virtual iron 4 "00:16:3E", //red hat xen , oracle vm , xen source, novell xen "08:00:27", //virtualbox } for _, v := range vNetAddrPrefix { if strings.HasPrefix(iface.HardwareAddr, v) { return true } } */ return false }