Skip to content

Commit 70b3141

Browse files
committed
refactor(system): 重构硬件ID和网络功能到独立文件
1 parent 0c355d6 commit 70b3141

File tree

7 files changed

+366
-275
lines changed

7 files changed

+366
-275
lines changed

internal/system/common.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package system
2+
3+
import (
4+
"os"
5+
"strings"
6+
)
7+
8+
// readFileContent 读取文件内容
9+
func readFileContent(path string) string {
10+
data, err := os.ReadFile(path)
11+
if err != nil {
12+
return ""
13+
}
14+
return strings.TrimSpace(string(data))
15+
}
16+
17+
// isDummyUUID 检查是否为虚拟UUID
18+
func isDummyUUID(s string) bool {
19+
dummyUUIDs := []string{
20+
"00000000-0000-0000-0000-000000000000",
21+
"ffffffff-ffff-ffff-ffff-ffffffffffff",
22+
"03000200-0400-0500-0006-000700080009",
23+
"00000000-0000-0000-0000-000000000001",
24+
"Not Available",
25+
"Not Specified",
26+
"System Product Name",
27+
}
28+
29+
s = strings.TrimSpace(s)
30+
for _, dummy := range dummyUUIDs {
31+
if strings.EqualFold(s, dummy) {
32+
return true
33+
}
34+
}
35+
return false
36+
}

internal/system/hardware_darwin.go

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
//go:build darwin
2+
// +build darwin
3+
4+
package system
5+
6+
import (
7+
"context"
8+
"os/exec"
9+
"strings"
10+
"sync"
11+
"time"
12+
)
13+
14+
// macHardwareInfo 缓存 macOS 硬件信息
15+
type macHardwareInfo struct {
16+
UUID string
17+
Serial string
18+
once sync.Once
19+
}
20+
21+
var macInfo macHardwareInfo
22+
23+
// getMacStableHardwareID 获取macOS稳定的硬件ID
24+
func getMacStableHardwareID() string {
25+
// 一次性获取所有硬件信息
26+
macInfo.once.Do(func() {
27+
macInfo.UUID, macInfo.Serial = getMacHardwareInfo()
28+
})
29+
30+
// 1. 优先使用硬件UUID(最稳定)
31+
if macInfo.UUID != "" && !isDummyUUID(macInfo.UUID) {
32+
return "hw:" + macInfo.UUID
33+
}
34+
35+
// 2. 尝试使用序列号
36+
if macInfo.Serial != "" {
37+
return "serial:" + macInfo.Serial
38+
}
39+
40+
// 3. 使用第一个稳定的MAC地址
41+
if mac := getFirstStableMAC(); mac != "" {
42+
return "mac:" + mac
43+
}
44+
45+
// 4. 最后使用基于系统信息的稳定ID
46+
return "sys:" + generateSystemBasedID()
47+
}
48+
49+
// getMacHardwareInfo 一次性获取macOS的UUID和序列号(优化:合并重复调用)
50+
func getMacHardwareInfo() (uuid, serial string) {
51+
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
52+
defer cancel()
53+
54+
cmd := exec.CommandContext(ctx, "system_profiler", "SPHardwareDataType", "-json")
55+
output, err := cmd.Output()
56+
if err != nil {
57+
return "", ""
58+
}
59+
60+
// 简单的JSON解析,查找hardware_uuid和serial_number
61+
lines := strings.Split(string(output), "\n")
62+
for _, line := range lines {
63+
// 查找 hardware_uuid
64+
if strings.Contains(line, "hardware_uuid") {
65+
parts := strings.Split(line, ":")
66+
if len(parts) >= 2 {
67+
uuid = strings.Trim(strings.TrimSpace(parts[1]), "\",")
68+
}
69+
}
70+
// 查找 serial_number
71+
if strings.Contains(line, "serial_number") {
72+
parts := strings.Split(line, ":")
73+
if len(parts) >= 2 {
74+
serial = strings.Trim(strings.TrimSpace(parts[1]), "\",")
75+
}
76+
}
77+
78+
// 如果都找到了,提前退出
79+
if uuid != "" && serial != "" {
80+
break
81+
}
82+
}
83+
84+
return uuid, serial
85+
}
86+
87+
// getLinuxStableHardwareID Darwin 平台的占位函数
88+
func getLinuxStableHardwareID() string {
89+
return ""
90+
}

internal/system/hardware_linux.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
//go:build linux
2+
// +build linux
3+
4+
package system
5+
6+
// getLinuxStableHardwareID 获取Linux稳定的硬件ID
7+
func getLinuxStableHardwareID() string {
8+
// 1. 优先使用machine-id(最稳定)
9+
if machineID := readFileContent("/etc/machine-id"); machineID != "" {
10+
return "mid:" + machineID
11+
}
12+
13+
// 2. 尝试读取dbus machine-id
14+
if dbusID := readFileContent("/var/lib/dbus/machine-id"); dbusID != "" {
15+
return "dbus:" + dbusID
16+
}
17+
18+
// 3. 尝试读取DMI product_uuid(物理机和云主机)
19+
if uuid := readFileContent("/sys/class/dmi/id/product_uuid"); uuid != "" && !isDummyUUID(uuid) {
20+
return "dmi:" + uuid
21+
}
22+
23+
// 4. 尝试读取主板序列号
24+
if serial := readFileContent("/sys/class/dmi/id/board_serial"); serial != "" && !isDummyUUID(serial) {
25+
return "board:" + serial
26+
}
27+
28+
// 5. 使用第一个稳定的MAC地址
29+
if mac := getFirstStableMAC(); mac != "" {
30+
return "mac:" + mac
31+
}
32+
33+
// 6. 最后使用基于系统信息的稳定ID
34+
return "sys:" + generateSystemBasedID()
35+
}
36+
37+
// getMacStableHardwareID Linux 平台的占位函数
38+
func getMacStableHardwareID() string {
39+
return ""
40+
}

internal/system/hardware_other.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//go:build !linux && !darwin
2+
// +build !linux,!darwin
3+
4+
package system
5+
6+
// getLinuxStableHardwareID 其他平台的占位函数
7+
func getLinuxStableHardwareID() string {
8+
return ""
9+
}
10+
11+
// getMacStableHardwareID 其他平台的占位函数
12+
func getMacStableHardwareID() string {
13+
return ""
14+
}

0 commit comments

Comments
 (0)