131 lines
4.1 KiB
Go
131 lines
4.1 KiB
Go
package json
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
"vServer/Backend/tools"
|
|
)
|
|
|
|
var CPU_NAME string
|
|
var CPU_GHz string
|
|
var CPU_Cores string
|
|
var CPU_Using string
|
|
var Disk_Size string
|
|
var Disk_Free string
|
|
var Disk_Used string
|
|
var Disk_Name string
|
|
var RAM_Using string
|
|
var RAM_Total string
|
|
|
|
// Инициализация при запуске пакета
|
|
func init() {
|
|
// Загружаем статичные данные один раз при старте
|
|
UpdateMetrics()
|
|
// Загружаем динамические данные в фоне
|
|
go updateMetricsBackground()
|
|
}
|
|
|
|
func UpdateMetrics() {
|
|
commands := []string{
|
|
`$name = (Get-WmiObject Win32_DiskDrive | Where-Object { $_.Index -eq (Get-WmiObject Win32_DiskPartition | Where-Object { $_.DeviceID -eq ((Get-WmiObject Win32_LogicalDiskToPartition | Where-Object { $_.Dependent -match "C:" }).Antecedent -split '"')[1] }).DiskIndex }).Model`,
|
|
`$size = "{0} GB" -f [math]::Round(((Get-PSDrive -Name C).Used + (Get-PSDrive -Name C).Free) / 1GB)`,
|
|
"$cpuInfo = Get-CimInstance Win32_Processor",
|
|
"$cpuCores = $cpuInfo.NumberOfCores",
|
|
"$cpuName = $cpuInfo.Name",
|
|
`$ram_total = [math]::Round((Get-CimInstance Win32_ComputerSystem).TotalPhysicalMemory / 1GB, 2)`,
|
|
"Write-Output \"$cpuName|$cpuCores|$name|$size|$ram_total\"",
|
|
}
|
|
|
|
// Выполняем команды и получаем результат
|
|
result := tools.RunPersistentScript(commands)
|
|
|
|
// Парсим результат для статичных данных
|
|
parts := strings.Split(result, "|")
|
|
if len(parts) >= 4 {
|
|
cpuName := strings.TrimSpace(parts[0])
|
|
cpuCores := strings.TrimSpace(parts[1])
|
|
diskName := strings.TrimSpace(parts[2])
|
|
diskSize := strings.TrimSpace(parts[3])
|
|
ramTotal := strings.TrimSpace(parts[4])
|
|
|
|
// Обновляем глобальные переменные
|
|
CPU_NAME = cpuName
|
|
CPU_Cores = cpuCores
|
|
Disk_Name = diskName
|
|
Disk_Size = diskSize
|
|
RAM_Total = ramTotal
|
|
}
|
|
}
|
|
|
|
// Фоновое обновление динамических метрик (внутреннее)
|
|
func updateMetricsBackground() {
|
|
|
|
updateDynamicMetrics := func() {
|
|
commands := []string{
|
|
"$cpuInfo = Get-CimInstance Win32_Processor",
|
|
"$cpuGHz = $cpuInfo.MaxClockSpeed",
|
|
"$cpuUsage = $cpuInfo.LoadPercentage",
|
|
`$used = "{0} GB" -f [math]::Round(((Get-PSDrive -Name C).Used / 1GB))`,
|
|
`$free = "{0} GB" -f [math]::Round(((Get-PSDrive -Name C).Free / 1GB))`,
|
|
`$ram_using = [math]::Round((Get-CimInstance Win32_OperatingSystem | % {($_.TotalVisibleMemorySize - $_.FreePhysicalMemory) / 1MB}), 2)`,
|
|
"Write-Output \"$cpuGHz|$cpuUsage|$used|$free|$ram_using\"",
|
|
}
|
|
|
|
// Один запуск PowerShell для динамических команд!
|
|
result := tools.RunPersistentScript(commands)
|
|
|
|
// Парсим результат для динамических данных
|
|
parts := strings.Split(result, "|")
|
|
if len(parts) >= 4 {
|
|
cpuGHz := strings.TrimSpace(parts[0])
|
|
cpuUsage := strings.TrimSpace(parts[1])
|
|
diskUsed := strings.TrimSpace(parts[2])
|
|
diskFree := strings.TrimSpace(parts[3])
|
|
ramUsing := strings.TrimSpace(parts[4])
|
|
// Обновляем глобальные переменные
|
|
CPU_GHz = cpuGHz
|
|
CPU_Using = cpuUsage
|
|
Disk_Used = diskUsed
|
|
Disk_Free = diskFree
|
|
RAM_Using = ramUsing
|
|
}
|
|
}
|
|
|
|
// Выполняем сразу при запуске
|
|
updateDynamicMetrics()
|
|
|
|
// Затем каждые 5 секунд
|
|
for range time.NewTicker(5 * time.Second).C {
|
|
updateDynamicMetrics()
|
|
}
|
|
|
|
}
|
|
|
|
// Получить JSON системных метрик
|
|
func GetAllMetrics(w http.ResponseWriter) {
|
|
w.Header().Set("Content-Type", "application/json")
|
|
w.Write(GetMetricsJSON())
|
|
}
|
|
|
|
// Получить JSON метрик
|
|
func GetMetricsJSON() []byte {
|
|
metrics := map[string]interface{}{
|
|
"cpu_name": CPU_NAME,
|
|
"cpu_ghz": CPU_GHz,
|
|
"cpu_cores": CPU_Cores,
|
|
"cpu_usage": CPU_Using,
|
|
"disk_name": Disk_Name,
|
|
"disk_size": Disk_Size,
|
|
"disk_used": Disk_Used,
|
|
"disk_free": Disk_Free,
|
|
"ram_using": RAM_Using,
|
|
"ram_total": RAM_Total,
|
|
"server_uptime": tools.ServerUptime("get"),
|
|
}
|
|
|
|
data, _ := json.Marshal(metrics)
|
|
return data
|
|
}
|