Compare commits

..

No commits in common. "cccd7ca3d69d7d32434ee4f3209e6d343c80f293" and "4a8fff43841495cc225a4f4f9445934983ccad6c" have entirely different histories.

View File

@ -1,37 +1,30 @@
<# <#
#> #>
[CmdletBinding()]
param param
( (
# Array of strings listing computer name(s) to wake up. Names will be matched using RegEx # Array of strings listing computer name(s) to wake up. Names will be matched using RegEx
[Alias("Computer")] [Alias("Computer")]
[String[]] [String[]]
$TargetComputer = "", $TargetComputer = "",
# XML database file containing computer details (Default: WOLDatabase.xml) # XML database file containing computer details
[Alias("List", "Database")] [Alias("List", "database", "db")]
[String] [String]
$WolDatabase = "WOLDatabase.xml", $WolDatabase = "WOLDatabase.xml",
# Skip connectivity check # Skip connectivity readiness check
[Alias("NoCheck", "NoReadiness")] [Alias("NoCheck", "NoReadiness")]
[Switch] [Switch]
$NoConnectivityCheck, $NoConnectivityCheck = $false,
# Delay before running first connectivity check (Default: 10) # Initial wait period in seconds before first connectivity check
[Alias("Delay")]
[Int] [Int]
$ConnectivityCheckDelay = 10, $WaitBeforeConnectivityCheck = 10,
# Seconds before aborting connectivity check (Default: 300) # connectivity readiness check total timeout
[Alias("Timeout")]
[Int] [Int]
$ConnectivityCheckTimeout = 300, $Timeout = 300,
# Seconds between connectivity checks (Default: 30) # connectivity readiness port to check
[Alias("Interval")]
[Int]
$ConnectivityCheckInterval = 30,
# Port to use for connectivity check (Default: 3389-RDP)
[Alias("CheckPort")] [Alias("CheckPort")]
[Int] [Int]
$ConnectivityCheckPort = 3389 $ConnectivityPort = 3389
) )
function exitError($errMessage, $PSItem, $exitCode = 1) function exitError($errMessage, $PSItem, $exitCode = 1)
@ -91,14 +84,14 @@ if ( [String]::IsNullOrWhiteSpace($TargetComputer))
Write-Host Write-Host
# read database and assemble list of target computers # read database and assemble list of target computers
[xml]$wolDb = Get-Content -Path $WolDatabase [xml]$db = Get-Content -Path $WolDatabase
$broadcastIP = $wolDb.WOLDatabase.Configuration.BroadcastAddress $broadcastIP = $db.WOLDatabase.Configuration.BroadcastAddress
$port = $wolDb.WOLDatabase.Configuration.Port $port = $db.WOLDatabase.Configuration.Port
$dnsSuffix = $wolDb.WOLDatabase.Configuration.DnsSuffix $dnsSuffix = $db.WOLDatabase.Configuration.DnsSuffix
$targetComputers = [System.Collections.Generic.List[PSObject]]::new() $targetComputers = [System.Collections.Generic.List[PSObject]]::new()
$TargetComputer | ForEach-Object { $TargetComputer | ForEach-Object {
$tgt = $_ $tgt = $_
$wolDb.WOLDatabase.Computers.Computer | Where-Object { $_.name -match $tgt } | ForEach-Object { $targetComputers.Add($_) } $db.WOLDatabase.Computers.Computer | Where-Object { $_.name -match $tgt } | ForEach-Object { $targetComputers.Add($_) }
} }
$removeFromTargetComputers = [System.Collections.Generic.List[String]]::new() $removeFromTargetComputers = [System.Collections.Generic.List[String]]::new()
@ -132,7 +125,6 @@ $targetComputers | ForEach-Object {
else else
{ {
Write-Host -ForegroundColor Red "[ERROR]" Write-Host -ForegroundColor Red "[ERROR]"
# queue for removal from computers on which to run a connectivity check
$removeFromTargetComputers.Add($name) $removeFromTargetComputers.Add($name)
} }
} }
@ -151,27 +143,22 @@ if ($NoConnectivityCheck)
} }
elseif ($targetComputers.Count -eq 0) elseif ($targetComputers.Count -eq 0)
{ {
exitError "No wake-up packets sent successfully" -exitCode 5 exitError "No successful wake-up packets sent" -exitCode 5
} }
# wait for initial delay seconds to let computer(s) wake up # wait for initialWaitTime seconds to let computer(s) wake up
for ($i = $ConnectivityCheckDelay; $i -gt 0; $i--) { for ($i = $WaitBeforeConnectivityCheck; $i -gt 0; $i--) {
Write-Progress -Activity "Waiting for computer(s) to wake-up..." -SecondsRemaining $i Write-Progress -Activity "Waiting for computer(s) to wake-up..." -SecondsRemaining $i
Start-Sleep 1 Start-Sleep 1
} }
Write-Progress -Activity "Waiting for computer(s) to wake-up..." -Completed Write-Progress -Activity "Waiting for computer(s) to wake-up..." -Completed
# iterate computers and test connectivity # iterate computers and test connectivity
# TODO: run connectivity test as background job $targetComputers | ForEach-Object {
$connCheckTotalTime = 0
$removeFromTargetComputers.Clear()
do
{
$targetComputers | ForEach-Object {
$name = $_.name $name = $_.name
$friendlyName = $_.friendlyName $friendlyName = $_.friendlyName
$fqdn = -join ($name, $dnsSuffix) $fqdn = -join ($name, $dnsSuffix)
$connectionError = @() $connectionError = ""
if ( [String]::IsNullOrWhiteSpace($friendlyName)) if ( [String]::IsNullOrWhiteSpace($friendlyName))
{ {
@ -181,48 +168,16 @@ do
{ {
Write-Host "Testing connection readiness of '$friendlyName'... " -NoNewline Write-Host "Testing connection readiness of '$friendlyName'... " -NoNewline
} }
if (!(Test-NetConnection -ComputerName $fqdn -Port $ConnectivityCheckPort -InformationLevel Quiet -WarningAction SilentlyContinue -ErrorAction SilentlyContinue -ErrorVariable +connectionError)) if (!(Test-NetConnection -ComputerName $fqdn -Port $ConnectivityPort -InformationLevel Quiet -WarningAction SilentlyContinue -ErrorAction SilentlyContinue -ErrorVariable connectionError))
{ {
if (($connCheckTotalTime + $ConnectivityCheckInterval) -gt $ConnectivityCheckTimeout)
{
# last iteration, display 'error'
Write-Host -ForegroundColor Red "[ERROR]" Write-Host -ForegroundColor Red "[ERROR]"
$connectionError | ForEach-Object { Write-Host -ForegroundColor Red "`tAdditional information:", $connectionError[-1].ToString()
$errMsg = $_.ToString()
Write-Verbose "`t(Additional information: $errMsg)"
}
}
else
{
# more iterations pending, display 'retrying'
Write-Host -ForegroundColor Yellow "[RETRYING]"
}
} }
else else
{ {
Write-Host -ForegroundColor Green "[OK]" Write-Host -ForegroundColor Green "[OK]"
# queue for removal from computers to check next round
$removeFromTargetComputers.Add($name)
} }
} }
# remove computers from targetComputers if connectivity check already successful
$removeFromTargetComputers | ForEach-Object {
$removeName = $_
$targetComputers.Remove(($targetComputers | Where-Object { $_.name -eq $removeName })) | Out-Null
}
# sleep until next test interval and increase time counter
$connCheckTotalTime += $ConnectivityCheckInterval
if ($connCheckTotalTime -le $ConnectivityCheckTimeout -and $targetComputers.Count -gt 0)
{
for ($i = $ConnectivityCheckInterval; $i -gt 0; $i--) {
Write-Progress -Activity "Waiting for next connectivity check..." -SecondsRemaining $i
Start-Sleep 1
}
Write-Progress -Activity "Waiting for next connectivity check..." -Completed
}
} while ($connCheckTotalTime -le $ConnectivityCheckTimeout -and $targetComputers.Count -gt 0)
# exit gracefully # exit gracefully
exitGracefully exitGracefully