Обновили файлы

This commit is contained in:
helmut 2026-03-31 13:25:02 +05:00
parent 4133aa1252
commit dd276e5d35
3 changed files with 159 additions and 0 deletions

View File

@ -0,0 +1,145 @@
<#
.SYNOPSIS
Acronis Universal Monitor ОДИН скрипт для всех
.DESCRIPTION
Авто-обнаружение задач, отправка агрегированных данных в Zabbix.
Работает с универсальным шаблоном на всех клиентах.
#>
# ==================== ЗАГРУЗКА КОНФИГА ====================
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$ConfigFile = Join-Path $ScriptDir "config.json"
if (-not (Test-Path $ConfigFile)) {
Write-Error "Конфиг не найден: $ConfigFile"
exit 1
}
$Config = Get-Content $ConfigFile -Raw -Encoding UTF8 | ConvertFrom-Json
$Z_SENDER = $Config.zabbix_sender
$Z_SERVER = $Config.zabbix_server
$Z_HOST = $Config.zabbix_host
$Z_TLS_ID = $Config.psk_identity
$Z_TLS_KEY = $Config.psk_key_file
$LOG_PATH = $Config.acronis_log_path
$SCAN_DAYS = $Config.scan_days
$MAX_AGE = $Config.max_age_seconds
# ===========================================================
function Send-ToZabbix {
param([string]$Key, [int]$Value)
$params = @(
'-z', $Z_SERVER, '-s', $Z_HOST, '-k', $Key, '-o', $Value.ToString(),
'--tls-connect', 'psk', '--tls-psk-identity', $Z_TLS_ID, '--tls-psk-file', $Z_TLS_KEY
)
$result = & $Z_SENDER @params 2>&1
return -not ($result -match 'failed: [1-9]')
}
function Parse-AcronisTime {
param([string]$Line)
if ($Line -match '^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}):(\d{3})([\+\-]\d{2}:\d{2})') {
$isoString = "$($matches[1]).$($matches[2])$($matches[3])"
try { return [datetime]::Parse($isoString) } catch { return $null }
}
return $null
}
function Get-AllTaskUUIDs {
param([string]$LogPath, [int]$Days)
$dateLimit = (Get-Date).AddDays(-$Days)
$uuids = @{}
Get-ChildItem -Path $LogPath -Filter "*.log" -File |
Where-Object { $_.LastWriteTime -gt $dateLimit } |
ForEach-Object {
if ($_.Name -match 'ti_demon_([0-9A-F-]{36})_') {
$uuids[$matches[1].ToUpper()] = $true
}
}
return $uuids.Keys
}
function Get-TaskStatus {
param([string]$LogPath, [string]$TaskUUID)
$logFile = Get-ChildItem -Path $LogPath -Filter "*$TaskUUID*.log" -File |
Sort-Object LastWriteTime -Descending | Select-Object -First 1
if (-not $logFile) { return @{ Status = 1; Age = $MAX_AGE; Time = $null } }
try {
$content = Get-Content -Path $logFile.FullName -Raw -Encoding UTF8
$successLine = $content | Select-String 'Операция завершена успешно' | Select-Object -First 1
if ($successLine) {
$time = Parse-AcronisTime -Line $successLine.Line
$age = if ($time) { [math]::Round(((Get-Date) - $time).TotalSeconds) } else { $MAX_AGE }
if ($age -lt 0) { $age = 0 }
return @{ Status = 0; Age = $age; Time = $time }
} else {
return @{ Status = 1; Age = $MAX_AGE; Time = $null }
}
} catch {
return @{ Status = 1; Age = $MAX_AGE; Time = $null }
}
}
# ==================== ОСНОВНАЯ ЛОГИКА ====================
Write-Host "╔════════════════════════════════════════════╗" -ForegroundColor Cyan
Write-Host "║ Acronis Monitor — Universal ║" -ForegroundColor Cyan
Write-Host "╚════════════════════════════════════════════╝" -ForegroundColor Cyan
Write-Host "Server: $Z_SERVER | Host: $Z_HOST | $(Get-Date)"
Write-Host ""
if (-not (Test-Path $LOG_PATH)) {
Write-Error "Путь к логам не найден: $LOG_PATH"
Send-ToZabbix -Key "acronis.status[all]" -Value 1
Send-ToZabbix -Key "acronis.age[oldest]" -Value $MAX_AGE
exit 1
}
$taskUUIDs = Get-AllTaskUUIDs -LogPath $LOG_PATH -Days $SCAN_DAYS
if ($taskUUIDs.Count -eq 0) {
Write-Warning "Задачи не найдены за $SCAN_DAYS дней!"
Send-ToZabbix -Key "acronis.status[all]" -Value 1
Send-ToZabbix -Key "acronis.age[oldest]" -Value $MAX_AGE
exit 1
}
Write-Host "✅ Задач обнаружено: $($taskUUIDs.Count)"
Write-Host ""
$oldestAge = 0
$overallStatus = 0
foreach ($uuid in $taskUUIDs) {
$task = Get-TaskStatus -LogPath $LOG_PATH -TaskUUID $uuid
Write-Host " $(if($task.Status -eq 0){'✓'}else{'✗'}) ($([math]::Round($task.Age/3600,1))ч)" -ForegroundColor $(if($task.Status -eq 0){'Green'}else{'Red'})
if ($task.Status -ne 0) { $overallStatus = 1 }
if ($task.Age -gt $oldestAge) { $oldestAge = $task.Age }
}
Write-Host ""
Write-Host "📤 Отправка в Zabbix..." -ForegroundColor Cyan
$statusSent = Send-ToZabbix -Key "acronis.status[all]" -Value $overallStatus
$ageSent = Send-ToZabbix -Key "acronis.age[oldest]" -Value $oldestAge
Write-Host " acronis.status[all] = $overallStatus $(if($statusSent){'✓'}else{'✗'})" -ForegroundColor $(if($overallStatus -eq 0){'Green'}else{'Red'})
Write-Host " acronis.age[oldest] = $oldestAge сек ($([math]::Round($oldestAge/3600,2)) ч) $(if($ageSent){'✓'}else{'✗'})" -ForegroundColor Gray
if ($statusSent -and $ageSent) {
Write-Host "Все данные отправлены" -ForegroundColor Green
} else {
Write-Host "⚠️ Ошибка отправки" -ForegroundColor Yellow
exit 1
}

11
Acronis/config.json Normal file
View File

@ -0,0 +1,11 @@
{
"zabbix_server": "92.242.18.210",
"zabbix_host": "EVROTEK_SERVERAPP",
"psk_identity": "EVROTEK_SERVERAPP",
"psk_key_file": "C:\\Program Files\\Zabbix Agent\\psk.key",
"zabbix_sender": "C:\\Program Files\\Zabbix Agent\\zabbix_sender.exe",
"acronis_log_path": "C:\\ProgramData\\Acronis\\TrueImageHome\\Logs\\ti_demon",
"scan_days": 7,
"max_age_seconds": 259200,
"debug": false
}

3
Acronis/monitor.bat Normal file
View File

@ -0,0 +1,3 @@
@echo off
chcp 65001 >nul
powershell -ExecutionPolicy Bypass -File "C:\cmd\Acronis\Acronis_Monitor.ps1" >> "C:\cmd\Acronis\monitor.log" 2>&1