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