icinga-powershell-framework/lib/core/installer/Install-Icinga.psm1

179 lines
7.7 KiB
PowerShell
Raw Normal View History

function Install-Icinga()
{
param (
[string]$InstallCommand = $null,
[string]$InstallFile = ''
);
if ($null -eq $global:Icinga) {
$global:Icinga = @{ };
}
if ($global:Icinga.ContainsKey('InstallWizard') -eq $FALSE) {
$global:Icinga.Add(
'InstallWizard', @{
'AdminShell' = (Test-AdministrativeShell);
'LastInput' = '';
'LastNotice' = '';
2022-01-28 09:22:12 -05:00
'LastWarning' = @();
'LastError' = @();
'DirectorError' = '';
'HeaderPreview' = '';
'DirectorSelfService' = $FALSE;
'DirectorRegisteredHost' = $FALSE;
'DirectorInstallError' = $FALSE;
'LastParent' = [System.Collections.ArrayList]@();
'LastValues' = @();
2021-08-06 12:12:27 -04:00
'DisabledEntries' = @{ };
'Config' = @{ };
'ConfigSwap' = @{ };
'ParentConfig' = $null;
'Menu' = 'Install-Icinga';
'NextCommand' = '';
'NextArguments' = $null;
'HeaderSelection' = $null;
'DisplayAdvanced' = $FALSE;
'ShowAdvanced' = $FALSE;
'ShowHelp' = $FALSE;
'ShowCommand' = $FALSE;
'DeleteValues' = $FALSE;
'HeaderPrint' = $FALSE;
'JumpToSummary' = $FALSE;
'Closing' = $FALSE;
}
);
2022-01-28 09:22:12 -05:00
} else {
$Global:Icinga.InstallWizard.LastWarning.Clear();
$Global:Icinga.InstallWizard.LastError.Clear();
}
if ([string]::IsNullOrEmpty($InstallFile) -eq $FALSE) {
$InstallCommand = Read-IcingaFileSecure -File $InstallFile -ExitOnReadError;
}
# Use our install command to configure everything
if ([string]::IsNullOrEmpty($InstallCommand) -eq $FALSE) {
try {
$JsonInstallCmd = ConvertFrom-Json -InputObject $InstallCommand -ErrorAction Stop;
} catch {
Write-IcingaConsoleError 'Failed to deserialize the provided JSON from file or command: {0}' -Objects $_.Exception.Message;
return;
}
# Add our "old" swap internally
$OldConfigSwap = Get-IcingaPowerShellConfig -Path 'Framework.Config.Swap';
Disable-IcingaFrameworkConsoleOutput;
[hashtable]$IcingaConfiguration = Convert-IcingaForwindowsManagementConsoleJSONConfig -Config $JsonInstallCmd;
# First run our configuration values
$Success = Invoke-IcingaForWindowsManagementConsoleCustomConfig -IcingaConfiguration $IcingaConfiguration;
if ($Success -eq $FALSE) {
return;
}
# In case we use the director, we require to first fetch all basic values from the Self-Service API then
# require to register the host to fet the remaining content
if ($IcingaConfiguration.ContainsKey('IfW-DirectorSelfServiceKey') -And $IcingaConfiguration.ContainsKey('IfW-DirectorUrl')) {
Enable-IcingaFrameworkConsoleOutput;
Resolve-IcingaForWindowsManagementConsoleInstallationDirectorTemplate;
Resolve-IcingaForWindowsManagementConsoleInstallationDirectorTemplate -Register;
Disable-IcingaFrameworkConsoleOutput;
} else {
# Now load all remaining values we haven't set and define the defaults
Add-IcingaForWindowsInstallationAdvancedEntries;
}
# Now apply our configuration again to ensure the defaults are overwritten again
# Suite a mess, but we can improve this later
$Success = Invoke-IcingaForWindowsManagementConsoleCustomConfig -IcingaConfiguration $IcingaConfiguration;
if ($Success -eq $FALSE) {
return;
}
Enable-IcingaFrameworkConsoleOutput;
Start-IcingaForWindowsInstallation -Automated;
# Set our "old" swap live again. By doing so, we can still continue our old
# configuration
Set-IcingaPowerShellConfig -Path 'Framework.Config.Swap' -Value $OldConfigSwap;
return;
}
while ($TRUE) {
# Do nothing else anymore in case we are closing the management console
if ($global:Icinga.InstallWizard.Closing) {
break;
}
$FrameworkInstalled = Get-IcingaPowerShellConfig -Path 'Framework.Installed';
if ($null -eq $FrameworkInstalled) {
$FrameworkInstalled = $FALSE;
}
if ([string]::IsNullOrEmpty($global:Icinga.InstallWizard.NextCommand) -Or $global:Icinga.InstallWizard.NextCommand -eq 'Install-Icinga') {
Show-IcingaForWindowsInstallerMenu `
-Header 'What do you want to do?' `
-Entries @(
@{
2022-01-28 09:22:12 -05:00
'Caption' = 'Base Installation';
'Command' = 'Show-IcingaForWindowsInstallerMenuInstallWindows';
'Help' = 'Allows you to install Icinga for Windows with all required components and options.'
},
@{
2022-01-28 09:22:12 -05:00
'Caption' = 'Component Manager';
'Command' = 'Show-IcingaForWindowsManagementConsoleComponentManager';
'Help' = 'Allows you to manage components for Icinga for Windows.';
'AdminMenu' = $TRUE;
2021-07-16 15:38:08 -04:00
},
@{
2022-01-28 09:22:12 -05:00
'Caption' = 'Settings';
'Command' = 'Show-IcingaForWindowsMenuManage';
'Help' = 'Allows you to modify your current Icinga for Windows installation.';
},
@{
2022-01-28 09:22:12 -05:00
'Caption' = 'Overview';
'Command' = 'Show-IcingaForWindowsMenuListEnvironment';
'Help' = 'Shows you an overview of your current Icinga for Windows installation, including installed components and system informations.';
2022-01-28 09:22:12 -05:00
},
@{
'Caption' = 'Icinga Shell';
'Command' = 'Invoke-IcingaForWindowsMenuStartIcingaShell';
'Help' = 'Shows you an overview of your current Icinga for Windows installation, including installed components and system informations.';
}
) `
-DefaultIndex 0;
} else {
$NextArguments = $global:Icinga.InstallWizard.NextArguments;
if ($global:Icinga.InstallWizard.NextCommand.Contains(':')) {
$NextArguments = @{
'Value' = ($global:Icinga.InstallWizard.NextCommand.Split(':')[1]);
};
$global:Icinga.InstallWizard.NextCommand = $global:Icinga.InstallWizard.NextCommand.Split(':')[0];
}
try {
if ($null -ne $NextArguments -And $NextArguments.Count -ne 0) {
& $global:Icinga.InstallWizard.NextCommand @NextArguments;
} else {
& $global:Icinga.InstallWizard.NextCommand;
}
} catch {
$ErrMsg = $_.Exception.Message;
2022-01-28 09:22:12 -05:00
$global:Icinga.InstallWizard.LastError += [string]::Format('Failed to enter menu "{0}". Error "{1}', $global:Icinga.InstallWizard.NextCommand, $ErrMsg);
$global:Icinga.InstallWizard.NextCommand = 'Install-Icinga';
$global:Icinga.InstallWizard.NextArguments = @{ };
}
}
}
}