Merge pull request #480 from Icinga:fix/service_locking_and_error_handling

Fix: Service locking and error handling

Fixes service locking during Icinga Agent upgrade and ensures errors on service management are caught and printed with internal error handling
This commit is contained in:
Lord Hepipud 2022-02-15 15:51:00 +01:00 committed by GitHub
commit 7c13c1362d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 75 additions and 41 deletions

View file

@ -16,6 +16,7 @@ Released closed milestones can be found on [GitHub](https://github.com/Icinga/ic
* [#472](https://github.com/Icinga/icinga-powershell-framework/pull/472) Fixes random errors while dynamically compiling Add-Type code by now writing a DLL inside `cache/dll` for later usage * [#472](https://github.com/Icinga/icinga-powershell-framework/pull/472) Fixes random errors while dynamically compiling Add-Type code by now writing a DLL inside `cache/dll` for later usage
* [#472](https://github.com/Icinga/icinga-powershell-framework/pull/472) Fixes random errors while dynamically compiling Add-Type code by now writing a DLL inside `cache/dll` for later usage * [#472](https://github.com/Icinga/icinga-powershell-framework/pull/472) Fixes random errors while dynamically compiling Add-Type code by now writing a DLL inside `cache/dll` for later usage
* [#479](https://github.com/Icinga/icinga-powershell-framework/pull/479) Fixes possible exceptions while trying to remove downloaded repository temp files which might still contain a file lock from virusscanners or other tasks * [#479](https://github.com/Icinga/icinga-powershell-framework/pull/479) Fixes possible exceptions while trying to remove downloaded repository temp files which might still contain a file lock from virusscanners or other tasks
* [#480](https://github.com/Icinga/icinga-powershell-framework/pull/480) Fixes service locking during Icinga Agent upgrade and ensures errors on service management are caught and printed with internal error handling
### Enhancements ### Enhancements

View file

@ -112,7 +112,7 @@ function Install-IcingaFrameworkComponent()
if ([string]::IsNullOrEmpty((Get-IcingaJEAContext)) -eq $FALSE) { if ([string]::IsNullOrEmpty((Get-IcingaJEAContext)) -eq $FALSE) {
Write-IcingaConsoleNotice 'Updating Icinga JEA profile'; Write-IcingaConsoleNotice 'Updating Icinga JEA profile';
Invoke-IcingaCommand { Install-IcingaJEAProfile }; Invoke-IcingaCommand { Install-IcingaJEAProfile; };
} }
# Unload the module if it was loaded before # Unload the module if it was loaded before

View file

@ -109,7 +109,7 @@ function Install-IcingaFrameworkUpdate()
if ([string]::IsNullOrEmpty((Get-IcingaJEAContext)) -eq $FALSE) { if ([string]::IsNullOrEmpty((Get-IcingaJEAContext)) -eq $FALSE) {
Remove-IcingaFrameworkDependencyFile; Remove-IcingaFrameworkDependencyFile;
Write-IcingaConsoleNotice 'Updating Icinga JEA profile'; Write-IcingaConsoleNotice 'Updating Icinga JEA profile';
Invoke-IcingaCommand { Install-IcingaJEAProfile }; Invoke-IcingaCommand { Install-IcingaJEAProfile; };
} }
Write-IcingaConsoleNotice 'Framework update has been completed. Please start a new PowerShell instance now to complete the update'; Write-IcingaConsoleNotice 'Framework update has been completed. Please start a new PowerShell instance now to complete the update';

View file

@ -26,12 +26,19 @@ function Restart-IcingaService()
if (Get-Service "$Service" -ErrorAction SilentlyContinue) { if (Get-Service "$Service" -ErrorAction SilentlyContinue) {
Write-IcingaConsoleNotice ([string]::Format('Restarting service "{0}"', $Service)); Write-IcingaConsoleNotice ([string]::Format('Restarting service "{0}"', $Service));
powershell.exe -Command {
$Service = $args[0]
Restart-Service "$Service"; Invoke-IcingaCommand -ArgumentList $Service -ScriptBlock {
} -Args $Service; try {
Restart-Service "$($IcingaShellArgs[0])" -ErrorAction Stop;
Start-Sleep -Seconds 2;
Optimize-IcingaForWindowsMemory;
} catch {
Write-IcingaConsoleError -Message 'Failed to restart service "{0}". Error: {1}' -Objects $IcingaShellArgs[0], $_.Exception.Message;
}
}
} else { } else {
Write-IcingaConsoleWarning -Message 'The service "{0}" is not installed' -Objects $Service; Write-IcingaConsoleWarning -Message 'The service "{0}" is not installed' -Objects $Service;
} }
Optimize-IcingaForWindowsMemory;
} }

View file

@ -26,12 +26,19 @@ function Start-IcingaService()
if (Get-Service $Service -ErrorAction SilentlyContinue) { if (Get-Service $Service -ErrorAction SilentlyContinue) {
Write-IcingaConsoleNotice -Message 'Starting service "{0}"' -Objects $Service; Write-IcingaConsoleNotice -Message 'Starting service "{0}"' -Objects $Service;
powershell.exe -Command {
$Service = $args[0]
Start-Service "$Service"; Invoke-IcingaCommand -ArgumentList $Service -ScriptBlock {
} -Args $Service; try {
Start-Service "$($IcingaShellArgs[0])" -ErrorAction Stop;
Start-Sleep -Seconds 2;
Optimize-IcingaForWindowsMemory;
} catch {
Write-IcingaConsoleError -Message 'Failed to start service "{0}". Error: {1}' -Objects $IcingaShellArgs[0], $_.Exception.Message;
}
}
} else { } else {
Write-IcingaConsoleWarning -Message 'The service "{0}" is not installed' -Objects $Service; Write-IcingaConsoleWarning -Message 'The service "{0}" is not installed' -Objects $Service;
} }
Optimize-IcingaForWindowsMemory;
} }

View file

@ -26,12 +26,19 @@ function Stop-IcingaService()
if (Get-Service $Service -ErrorAction SilentlyContinue) { if (Get-Service $Service -ErrorAction SilentlyContinue) {
Write-IcingaConsoleNotice -Message 'Stopping service "{0}"' -Objects $Service; Write-IcingaConsoleNotice -Message 'Stopping service "{0}"' -Objects $Service;
powershell.exe -Command {
$Service = $args[0]
Stop-Service "$Service"; Invoke-IcingaCommand -ArgumentList $Service -ScriptBlock {
} -Args $Service; try {
Stop-Service "$($IcingaShellArgs[0])" -ErrorAction Stop;
Start-Sleep -Seconds 2;
Optimize-IcingaForWindowsMemory;
} catch {
Write-IcingaConsoleError -Message 'Failed to stop service "{0}". Error: {1}' -Objects $IcingaShellArgs[0], $_.Exception.Message;
}
}
} else { } else {
Write-IcingaConsoleWarning -Message 'The service "{0}" is not installed' -Objects $Service; Write-IcingaConsoleWarning -Message 'The service "{0}" is not installed' -Objects $Service;
} }
Optimize-IcingaForWindowsMemory;
} }

