Fixes possible service lock and error handling

This commit is contained in:
Lord Hepipud 2022-02-15 15:14:27 +01:00
parent 43252ced15
commit 733f3cfe3b
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;