feat(ups): monitorizare UPS pe serverul 36, in locul ViewPower
ViewPower nu putea dialoga cu acest UPS: 5777 de "QPI return(NAK" si zero citiri reusite in fereastra 6-10 august, pentru ca UPS-ul vorbeste HID Power Device standard, nu dialectul text Voltronic. Serviciile au fost dezactivate pe 10.08.2026 la 22:34, lasand serverul fara nicio alertare 17 zile. Nici inainte nu exista: emailReceivers = 0, iar excuteProgram era gol, deci Oracle nu era oprit curat oricum. UPS-ul comunica insa perfect cu Windows pe canalul HID - dovedit de perechile de evenimente Kernel-Power 105 la panele reale din 2026. Monitorul nou citeste GetSystemPowerStatus, acelasi semnal pe care il foloseste Windows pentru propria actiune la baterie critica. Alerteaza pe email la trecerea pe baterie, la revenirea curentului si cand UPS-ul nu mai comunica - cazul care a trecut neobservat. Opreste curat listenerul, apoi instanta cu shutdown immediate, apoi Windows-ul, inaintea pragului brutal de 20% al Windows-ului. Ruleaza ca task programat sub SYSTEM, cu AllowStartIfOnBatteries si DontStopIfGoingOnBatteries - fara ele Windows ar fi oprit taskul exact cand serverul trece pe baterie. Validat pe 27.08.2026: citire, email, secventa de oprire in dry-run si pierderea comunicatiei (alerta la exact 8 cicluri, apoi revenire). Pragurile de 10 min / 35% sunt conservatoare, nu masurate - testul de autonomie reala ramane de facut. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RRyaDj39hPQ89SZS6URRpS
This commit is contained in:
65
scripts/ups-monitor/test-comms-loss.ps1
Normal file
65
scripts/ups-monitor/test-comms-loss.ps1
Normal file
@@ -0,0 +1,65 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Verifica alerta "UPS-ul nu mai comunica", dezactivand temporar dispozitivul de
|
||||
baterie HID - echivalentul software al cablului USB scos din UPS.
|
||||
|
||||
.DESCRIPTION
|
||||
Se ruleaza PE SERVER, ridicat (Administrator), cu monitorul deja pornit.
|
||||
|
||||
Reactivarea dispozitivului e in blocul finally, ca sa nu ramana oprit daca pica
|
||||
sesiunea SSH sau se intrerupe scriptul. Testul e sigur cat timp serverul e pe
|
||||
retea: fara baterie vizibila, monitorul intra pe ramura de "comunicatie pierduta"
|
||||
si NU ia nicio decizie de oprire.
|
||||
|
||||
Asteptarea implicita e calculata din config.json: commsLostPolls * pollSeconds,
|
||||
plus o marja.
|
||||
|
||||
.EXAMPLE
|
||||
powershell -ExecutionPolicy Bypass -File .\test-comms-loss.ps1
|
||||
#>
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[string]$InstallDir = 'C:\ROMFAST\ups-monitor',
|
||||
[int]$WaitSeconds = 0
|
||||
)
|
||||
|
||||
Set-StrictMode -Version 2.0
|
||||
$ErrorActionPreference = 'Stop'
|
||||
|
||||
$dev = Get-PnpDevice -Class Battery -ErrorAction SilentlyContinue |
|
||||
Where-Object { $_.InstanceId -like 'HID\*' } | Select-Object -First 1
|
||||
if (-not $dev) {
|
||||
throw 'Nu am gasit niciun dispozitiv de baterie HID - UPS-ul nu e vazut de Windows nici acum.'
|
||||
}
|
||||
Write-Host "Dispozitiv tinta: $($dev.FriendlyName) [$($dev.InstanceId)]"
|
||||
|
||||
if ($WaitSeconds -le 0) {
|
||||
$cfg = Get-Content -LiteralPath (Join-Path $InstallDir 'config.json') -Raw -Encoding UTF8 | ConvertFrom-Json
|
||||
$WaitSeconds = ($cfg.commsLostPolls * $cfg.pollSeconds) + 45
|
||||
}
|
||||
Write-Host "Astept $WaitSeconds secunde cat dispozitivul e oprit."
|
||||
|
||||
try {
|
||||
Disable-PnpDevice -InstanceId $dev.InstanceId -Confirm:$false -ErrorAction Stop
|
||||
Start-Sleep -Seconds 3
|
||||
$n = @(Get-CimInstance Win32_Battery -ErrorAction SilentlyContinue).Count
|
||||
Write-Host "dezactivat : $((Get-PnpDevice -InstanceId $dev.InstanceId).Status) | instante Win32_Battery = $n"
|
||||
Start-Sleep -Seconds $WaitSeconds
|
||||
} finally {
|
||||
Enable-PnpDevice -InstanceId $dev.InstanceId -Confirm:$false -ErrorAction SilentlyContinue
|
||||
Start-Sleep -Seconds 10
|
||||
$n = @(Get-CimInstance Win32_Battery -ErrorAction SilentlyContinue).Count
|
||||
Write-Host "reactivat : $((Get-PnpDevice -InstanceId $dev.InstanceId).Status) | instante Win32_Battery = $n"
|
||||
if ($n -lt 1) {
|
||||
Write-Warning 'UPS-ul NU a revenit in Win32_Battery. Verifica Device Manager -> Batteries inainte de a pleca.'
|
||||
}
|
||||
}
|
||||
|
||||
Start-Sleep -Seconds 45
|
||||
Write-Host ''
|
||||
Write-Host '--- ultimele linii de log ---'
|
||||
Get-Content (Join-Path $InstallDir ('log\ups-monitor-{0}.log' -f (Get-Date -Format 'yyyy-MM'))) -Tail 12
|
||||
|
||||
Write-Host ''
|
||||
Write-Host 'Asteptat: o linie ALERT "UPS-ul nu mai este vazut de Windows", un email trimis,'
|
||||
Write-Host 'apoi "Comunicatia cu UPS-ul a revenit" si al doilea email.'
|
||||
Reference in New Issue
Block a user