From 224a1b56595f114e0a62e79332eb5bd850f5d5a3 Mon Sep 17 00:00:00 2001 From: Lord Hepipud Date: Wed, 13 May 2020 14:50:11 +0200 Subject: [PATCH 1/3] Adds defaults to certain steps and FQDN to IP conversion --- .../misc/Start-IcingaAgentInstallWizard.psm1 | 35 +++++++++-- .../tools/Convert-IcingaEndpointsToIP.psm1 | 60 +++++++++++++++++++ 2 files changed, 89 insertions(+), 6 deletions(-) create mode 100644 lib/core/tools/Convert-IcingaEndpointsToIP.psm1 diff --git a/lib/core/icingaagent/misc/Start-IcingaAgentInstallWizard.psm1 b/lib/core/icingaagent/misc/Start-IcingaAgentInstallWizard.psm1 index 81e3551..c9777e8 100644 --- a/lib/core/icingaagent/misc/Start-IcingaAgentInstallWizard.psm1 +++ b/lib/core/icingaagent/misc/Start-IcingaAgentInstallWizard.psm1 @@ -16,6 +16,7 @@ function Start-IcingaAgentInstallWizard() $AcceptConnections = $null, [array]$Endpoints = @(), [array]$EndpointConnections = @(), + $ConvertEndpointIPConfig = $null, [string]$ParentZone, [array]$GlobalZones = $null, [string]$CAEndpoint, @@ -218,7 +219,7 @@ function Start-IcingaAgentInstallWizard() if ($UpdateAgent -eq 1) { if ([string]::IsNullOrEmpty($AgentVersion)) { - $AgentVersion = (Get-IcingaAgentInstallerAnswerInput -Prompt 'Please specify the version you wish to install ("latest", "snapshot", or a version like "2.11.0")' -Default 'v').answer; + $AgentVersion = (Get-IcingaAgentInstallerAnswerInput -Prompt 'Please specify the version you wish to install ("latest", "snapshot", or a version like "2.11.0")' -Default 'v' -DefaultInput 'latest').answer; $InstallerArguments += "-AgentVersion '$AgentVersion'"; Write-Host ([string]::Format('Updating/Downgrading Icinga 2 Agent to version: "{0}"', $AgentVersion)); @@ -237,7 +238,7 @@ function Start-IcingaAgentInstallWizard() } if ($Endpoints.Count -eq 0) { - $ArrayString = (Get-IcingaAgentInstallerAnswerInput -Prompt 'Please specify all endpoints this Agent will report to (separated by ",")' -Default 'v').answer; + $ArrayString = (Get-IcingaAgentInstallerAnswerInput -Prompt 'Please specify all Icinga endpoints this Agent will report to separated by "," (Example: master-icinga2a, master-icinga2b)' -Default 'v').answer; $Endpoints = ($ArrayString.Replace(' ', '')).Split(','); $InstallerArguments += ("-Endpoints " + ([string]::Join(',', $Endpoints))); } @@ -255,7 +256,7 @@ function Start-IcingaAgentInstallWizard() [bool]$CanConnectToParent = $FALSE; if ($null -eq $AcceptConnections) { - if ((Get-IcingaAgentInstallerAnswerInput -Prompt 'Is this Agent able to connect to its parent node for certificate generation and general communication?' -Default 'y').result -eq 1) { + if ((Get-IcingaAgentInstallerAnswerInput -Prompt "Is this Agent able to connect to it's parent node for certificate requests and general communication?" -Default 'y').result -eq 1) { $CanConnectToParent = $TRUE; $AcceptConnections = 1; $InstallerArguments += ("-AcceptConnections 1"); @@ -280,6 +281,21 @@ function Start-IcingaAgentInstallWizard() } } + if ($null -eq $ConvertEndpointIPConfig) { + if ((Get-IcingaAgentInstallerAnswerInput -Prompt ([string]::Format('Do you want to convert all possible provided FQDN address for endpoint/network configuration for Icinga 2 to plain IP-Address?', $CAPort)) -Default 'y').result -eq 1) { + $InstallerArguments += "-ConvertEndpointIPConfig 1"; + $ConvertEndpointIPConfig = $TRUE; + $EndpointsConversion = Convert-IcingaEndpointsToIPv4 -NetworkConfig $Endpoints; + if ($EndpointsConversion.HasErrors) { + Write-Host 'Not all of your endpoints configuration could be converted and was therefor dropped'; + } + $Endpoints = $EndpointsConversion.Network; + } else { + $InstallerArguments += "-ConvertEndpointIPConfig 0"; + $ConvertEndpointIPConfig = $FALSE; + } + } + if ($EndpointConnections.Count -eq 0 -And $AcceptConnections -eq 1) { $NetworkDefault = ''; foreach ($Endpoint in $Endpoints) { @@ -288,8 +304,15 @@ function Start-IcingaAgentInstallWizard() if ([string]::IsNullOrEmpty($NetworkDefault) -eq $FALSE) { $NetworkDefault = $NetworkDefault.Substring(0, $NetworkDefault.Length - 1); } - $ArrayString = (Get-IcingaAgentInstallerAnswerInput -Prompt 'Please specify the network destinations this agent will connect to, separated by ","' -Default 'v' -DefaultInput $NetworkDefault).answer; + $ArrayString = (Get-IcingaAgentInstallerAnswerInput -Prompt 'Please specify the network destinations this Agent will connect to separated by "," (Example: 192.168.0.1, [192.168.0.2]:5665, [icinga2.example.com]:5665)' -Default 'v' -DefaultInput $NetworkDefault).answer; $EndpointConnections = ($ArrayString.Replace(' ', '')).Split(','); + + if ($ConvertEndpointIPConfig) { + $EndpointsConversion = Convert-IcingaEndpointsToIPv4 -NetworkConfig $EndpointConnections; + if ($EndpointsConversion.HasErrors -eq $FALSE) { + $EndpointConnections = $EndpointsConversion.Network; + } + } $InstallerArguments += ("-EndpointConnections " + ([string]::Join(',', $EndpointConnections))); } @@ -342,7 +365,7 @@ function Start-IcingaAgentInstallWizard() if ($CanConnectToParent) { if ([string]::IsNullOrEmpty($CAEndpoint)) { - $CAEndpoint = (Get-IcingaAgentInstallerAnswerInput -Prompt 'Please enter the IP/FQDN for either ONE of your Icinga parent nodes or your Icinga 2 CA master' -Default 'v' -DefaultInput (Get-IPConfigFromString $EndpointConnections[0]).address).answer; + $CAEndpoint = (Get-IcingaAgentInstallerAnswerInput -Prompt 'Please enter the IP/FQDN for either ONE of your Icinga parent nodes or your Icinga 2 CA master for requesting certificates' -Default 'v' -DefaultInput (Get-IPConfigFromString $EndpointConnections[0]).address).answer; $InstallerArguments += "-CAEndpoint $CAEndpoint"; } if ([string]::IsNullOrEmpty($Ticket) -And $null -eq $EmptyTicket) { @@ -400,7 +423,7 @@ function Start-IcingaAgentInstallWizard() if ([string]::IsNullOrEmpty($ServiceUser)) { if ((Get-IcingaAgentInstallerAnswerInput -Prompt 'Do you want to change the user the Icinga Agent service is running with (Default: "NT Authority\NetworkService")?' -Default 'n').result -eq 0) { - $ServiceUser = (Get-IcingaAgentInstallerAnswerInput -Prompt 'Please enter the user you wish the Icinga Agent service to run with' -Default 'v').answer; + $ServiceUser = (Get-IcingaAgentInstallerAnswerInput -Prompt 'Please enter the user you wish the Icinga Agent service to run with' -Default 'v' -DefaultInput 'NT Authority\NetworkService').answer; $InstallerArguments += "-ServiceUser $ServiceUser"; if ($null -eq $ServicePass) { if ((Get-IcingaAgentInstallerAnswerInput -Prompt 'Does your Icinga Service user require a password to login (not required for System users)?' -Default 'y').result -eq 1) { diff --git a/lib/core/tools/Convert-IcingaEndpointsToIP.psm1 b/lib/core/tools/Convert-IcingaEndpointsToIP.psm1 new file mode 100644 index 0000000..9305b88 --- /dev/null +++ b/lib/core/tools/Convert-IcingaEndpointsToIP.psm1 @@ -0,0 +1,60 @@ +<# +.SYNOPSIS + Converts Icinga Network configuration from FQDN to IP +.DESCRIPTION + This Cmdlet will convert a given Icinga Endpoint configuration based + on a FQDN to a IPv4 based configuration and returns nothing of the + FQDN could not be resolved +.FUNCTIONALITY + Converts Icinga Network configuration from FQDN to IP +.EXAMPLE + PS>Convert-IcingaEndpointsToIPv4 -NetworkConfig @( '[icinga2.example.com]:5665' ); +.PARAMETER NetworkConfig + An array of Icinga endpoint or single network configuration, like '[icinga2.example.com]:5665' + which will be converted to IP based configuration +.INPUTS + System.Array +.OUTPUTS + System.Hashtable +.LINK + https://github.com/Icinga/icinga-powershell-framework +#> +function Convert-IcingaEndpointsToIPv4() +{ + param ( + [array]$NetworkConfig + ); + + [array]$ResolvedNetwork = @(); + [bool]$HasUnresolved = $FALSE; + [string]$Domain = $ENV:UserDNSDomain; + + foreach ($entry in $NetworkConfig) { + $Network = Get-IPConfigFromString -IPConfig $entry; + try { + $ResolvedIP = [System.Net.Dns]::GetHostAddresses($Network.address); + $ResolvedNetwork += $entry.Replace($Network.address, $ResolvedIP); + } catch { + # Once we failed in first place, try to lookup the "FQDN" with our host domain + # we are in. Might resolve some issues if our DNS is not knowing the plain + # hostname and untable to resolve it + try { + $ResolvedIP = [System.Net.Dns]::GetHostAddresses( + [string]::Format( + '{0}.{1}', + $Network.address, + $Domain + ) + ); + $ResolvedNetwork += $entry.Replace($Network.address, $ResolvedIP); + } catch { + $HasUnresolved = $TRUE; + } + } + } + + return @{ + 'Network' = $ResolvedNetwork; + 'HasErrors' = $HasUnresolved; + }; +} From 6229d3ce3782eb26296ee15575f31293a9d3a18d Mon Sep 17 00:00:00 2001 From: Lord Hepipud Date: Fri, 22 May 2020 12:08:42 +0200 Subject: [PATCH 2/3] Fixes FQDN to IP wizard conversion question --- .../misc/Start-IcingaAgentInstallWizard.psm1 | 12 ++++++++---- lib/core/tools/Convert-IcingaEndpointsToIP.psm1 | 15 +++++++++------ 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/lib/core/icingaagent/misc/Start-IcingaAgentInstallWizard.psm1 b/lib/core/icingaagent/misc/Start-IcingaAgentInstallWizard.psm1 index c9777e8..b744c6b 100644 --- a/lib/core/icingaagent/misc/Start-IcingaAgentInstallWizard.psm1 +++ b/lib/core/icingaagent/misc/Start-IcingaAgentInstallWizard.psm1 @@ -285,11 +285,15 @@ function Start-IcingaAgentInstallWizard() if ((Get-IcingaAgentInstallerAnswerInput -Prompt ([string]::Format('Do you want to convert all possible provided FQDN address for endpoint/network configuration for Icinga 2 to plain IP-Address?', $CAPort)) -Default 'y').result -eq 1) { $InstallerArguments += "-ConvertEndpointIPConfig 1"; $ConvertEndpointIPConfig = $TRUE; - $EndpointsConversion = Convert-IcingaEndpointsToIPv4 -NetworkConfig $Endpoints; - if ($EndpointsConversion.HasErrors) { - Write-Host 'Not all of your endpoints configuration could be converted and was therefor dropped'; + if ($EndpointConnections.Count -eq 0) { + $EndpointsConversion = Convert-IcingaEndpointsToIPv4 -NetworkConfig $Endpoints; + } else { + $EndpointsConversion = Convert-IcingaEndpointsToIPv4 -NetworkConfig $EndpointConnections; } - $Endpoints = $EndpointsConversion.Network; + if ($EndpointsConversion.HasErrors) { + Write-Host ([string]::Format('Not all of your endpoint configuration could be resolved and is not reachable by this host. These endpoints were dropped: {0}', ([string]::Join(', ', $EndpointsConversion.Unresolved)))); + } + $EndpointConnections = $EndpointsConversion.Network; } else { $InstallerArguments += "-ConvertEndpointIPConfig 0"; $ConvertEndpointIPConfig = $FALSE; diff --git a/lib/core/tools/Convert-IcingaEndpointsToIP.psm1 b/lib/core/tools/Convert-IcingaEndpointsToIP.psm1 index 9305b88..0131db4 100644 --- a/lib/core/tools/Convert-IcingaEndpointsToIP.psm1 +++ b/lib/core/tools/Convert-IcingaEndpointsToIP.psm1 @@ -25,9 +25,10 @@ function Convert-IcingaEndpointsToIPv4() [array]$NetworkConfig ); - [array]$ResolvedNetwork = @(); - [bool]$HasUnresolved = $FALSE; - [string]$Domain = $ENV:UserDNSDomain; + [array]$ResolvedNetwork = @(); + [array]$UnresolvedNetwork = @(); + [bool]$HasUnresolved = $FALSE; + [string]$Domain = $ENV:UserDNSDomain; foreach ($entry in $NetworkConfig) { $Network = Get-IPConfigFromString -IPConfig $entry; @@ -48,13 +49,15 @@ function Convert-IcingaEndpointsToIPv4() ); $ResolvedNetwork += $entry.Replace($Network.address, $ResolvedIP); } catch { - $HasUnresolved = $TRUE; + $UnresolvedNetwork += $entry; + $HasUnresolved = $TRUE; } } } return @{ - 'Network' = $ResolvedNetwork; - 'HasErrors' = $HasUnresolved; + 'Network' = $ResolvedNetwork; + 'HasErrors' = $HasUnresolved; + 'Unresolved' = $UnresolvedNetwork; }; } From 2edf351fd472548c8505ef3617dca4074084707a Mon Sep 17 00:00:00 2001 From: Lord Hepipud Date: Fri, 22 May 2020 12:52:11 +0200 Subject: [PATCH 3/3] Improves connection conversion wizard handling --- .../icingaagent/misc/Start-IcingaAgentInstallWizard.psm1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/core/icingaagent/misc/Start-IcingaAgentInstallWizard.psm1 b/lib/core/icingaagent/misc/Start-IcingaAgentInstallWizard.psm1 index b744c6b..750a975 100644 --- a/lib/core/icingaagent/misc/Start-IcingaAgentInstallWizard.psm1 +++ b/lib/core/icingaagent/misc/Start-IcingaAgentInstallWizard.psm1 @@ -282,16 +282,16 @@ function Start-IcingaAgentInstallWizard() } if ($null -eq $ConvertEndpointIPConfig) { - if ((Get-IcingaAgentInstallerAnswerInput -Prompt ([string]::Format('Do you want to convert all possible provided FQDN address for endpoint/network configuration for Icinga 2 to plain IP-Address?', $CAPort)) -Default 'y').result -eq 1) { + if ((Get-IcingaAgentInstallerAnswerInput -Prompt 'Do you want to convert endpoint connection data to IP adresses?' -Default 'y').result -eq 1) { $InstallerArguments += "-ConvertEndpointIPConfig 1"; $ConvertEndpointIPConfig = $TRUE; if ($EndpointConnections.Count -eq 0) { - $EndpointsConversion = Convert-IcingaEndpointsToIPv4 -NetworkConfig $Endpoints; + $EndpointsConversion = Convert-IcingaEndpointsToIPv4 -NetworkConfig $Endpoints; } else { - $EndpointsConversion = Convert-IcingaEndpointsToIPv4 -NetworkConfig $EndpointConnections; + $EndpointsConversion = Convert-IcingaEndpointsToIPv4 -NetworkConfig $EndpointConnections; } if ($EndpointsConversion.HasErrors) { - Write-Host ([string]::Format('Not all of your endpoint configuration could be resolved and is not reachable by this host. These endpoints were dropped: {0}', ([string]::Join(', ', $EndpointsConversion.Unresolved)))); + Write-Host ([string]::Format('Not all of your endpoint connection data could be resolved and are not reachable by this host. These endpoints were dropped: {0}', ([string]::Join(', ', $EndpointsConversion.Unresolved)))); } $EndpointConnections = $EndpointsConversion.Network; } else {