163 lines
4.5 KiB
Go
163 lines
4.5 KiB
Go
|
|
package info
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"bufio"
|
|||
|
|
"fmt"
|
|||
|
|
"os"
|
|||
|
|
"runtime"
|
|||
|
|
"strings"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// -------------------------- 编译注入的静态信息 --------------------------
|
|||
|
|
var (
|
|||
|
|
Version = "dev" // 应用版本号
|
|||
|
|
BuildTime = "unknown" // 编译时间
|
|||
|
|
GitCommit = "unknown" // Git提交ID
|
|||
|
|
GitBranch = "unknown" // Git分支
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// -------------------------- 固定常量 --------------------------
|
|||
|
|
const (
|
|||
|
|
AppName = "sunhpc"
|
|||
|
|
linuxProcVersion = "/proc/version"
|
|||
|
|
linuxProcCpuinfo = "/proc/cpuinfo"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// -------------------------- 系统信息结构体 --------------------------
|
|||
|
|
// SystemInfo 封装所有系统相关信息(Linux专属)
|
|||
|
|
type SystemInfo struct {
|
|||
|
|
OS string // 操作系统
|
|||
|
|
Arch string // 系统架构
|
|||
|
|
KernelVersion string // 内核版本
|
|||
|
|
CPUModel string // CPU型号
|
|||
|
|
NumCPU int // CPU核心数
|
|||
|
|
MemTotal string // 总内存
|
|||
|
|
Hostname string // 主机名
|
|||
|
|
GoVersion string // Go运行时版本
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// -------------------------- 通用工具函数(无错误返回) --------------------------
|
|||
|
|
// readFileFirstLine 读取文件第一行,失败返回空字符串
|
|||
|
|
func readFileFirstLine(path string) string {
|
|||
|
|
file, err := os.Open(path)
|
|||
|
|
if err != nil {
|
|||
|
|
return ""
|
|||
|
|
}
|
|||
|
|
defer file.Close()
|
|||
|
|
|
|||
|
|
scanner := bufio.NewScanner(file)
|
|||
|
|
if scanner.Scan() {
|
|||
|
|
return strings.TrimSpace(scanner.Text())
|
|||
|
|
}
|
|||
|
|
return ""
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// -------------------------- 核心函数(无错误返回) --------------------------
|
|||
|
|
// readCPUModel 读取CPU型号,失败返回 "unknown"
|
|||
|
|
func readCPUModel() string {
|
|||
|
|
file, err := os.Open(linuxProcCpuinfo)
|
|||
|
|
if err != nil {
|
|||
|
|
return "unknown"
|
|||
|
|
}
|
|||
|
|
defer file.Close()
|
|||
|
|
|
|||
|
|
scanner := bufio.NewScanner(file)
|
|||
|
|
for scanner.Scan() {
|
|||
|
|
line := strings.TrimSpace(scanner.Text())
|
|||
|
|
if strings.HasPrefix(line, "model name") {
|
|||
|
|
parts := strings.SplitN(line, ":", 2)
|
|||
|
|
if len(parts) == 2 {
|
|||
|
|
return strings.TrimSpace(parts[1])
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return "unknown"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// readMemTotal 读取总内存,失败返回 "unknown"
|
|||
|
|
func readMemTotal() string {
|
|||
|
|
file, err := os.Open("/proc/meminfo")
|
|||
|
|
if err != nil {
|
|||
|
|
return "unknown"
|
|||
|
|
}
|
|||
|
|
defer file.Close()
|
|||
|
|
|
|||
|
|
scanner := bufio.NewScanner(file)
|
|||
|
|
for scanner.Scan() {
|
|||
|
|
line := strings.TrimSpace(scanner.Text())
|
|||
|
|
if strings.HasPrefix(line, "MemTotal") {
|
|||
|
|
parts := strings.Fields(line)
|
|||
|
|
if len(parts) >= 2 {
|
|||
|
|
memKB := strings.TrimSuffix(parts[1], "kB")
|
|||
|
|
var memTotalKB int
|
|||
|
|
fmt.Sscanf(memKB, "%d", &memTotalKB)
|
|||
|
|
memTotalMB := memTotalKB / 1024
|
|||
|
|
return fmt.Sprintf("%d MB", memTotalMB)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return "unknown"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetSystemInfo 获取Linux系统信息,无错误返回,异常字段用默认值填充
|
|||
|
|
func GetSystemInfo() SystemInfo {
|
|||
|
|
// 初始化结构体,先填充基础默认值
|
|||
|
|
sysInfo := SystemInfo{
|
|||
|
|
OS: runtime.GOOS,
|
|||
|
|
Arch: runtime.GOARCH,
|
|||
|
|
NumCPU: runtime.NumCPU(),
|
|||
|
|
GoVersion: runtime.Version(),
|
|||
|
|
// 以下字段先设为默认值,后续尝试覆盖
|
|||
|
|
KernelVersion: "unknown",
|
|||
|
|
CPUModel: "unknown",
|
|||
|
|
MemTotal: "unknown",
|
|||
|
|
Hostname: "unknown",
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 1. 获取主机名(失败保留默认值)
|
|||
|
|
if hostname, err := os.Hostname(); err == nil {
|
|||
|
|
sysInfo.Hostname = hostname
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 2. 获取内核版本(失败保留默认值)
|
|||
|
|
procVersion := readFileFirstLine(linuxProcVersion)
|
|||
|
|
if procVersion != "" {
|
|||
|
|
versionParts := strings.Split(procVersion, " ")
|
|||
|
|
if len(versionParts) >= 3 {
|
|||
|
|
sysInfo.KernelVersion = versionParts[2]
|
|||
|
|
} else {
|
|||
|
|
sysInfo.KernelVersion = procVersion
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 3. 获取CPU型号(失败已返回 "unknown")
|
|||
|
|
sysInfo.CPUModel = readCPUModel()
|
|||
|
|
|
|||
|
|
// 4. 获取总内存(失败已返回 "unknown")
|
|||
|
|
sysInfo.MemTotal = readMemTotal()
|
|||
|
|
|
|||
|
|
return sysInfo
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// -------------------------- 辅助函数:打印所有信息 --------------------------
|
|||
|
|
// PrintAllInfo 打印所有公共信息(调试用)
|
|||
|
|
func PrintAllInfo() {
|
|||
|
|
fmt.Println("=== 应用公共信息 ===")
|
|||
|
|
fmt.Printf("应用名称 : %s\n", AppName)
|
|||
|
|
fmt.Printf("版本号 : %s\n", Version)
|
|||
|
|
fmt.Printf("编译时间 : %s\n", BuildTime)
|
|||
|
|
fmt.Printf("Git提交ID : %s\n", GitCommit)
|
|||
|
|
fmt.Printf("Git分支 : %s\n", GitBranch)
|
|||
|
|
|
|||
|
|
fmt.Println("\n=== 系统信息 ===")
|
|||
|
|
sysInfo := GetSystemInfo()
|
|||
|
|
fmt.Printf("操作系统 : %s\n", sysInfo.OS)
|
|||
|
|
fmt.Printf("系统架构 : %s\n", sysInfo.Arch)
|
|||
|
|
fmt.Printf("内核版本 : %s\n", sysInfo.KernelVersion)
|
|||
|
|
fmt.Printf("CPU型号 : %s\n", sysInfo.CPUModel)
|
|||
|
|
fmt.Printf("CPU核心数 : %d\n", sysInfo.NumCPU)
|
|||
|
|
fmt.Printf("总内存 : %s\n", sysInfo.MemTotal)
|
|||
|
|
fmt.Printf("主机名 : %s\n", sysInfo.Hostname)
|
|||
|
|
fmt.Printf("Go版本 : %s\n", sysInfo.GoVersion)
|
|||
|
|
}
|