Created
April 2, 2024 14:08
-
-
Save AlexAtkinson/3c1dac858d81a71f317c30a72fc4ac52 to your computer and use it in GitHub Desktop.
PS1 From The Past: Nagios DHCP Failover Check
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# ---------------------------------------------------------------------- | |
# File: check_failover_dhcp.ps1 | |
# Description: NRPE Nagios Check for Windows Server 2012 DHCP Failover Servers | |
# https://exchange.nagios.org/directory/Plugins/Network-Protocols/DHCP-and-BOOTP/Windows-2012-DHCP-Failover-and-Scope-Health-Check/details | |
# | |
# Checks: Failover State | |
# Failover Mode | |
# Scope State of Each Scope | |
# Scope Statistics (PercentInUse) of Each Scope | |
# | |
# Required: Windows Server 2012 with the following Cmdlets | |
# Get-DhcpServerv4Failover | |
# Get-DhcpServerv4Scope | |
# Get-DhcpServerv4ScopeStatistics | |
# | |
# Notes: - Reports only the highest value exit code to Nagios | |
# - Does not support exit code 3 (Unknown) | |
# - Unknown IS critical for DHCP services (In my case anyway) | |
# - This script can easily be broken out into separate checks | |
# - If this is done, support for exit code 3 can easily be added | |
# | |
# Variables: - Set $DesiredFailoverMode according to your Failover implementation | |
# - Set $ScopePercentInUse_LowWarning and $ScopePercentInUse_LowCritical | |
# to "-1" to disable alerting on low use. | |
# - Disabled by default. | |
# - Set $ScopePercentInUse_HighWarning and $ScopePercentInUse_HighCritical | |
# to "101" to disable alerting on high use. | |
# | |
# ---------------------------------------------------------------------- | |
# Author: Alex Atkinson | |
# Date: June 9, 2014 | |
# Modified: June 11, 2014 | |
# Version: 1.1 | |
# ---------------------------------------------------------------------- | |
# ---------------------------------------------------------------------- | |
# Sanity Checks | |
# ---------------------------------------------------------------------- | |
$exitcode = 0 | |
# Enssure Script Runs Only On Windows Server 2012 Hosts | |
if (!($((Get-WmiObject -class Win32_OperatingSystem).Caption) -like "*Windows Server 2012*")){ | |
Write-Host "Error: Host not running Windows Server 2012" | |
} | |
# Ensure Required Cmdlets Are Available | |
$RequiredCmdlets = @( | |
"Get-DhcpServerv4Failover", | |
"Get-DhcpServerv4Scope", | |
"Get-DhcpServerv4ScopeStatistics" | |
) | |
$ExitCodeInc = 1 | |
ForEach ( $Cmdlet in $RequiredCmdlets ) { | |
$CmdletExitCodeVar = "CmdletExitCode" + $ExitCodeInc | |
Get-Command $Cmdlet 2>&1 | Out-Null | |
if ( $? -ne "True" ) { | |
Write-Host "ERROR: Missing Cmdlet -"$Cmdlet | |
$CmdletExitCode = 2 | |
} | |
if (( $CmdletExitCode -eq 0 ) -and ( $exitcode -eq 0 )) { $exitcode = 0 } | |
if (( $CmdletExitCode -eq 1 ) -and ( $exitcode -le 1 )) { $exitcode = 1 } | |
if (( $CmdletExitCode -eq 2 ) -and ( $exitcode -le 2 )) { $exitcode = 2 } | |
$ExitCodeInc++ | |
} | |
# Exit If Sanity Failed | |
if ( $exitcode -ne 0 ) { exit $exitcode } | |
# ---------------------------------------------------------------------- | |
# Variables | |
# ---------------------------------------------------------------------- | |
$DesiredFailoverMode = "LoadBalance" | |
$DesiredFailoverState = "Normal" | |
$DesiredScopeState = "Active" | |
$ScopePercentInUse_LowWarning = "-1" | |
$ScopePercentInUse_LowCritical = "-1" | |
$ScopePercentInUse_HighWarning = "90" | |
$ScopePercentInUse_HighCritical = "95" | |
$FailoverOutput = Get-DhcpServerv4Failover | Select-Object Mode, State, ServerType, PartnerServer | |
$ScopeOutput = Get-DhcpServerv4Scope | Select-Object Name, State | |
$ScopeStatsOutput = Get-DhcpServerv4ScopeStatistics | Select-Object ScopeID, Free, InUse, Pending, PercentageInUse | |
# ---------------------------------------------------------------------- | |
# Main Operations | |
# ---------------------------------------------------------------------- | |
# Check Failover State | |
if ( $FailoverOutput.State -eq $DesiredFailoverState ) { | |
Write-Host "OK: Failover state is" $FailoverOutput.State | |
$FailoverStateExitCode = 0 | |
} | |
elseif ( $Output.State -ne $DesiredFailoverState ) { | |
if ( $FailoverOutput.State -eq $Null ) { | |
Write-Host "CRITICAL: Failover state NOT returned!" | |
$FailoverStateExitCode = 2 | |
} | |
else { | |
Write-Host "CRITICAL: Failover state is" $FailoverOutput.State | |
$FailoverStateExitCode = 2 | |
} | |
} | |
if (( $FailoverStateExitCode -eq 0 ) -and ( $exitcode -eq 0 )) { $exitcode = 0 } | |
if (( $FailoverStateExitCode -eq 1 ) -and ( $exitcode -le 1 )) { $exitcode = 1 } | |
if (( $FailoverStateExitCode -eq 2 ) -and ( $exitcode -le 2 )) { $exitcode = 2 } | |
# Check Failover Mode | |
if ( $FailoverOutput.Mode -eq $DesiredFailoverMode ) { | |
Write-Host "OK: Failover mode is" $FailoverOutput.Mode | |
$FailoverModeExitCode = 0 | |
} | |
elseif ( $FailoverOutput.Mode -ne $DesiredFailoverMode ) { | |
if ( $FailoverOutput.Mode -eq $Null ) { | |
Write-Host "CRITICAL: Failover mode NOT returned!" | |
$FailoverModeExitCode = 2 | |
} | |
else { | |
Write-Host "CRITICAL: Failover mode is" $FailoverOutput.Mode | |
$FailoverModeExitCode = 2 | |
} | |
} | |
if (( $FailoverModeExitCode -eq 0 ) -and ( $exitcode -eq 0 )) { $exitcode = 0 } | |
if (( $FailoverModeExitCode -eq 1 ) -and ( $exitcode -le 1 )) { $exitcode = 1 } | |
if (( $FailoverModeExitCode -eq 2 ) -and ( $exitcode -le 2 )) { $exitcode = 2 } | |
# Check Scope States | |
$ExitCodeInc = 1 | |
ForEach ( $Scope in $ScopeOutput ) { | |
$ScopeName = $Scope.Name | |
$ScopeState = $Scope.State | |
$StateExitCodeVar = "StateExitCode" + $ExitCodeInc | |
if ( $ScopeState -eq $DesiredScopeState ) { | |
Write-Host "OK:"$ScopeName "is" $DesiredScopeState | |
$StateExitCode = 0 | |
} | |
elseif ( $ScopeState -ne $DesiredScopeState ) { | |
if ( $ScopeState -eq $Null ) { | |
Write-Host "CRITICAL: Scope state NOT returned!" | |
$StateExitCode = 2 | |
} | |
else { | |
Write-Host "CRITICAL: Scope is" $ScopeState | |
$StateExitCode = 2 | |
} | |
} | |
if (( $StateExitCode -eq 0 ) -and ( $exitcode -eq 0 )) { $exitcode = 0 } | |
if (( $StateExitCode -eq 1 ) -and ( $exitcode -le 1 )) { $exitcode = 1 } | |
if (( $StateExitCode -eq 2 ) -and ( $exitcode -le 2 )) { $exitcode = 2 } | |
$ExitCodeInc++ | |
} | |
# Check Scope Statistics | |
$ExitCodeInc = 1 | |
ForEach ( $Stat in $ScopeStatsOutput ) { | |
$StatScopeID = $Stat.ScopeID | |
$StatFree = $Stat.Free | |
$StatInUse = $Stat.InUse | |
$StatPending = $Stat.Pending | |
$StatPercentInUse = $Stat.PercentageInUse | |
$StatExitCodeVar = "StatExitCode" + $ExitCodeInc | |
if (( $StatPercentInUse -lt $ScopePercentInUse_HighWarning ) -and ( $StatPercentInUse -gt $ScopePercentInUse_LowWarning )) { | |
Write-Host "OK: Scope" $StatScopeID "use is" $StatPercentInUse"%" | |
$StatExitCode = 0 | |
} | |
elseif (( $StatPercentInUse -ge $ScopePercentInUse_HighWarning ) -and ( $StatPercentInUse -lt $ScopePercentInUse_HighCritical )) { | |
Write-Host "WARNING: Scope" $StatScopeID "use is" $StatPercentInUse"%" | |
$StatExitCode = 1 | |
} | |
elseif ( $StatPercentInUse -ge $ScopePercentInUse_HighCritical ) { | |
Write-Host "CRITICAL: Scope " $StatScopeID "use is" $StatPercentInUse"%" | |
$StatExitCode = 2 | |
} | |
elseif (( $StatPercentInUse -le $ScopePercentInUse_LowWarning ) -and ( $StatPercentInUse -gt $ScopePercentInUse_LowCritical )) { | |
Write-Host "WARNING: Scope" $StatScopeID "use is" $StatPercentInUse"%" | |
$StatExitCode = 1 | |
} | |
elseif ( $StatPercentInUse -le $ScopePercentInUse_LowCritical ) { | |
Write-Host "CRITICAL: Scope " $StatScopeID "use is" $StatPercentInUse"%" | |
$StatExitCode = 2 | |
} | |
elseif ( $StatPercentInUse -eq $Null ) { | |
Write-Host "CRITICAL: Scope usage NOT returned!" | |
$StatExitCode = 2 | |
} | |
if (( $StatExitCode -eq 0 ) -and ( $exitcode -eq 0 )) { $exitcode = 0 } | |
if (( $StatExitCode -eq 1 ) -and ( $exitcode -le 1 )) { $exitcode = 1 } | |
if (( $StatExitCode -eq 2 ) -and ( $exitcode -le 2 )) { $exitcode = 2 } | |
$ExitCodeInc++ | |
} | |
exit $exitcode |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment