package services import ( "cmii-uav-watchdog-common/models" "log" "os" "strings" ) // NewOSInfo 创建并返回一个 OSInfo 实例,设置默认值 func NewOSInfo() models.OSInfo { return models.OSInfo{ Name: "unknown", Version: "unknown", ID: "unknown", IDLike: "unknown", VersionID: "unknown", PrettyName: "unknown", HomeURL: "unknown", SupportURL: "unknown", BugReportURL: "unknown", PrivacyURL: "unknown", } } // NewSystemInfo 创建并返回一个 SystemInfo 实例,设置默认值 func NewSystemInfo() models.SystemInfo { return models.SystemInfo{ MachineID: "unknown", OS: NewOSInfo(), KernelVersion: "unknown", } } // GetSystemInfo 获取 Linux 系统信息 func GetSystemInfo() models.SystemInfo { sysInfo := NewSystemInfo() // 初始化结构体 // 获取机器 ID machineID := getMachineID() if machineID != "" { sysInfo.MachineID = machineID } // 获取操作系统版本 sysInfo.OS = getOSVersion() // 获取内核版本 kernelVersion := getKernelVersion() if kernelVersion != "" { sysInfo.KernelVersion = kernelVersion } return sysInfo } func getOSVersion() models.OSInfo { data, err := os.ReadFile("/etc/os-release") if err != nil { log.Printf("Error reading /etc/os-release: %v", err) return NewOSInfo() // 返回默认值 } osInfo := NewOSInfo() // 初始化 OSInfo 结构体 lines := strings.Split(string(data), "\n") for _, line := range lines { line = strings.TrimSpace(line) if line == "" { continue } parts := strings.SplitN(line, "=", 2) if len(parts) != 2 { continue } key := strings.Trim(parts[0], `"`) value := strings.Trim(parts[1], `"`) // 解析不同的字段 switch key { case "NAME": osInfo.Name = value case "VERSION": osInfo.Version = value case "ID": osInfo.ID = value case "ID_LIKE": osInfo.IDLike = value case "VERSION_ID": osInfo.VersionID = value case "PRETTY_NAME": osInfo.PrettyName = value case "HOME_URL": osInfo.HomeURL = value case "SUPPORT_URL": osInfo.SupportURL = value case "BUG_REPORT_URL": osInfo.BugReportURL = value case "PRIVACY_URL": osInfo.PrivacyURL = value } } return osInfo } // getMachineID 从 /etc/machine-id 文件中获取机器 ID func getMachineID() string { data, err := os.ReadFile("/etc/machine-id") if err != nil { log.Printf("Error reading /etc/machine-id: %v", err) return "" } return strings.TrimSpace(string(data)) // 去除多余空格 } // getKernelVersion 获取内核版本 func getKernelVersion() string { data, err := os.ReadFile("/proc/version") if err != nil { log.Printf("Error reading /proc/version: %v", err) return "" } return string(data) }