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",
|
"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
|
}
|