mirror of
https://github.com/Icinga/icinga-powershell-framework.git
synced 2025-12-21 15:19:58 -05:00
94 lines
3.4 KiB
PowerShell
94 lines
3.4 KiB
PowerShell
function Invoke-IcingaInternalServiceCall()
|
|
{
|
|
param (
|
|
[string]$Command = '',
|
|
[hashtable]$Arguments = @{ },
|
|
[switch]$NoExit = $FALSE
|
|
);
|
|
|
|
# If our Framework is running as daemon, never call our api
|
|
if ($Global:Icinga.Protected.RunAsDaemon) {
|
|
return $NULL;
|
|
}
|
|
|
|
# If the API forward feature is disabled, do nothing
|
|
if ((Get-IcingaFrameworkApiChecks) -eq $FALSE) {
|
|
return $NULL;
|
|
}
|
|
|
|
# Test our Icinga for Windows service. If the service is not installed or not running, execute the plugin locally
|
|
$IcingaForWindowsService = (Get-Service 'icingapowershell' -ErrorAction SilentlyContinue);
|
|
|
|
if ($null -eq $IcingaForWindowsService -Or $IcingaForWindowsService.Status -ne 'Running') {
|
|
return $NULL;
|
|
}
|
|
|
|
# In case the REST-Api module ist not configured, do nothing
|
|
$BackgroundDaemons = Get-IcingaBackgroundDaemons;
|
|
|
|
if ($null -eq $BackgroundDaemons -Or $BackgroundDaemons.ContainsKey('Start-IcingaWindowsRESTApi') -eq $FALSE) {
|
|
return $NULL;
|
|
}
|
|
|
|
$RestApiPort = 5668;
|
|
[int]$Timeout = 120;
|
|
$Daemon = $BackgroundDaemons['Start-IcingaWindowsRESTApi'];
|
|
|
|
# Fetch our deamon configuration
|
|
if ($Daemon.ContainsKey('-Port')) {
|
|
$RestApiPort = $Daemon['-Port'];
|
|
} elseif ($Daemon.ContainsKey('Port')) {
|
|
$RestApiPort = $Daemon['Port'];
|
|
}
|
|
if ($Daemon.ContainsKey('-Timeout')) {
|
|
$Timeout = $Daemon['-Timeout'];
|
|
} elseif ($Daemon.ContainsKey('Timeout')) {
|
|
$Timeout = $Daemon['Timeout'];
|
|
}
|
|
|
|
Set-IcingaTLSVersion;
|
|
Enable-IcingaUntrustedCertificateValidation -SuppressMessages;
|
|
|
|
# Now queue the check inside our REST-Api
|
|
try {
|
|
$ApiResult = Invoke-WebRequest -Method POST -UseBasicParsing -Uri ([string]::Format('https://localhost:{0}/v1/checker?command={1}', $RestApiPort, $Command)) -Body (ConvertTo-JsonUTF8Bytes -InputObject $Arguments -Depth 100 -Compress) -ContentType 'application/json' -TimeoutSec $Timeout;
|
|
} catch {
|
|
# Fallback to execute plugin locally
|
|
Write-IcingaEventMessage -Namespace 'Framework' -EventId 1553 -ExceptionObject $_ -Objects $Command, $Arguments;
|
|
return $NULL;
|
|
}
|
|
|
|
# Resolve our result from the API
|
|
$IcingaResult = ConvertFrom-JsonUTF8 -InputObject $ApiResult.Content;
|
|
$IcingaCR = '';
|
|
|
|
# In case we didn't receive a check result, fallback to local execution
|
|
if ([string]::IsNullOrEmpty($IcingaResult.$Command.checkresult)) {
|
|
Write-IcingaEventMessage -Namespace 'Framework' -EventId 1553 -Objects 'The check result for the executed command was empty', $Command, $Arguments;
|
|
return $NULL;
|
|
}
|
|
|
|
if ([string]::IsNullOrEmpty($IcingaResult.$Command.exitcode)) {
|
|
Write-IcingaEventMessage -Namespace 'Framework' -EventId 1553 -Objects 'The check result for the executed command was empty', $Command, $Arguments;
|
|
return $NULL;
|
|
}
|
|
|
|
$IcingaCR = ($IcingaResult.$Command.checkresult.Replace("`r`n", "`n"));
|
|
|
|
if ($IcingaResult.$Command.perfdata.Count -ne 0) {
|
|
$IcingaCR += ' | ';
|
|
foreach ($perfdata in $IcingaResult.$Command.perfdata) {
|
|
$IcingaCR += $perfdata;
|
|
}
|
|
}
|
|
|
|
if ($NoExit) {
|
|
Set-IcingaInternalPluginExitCode -ExitCode $IcingaResult.$Command.exitcode;
|
|
|
|
return $IcingaCR;
|
|
}
|
|
|
|
# Print our response and exit with the provide exit code
|
|
Write-IcingaConsolePlain $IcingaCR;
|
|
exit $IcingaResult.$Command.exitcode;
|
|
}
|