mirror of
https://gitee.com/xiangheng/x_admin.git
synced 2025-10-11 11:00:24 +08:00
init
This commit is contained in:
171
server/util/server.go
Normal file
171
server/util/server.go
Normal file
@@ -0,0 +1,171 @@
|
||||
package util
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"os"
|
||||
"runtime"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
"x_admin/core"
|
||||
|
||||
"github.com/shirou/gopsutil/cpu"
|
||||
"github.com/shirou/gopsutil/disk"
|
||||
"github.com/shirou/gopsutil/host"
|
||||
"github.com/shirou/gopsutil/mem"
|
||||
"github.com/shirou/gopsutil/process"
|
||||
)
|
||||
|
||||
var ServerUtil = serverUtil{}
|
||||
|
||||
// serverUtil 服务器信息获取工具
|
||||
type serverUtil struct{}
|
||||
|
||||
// GetFmtSize 按照正确的格式缩放字节
|
||||
func (su serverUtil) GetFmtSize(data uint64) string {
|
||||
var factor float64 = 1024
|
||||
res := float64(data)
|
||||
for _, unit := range []string{"", "K", "M", "G", "T", "P"} {
|
||||
if res < factor {
|
||||
return fmt.Sprintf("%.2f%sB", res, unit)
|
||||
}
|
||||
res /= factor
|
||||
}
|
||||
return fmt.Sprintf("%.2f%sB", res, "P")
|
||||
}
|
||||
|
||||
// GetFmtTime 格式化显示时间 (毫秒)
|
||||
func (su serverUtil) GetFmtTime(ms int64) (res string) {
|
||||
rem := ms / 1000
|
||||
days, rem := rem/86400, rem%86400
|
||||
hours, rem := rem/3600, rem%3600
|
||||
minutes := rem / 60
|
||||
res = strconv.FormatInt(minutes, 10) + "分钟"
|
||||
if hours > 0 {
|
||||
res = strconv.FormatInt(hours, 10) + "小时" + res
|
||||
}
|
||||
if days > 0 {
|
||||
res = strconv.FormatInt(days, 10) + "天" + res
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
// GetCpuInfo 获取CPU信息
|
||||
func (su serverUtil) GetCpuInfo() (data map[string]interface{}) {
|
||||
cnt, err := cpu.Counts(true)
|
||||
if err != nil {
|
||||
core.Logger.Errorf("GetCpuInfo Counts err: err=[%+v]", err)
|
||||
return data
|
||||
}
|
||||
tss, err := cpu.Times(false)
|
||||
if err != nil {
|
||||
core.Logger.Errorf("GetCpuInfo Times err: err=[%+v]", err)
|
||||
return data
|
||||
}
|
||||
ts := tss[0]
|
||||
return map[string]interface{}{
|
||||
"cpu_num": cnt,
|
||||
"total": ToolsUtil.Round(ts.Total(), 2),
|
||||
"sys": ToolsUtil.Round(ts.System/ts.Total(), 2),
|
||||
"used": ToolsUtil.Round(ts.User/ts.Total(), 2),
|
||||
"wait": ToolsUtil.Round(ts.Iowait/ts.Total(), 2),
|
||||
"free": ToolsUtil.Round(ts.Idle/ts.Total(), 2),
|
||||
}
|
||||
}
|
||||
|
||||
// GetMemInfo 获取内存信息
|
||||
func (su serverUtil) GetMemInfo() (data map[string]interface{}) {
|
||||
number := math.Pow(1024, 3)
|
||||
vm, err := mem.VirtualMemory()
|
||||
if err != nil {
|
||||
core.Logger.Errorf("GetMemInfo VirtualMemory err: err=[%+v]", err)
|
||||
return data
|
||||
}
|
||||
return map[string]interface{}{
|
||||
"total": ToolsUtil.Round(float64(vm.Total)/number, 2),
|
||||
"used": ToolsUtil.Round(float64(vm.Used)/number, 2),
|
||||
"free": ToolsUtil.Round(float64(vm.Available)/number, 2),
|
||||
"usage": ToolsUtil.Round(vm.UsedPercent, 2),
|
||||
}
|
||||
}
|
||||
|
||||
// GetSysInfo 获取服务器信息
|
||||
func (su serverUtil) GetSysInfo() (data map[string]interface{}) {
|
||||
infoStat, err := host.Info()
|
||||
if err != nil {
|
||||
core.Logger.Errorf("GetSysInfo Info err: err=[%+v]", err)
|
||||
return data
|
||||
}
|
||||
pwd, err := os.Getwd()
|
||||
if err != nil {
|
||||
core.Logger.Errorf("GetSysInfo Getwd err: err=[%+v]", err)
|
||||
return data
|
||||
}
|
||||
return map[string]interface{}{
|
||||
"computerName": infoStat.Hostname,
|
||||
"computerIp": IpUtil.GetHostIp(),
|
||||
"userDir": pwd,
|
||||
"osName": infoStat.OS,
|
||||
"osArch": infoStat.KernelArch,
|
||||
}
|
||||
}
|
||||
|
||||
// GetDiskInfo 获取磁盘信息
|
||||
func (su serverUtil) GetDiskInfo() (data []map[string]interface{}) {
|
||||
partStats, err := disk.Partitions(false)
|
||||
if err != nil {
|
||||
core.Logger.Errorf("GetDiskInfo Partitions err: err=[%+v]", err)
|
||||
return data
|
||||
}
|
||||
for i := 0; i < len(partStats); i++ {
|
||||
part := partStats[i]
|
||||
usage, uErr := disk.Usage(part.Mountpoint)
|
||||
if uErr != nil {
|
||||
core.Logger.Errorf("GetDiskInfo Usage err: err=[%+v]", err)
|
||||
continue
|
||||
}
|
||||
data = append(data, map[string]interface{}{
|
||||
"dirName": part.Mountpoint,
|
||||
"sysTypeName": part.Fstype,
|
||||
"typeName": part.Device,
|
||||
"total": su.GetFmtSize(usage.Total),
|
||||
"free": su.GetFmtSize(usage.Free),
|
||||
"used": su.GetFmtSize(usage.Used),
|
||||
"usage": ToolsUtil.Round(usage.UsedPercent, 2),
|
||||
})
|
||||
}
|
||||
return data
|
||||
}
|
||||
|
||||
// GetGoInfo 获取Go环境及服务信息
|
||||
func (su serverUtil) GetGoInfo() (data map[string]interface{}) {
|
||||
number := math.Pow(1024, 2)
|
||||
curProc, err := process.NewProcess(int32(os.Getpid()))
|
||||
if err != nil {
|
||||
core.Logger.Errorf("GetGoInfo NewProcess err: err=[%+v]", err)
|
||||
return data
|
||||
}
|
||||
memInfo, err := curProc.MemoryInfo()
|
||||
if err != nil {
|
||||
core.Logger.Errorf("GetGoInfo MemoryInfo err: err=[%+v]", err)
|
||||
return data
|
||||
}
|
||||
startTime, err := curProc.CreateTime()
|
||||
if err != nil {
|
||||
core.Logger.Errorf("GetGoInfo CreateTime err: err=[%+v]", err)
|
||||
return data
|
||||
}
|
||||
return map[string]interface{}{
|
||||
"name": "Go",
|
||||
"version": runtime.Version(),
|
||||
"home": os.Args[0],
|
||||
"inputArgs": fmt.Sprintf("[%s]", strings.Join(os.Args[1:], ", ")),
|
||||
"total": ToolsUtil.Round(float64(memInfo.VMS)/number, 2),
|
||||
"max": ToolsUtil.Round(float64(memInfo.VMS)/number, 2),
|
||||
"free": ToolsUtil.Round((float64(memInfo.VMS-memInfo.RSS))/number, 2),
|
||||
"usage": ToolsUtil.Round(float64(memInfo.RSS)/number, 2),
|
||||
"runTime": su.GetFmtTime(time.Now().UnixMilli() - startTime),
|
||||
"startTime": time.UnixMilli(startTime).Format(core.TimeFormat),
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user