This repository has been archived on 2026-03-28. You can view files and clone it, but cannot push or open issues or pull requests.
old-sysmonitord/internal/agent/identity.go
2026-03-25 08:22:57 +08:00

102 lines
2.2 KiB
Go

package agent
import (
"fmt"
"net"
"os"
"runtime"
"strings"
)
type Identity struct {
Hostname string `json:"hostname"`
MACAddr string `json:"mac_addr"`
AgentID string `json:"agent_id"`
IPAddr string `json:"ip_addr"`
OS string `json:"os"`
Arch string `json:"arch"`
PID int `json:"pid"`
}
func GetIdentity() (*Identity, error) {
hostname, err := os.Hostname()
if err != nil {
return nil, fmt.Errorf("[Agent]获取主机名失败: %v", err)
}
mac, err := getPrimaryMAC()
if err != nil {
return nil, fmt.Errorf("[Agent]获取MAC地址失败: %v", err)
}
ips, err := getIPAddrs()
if err != nil {
return nil, fmt.Errorf("[Agent]获取IP地址失败: %v", err)
}
AgentID := generateAgentID(hostname, mac)
return &Identity{
Hostname: hostname,
MACAddr: mac,
IPAddr: ips[0],
AgentID: AgentID,
OS: runtime.GOOS,
Arch: runtime.GOARCH,
PID: os.Getpid(),
}, nil
}
func getPrimaryMAC() (string, error) {
interfaces, err := net.Interfaces()
if err != nil {
return "", fmt.Errorf("[Agent]获取网络接口失败: %v", err)
}
for _, iface := range interfaces {
if iface.Flags&net.FlagLoopback != 0 {
continue // 跳过回环接口
}
mac := iface.HardwareAddr.String()
if mac == "" {
continue // 跳过没有MAC地址的接口
}
if iface.Flags&net.FlagUp != 0 {
return mac, nil // 返回第一个活动接口的MAC地址
}
}
for _, iface := range interfaces {
if iface.Flags&net.FlagLoopback == 0 && iface.HardwareAddr.String() != "" {
return iface.HardwareAddr.String(), nil // 返回第一个非回环接口的MAC地址
}
}
return "", fmt.Errorf("[Agent]未找到有效的网络接口")
}
func getIPAddrs() ([]string, error) {
var ips []string
addrs, err := net.InterfaceAddrs()
if err != nil {
return nil, fmt.Errorf("[Agent]获取IP地址失败: %v", err)
}
for _, addr := range addrs {
if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
if ipnet.IP.To4() != nil {
ips = append(ips, ipnet.IP.String())
}
}
}
return ips, nil
}
func generateAgentID(hostname, mac string) string {
macFormat := strings.ToLower(strings.ReplaceAll(mac, ":", ""))
return fmt.Sprintf("%s-%s", hostname, macFormat)
}