102 lines
2.2 KiB
Go
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)
|
|
}
|