package licence import ( "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 { for _, n := range net { if n.MTU == 1500 && !VNetFilter(&n) { machineInfo = append(machineInfo, "mac:"+n.HardwareAddr) } } } sort.Strings(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", } 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 }