Files
MonkeyCode/backend/pkg/machine/machine.go
2025-07-21 18:11:16 +08:00

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())
}