-
Notifications
You must be signed in to change notification settings - Fork 32
Expand file tree
/
Copy pathInvoke-IcingaInternalServiceCall.psm1
More file actions
103 lines (82 loc) · 3.82 KB
/
Invoke-IcingaInternalServiceCall.psm1
File metadata and controls
103 lines (82 loc) · 3.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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'];
}
# In case we are using SecureStrings for credentials, we have to convert them back to regular strings
# before pushing them to the REST-Api
[array]$CommandArguments = $Arguments.Keys;
foreach ($arg in $CommandArguments) {
$Value = $Arguments[$arg];
if ($Value -Is [SecureString]) {
$Arguments[$arg] = ConvertFrom-IcingaSecureString -SecureString $Value;
}
}
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 = [string]::Format('{0}{1}| {2}', $IcingaCR, "`r`n", ([string]::Join(' ', $IcingaResult.$Command.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;
}