mirror of
https://github.com/chaitin/MonkeyCode.git
synced 2026-02-02 06:43:23 +08:00
103 lines
2.3 KiB
Go
103 lines
2.3 KiB
Go
package machine
|
|
|
|
import (
|
|
"crypto/md5"
|
|
"crypto/sha256"
|
|
"fmt"
|
|
"net"
|
|
"os"
|
|
"runtime"
|
|
"sort"
|
|
"strings"
|
|
)
|
|
|
|
type MachineInfo struct {
|
|
Hostname string `json:"hostname"`
|
|
MACAddresses []string `json:"mac_addresses"`
|
|
OSType string `json:"os_type"`
|
|
OSRelease string `json:"os_release"`
|
|
CPUInfo string `json:"cpu_info"`
|
|
}
|
|
|
|
func GetMachineInfo() (*MachineInfo, error) {
|
|
hostname, err := os.Hostname()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to get hostname: %w", err)
|
|
}
|
|
|
|
macAddresses, err := getMACAddresses()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to get MAC addresses: %w", err)
|
|
}
|
|
|
|
return &MachineInfo{
|
|
Hostname: hostname,
|
|
MACAddresses: macAddresses,
|
|
OSType: runtime.GOOS,
|
|
OSRelease: getOSRelease(),
|
|
CPUInfo: getCPUInfo(),
|
|
}, nil
|
|
}
|
|
|
|
func GenerateMachineID() (string, error) {
|
|
machineInfo, err := GetMachineInfo()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
var parts []string
|
|
parts = append(parts, machineInfo.Hostname)
|
|
parts = append(parts, strings.Join(machineInfo.MACAddresses, ","))
|
|
parts = append(parts, machineInfo.OSType)
|
|
parts = append(parts, machineInfo.OSRelease)
|
|
parts = append(parts, machineInfo.CPUInfo)
|
|
|
|
combined := strings.Join(parts, "|")
|
|
hash := sha256.Sum256([]byte(combined))
|
|
return fmt.Sprintf("%x", hash), nil
|
|
}
|
|
|
|
func GenerateShortMachineID() (string, error) {
|
|
machineInfo, err := GetMachineInfo()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
var parts []string
|
|
parts = append(parts, machineInfo.Hostname)
|
|
if len(machineInfo.MACAddresses) > 0 {
|
|
parts = append(parts, machineInfo.MACAddresses[0])
|
|
}
|
|
parts = append(parts, machineInfo.OSType)
|
|
|
|
combined := strings.Join(parts, "|")
|
|
hash := md5.Sum([]byte(combined))
|
|
return fmt.Sprintf("%x", hash), nil
|
|
}
|
|
|
|
func getMACAddresses() ([]string, error) {
|
|
interfaces, err := net.Interfaces()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var macAddresses []string
|
|
for _, iface := range interfaces {
|
|
if iface.Flags&net.FlagLoopback != 0 || len(iface.HardwareAddr) == 0 {
|
|
continue
|
|
}
|
|
macAddresses = append(macAddresses, iface.HardwareAddr.String())
|
|
}
|
|
|
|
sort.Strings(macAddresses)
|
|
return macAddresses, nil
|
|
}
|
|
|
|
func getOSRelease() string {
|
|
return runtime.GOARCH
|
|
}
|
|
|
|
func getCPUInfo() string {
|
|
return fmt.Sprintf("%s_%d", runtime.GOARCH, runtime.NumCPU())
|
|
}
|