[agent-wdd] 基本完成Info部分的整理
This commit is contained in:
155
agent-wdd/config/Memory.go
Normal file
155
agent-wdd/config/Memory.go
Normal file
@@ -0,0 +1,155 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"agent-wdd/log"
|
||||
"os"
|
||||
"os/exec"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func (mem *Memory) Gather() {
|
||||
// 获取内存总大小
|
||||
data, err := os.ReadFile("/proc/meminfo")
|
||||
if err != nil {
|
||||
mem.Size = "0B"
|
||||
mem.Type = ""
|
||||
mem.Speed = 0
|
||||
return
|
||||
}
|
||||
lines := strings.Split(string(data), "\n")
|
||||
//var totalKB uint64
|
||||
for _, line := range lines {
|
||||
if strings.HasPrefix(line, "MemTotal:") {
|
||||
fields := strings.Fields(line)
|
||||
if len(fields) >= 3 {
|
||||
kb, err := strconv.ParseUint(fields[1], 10, 64)
|
||||
if err != nil {
|
||||
mem.Size = "0B"
|
||||
} else {
|
||||
mem.Size = formatSize(kb * 1024)
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
// 获取Type和Speed
|
||||
mem.Type, mem.Speed = getMemoryTypeAndSpeed()
|
||||
}
|
||||
|
||||
func getMemoryTypeAndSpeed() (string, int) {
|
||||
cmd := exec.Command("dmidecode", "-t", "memory")
|
||||
output, err := cmd.CombinedOutput()
|
||||
if err != nil {
|
||||
return "", 0
|
||||
}
|
||||
var memType string
|
||||
var speed int
|
||||
lines := strings.Split(string(output), "\n")
|
||||
for _, line := range lines {
|
||||
trimmed := strings.TrimSpace(line)
|
||||
if strings.HasPrefix(trimmed, "Type:") {
|
||||
parts := strings.SplitN(trimmed, ":", 2)
|
||||
if len(parts) == 2 {
|
||||
memType = strings.TrimSpace(parts[1])
|
||||
// 可能dmidecode返回的类型中有更多细节,例如"DDR4"或其他
|
||||
// 例如,如果类型是"Unknown",可能需要处理
|
||||
if memType == "Unknown" || memType == "Other" {
|
||||
memType = ""
|
||||
}
|
||||
}
|
||||
} else if strings.HasPrefix(trimmed, "Speed:") {
|
||||
parts := strings.SplitN(trimmed, ":", 2)
|
||||
if len(parts) == 2 {
|
||||
speedStr := strings.TrimSpace(parts[1])
|
||||
// 可能的格式如 "2667 MHz" 或 "Unknown"
|
||||
if speedStr == "Unknown" {
|
||||
continue
|
||||
}
|
||||
speedStr = strings.TrimSuffix(speedStr, " MHz")
|
||||
s, err := strconv.Atoi(speedStr)
|
||||
if err == nil {
|
||||
speed = s
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return memType, speed
|
||||
}
|
||||
|
||||
func (mem *Memory) SaveConfig() {
|
||||
log.Info("Saving INFO => MEM !")
|
||||
|
||||
ConfigCache.Agent.Mem = *mem
|
||||
SaveConfig()
|
||||
}
|
||||
|
||||
func (swap *Swap) Gather() {
|
||||
|
||||
log.Info("Gathering INFO => SWAP !")
|
||||
|
||||
const swapsFile = "/proc/swaps"
|
||||
data, err := os.ReadFile(swapsFile)
|
||||
if err != nil {
|
||||
swap.Open = false
|
||||
swap.Size = "0B"
|
||||
return
|
||||
}
|
||||
|
||||
lines := strings.Split(strings.TrimSpace(string(data)), "\n")
|
||||
if len(lines) < 2 { // 空文件或只有标题行
|
||||
swap.Open = false
|
||||
swap.Size = "0B"
|
||||
return
|
||||
}
|
||||
|
||||
var totalKB uint64
|
||||
for _, line := range lines[1:] {
|
||||
line = strings.TrimSpace(line)
|
||||
if line == "" {
|
||||
continue
|
||||
}
|
||||
|
||||
fields := strings.Fields(line)
|
||||
if len(fields) < 3 {
|
||||
continue
|
||||
}
|
||||
|
||||
sizeKB, err := strconv.ParseUint(fields[2], 10, 64)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
totalKB += sizeKB
|
||||
}
|
||||
|
||||
if totalKB == 0 {
|
||||
swap.Open = false
|
||||
swap.Size = "0B"
|
||||
} else {
|
||||
swap.Open = true
|
||||
swap.Size = formatSize(totalKB * 1024)
|
||||
}
|
||||
}
|
||||
|
||||
func formatSize(bytes uint64) string {
|
||||
units := []string{"B", "KB", "MB", "GB", "TB", "PB"}
|
||||
var unitIndex int
|
||||
size := float64(bytes)
|
||||
|
||||
for size >= 1024 && unitIndex < len(units)-1 {
|
||||
size /= 1024
|
||||
unitIndex++
|
||||
}
|
||||
|
||||
if unitIndex == 0 {
|
||||
return strconv.FormatUint(bytes, 10) + units[unitIndex]
|
||||
}
|
||||
return strconv.FormatFloat(size, 'f', 1, 64) + units[unitIndex]
|
||||
}
|
||||
|
||||
func (swap *Swap) SaveConfig() {
|
||||
log.Info("Saving INFO => SWAP !")
|
||||
|
||||
ConfigCache.Agent.Swap = *swap
|
||||
SaveConfig()
|
||||
}
|
||||
Reference in New Issue
Block a user