From e17adcce54af03e980f6a3d5371c1dcc1de5c721 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 6 Jun 2023 14:52:32 +0200 Subject: [PATCH 1/2] Get-IcingaCheckCommandConfig: provide vars.ifw_api_arguments in each command to properly support just importing the ifw-api command. That command e.g. takes DSL/JSON arrays [], not PS ones @(). Similar with strings. Therefore set vars.ifw_api_arguments as ifw-api expects. --- lib/core/tools/Get-IcingaCheckCommandConfig.psm1 | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/core/tools/Get-IcingaCheckCommandConfig.psm1 b/lib/core/tools/Get-IcingaCheckCommandConfig.psm1 index 2faee4f..fc75cbc 100644 --- a/lib/core/tools/Get-IcingaCheckCommandConfig.psm1 +++ b/lib/core/tools/Get-IcingaCheckCommandConfig.psm1 @@ -211,7 +211,9 @@ function Get-IcingaCheckCommandConfig() 'imports' = @( 'PowerShell Base' ); 'object_name' = $check; 'object_type' = 'object'; - 'vars' = @{ }; + 'vars' = @{ + 'ifw_api_arguments' = @{ }; + }; } ); @@ -313,6 +315,16 @@ function Get-IcingaCheckCommandConfig() ); } + if ($parameter.type.name -eq 'SwitchParameter') { + $Basket.Command[$check].vars.ifw_api_arguments.Add([string]::Format('-{0}', $parameter.Name), @{ + 'set_if' = $IcingaCustomVariable; + }); + } else { + $Basket.Command[$check].vars.ifw_api_arguments.Add([string]::Format('-{0}', $parameter.Name), @{ + 'value' = $IcingaCustomVariable; + }); + } + # Determine wether a parameter is required based on given syntax-information if ($parameter.required -eq $TRUE) { $Required = 'y'; From a11e6405d3f6013dc7be5ea703753e471d18d1ab Mon Sep 17 00:00:00 2001 From: Lord Hepipud Date: Fri, 30 Jun 2023 13:37:41 +0200 Subject: [PATCH 2/2] Adds docs and adds plain config writer for ifw-api support --- doc/100-General/10-Changelog.md | 6 +- .../30-API-Check-Forwarder.md | 108 ++++++++++++++++++ doc/300-Knowledge-Base.md | 1 + .../IWKB000015/01_stringescape.png | Bin 0 -> 12919 bytes .../IWKB000015/02_stringescaped_correctly.png | Bin 0 -> 10031 bytes .../02_ifw-api/01_powershell_base.png | Bin 0 -> 25609 bytes doc/knowledgebase/IWKB000015.md | 23 ++++ .../tools/Get-IcingaCheckCommandConfig.psm1 | 50 ++++++-- 8 files changed, 177 insertions(+), 11 deletions(-) create mode 100644 doc/images/04_knowledgebase/IWKB000015/01_stringescape.png create mode 100644 doc/images/04_knowledgebase/IWKB000015/02_stringescaped_correctly.png create mode 100644 doc/images/05_installation/02_ifw-api/01_powershell_base.png create mode 100644 doc/knowledgebase/IWKB000015.md diff --git a/doc/100-General/10-Changelog.md b/doc/100-General/10-Changelog.md index 9e5a604..360c541 100644 --- a/doc/100-General/10-Changelog.md +++ b/doc/100-General/10-Changelog.md @@ -21,11 +21,9 @@ Released closed milestones can be found on [GitHub](https://github.com/Icinga/ic ### Enhancements -* [#623](https://github.com/Icinga/icinga-powershell-framework/issues/623) Adds support to provide the Icinga service user written as `user@domain` - -### Enhancements - * [#619](https://github.com/Icinga/icinga-powershell-framework/pull/619) Adds feature to securely read enum provider values with new function `Get-IcingaProviderEnumData` +* [#623](https://github.com/Icinga/icinga-powershell-framework/issues/623) Adds support to provide the Icinga service user written as `user@domain` +* [#633](https://github.com/Icinga/icinga-powershell-framework/pull/633) Adds support for Icinga 2.14.0 native Icinga for Windows API communication ## 1.10.1 (2022-12-20) diff --git a/doc/110-Installation/30-API-Check-Forwarder.md b/doc/110-Installation/30-API-Check-Forwarder.md index 8247bd4..f9c4bb1 100644 --- a/doc/110-Installation/30-API-Check-Forwarder.md +++ b/doc/110-Installation/30-API-Check-Forwarder.md @@ -106,3 +106,111 @@ Enable-IcingaFrameworkApiChecks; ## EventLog Errors In case a check could not be executed by using this experimental feature, either because of timeouts or other issues, they are added with `EventId 1553` inside the EventLog for `Icinga for Windows`. A description on why the check could not be executed is added within the event output. + +## Icinga Communication to API + +With Icinga 2.14.0 and later, you can enable the Icinga Agent to natively communicate with the Icinga for Windows API, allowing checks being executed without having to start a PowerShell. + +This is a huge performance boost and should be **mandatory** on all Windows machines. + +To enable this feature, ensure you have **all** plugins updated by importing the latest version of the Icinga Director baskets or use the latest `.conf` files for Icinga provided by each plugin repository. + +Once your configuration is updated, you have to enable this feature. + +### Requirements + +* Icinga for Windows v1.11.0 or later +* Icinga Director v.1.11.0 or later +* Icinga 2.14.0 or later (at least master) + +### Icinga Director + +Navigate to `Icinga Director` and click on `Commands` -> `Commands` and search for `PowerShell Base`. + +Click on this CheckCommand and under the `Import` section add the check `ifw-api`. + +If the CheckCommand `ifw-api` does not exist, click on the `Icinga Director` on the menu and then `Icinga Infrastructure` -> `Kickstart Wizard` and then `Run Import` to import the latest CheckCommands shipped with Icinga. Please ensure you have updated to Icinga 2.14.0 or later on your master, otherwise this command is not available. + +You can verify that the `ifw-api` CheckCommand was installed by clicking on `Icinga Director` on the menu and then `Activity Log`. You should now see an entry like this: + +``` +[username] create command "ifw-api" +``` + +Now proceed with the previous step, to update the `PowerShell Base` to import the `ifw-api` CheckCommand. + +![Icinga Director IfW Api](../images/05_installation/02_ifw-api/01_powershell_base.png) + +Once you deploy the configuration, Icinga will communicate directly with the Icinga for Windows API, as long as on the Agent side 2.14.0 or later is installed. In case you are running an older version, Icinga will fall back to the previous handling and check the system either with or without API, depending on the configuration. + +### Icinga Plain Configuration + +Ensure you have updated to the latest version of Icinga and all `.conf` files for the Icinga for Windows CheckCommands are updated to the latest version. + +Afterwards navigate to the file containing your `PowerShell Base` CheckCommand and add the following line + +``` +import "ifw-api" +``` + +directly below `import "plugin-check-command"` + +**Note:** For backwards compatibility, if you didn't manage to update your entire environment (Master, Satellite and Agents) to v2.14.0 or later, you will have to deploy an additional check command on your global zones. This global configuration will create a dummy check-command `ifw-api`, ensuring the older Agents and Satellites older than 2.14.0 will not fail with a configuration error. Please read the section **`Global Zone Config`** for more details below. + +**Example:** + +``` +object CheckCommand "PowerShell Base" { + import "plugin-check-command" + import "ifw-api" + +... +``` + +Once modified, save the file and test your Icinga configuration with + +``` +icinga2 daemon -C +``` + +If the configuration is valid, restart your Icinga service + +``` +systemctl restart icinga2 +``` + +**Global Zone Config:** + +**This only applies in multi-version environments NOT using Icinga Director and not fully upgraded to v2.14.0**! + +Please validate your Icinga zones.conf for your global zone in (`/etc/icinga2/zones.conf`). There should be a zone configured as `global = true`, like `global-templates`. Please **DO NOT USE** `director-global`! + +In case your global zone is using the default `global-templates`, create a new file at the location + +`/etc/icinga2/zones.d/global-templates` + +with the name `ifw-fallback.conf` and add the following content: + +``` +if (! globals.System || ! System.get_template || ! get_template(CheckCommand, "ifw-api-check-command")) { + object CheckCommand "ifw-api" { + import "plugin-check-command" + } +} +``` + +Full path example: `/etc/icinga2/zones.d/global-templates/ifw-fallback.conf` + +Now validate your configuration and restart your master. + +``` +icinga2 daemon -C +``` + +If the configuration is valid, restart your Icinga service + +``` +systemctl restart icinga2 +``` + +Icinga will now communicate directly with the Icinga for Windows API, as long as on the Agent side 2.14.0 or later is installed. In case you are running an older version, Icinga will fall back to the previous handling and check the system either with or without API, depending on the configuration. diff --git a/doc/300-Knowledge-Base.md b/doc/300-Knowledge-Base.md index 8cac086..e671e00 100644 --- a/doc/300-Knowledge-Base.md +++ b/doc/300-Knowledge-Base.md @@ -22,3 +22,4 @@ For this reason you will find a list of Icinga knowledge base entries below. Ent | [IWKB000012](knowledgebase/IWKB000012.md) | Icinga for Windows cannot be used with Microsoft Defender: `Windows Defender Antivirus has detected malware or other potentially unwanted software` | | [IWKB000013](knowledgebase/IWKB000013.md) | The local Icinga Agent certificate seems not to be signed by our Icinga CA yet. Using this certificate for the REST-Api as example might not work yet. Please check the state of the certificate and complete the signing process if required | | [IWKB000014](knowledgebase/IWKB000014.md) | Installing or Updating Icinga for Windows causes error messages regarding `framework_cache.psm1` errors | +| [IWKB000015](knowledgebase/IWKB000015.md) | Got JSON, but not an object, from IfW API on host 'localhost' port '5668': "Exception while calling \\"Fill\\" with 1 arguments: \\"Invalid syntax near \\"`:`\\".\\"" | \ No newline at end of file diff --git a/doc/images/04_knowledgebase/IWKB000015/01_stringescape.png b/doc/images/04_knowledgebase/IWKB000015/01_stringescape.png new file mode 100644 index 0000000000000000000000000000000000000000..c58507e2e08b25bc7786a02ac4d9ad82d1d51b15 GIT binary patch literal 12919 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 literal 0 HcmV?d00001 diff --git a/doc/images/04_knowledgebase/IWKB000015/02_stringescaped_correctly.png b/doc/images/04_knowledgebase/IWKB000015/02_stringescaped_correctly.png new file mode 100644 index 0000000000000000000000000000000000000000..9a588c24d2cb58a216b9dbc762fdb0ac5bb3d1f2 GIT binary patch literal 10031 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 bUUuXEj$&hAR%@h(ddv}Z#v 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 literal 0 HcmV?d00001 diff --git a/doc/knowledgebase/IWKB000015.md b/doc/knowledgebase/IWKB000015.md new file mode 100644 index 0000000..07de93d --- /dev/null +++ b/doc/knowledgebase/IWKB000015.md @@ -0,0 +1,23 @@ +# Icinga Knowledge Base - IWKB000015 + +## Short Message + +Got JSON, but not an object, from IfW API on host 'localhost' port '5668': "Exception while calling \\"Fill\\" with 1 argument: \\"Invalid syntax near \\"`:`\\".\\"" + +## Example Exception + +Got JSON, but not an object, from IfW API on host 'localhost' port '5668': "Exception while calling \\"Fill\\" with 1 arguments: \\"Invalid syntax near \\"SQLServer:`\\".\\"" + +## Reason + +This issue is caused by using the native communication over the Icinga for Windows API with Icinga 2.14.0 or later, while using values for arguments manually escaped by the user with `''`: + +![String Escaping](../images/04_knowledgebase/IWKB000015/01_stringescape.png) + +## Solution + +Remove all added `' '` from your Icinga configuration, regardless if you are using the Icinga Director or plain Icinga configuration files. Latest Icinga for Windows versions, will escape and build strings properly anyway, even without the new Icinga communication feature. + +Once the `' '` are removed from your configuration, deploy your configuration and the check will run just fine. + +![String Escaped Correctly](../images/04_knowledgebase/IWKB000015/02_stringescaped_correctly.png) diff --git a/lib/core/tools/Get-IcingaCheckCommandConfig.psm1 b/lib/core/tools/Get-IcingaCheckCommandConfig.psm1 index fc75cbc..b2e08d9 100644 --- a/lib/core/tools/Get-IcingaCheckCommandConfig.psm1 +++ b/lib/core/tools/Get-IcingaCheckCommandConfig.psm1 @@ -213,7 +213,7 @@ function Get-IcingaCheckCommandConfig() 'object_type' = 'object'; 'vars' = @{ 'ifw_api_arguments' = @{ }; - }; + }; } ); @@ -316,14 +316,14 @@ function Get-IcingaCheckCommandConfig() } if ($parameter.type.name -eq 'SwitchParameter') { - $Basket.Command[$check].vars.ifw_api_arguments.Add([string]::Format('-{0}', $parameter.Name), @{ + $Basket.Command[$check].vars.ifw_api_arguments.Add([string]::Format('{0}', $parameter.Name), @{ 'set_if' = $IcingaCustomVariable; }); } else { - $Basket.Command[$check].vars.ifw_api_arguments.Add([string]::Format('-{0}', $parameter.Name), @{ + $Basket.Command[$check].vars.ifw_api_arguments.Add([string]::Format('{0}', $parameter.Name), @{ 'value' = $IcingaCustomVariable; }); - } + } # Determine wether a parameter is required based on given syntax-information if ($parameter.required -eq $TRUE) { @@ -626,11 +626,47 @@ function Write-IcingaPlainConfigurationFiles() # In case we pre-define custom variables, we should add them here if ($CheckCommand.vars.Count -ne 0) { - $IcingaConfig += New-IcingaNewLine; + $IcingaConfig += New-IcingaNewLine; + [bool]$AddNewLine = $FALSE; foreach ($var in $CheckCommand.vars.Keys) { - [string]$Value = $CheckCommand.vars[$var]; - $IcingaConfig += [string]::Format(' vars.{0} = {1}{2}', $var, $Value.ToLower(), (New-IcingaNewLine)); + if ($CheckCommand.vars[$var] -Is [Hashtable]) { + if ($AddNewLine) { + $IcingaConfig += New-IcingaNewLine; + } + [string]$HashtableArguments = ''; + [bool]$AddConfigNewLine = $FALSE; + foreach ($item in $CheckCommand.vars[$var].Keys) { + if ($AddConfigNewLine) { + $HashtableArguments += New-IcingaNewLine; + } + $HashtableArguments += [string]::Format(' "{0}" = {{{1}', $item, (New-IcingaNewLine)); + + if ($CheckCommand.vars[$var][$item] -Is [Hashtable]) { + foreach ($icingaconf in $CheckCommand.vars[$var][$item].Keys) { + [string]$Value = $CheckCommand.vars[$var][$item][$icingaconf]; + $HashtableArguments += [string]::Format(' {0} = "{1}"{2}', $icingaconf, $Value, (New-IcingaNewLine)); + } + } else { + [string]$Value = $CheckCommand.vars[$var][$item]; + $HashtableArguments += [string]::Format(' value = "{0}"{1}', $Value, (New-IcingaNewLine)); + } + $HashtableArguments += ' }'; + $AddConfigNewLine = $TRUE; + } + + $IcingaConfig += [string]::Format(' vars.{0} = {{{1}', $var, (New-IcingaNewLine)); + $IcingaConfig += [string]::Format('{0}{1}', $HashtableArguments, (New-IcingaNewLine)); + $IcingaConfig += ' }'; + $AddNewLine = $TRUE; + } else { + if ($AddNewLine) { + $IcingaConfig += New-IcingaNewLine; + $AddNewLine = $FALSE; + } + [string]$Value = $CheckCommand.vars[$var]; + $IcingaConfig += [string]::Format(' vars.{0} = {1}{2}', $var, $Value.ToLower(), (New-IcingaNewLine)); + } } } else { $IcingaConfig += New-IcingaNewLine;