From 128dd278f628172d7992da0b1d53fe7da1e05774 Mon Sep 17 00:00:00 2001 From: PTah Date: Mon, 22 Jun 2026 10:01:16 +1000 Subject: [PATCH] feat(deploy): sync ServerIPv4 hint and DailyReportEnabled on upgrade (2.1.3-SAC) Co-authored-by: Cursor --- Deploy-LoginMonitor.ps1 | 100 ++++++++++++++++++++++++----- Login_Monitor.ps1 | 2 +- login_monitor.settings.example.ps1 | 2 +- version.txt | 2 +- 4 files changed, 88 insertions(+), 18 deletions(-) diff --git a/Deploy-LoginMonitor.ps1 b/Deploy-LoginMonitor.ps1 index 293541e..a21f220 100644 --- a/Deploy-LoginMonitor.ps1 +++ b/Deploy-LoginMonitor.ps1 @@ -285,12 +285,24 @@ function Test-RdpMonitorSettingsNeedsServerDisplayNameHint { return $true } -function Test-RdpMonitorSettingsNeedsDailyReportHint { +function Test-RdpMonitorSettingsDailyReportEnabledIsTrue { param([string]$SettingsPath) if (-not (Test-Path -LiteralPath $SettingsPath)) { return $false } $c = Get-RdpMonitorSettingsRaw -Path $SettingsPath if ([string]::IsNullOrWhiteSpace($c)) { return $false } - if ($c -match '(?m)^\s*(\#\s*)?\$DailyReportEnabled\s*=') { return $false } + if ($c -match '(?m)^\s*\$DailyReportEnabled\s*=\s*\$(?:true)\b') { return $true } + if ($c -match '(?m)^\s*\$DailyReportEnabled\s*=\s*1\s*(?:#.*)?$') { return $true } + return $false +} + +function Test-RdpMonitorSettingsNeedsDailyReportHint { + param([string]$SettingsPath) + if (-not (Test-Path -LiteralPath $SettingsPath)) { return $true } + $c = Get-RdpMonitorSettingsRaw -Path $SettingsPath + if ([string]::IsNullOrWhiteSpace($c)) { return $true } + if (Test-RdpMonitorSettingsDailyReportEnabledIsTrue -SettingsPath $SettingsPath) { return $false } + if (Test-RdpMonitorSettingsHasInvalidDailyReportAssignment -SettingsPath $SettingsPath) { return $true } + if ($c -match '(?m)^\s*(\#\s*)?\$DailyReportEnabled\s*=') { return $true } return $true } @@ -327,7 +339,7 @@ function Repair-RdpMonitorSettingsDailyReportAssignmentIfInvalid { return $true } -function Update-RdpMonitorSettingsDailyReportHintIfMissing { +function Sync-RdpMonitorSettingsDailyReportEnabledToTrue { param([string]$LocalSettings) if (-not (Test-Path -LiteralPath $LocalSettings)) { return $false } if (-not (Test-RdpMonitorSettingsNeedsDailyReportHint -SettingsPath $LocalSettings)) { @@ -337,24 +349,35 @@ function Update-RdpMonitorSettingsDailyReportHintIfMissing { $c = Get-RdpMonitorSettingsRaw -Path $LocalSettings if ([string]::IsNullOrWhiteSpace($c)) { return $false } + $dailyLine = '$DailyReportEnabled = $true # по умолчанию: только SAC; $true или 1 — отчёт с агента' $hintBlock = @( '# --- Суточный отчёт report.daily.rdp (агент или только SAC) ---' - '# $DailyReportEnabled = $false # по умолчанию: только SAC; $true или 1 — отчёт с агента' + $dailyLine '# Не пишите "= false" без $ — PowerShell воспримет false как команду.' ) -join "`r`n" $bak = "$LocalSettings.bak.$(Get-Date -Format 'yyyyMMdd_HHmmss')" Copy-Item -LiteralPath $LocalSettings -Destination $bak -Force - Write-DeployLog "Добавление закомментированного `$DailyReportEnabled в login_monitor.settings.ps1; резервная копия: $bak" - $insertBefore = '(?m)^\s*#\s*---\s*Security Alert Center' - if ($c -match $insertBefore) { - $newContent = [regex]::Replace($c, $insertBefore, ($hintBlock + "`r`n`r`n" + '$0'), 1) + if ($c -match '(?m)^\s*(\#\s*)?\$DailyReportEnabled\s*=') { + Write-DeployLog "login_monitor.settings.ps1: `$DailyReportEnabled → `$true (резервная копия: $bak)" + $newContent = [regex]::Replace( + $c, + '(?m)^\s*(\#\s*)?\$DailyReportEnabled\s*=.*$', + $dailyLine, + 1 + ) } else { - $newContent = ($c.TrimEnd() + "`r`n`r`n" + $hintBlock + "`r`n") + Write-DeployLog "login_monitor.settings.ps1: добавлен `$DailyReportEnabled = `$true (резервная копия: $bak)" + $insertBefore = '(?m)^\s*#\s*---\s*Security Alert Center' + if ($c -match $insertBefore) { + $newContent = [regex]::Replace($c, $insertBefore, ($hintBlock + "`r`n`r`n" + '$0'), 1) + } else { + $newContent = ($c.TrimEnd() + "`r`n`r`n" + $hintBlock + "`r`n") + } } + [System.IO.File]::WriteAllText($LocalSettings, $newContent.TrimEnd() + "`r`n", $Utf8Bom) - Write-DeployLog 'login_monitor.settings.ps1: добавлена подсказка # $DailyReportEnabled = $false' return $true } @@ -365,7 +388,7 @@ function Sync-RdpMonitorSettingsDailyReportPatches { if (Repair-RdpMonitorSettingsDailyReportAssignmentIfInvalid -LocalSettings $LocalSettings) { $changed = $true } - if (Update-RdpMonitorSettingsDailyReportHintIfMissing -LocalSettings $LocalSettings) { + if (Sync-RdpMonitorSettingsDailyReportEnabledToTrue -LocalSettings $LocalSettings) { $changed = $true } return $changed @@ -773,6 +796,7 @@ function Invoke-RdpMonitorSettingsPostPatches { if (-not (Test-Path -LiteralPath $LocalSettings)) { return $false } $changed = $false if (Update-RdpMonitorSettingsServerDisplayNameHintIfMissing -LocalSettings $LocalSettings) { $changed = $true } + if (Update-RdpMonitorSettingsServerIPv4HintIfMissing -LocalSettings $LocalSettings) { $changed = $true } if (Sync-RdpMonitorSettingsDailyReportPatches -LocalSettings $LocalSettings) { $changed = $true } if (Sync-RdpMonitorSettingsExchangeNoisePatches -LocalSettings $LocalSettings) { $changed = $true } if (Repair-RdpMonitorSettingsWinRmLinesIfInvalid -LocalSettings $LocalSettings) { $changed = $true } @@ -886,8 +910,6 @@ function Update-RdpMonitorSettingsServerDisplayNameHintIfMissing { $hintBlock = @( '# --- Подпись сервера в Telegram и SAC (host.display_name); раскомментируйте при необходимости ---' "# `$ServerDisplayName = '$hostLabel'" - '# --- Явный IPv4 хоста для SAC (опционально; иначе автоопределение) ---' - '# $ServerIPv4 = ''' ) -join "`r`n" $bak = "$LocalSettings.bak.$(Get-Date -Format 'yyyyMMdd_HHmmss')" @@ -905,6 +927,51 @@ function Update-RdpMonitorSettingsServerDisplayNameHintIfMissing { return $true } +function Test-RdpMonitorSettingsNeedsServerIPv4Hint { + param([string]$SettingsPath) + if (-not (Test-Path -LiteralPath $SettingsPath)) { return $false } + $c = Get-RdpMonitorSettingsRaw -Path $SettingsPath + if ([string]::IsNullOrWhiteSpace($c)) { return $false } + if ($c -match '(?m)^\s*(\#\s*)?\$ServerIPv4\s*=') { return $false } + return $true +} + +function Update-RdpMonitorSettingsServerIPv4HintIfMissing { + param([string]$LocalSettings) + if (-not (Test-Path -LiteralPath $LocalSettings)) { return $false } + if (-not (Test-RdpMonitorSettingsNeedsServerIPv4Hint -SettingsPath $LocalSettings)) { + return $false + } + + $c = Get-RdpMonitorSettingsRaw -Path $LocalSettings + if ([string]::IsNullOrWhiteSpace($c)) { return $false } + + $hintBlock = @( + '# --- Явный IPv4 хоста для SAC (опционально; иначе автоопределение) ---' + "# `$ServerIPv4 = '10.0.0.10'" + ) -join "`r`n" + + $bak = "$LocalSettings.bak.$(Get-Date -Format 'yyyyMMdd_HHmmss')" + Copy-Item -LiteralPath $LocalSettings -Destination $bak -Force + Write-DeployLog "Добавление закомментированного `$ServerIPv4 в login_monitor.settings.ps1; резервная копия: $bak" + + $insertAfterDisplay = '(?m)^(\s*(\#\s*)?\$ServerDisplayName\s*=.*)$' + if ($c -match $insertAfterDisplay) { + $newContent = [regex]::Replace($c, $insertAfterDisplay, ('$1' + "`r`n" + $hintBlock), 1) + } else { + $insertBefore = '(?m)^\s*#\s*---\s*Security Alert Center' + if ($c -match $insertBefore) { + $newContent = [regex]::Replace($c, $insertBefore, ($hintBlock + "`r`n`r`n" + '$0'), 1) + } else { + $newContent = ($c.TrimEnd() + "`r`n`r`n" + $hintBlock + "`r`n") + } + } + + [System.IO.File]::WriteAllText($LocalSettings, $newContent.TrimEnd() + "`r`n", $Utf8Bom) + Write-DeployLog "login_monitor.settings.ps1: добавлена подсказка # `$ServerIPv4 = '10.0.0.10'" + return $true +} + function Get-RdpMonitorSacBlockFromExample { param([string]$ExamplePath) if (-not (Test-Path -LiteralPath $ExamplePath)) { return $null } @@ -1429,6 +1496,7 @@ try { $needsSettingsBootstrap = Test-RdpMonitorSettingsNeedsSacBootstrap -SettingsPath $settingsLocal $needsDisplayNameHint = Test-RdpMonitorSettingsNeedsServerDisplayNameHint -SettingsPath $settingsLocal + $needsServerIPv4Hint = Test-RdpMonitorSettingsNeedsServerIPv4Hint -SettingsPath $settingsLocal $needsDailyReportHint = Test-RdpMonitorSettingsNeedsDailyReportHint -SettingsPath $settingsLocal $needsDailyReportRepair = Test-RdpMonitorSettingsHasInvalidDailyReportAssignment -SettingsPath $settingsLocal $needsExchangeNoisePatch = Test-RdpMonitorSettingsNeedsExchangeNoisePatch -SettingsPath $settingsLocal @@ -1437,7 +1505,7 @@ try { $needsStartupRebootDetectMinutes = Test-RdpMonitorSettingsNeedsStartupRebootDetectMinutes -SettingsPath $settingsLocal $needsBundleSync = Test-RdpMonitorDeployBundleNeedsSync -ShareRoot $shareRoot $needsTaskExecutionLimitFix = Test-RdpMonitorDeployMainTaskNeedsUnlimitedExecutionTime -ShareRoot $shareRoot - $needsSacBootstrap = $needsSettingsBootstrap -or $needsBundleSync -or $needsDisplayNameHint -or $needsDailyReportHint -or $needsDailyReportRepair -or $needsExchangeNoisePatch -or $needsWinRmInboundBlock -or $needsHeartbeatInterval -or $needsStartupRebootDetectMinutes -or $needsTaskExecutionLimitFix + $needsSacBootstrap = $needsSettingsBootstrap -or $needsBundleSync -or $needsDisplayNameHint -or $needsServerIPv4Hint -or $needsDailyReportHint -or $needsDailyReportRepair -or $needsExchangeNoisePatch -or $needsWinRmInboundBlock -or $needsHeartbeatInterval -or $needsStartupRebootDetectMinutes -or $needsTaskExecutionLimitFix if (Test-RdpMonitorExchangeServerRole) { Write-DeployLog "Обнаружена роль Exchange — при необходимости допишем WinRM/4624 noise settings в login_monitor.settings.ps1." @@ -1466,8 +1534,10 @@ try { Write-DeployLog "Версия совпадает ($shareVerRaw), но нужна донастройка SAC в settings — продолжаем деплой." } elseif ($needsDisplayNameHint) { Write-DeployLog "Версия совпадает ($shareVerRaw), но нет подсказки `$ServerDisplayName в settings — продолжаем деплой." + } elseif ($needsServerIPv4Hint) { + Write-DeployLog "Версия совпадает ($shareVerRaw), но нет подсказки `$ServerIPv4 в settings — продолжаем деплой." } elseif ($needsDailyReportHint) { - Write-DeployLog "Версия совпадает ($shareVerRaw), но нет `$DailyReportEnabled в settings — продолжаем деплой." + Write-DeployLog "Версия совпадает ($shareVerRaw), но `$DailyReportEnabled не `$true — допишем/исправим и продолжим деплой." } elseif ($needsDailyReportRepair) { Write-DeployLog "Версия совпадает ($shareVerRaw), но в settings некорректно задан `$DailyReportEnabled (= true/false без `$) — продолжаем деплой." } elseif ($needsExchangeNoisePatch) { diff --git a/Login_Monitor.ps1 b/Login_Monitor.ps1 index a688b05..4aca44b 100644 --- a/Login_Monitor.ps1 +++ b/Login_Monitor.ps1 @@ -90,7 +90,7 @@ $script:SkipLogDetailLimit = 15 # строки ниже, если правки «мелкие» и вы не хотите менять отображаемую версию в логах). # Рекомендация: при значимых релизах меняйте и $ScriptVersion, и version.txt одинаково; при только # исправлениях на шаре — достаточно поднять patch в version.txt (например 1.3.0.1). -$ScriptVersion = "2.1.2-SAC" +$ScriptVersion = "2.1.3-SAC" # Логи (все под InstallRoot) $LogFile = Join-Path $script:InstallRoot "Logs\login_monitor.log" diff --git a/login_monitor.settings.example.ps1 b/login_monitor.settings.example.ps1 index 2126acd..9d49b09 100644 --- a/login_monitor.settings.example.ps1 +++ b/login_monitor.settings.example.ps1 @@ -42,7 +42,7 @@ $SacApiKey = 'sac_CHANGE_ME' # $SacFallbackFailures = 5 # $false = не слать report.daily.rdp с агента (суточный отчёт только из SAC) # В settings.ps1 используйте 1/0 или $true/$false — не пишите голое false без $ -$DailyReportEnabled = 1 +$DailyReportEnabled = $true # по умолчанию: только SAC; $true или 1 — отчёт с агента # --- Heartbeat SAC (agent.heartbeat): интервал в секундах; 14400 = 4 ч --- $HeartbeatInterval = 14400 diff --git a/version.txt b/version.txt index 975d4d4..aead1fb 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -2.1.2-SAC +2.1.3-SAC