Инициализация проекта
Стабильный рабочий проект.
This commit is contained in:
130
Backend/admin/go/json/metrics.go
Normal file
130
Backend/admin/go/json/metrics.go
Normal file
@@ -0,0 +1,130 @@
|
||||
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
|
||||
}
|
Reference in New Issue
Block a user