From b34f539d01137dfc3e70e2b421b54bfc0512e9b4 Mon Sep 17 00:00:00 2001 From: Lord Hepipud Date: Fri, 13 Sep 2019 19:04:27 +0200 Subject: [PATCH] Added first draft for permission exception handling --- .../Exit-IcingaMissingPermission.psm1 | 36 +++++++++++++++++++ .../Icinga_IcingaExceptionEnums.psm1 | 22 ++++++++++++ lib/plugins/Invoke-IcingaCheckCPU.psm1 | 3 ++ 3 files changed, 61 insertions(+) create mode 100644 lib/icinga/exception/Exit-IcingaMissingPermission.psm1 create mode 100644 lib/icinga/exception/Icinga_IcingaExceptionEnums.psm1 diff --git a/lib/icinga/exception/Exit-IcingaMissingPermission.psm1 b/lib/icinga/exception/Exit-IcingaMissingPermission.psm1 new file mode 100644 index 0000000..bf1a066 --- /dev/null +++ b/lib/icinga/exception/Exit-IcingaMissingPermission.psm1 @@ -0,0 +1,36 @@ +Import-IcingaLib icinga\enums; +Import-IcingaLib icinga\exception; + +function Exit-IcingaMissingPermission() +{ + param( + [string]$Input, + [string]$StringPattern, + [string]$CustomMessage, + [string]$ExeptionType + ); + + if ($null -eq $Input -Or [string]::IsNullOrEmpty($Input)) { + return; + } + + if (-Not $Input.Contains($StringPattern)) { + return; + } + + $OutputMessage = '{0}: Icinga Permission Error was thrown: {3}{1}{1}{2}'; + if ([string]::IsNullOrEmpty($CustomMessage) -eq $TRUE) { + $OutputMessage = '{0}: Icinga Permission Error was thrown {1}{1}{2}{3}'; + } + + $OutputMessage = [string]::Format( + $OutputMessage, + $IcingaEnums.IcingaExitCodeText.($IcingaEnums.IcingaExitCode.Unknown), + "`r`n", + $ExeptionType, + $CustomMessage + ); + + Write-Host $OutputMessage; + exit $IcingaEnums.IcingaExitCode.Unknown; +} diff --git a/lib/icinga/exception/Icinga_IcingaExceptionEnums.psm1 b/lib/icinga/exception/Icinga_IcingaExceptionEnums.psm1 new file mode 100644 index 0000000..8e87c40 --- /dev/null +++ b/lib/icinga/exception/Icinga_IcingaExceptionEnums.psm1 @@ -0,0 +1,22 @@ +<# + # This script will provide 'Enums' we can use within our module to + # easier access constants and to maintain a better overview of the + # entire components + #> + + [hashtable]$Throw = @{ + PerformanceCounter = 'Icinga failed to fetch Performance Counter information. This may be caused when the Icinga Service User is not permited to access these information. To fix this, please add the User the Icinga Agent is running on into the "Performance Log Users" group.'; +}; + +<# + # Once we defined a new enum hashtable above, simply add it to this list + # to make it available within the entire module. + # + # Example usage: + # $IcingaExceptionEnums.IcingaExecptionHandlers.PerformanceCounter + #> +[hashtable]$IcingaExceptions = @{ + Throw = $Throw; +} + +Export-ModuleMember -Variable @( 'IcingaExceptions' ); diff --git a/lib/plugins/Invoke-IcingaCheckCPU.psm1 b/lib/plugins/Invoke-IcingaCheckCPU.psm1 index 0df4075..33f4191 100644 --- a/lib/plugins/Invoke-IcingaCheckCPU.psm1 +++ b/lib/plugins/Invoke-IcingaCheckCPU.psm1 @@ -1,5 +1,6 @@ Import-IcingaLib core\perfcounter; Import-IcingaLib icinga\plugin; +Import-IcingaLib icinga\exception; function Invoke-IcingaCheckCPU() { @@ -14,6 +15,8 @@ function Invoke-IcingaCheckCPU() $CpuCounter = New-IcingaPerformanceCounter -Counter ([string]::Format('\Processor({0})\% processor time', $Core)); $CpuPackage = New-IcingaCheckPackage -Name 'CPU Load' -OperatorAnd -Verbos $Verbose; + Exit-IcingaMissingPermission -Input $CpuCounter.ErrorMessage -StringPattern '"Global"' -ExeptionType $IcingaExceptions.Throw.PerformanceCounter; + if ($CpuCounter.Counters.Count -ne 0) { foreach ($counter in $CpuCounter.Counters) { $IcingaCheck = New-IcingaCheck -Name ([string]::Format('Core #{0}', $counter.Instance)) -Value $counter.Value().Value -Unit '%';