View file

@ -73,15 +73,17 @@ function Install-IcingaAgent()
} }
} }
$InstallProcess = powershell.exe -Command { $InstallProcess = Invoke-IcingaCommand -ArgumentList $IcingaInstaller, $InstallTarget -ScriptBlock {
$IcingaInstaller = $args[0]; $IcingaInstaller = $IcingaShellArgs[0];
$InstallTarget = $args[1]; $InstallTarget = $IcingaShellArgs[1];
Use-Icinga;
$InstallProcess = Start-IcingaProcess -Executable 'MsiExec.exe' -Arguments ([string]::Format('/quiet /i "{0}" {1}', $IcingaInstaller.InstallerPath, $InstallTarget)) -FlushNewLines; $InstallProcess = Start-IcingaProcess -Executable 'MsiExec.exe' -Arguments ([string]::Format('/quiet /i "{0}" {1}', $IcingaInstaller.InstallerPath, $InstallTarget)) -FlushNewLines;
Start-Sleep -Seconds 2;
Optimize-IcingaForWindowsMemory;
return $InstallProcess; return $InstallProcess;
} -Args $IcingaInstaller, $InstallTarget; }
if ($InstallProcess.ExitCode -ne 0) { if ($InstallProcess.ExitCode -ne 0) {
Write-IcingaConsoleError -Message 'Failed to install Icinga 2 Agent: {0}{1}' -Objects $InstallProcess.Message, $InstallProcess.Error; Write-IcingaConsoleError -Message 'Failed to install Icinga 2 Agent: {0}{1}' -Objects $InstallProcess.Message, $InstallProcess.Error;

View file

@ -20,16 +20,18 @@ function Uninstall-IcingaAgent()
return $FALSE; return $FALSE;
} }
$Uninstaller = powershell.exe -Command { Stop-IcingaService -Service 'icinga2';
$IcingaData = $args[0]
Use-Icinga;
Stop-Service 'icinga2' -ErrorAction SilentlyContinue | Out-Null; $Uninstaller = Invoke-IcingaCommand -ArgumentList $IcingaData -ScriptBlock {
$IcingaData = $IcingaShellArgs[0];
$Uninstaller = Start-IcingaProcess -Executable 'MsiExec.exe' -Arguments ([string]::Format('{0} /q', $IcingaData.Uninstaller)) -FlushNewLine; $Uninstaller = Start-IcingaProcess -Executable 'MsiExec.exe' -Arguments ([string]::Format('{0} /q', $IcingaData.Uninstaller)) -FlushNewLine;
Start-Sleep -Seconds 2;
Optimize-IcingaForWindowsMemory;
return $Uninstaller; return $Uninstaller;
} -Args $IcingaData; }
if ($Uninstaller.ExitCode -ne 0) { if ($Uninstaller.ExitCode -ne 0) {
Write-IcingaConsoleError ([string]::Format('Failed to remove Icinga Agent: {0}{1}', $Uninstaller.Message, $Uninstaller.Error)); Write-IcingaConsoleError ([string]::Format('Failed to remove Icinga Agent: {0}{1}', $Uninstaller.Message, $Uninstaller.Error));

View file

@ -24,8 +24,8 @@ function Show-IcingaForWindowsMenuManageIcingaForWindowsServices()
'DisabledReason' = 'The Icinga Agent service is either not installed or the service is already running'; 'DisabledReason' = 'The Icinga Agent service is either not installed or the service is already running';
'AdminMenu' = $TRUE; 'AdminMenu' = $TRUE;
'Action' = @{ 'Action' = @{
'Command' = 'Start-Service'; 'Command' = 'Start-IcingaService';
'Arguments' = @{ '-Name' = 'icinga2'; }; 'Arguments' = @{ '-Service' = 'icinga2'; };
} }
}, },
@{ @{
@ -36,8 +36,8 @@ function Show-IcingaForWindowsMenuManageIcingaForWindowsServices()
'DisabledReason' = 'The Icinga Agent service is either not installed or the service is not running'; 'DisabledReason' = 'The Icinga Agent service is either not installed or the service is not running';
'AdminMenu' = $TRUE; 'AdminMenu' = $TRUE;
'Action' = @{ 'Action' = @{
'Command' = 'Stop-Service'; 'Command' = 'Stop-IcingaService';
'Arguments' = @{ '-Name' = 'icinga2'; }; 'Arguments' = @{ '-Service' = 'icinga2'; };
} }
}, },
@{ @{
@ -48,8 +48,8 @@ function Show-IcingaForWindowsMenuManageIcingaForWindowsServices()
'DisabledReason' = 'The Icinga Agent service is not installed'; 'DisabledReason' = 'The Icinga Agent service is not installed';
'AdminMenu' = $TRUE; 'AdminMenu' = $TRUE;
'Action' = @{ 'Action' = @{
'Command' = 'Restart-Service'; 'Command' = 'Restart-IcingaService';
'Arguments' = @{ '-Name' = 'icinga2'; }; 'Arguments' = @{ '-Service' = 'icinga2'; };
} }
}, },
@{ @{
@ -71,8 +71,8 @@ function Show-IcingaForWindowsMenuManageIcingaForWindowsServices()
'DisabledReason' = 'The Icinga for Windows service is either not installed or already running'; 'DisabledReason' = 'The Icinga for Windows service is either not installed or already running';
'AdminMenu' = $TRUE; 'AdminMenu' = $TRUE;
'Action' = @{ 'Action' = @{
'Command' = 'Start-Service'; 'Command' = 'Start-IcingaService';
'Arguments' = @{ '-Name' = 'icingapowershell'; }; 'Arguments' = @{ '-Service' = 'icingapowershell'; };
} }
}, },
@{ @{

View file

@ -12,6 +12,10 @@ function Test-IcingaJEAServiceRunning()
return $FALSE; return $FALSE;
} }
if ($JeaPid -eq '0' -Or $JeaPid -eq 0) {
return $FALSE;
}
$JeaPowerShellProcess = Get-Process -Id $JeaPid -ErrorAction SilentlyContinue; $JeaPowerShellProcess = Get-Process -Id $JeaPid -ErrorAction SilentlyContinue;
if ($null -eq $JeaPowerShellProcess) { if ($null -eq $JeaPowerShellProcess) {
return $FALSE; return $FALSE;

View file

@ -348,7 +348,9 @@ function Install-IcingaComponent()
} }
} }
$MSIData = & powershell.exe -Command { Use-Icinga; return Read-IcingaMSIMetadata -File $args[0] } -Args $DownloadDestination; $MSIData = Invoke-IcingaCommand -ArgumentList $DownloadDestination -ScriptBlock {
return (Read-IcingaMSIMetadata -File $IcingaShellArgs[0]);
}
if ($InstalledVersion.Full -eq $MSIData.ProductVersion -And $Force -eq $FALSE) { if ($InstalledVersion.Full -eq $MSIData.ProductVersion -And $Force -eq $FALSE) {
Write-IcingaConsoleWarning 'The package "agent" with version "{0}" is already installed. Use "-Force" to re-install the component' -Objects $InstalledVersion.Full; Write-IcingaConsoleWarning 'The package "agent" with version "{0}" is already installed. Use "-Force" to re-install the component' -Objects $InstalledVersion.Full;
@ -365,15 +367,17 @@ function Install-IcingaComponent()
} }
} }
$InstallProcess = powershell.exe -Command { $InstallProcess = Invoke-IcingaCommand -ArgumentList $DownloadDestination, $InstallTarget -ScriptBlock {
$IcingaInstaller = $args[0]; $IcingaInstaller = $IcingaShellArgs[0];
$InstallTarget = $args[1]; $InstallTarget = $IcingaShellArgs[1];
Use-Icinga;
$InstallProcess = Start-IcingaProcess -Executable 'MsiExec.exe' -Arguments ([string]::Format('/quiet /i "{0}" {1}', $IcingaInstaller, $InstallTarget)) -FlushNewLines; $InstallProcess = Start-IcingaProcess -Executable 'MsiExec.exe' -Arguments ([string]::Format('/quiet /i "{0}" {1}', $IcingaInstaller, $InstallTarget)) -FlushNewLines;
Start-Sleep -Seconds 2;
Optimize-IcingaForWindowsMemory;
return $InstallProcess; return $InstallProcess;
} -Args $DownloadDestination, $InstallTarget; }
if ($InstallProcess.ExitCode -ne 0) { if ($InstallProcess.ExitCode -ne 0) {
Write-IcingaConsoleError -Message 'Failed to install component "agent": {0}{1}' -Objects $InstallProcess.Message, $InstallProcess.Error; Write-IcingaConsoleError -Message 'Failed to install component "agent": {0}{1}' -Objects $InstallProcess.Message, $InstallProcess.Error;