144 lines
3.2 KiB
Go
144 lines
3.2 KiB
Go
package host_info
|
|
|
|
import (
|
|
"cmii-uav-watchdog-common/models"
|
|
"cmii-uav-watchdog-common/wdd_log"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
// NewOSInfo 创建并返回一个 OSInfo 实例,设置默认值
|
|
func NewOSInfo() models.OSInfo {
|
|
return models.OSInfo{
|
|
Name: "unknown",
|
|
Version: "unknown",
|
|
ID: "unknown",
|
|
IDLike: "unknown",
|
|
VersionID: "unknown",
|
|
PrettyName: "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
|
|
}
|
|
|
|
// 获取 machine serial
|
|
|
|
serialID := getMachineSerial()
|
|
if serialID != "" {
|
|
sysInfo.MachineSerial = serialID
|
|
}
|
|
|
|
// 获取操作系统版本
|
|
sysInfo.OS = getOSVersion()
|
|
|
|
// 获取内核版本
|
|
kernelVersion := getKernelVersion()
|
|
if kernelVersion != "" {
|
|
sysInfo.KernelVersion = kernelVersion
|
|
}
|
|
|
|
// 获取节点名称
|
|
sysInfo.NodeName = "unknown"
|
|
nodeName := os.Getenv("NODE_NAME")
|
|
if nodeName != "" {
|
|
sysInfo.NodeName = nodeName
|
|
}
|
|
|
|
// 获取节点IP
|
|
sysInfo.NodeIP = "unknown"
|
|
ip := os.Getenv("NODE_IP")
|
|
if ip != "" {
|
|
sysInfo.NodeIP = ip
|
|
}
|
|
|
|
return sysInfo
|
|
}
|
|
func getOSVersion() models.OSInfo {
|
|
data, err := os.ReadFile("/etc/os-release")
|
|
if err != nil {
|
|
wdd_log.Error("读取 /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
|
|
}
|
|
}
|
|
|
|
return osInfo
|
|
}
|
|
|
|
// getMachineID 从 /sys/devices/virtual/dmi/id/product_uuid 文件中获取机器 ID
|
|
func getMachineID() string {
|
|
data, err := os.ReadFile("/sys/devices/virtual/dmi/id/product_uuid")
|
|
if err != nil {
|
|
wdd_log.Error("读取 /sys/devices/virtual/dmi/id/product_uuid 失败: %v", err)
|
|
return ""
|
|
}
|
|
return strings.TrimSpace(string(data)) // 去除多余空格
|
|
}
|
|
|
|
// getMachineID 从 /sys/devices/virtual/dmi/id/product_uuid 文件中获取机器 ID
|
|
func getMachineSerial() string {
|
|
data, err := os.ReadFile("/sys/devices/virtual/dmi/id/product_serial")
|
|
if err != nil {
|
|
wdd_log.Error("读取 /sys/devices/virtual/dmi/id/product_serial 失败: %v", err)
|
|
return ""
|
|
}
|
|
return strings.TrimSpace(string(data)) // 去除多余空格
|
|
}
|
|
|
|
// getKernelVersion 获取内核版本
|
|
func getKernelVersion() string {
|
|
data, err := os.ReadFile("/proc/version")
|
|
if err != nil {
|
|
wdd_log.Error("读取 /proc/version 失败: %v", err)
|
|
return ""
|
|
}
|
|
return strings.TrimSpace(string(data))
|
|
}
|