From 9b6941c4b9bd396b1d75ce8e015d0057610f6c10 Mon Sep 17 00:00:00 2001 From: Christian Stein Date: Fri, 7 Feb 2020 11:06:57 +0100 Subject: [PATCH] Fixes exceptions during interface discovery Fix #38 --- .../tools/ConvertTo-IcingaIPBinaryString.psm1 | 21 +++++-------- .../ConvertTo-IcingaIPv4BinaryString.psm1 | 30 +++++++++++-------- .../tools/Get-IcingaNetworkInterface.psm1 | 12 +++++++- 3 files changed, 37 insertions(+), 26 deletions(-) diff --git a/lib/core/tools/ConvertTo-IcingaIPBinaryString.psm1 b/lib/core/tools/ConvertTo-IcingaIPBinaryString.psm1 index 7f7bd8f..d21db80 100644 --- a/lib/core/tools/ConvertTo-IcingaIPBinaryString.psm1 +++ b/lib/core/tools/ConvertTo-IcingaIPBinaryString.psm1 @@ -22,21 +22,16 @@ function ConvertTo-IcingaIPBinaryString() { param( - [string]$IP + $IP ); - $IPArray = $IP.Split(' '); - $IPList = @(); - - foreach ($entry in $IPArray) { - if ($entry -like '*.*') { - $IPList += ConvertTo-IcingaIPv4BinaryString -IP $entry; - } elseif ($entry -like '*:*') { - $IPList += ConvertTo-IcingaIPv6BinaryString -IP $entry; - } else { - return 'Invalid IP was provided!'; - } + if ($IP -like '*.*') { + $IP = ConvertTo-IcingaIPv4BinaryString -IP $IP; + } elseif ($IP -like '*:*') { + $IP = ConvertTo-IcingaIPv6BinaryString -IP $IP; + } else { + return 'Invalid IP was provided!'; } - return $IPList; + return $IP; } diff --git a/lib/core/tools/ConvertTo-IcingaIPv4BinaryString.psm1 b/lib/core/tools/ConvertTo-IcingaIPv4BinaryString.psm1 index a6c9133..dfeb0a2 100644 --- a/lib/core/tools/ConvertTo-IcingaIPv4BinaryString.psm1 +++ b/lib/core/tools/ConvertTo-IcingaIPv4BinaryString.psm1 @@ -21,18 +21,24 @@ function ConvertTo-IcingaIPv4BinaryString() { - param( - [string]$IP - ); + param( + [string]$IP + ); - $IP = $IP -split '\.' | ForEach-Object { - [System.Convert]::ToString($_, 2).PadLeft(8, '0'); - } - $IP = $IP -join ''; - $IP = $IP -replace '\s',''; - - return @{ - 'value' = $IP; - 'name' = 'IPv4' + try { + $IP = $IP -split '\.' | ForEach-Object { + [System.Convert]::ToString($_, 2).PadLeft(8, '0'); + } + $IP = $IP -join ''; + $IP = $IP -replace '\s',''; + } catch { + # Todo: Should we handle errors? It might happen due to faulty routes or unhandled route config + # we throw errors which should have no effect at all + return $null; + } + + return @{ + 'value' = $IP; + 'name' = 'IPv4' } } diff --git a/lib/core/tools/Get-IcingaNetworkInterface.psm1 b/lib/core/tools/Get-IcingaNetworkInterface.psm1 index 7a962b7..ad72151 100644 --- a/lib/core/tools/Get-IcingaNetworkInterface.psm1 +++ b/lib/core/tools/Get-IcingaNetworkInterface.psm1 @@ -113,11 +113,21 @@ function Get-IcingaNetworkInterface() foreach ($destinationIP in $IPBinStringMaster) { [string]$RegexPattern = [string]::Format("^.{{{0}}}", $Route.Value.Mask); [string]$ToBeMatched = $Route.Value."Binary IP String"; + if ($null -eq $ToBeMatched) { + continue; + } + $Match1=[regex]::Matches($ToBeMatched, $RegexPattern).Value; $Match2=[regex]::Matches($destinationIP.Value, $RegexPattern).Value; If ($Match1 -like $Match2) { - $ExternalInterface = ((Get-NetIPAddress -InterfaceIndex $Route.Value.Interface -AddressFamily $destinationIP.Name).IPAddress); + $ExternalInterface = ((Get-NetIPAddress -InterfaceIndex $Route.Value.Interface -AddressFamily $destinationIP.Name -ErrorAction SilentlyContinue).IPAddress); + + # If no interface was found -> skip this entry + if ($null -eq $ExternalInterface) { + continue; + } + if ($ExternalInterfaces.ContainsKey($ExternalInterface)) { $ExternalInterfaces[$ExternalInterface].count += 1; } else {