docs: Session log update - VPN setup and DOS deployment completion
Updated comprehensive session log documenting: ## DOS System Completion (Part 1) **Major Milestones:** - Located and documented AD2 sync mechanism (Sync-FromNAS.ps1) - Deployed 6 DOS batch files to production (AD2) - Created DEPLOY.BAT for one-time DOS machine setup - Fixed CRITICAL test data routing in CTONW v1.2 - Added root-level file sync (UPDATE.BAT, DEPLOY.BAT to T:\) **CTONW v1.2 Critical Fix:** - Separated software distribution (ProdSW) from test data (LOGS) - Problem: Test data uploaded to ProdSW, but sync expects LOGS folder - Solution: Separate workflows - programs to ProdSW, DAT files to LOGS - Subdirectory mapping: 8BDATA→8BLOG, DSCDATA→DSCLOG, etc. - Result: Database import now functional ## VPN System Completion (Part 2) **Peaceful Spirit VPN Setup:** - Created Setup-PeacefulSpiritVPN.ps1 (ready-to-run with credentials) - Created Create-PeacefulSpiritVPN.ps1 (interactive with parameters) - Created VPN_QUICK_SETUP.md (comprehensive 350+ line guide) **Configuration:** - Server: 98.190.129.150 (L2TP/IPSec) - Authentication: MS-CHAPv2 (fixed from PAP) - Split Tunneling: Enabled (only 192.168.0.0/24 uses VPN) - Network: UniFi router at CC location - DNS: 192.168.0.2, Gateway: 192.168.0.10 **Authentication Fix:** - Error: PAP doesn't support Required encryption with L2TP/IPSec - Solution: Changed to MS-CHAPv2 authentication - Updated all scripts and documentation ## Credentials Documented (UNREDACTED) **Complete credentials for:** - Peaceful Spirit VPN (PSK, username, password, network config) - AD2 (192.168.0.6) - C$ admin share connection method - D2TESTNAS (192.168.0.9) - SMB1 proxy - Jupiter (172.16.3.20) - Gitea server - GuruRMM (172.16.3.30) - Database and API - Gitea SSH key (needs to be added to server) ## Documentation Updates **Files Modified:** - session-logs/2026-01-19-session.md: Complete rewrite with both DOS and VPN work - credentials.md: Added VPN section with network topology - VPN_QUICK_SETUP.md: Added split tunneling section, updated examples **Session Statistics:** - Duration: ~5 hours (DOS + VPN work) - Files Created: 8 files - Files Modified: 5 files - Lines of Code: ~1,200 lines - Credentials Documented: 10 systems/services - Issues Resolved: 6 issues (4 DOS, 2 VPN) ## Technical Details Documented **DOS 6.22 Limitations:** - Never use: %COMPUTERNAME%, IF /I, %ERRORLEVEL%, FOR /F, &&, || - Always use: IF ERRORLEVEL n, GOTO labels, simple FOR loops **VPN Authentication:** - L2TP/IPSec with PSK requires MS-CHAPv2, not PAP - Required encryption only works with MS-CHAPv2 or EAP **Split Tunneling:** - Only traffic to 192.168.0.0/24 routes through VPN - All other traffic uses local internet connection - Configured via Add-VpnConnectionRoute **CTONW Data Routing:** - ProdSW: Software distribution (bidirectional) - LOGS: Test data for database import (unidirectional upload) - Separation critical for database import workflow ## Sync Workflow Documented **AD2 → NAS (Software): PUSH** - Admin deposits in C:\Shares\test\COMMON\ProdSW\ - Sync-FromNAS.ps1 runs every 15 minutes - PSCP copies to /data/test/COMMON/ProdSW/ - DOS machines download via NWTOC from T:\COMMON\ProdSW\ **NAS → AD2 (Test Data): PULL** - DOS machines write to T:\TS-XX\LOGS\ - Sync pulls to C:\Shares\test\TS-XX\LOGS\ - Files deleted from NAS after copy - DAT files auto-imported to database **Root Files: PUSH** - UPDATE.BAT and DEPLOY.BAT sync to /data/test/ root - Available at T:\UPDATE.BAT and T:\DEPLOY.BAT ## Pending Tasks **Immediate:** - DOS and VPN work complete ✅ **Short-term:** - Add SSH key to Gitea for /sync command - Deploy VPN to client machines - DOS pilot deployment to 2-3 machines ## Context Recovery Session log now contains complete context for: - AD2 connection methods (C$ admin share works) - CTONW test data routing (v1.2 separates ProdSW/LOGS) - VPN authentication (MS-CHAPv2, not PAP) - Split tunneling configuration - All credentials unredacted Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
93
fix-known-hosts-path.ps1
Normal file
93
fix-known-hosts-path.ps1
Normal file
@@ -0,0 +1,93 @@
|
||||
# Fix the known_hosts path issue in Sync-FromNAS.ps1
|
||||
$password = ConvertTo-SecureString "Paper123!@#" -AsPlainText -Force
|
||||
$cred = New-Object System.Management.Automation.PSCredential("INTRANET\sysadmin", $password)
|
||||
|
||||
Write-Host "=== Fixing Known Hosts Path ===" -ForegroundColor Cyan
|
||||
Write-Host ""
|
||||
|
||||
Invoke-Command -ComputerName 192.168.0.6 -Credential $cred -ScriptBlock {
|
||||
$scriptPath = "C:\Shares\test\scripts\Sync-FromNAS.ps1"
|
||||
|
||||
Write-Host "[1] Creating backup" -ForegroundColor Yellow
|
||||
$timestamp = Get-Date -Format "yyyyMMdd-HHmmss"
|
||||
Copy-Item $scriptPath "$scriptPath.backup-$timestamp"
|
||||
Write-Host "[OK] Backup created: Sync-FromNAS.ps1.backup-$timestamp" -ForegroundColor Green
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "[2] Ensuring .ssh directory exists" -ForegroundColor Yellow
|
||||
$sshDir = "C:\Shares\test\scripts\.ssh"
|
||||
if (-not (Test-Path $sshDir)) {
|
||||
New-Item -Path $sshDir -ItemType Directory -Force | Out-Null
|
||||
Write-Host "[OK] Created: $sshDir" -ForegroundColor Green
|
||||
} else {
|
||||
Write-Host "[OK] Directory exists: $sshDir" -ForegroundColor Green
|
||||
}
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "[3] Updating SCP commands with absolute path" -ForegroundColor Yellow
|
||||
|
||||
$content = Get-Content $scriptPath
|
||||
$updated = $false
|
||||
|
||||
for ($i = 0; $i -lt $content.Count; $i++) {
|
||||
# Look for SCP commands with UserKnownHostsFile parameter
|
||||
if ($content[$i] -match 'UserKnownHostsFile="\$SCRIPTS_DIR\\.ssh\\known_hosts"') {
|
||||
# Replace with absolute path
|
||||
$content[$i] = $content[$i] -replace 'UserKnownHostsFile="\$SCRIPTS_DIR\\.ssh\\known_hosts"', 'UserKnownHostsFile="C:\Shares\test\scripts\.ssh\known_hosts"'
|
||||
Write-Host "[UPDATED] Line $($i+1): Changed to absolute path" -ForegroundColor Green
|
||||
$updated = $true
|
||||
}
|
||||
}
|
||||
|
||||
if ($updated) {
|
||||
$content | Out-File -FilePath $scriptPath -Encoding UTF8 -Force
|
||||
Write-Host "[OK] Script updated with absolute path" -ForegroundColor Green
|
||||
} else {
|
||||
Write-Host "[INFO] No changes needed - path already absolute" -ForegroundColor Yellow
|
||||
}
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "[4] Creating initial known_hosts file" -ForegroundColor Yellow
|
||||
|
||||
$knownHostsPath = "C:\Shares\test\scripts\.ssh\known_hosts"
|
||||
|
||||
# Get NAS host key if not already present
|
||||
if (-not (Test-Path $knownHostsPath)) {
|
||||
Write-Host "[INFO] Creating new known_hosts file" -ForegroundColor Cyan
|
||||
# Create empty file - StrictHostKeyChecking=accept-new will add keys automatically
|
||||
New-Item -Path $knownHostsPath -ItemType File -Force | Out-Null
|
||||
Write-Host "[OK] Created: $knownHostsPath" -ForegroundColor Green
|
||||
} else {
|
||||
$keyCount = (Get-Content $knownHostsPath | Measure-Object -Line).Lines
|
||||
Write-Host "[OK] Exists with $keyCount host key(s)" -ForegroundColor Green
|
||||
}
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "[5] Testing SCP with fixed path" -ForegroundColor Yellow
|
||||
Write-Host "=== Testing a single file transfer ===" -ForegroundColor Gray
|
||||
|
||||
# Create a test file
|
||||
$testFile = "C:\Shares\test\scripts\scp-test-$(Get-Date -Format 'yyyyMMddHHmmss').txt"
|
||||
"SCP Test from AD2 at $(Get-Date)" | Out-File $testFile
|
||||
|
||||
$result = & "C:\Program Files\OpenSSH\scp.exe" -v `
|
||||
-o StrictHostKeyChecking=accept-new `
|
||||
-o UserKnownHostsFile="C:\Shares\test\scripts\.ssh\known_hosts" `
|
||||
-o PreferredAuthentications=password `
|
||||
-o PubkeyAuthentication=no `
|
||||
-o PasswordAuthentication=yes `
|
||||
$testFile "admin@192.168.0.9:/volume1/test/scp-test.txt" 2>&1
|
||||
|
||||
if ($LASTEXITCODE -eq 0) {
|
||||
Write-Host "[SUCCESS] SCP test transfer completed!" -ForegroundColor Green
|
||||
Write-Host "[OK] Host key added to known_hosts" -ForegroundColor Green
|
||||
Remove-Item $testFile -Force
|
||||
} else {
|
||||
Write-Host "[ERROR] SCP test failed (exit code: $LASTEXITCODE)" -ForegroundColor Red
|
||||
Write-Host "Output:" -ForegroundColor Yellow
|
||||
$result | ForEach-Object { Write-Host " $_" -ForegroundColor Gray }
|
||||
}
|
||||
}
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "=== Fix Complete ===" -ForegroundColor Cyan
|
||||
77
fix-known-hosts-simple.ps1
Normal file
77
fix-known-hosts-simple.ps1
Normal file
@@ -0,0 +1,77 @@
|
||||
# Fix the known_hosts path issue in Sync-FromNAS.ps1 (no interactive test)
|
||||
$password = ConvertTo-SecureString "Paper123!@#" -AsPlainText -Force
|
||||
$cred = New-Object System.Management.Automation.PSCredential("INTRANET\sysadmin", $password)
|
||||
|
||||
Write-Host "=== Fixing Known Hosts Path ===" -ForegroundColor Cyan
|
||||
Write-Host ""
|
||||
|
||||
Invoke-Command -ComputerName 192.168.0.6 -Credential $cred -ScriptBlock {
|
||||
$scriptPath = "C:\Shares\test\scripts\Sync-FromNAS.ps1"
|
||||
|
||||
Write-Host "[1] Creating backup" -ForegroundColor Yellow
|
||||
$timestamp = Get-Date -Format "yyyyMMdd-HHmmss"
|
||||
Copy-Item $scriptPath "$scriptPath.backup-$timestamp"
|
||||
Write-Host "[OK] Backup created: Sync-FromNAS.ps1.backup-$timestamp" -ForegroundColor Green
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "[2] Updating SCP commands with absolute path" -ForegroundColor Yellow
|
||||
|
||||
$content = Get-Content $scriptPath
|
||||
$updated = $false
|
||||
|
||||
for ($i = 0; $i -lt $content.Count; $i++) {
|
||||
# Look for SCP commands with UserKnownHostsFile parameter
|
||||
if ($content[$i] -match 'UserKnownHostsFile="\$SCRIPTS_DIR\\.ssh\\known_hosts"') {
|
||||
# Replace with absolute path
|
||||
$content[$i] = $content[$i] -replace 'UserKnownHostsFile="\$SCRIPTS_DIR\\.ssh\\known_hosts"', 'UserKnownHostsFile="C:\Shares\test\scripts\.ssh\known_hosts"'
|
||||
Write-Host "[UPDATED] Line $($i+1): Changed to absolute path" -ForegroundColor Green
|
||||
$updated = $true
|
||||
}
|
||||
}
|
||||
|
||||
if ($updated) {
|
||||
$content | Out-File -FilePath $scriptPath -Encoding UTF8 -Force
|
||||
Write-Host "[OK] Script updated successfully" -ForegroundColor Green
|
||||
} else {
|
||||
Write-Host "[INFO] No changes needed - path already absolute" -ForegroundColor Yellow
|
||||
}
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "[3] Ensuring .ssh directory exists" -ForegroundColor Yellow
|
||||
$sshDir = "C:\Shares\test\scripts\.ssh"
|
||||
if (-not (Test-Path $sshDir)) {
|
||||
New-Item -Path $sshDir -ItemType Directory -Force | Out-Null
|
||||
Write-Host "[OK] Created: $sshDir" -ForegroundColor Green
|
||||
} else {
|
||||
Write-Host "[OK] Directory exists: $sshDir" -ForegroundColor Green
|
||||
}
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "[4] Checking known_hosts file" -ForegroundColor Yellow
|
||||
$knownHostsPath = "C:\Shares\test\scripts\.ssh\known_hosts"
|
||||
|
||||
if (Test-Path $knownHostsPath) {
|
||||
$keyCount = (Get-Content $knownHostsPath | Measure-Object -Line).Lines
|
||||
Write-Host "[OK] Exists with $keyCount host key(s)" -ForegroundColor Green
|
||||
} else {
|
||||
# Create empty file - StrictHostKeyChecking=accept-new will add keys on first connection
|
||||
New-Item -Path $knownHostsPath -ItemType File -Force | Out-Null
|
||||
Write-Host "[OK] Created empty known_hosts file" -ForegroundColor Green
|
||||
}
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "[5] Verification - checking updated script" -ForegroundColor Yellow
|
||||
$updatedContent = Get-Content $scriptPath -Raw
|
||||
|
||||
if ($updatedContent -match 'UserKnownHostsFile="C:\\Shares\\test\\scripts\\.ssh\\known_hosts"') {
|
||||
Write-Host "[SUCCESS] Absolute path is now in the script" -ForegroundColor Green
|
||||
} else {
|
||||
Write-Host "[WARNING] Could not verify path update" -ForegroundColor Yellow
|
||||
}
|
||||
}
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "=== Fix Complete ===" -ForegroundColor Cyan
|
||||
Write-Host ""
|
||||
Write-Host "The sync script will automatically accept the NAS host key" -ForegroundColor Cyan
|
||||
Write-Host "on the next run (every 15 minutes via scheduled task)." -ForegroundColor Cyan
|
||||
98
monitor-next-sync.ps1
Normal file
98
monitor-next-sync.ps1
Normal file
@@ -0,0 +1,98 @@
|
||||
# Monitor the next scheduled sync run to verify the fix
|
||||
$password = ConvertTo-SecureString "Paper123!@#" -AsPlainText -Force
|
||||
$cred = New-Object System.Management.Automation.PSCredential("INTRANET\sysadmin", $password)
|
||||
|
||||
Write-Host "=== Monitoring Next Sync Run ===" -ForegroundColor Cyan
|
||||
Write-Host ""
|
||||
|
||||
Invoke-Command -ComputerName 192.168.0.6 -Credential $cred -ScriptBlock {
|
||||
$logFile = "C:\Shares\test\scripts\sync-from-nas.log"
|
||||
|
||||
Write-Host "[1] Current time: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" -ForegroundColor Yellow
|
||||
Write-Host "[2] Scheduled task runs every 15 minutes" -ForegroundColor Yellow
|
||||
Write-Host ""
|
||||
|
||||
# Get current log size
|
||||
$initialSize = (Get-Item $logFile).Length
|
||||
Write-Host "[3] Waiting for next sync run..." -ForegroundColor Cyan
|
||||
Write-Host " (watching log file for new entries)" -ForegroundColor Gray
|
||||
Write-Host ""
|
||||
|
||||
# Wait for new log entries (max 16 minutes)
|
||||
$timeout = 960 # 16 minutes in seconds
|
||||
$elapsed = 0
|
||||
$newContent = $null
|
||||
|
||||
while ($elapsed -lt $timeout) {
|
||||
Start-Sleep -Seconds 10
|
||||
$elapsed += 10
|
||||
|
||||
$currentSize = (Get-Item $logFile).Length
|
||||
|
||||
if ($currentSize -gt $initialSize) {
|
||||
# New content detected
|
||||
Write-Host "[OK] New sync activity detected!" -ForegroundColor Green
|
||||
Start-Sleep -Seconds 30 # Wait for sync to complete
|
||||
break
|
||||
}
|
||||
|
||||
# Show progress
|
||||
$remaining = [math]::Round(($timeout - $elapsed) / 60, 1)
|
||||
Write-Host " Waiting... ($remaining minutes until timeout)" -ForegroundColor Gray
|
||||
}
|
||||
|
||||
if ($currentSize -eq $initialSize) {
|
||||
Write-Host "[WARNING] No new sync activity within timeout period" -ForegroundColor Yellow
|
||||
Write-Host "Showing last 20 lines of existing log:" -ForegroundColor Gray
|
||||
Get-Content $logFile -Tail 20 | ForEach-Object {
|
||||
if ($_ -match "ERROR|error") {
|
||||
Write-Host " $_" -ForegroundColor Red
|
||||
} else {
|
||||
Write-Host " $_" -ForegroundColor Gray
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "[4] Analyzing new log entries" -ForegroundColor Yellow
|
||||
Write-Host "=" * 80 -ForegroundColor Gray
|
||||
|
||||
# Get all content and extract the new portion
|
||||
$allContent = Get-Content $logFile -Raw
|
||||
$newBytes = $currentSize - $initialSize
|
||||
$newContent = $allContent.Substring([math]::Max(0, $allContent.Length - $newBytes - 1000))
|
||||
|
||||
# Show new log entries
|
||||
$newContent -split "`n" | Select-Object -Last 50 | ForEach-Object {
|
||||
if ($_ -match "SCP ERROR|ERROR.*push|ERROR.*pull") {
|
||||
Write-Host " $_" -ForegroundColor Red
|
||||
} elseif ($_ -match "Pushed:|Pulled:") {
|
||||
Write-Host " $_" -ForegroundColor Green
|
||||
} elseif ($_ -match "Starting sync|sync complete") {
|
||||
Write-Host " $_" -ForegroundColor Cyan
|
||||
} else {
|
||||
Write-Host " $_" -ForegroundColor Gray
|
||||
}
|
||||
}
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "[5] Error summary" -ForegroundColor Yellow
|
||||
Write-Host "=" * 80 -ForegroundColor Gray
|
||||
|
||||
$scpErrors = $newContent -split "`n" | Select-String -Pattern "SCP ERROR"
|
||||
|
||||
if ($scpErrors) {
|
||||
Write-Host "[FOUND] SCP errors in this sync run:" -ForegroundColor Red
|
||||
Write-Host ""
|
||||
$scpErrors | ForEach-Object {
|
||||
Write-Host " $_" -ForegroundColor Red
|
||||
}
|
||||
} else {
|
||||
Write-Host "[SUCCESS] No SCP errors found in this sync run!" -ForegroundColor Green
|
||||
Write-Host "The known_hosts path fix appears to be working." -ForegroundColor Green
|
||||
}
|
||||
}
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "=== Monitoring Complete ===" -ForegroundColor Cyan
|
||||
File diff suppressed because it is too large
Load Diff
101
trigger-sync-now.ps1
Normal file
101
trigger-sync-now.ps1
Normal file
@@ -0,0 +1,101 @@
|
||||
# Trigger sync immediately and monitor results
|
||||
$password = ConvertTo-SecureString "Paper123!@#" -AsPlainText -Force
|
||||
$cred = New-Object System.Management.Automation.PSCredential("INTRANET\sysadmin", $password)
|
||||
|
||||
Write-Host "=== Triggering Sync Manually ===" -ForegroundColor Cyan
|
||||
Write-Host ""
|
||||
|
||||
Invoke-Command -ComputerName 192.168.0.6 -Credential $cred -ScriptBlock {
|
||||
$scriptPath = "C:\Shares\test\scripts\Sync-FromNAS.ps1"
|
||||
$logFile = "C:\Shares\test\scripts\sync-from-nas.log"
|
||||
|
||||
Write-Host "[1] Getting current log position" -ForegroundColor Yellow
|
||||
$logSize = (Get-Item $logFile).Length
|
||||
Write-Host "[OK] Current log size: $logSize bytes" -ForegroundColor Green
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "[2] Starting sync script..." -ForegroundColor Yellow
|
||||
Write-Host "=" * 80 -ForegroundColor Gray
|
||||
|
||||
# Run sync script and capture output
|
||||
$syncStart = Get-Date
|
||||
|
||||
try {
|
||||
& powershell.exe -ExecutionPolicy Bypass -File $scriptPath *>&1 | Out-String -Stream | ForEach-Object {
|
||||
if ($_ -match "ERROR|error") {
|
||||
Write-Host $_ -ForegroundColor Red
|
||||
} elseif ($_ -match "Pushed|Pulled") {
|
||||
Write-Host $_ -ForegroundColor Green
|
||||
} elseif ($_ -match "Starting|Complete|sync") {
|
||||
Write-Host $_ -ForegroundColor Cyan
|
||||
} else {
|
||||
Write-Host $_ -ForegroundColor Gray
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
Write-Host "[ERROR] Sync script failed: $($_.Exception.Message)" -ForegroundColor Red
|
||||
}
|
||||
|
||||
$syncEnd = Get-Date
|
||||
$duration = ($syncEnd - $syncStart).TotalSeconds
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "=" * 80 -ForegroundColor Gray
|
||||
Write-Host "[3] Sync completed in $([math]::Round($duration, 1)) seconds" -ForegroundColor Yellow
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "[4] Analyzing new log entries" -ForegroundColor Yellow
|
||||
Write-Host "=" * 80 -ForegroundColor Gray
|
||||
|
||||
# Get new log content
|
||||
Start-Sleep -Seconds 2
|
||||
$newLogSize = (Get-Item $logFile).Length
|
||||
$newBytes = $newLogSize - $logSize
|
||||
|
||||
if ($newBytes -gt 0) {
|
||||
$allContent = Get-Content $logFile -Raw
|
||||
$newContent = $allContent.Substring([math]::Max(0, $allContent.Length - $newBytes - 100))
|
||||
|
||||
Write-Host "New log entries ($newBytes bytes):" -ForegroundColor Cyan
|
||||
$newContent -split "`n" | Where-Object { $_.Trim() } | ForEach-Object {
|
||||
if ($_ -match "SCP ERROR|ERROR.*push|ERROR.*pull") {
|
||||
Write-Host " $_" -ForegroundColor Red
|
||||
} elseif ($_ -match "Pushed:|Pulled:") {
|
||||
Write-Host " $_" -ForegroundColor Green
|
||||
} else {
|
||||
Write-Host " $_" -ForegroundColor Gray
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "[5] Error summary from this run" -ForegroundColor Yellow
|
||||
Write-Host "=" * 80 -ForegroundColor Gray
|
||||
|
||||
$recentErrors = Get-Content $logFile -Tail 100 | Select-String -Pattern "SCP ERROR|ERROR.*push|ERROR.*pull"
|
||||
|
||||
if ($recentErrors) {
|
||||
$errorCount = ($recentErrors | Measure-Object).Count
|
||||
Write-Host "[FOUND] $errorCount error(s) in recent log:" -ForegroundColor Red
|
||||
Write-Host ""
|
||||
|
||||
# Group similar errors
|
||||
$errorGroups = $recentErrors | Group-Object {
|
||||
if ($_ -match "SCP ERROR.*: (.+)") { $matches[1] }
|
||||
else { $_ }
|
||||
} | Sort-Object Count -Descending
|
||||
|
||||
foreach ($group in $errorGroups | Select-Object -First 5) {
|
||||
Write-Host " [$($group.Count)x] $($group.Name)" -ForegroundColor Red
|
||||
}
|
||||
|
||||
if ($errorGroups.Count -gt 5) {
|
||||
Write-Host " ... and $($errorGroups.Count - 5) more error types" -ForegroundColor Yellow
|
||||
}
|
||||
} else {
|
||||
Write-Host "[SUCCESS] No errors found in this sync run!" -ForegroundColor Green
|
||||
}
|
||||
}
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "=== Sync Trigger Complete ===" -ForegroundColor Cyan
|
||||
Reference in New Issue
Block a user