public override void ExecuteTask(EnvironmentManager environmentManager, ExecutePowerShellScriptTask updateTask, Logger logger, StatusUpdater statusUpdater) { statusUpdater.UpdateStatus(statusUpdater.Translation.WritePowerShellScript); var scriptFilename = FileExtensions.MakeUnique(Path.Combine(environmentManager.RevertTempDirectory.FullName, "PowerShell-Script.ps1")); logger.Info($"PowerShell script filename: {scriptFilename}"); File.WriteAllText(scriptFilename, updateTask.Code); statusUpdater.UpdateStatus(statusUpdater.Translation.ExecutePowerShellScript); var processStartInfo = new ProcessStartInfo("powershell.exe") { Arguments = scriptFilename, CreateNoWindow = true, UseShellExecute = false }; var process = Process.Start(processStartInfo); logger.Info("Script started, wait for exit"); process.WaitForExit(); }
internal async void IntervalFunctions(object state) { // TODO: Uncomment this when the tempus module is complete //await _tempusDataAccess.UpdateMapList(); await _rankUpdater.UpdateRanks(); await _statusUpdater.UpdateStatus(); }
public override void ExecuteTask(EnvironmentManager environmentManager, StartProcessTask updateTask, Logger logger, StatusUpdater statusUpdater) { statusUpdater.UpdateStatus(statusUpdater.Translation.StartProcess, statusUpdater.FormatFilename(updateTask.Filename)); var processStartInfo = new ProcessStartInfo(environmentManager.TranslateFilename(updateTask.Filename), updateTask.Arguments); if (updateTask.RequireElevatedPrivileges) { processStartInfo.Verb = "runas"; } var process = Process.Start(processStartInfo); if (process == null) { throw new InvalidOperationException("Unable to start process"); } ProcessId = process.Id; ProcessName = process.ProcessName; if (updateTask.WaitForExit) { statusUpdater.UpdateStatus(statusUpdater.Translation.WaitingForProcessToExit, process.ProcessName); process.WaitForExit(); if (updateTask.FailIfProcessReturnsFailure && process.ExitCode != 0) { throw new InvalidOperationException( $"The process returned the exit code {process.ExitCode}. Because that code is not zero and \"FailIfProcessReturnsFailure\" is checked, the operation must be aborted."); } } }
public override void ExecuteTask(EnvironmentManager environmentManager, DeleteFilesTask updateTask, Logger logger, StatusUpdater statusUpdater) { if (!(updateTask.Filenames?.Count > 0)) { return; } foreach (var filename in updateTask.Filenames) { statusUpdater.UpdateStatus(statusUpdater.Translation.DeleteFile, filename); var file = new FileInfo(environmentManager.TranslateFilename(filename)); if (!file.Exists) { logger.Info($"File \"{file.FullName}\" does not exist, continue."); continue; } if (MoveFileInfos == null) { MoveFileInfos = new List <RevertMoveFile>(); } var tempFile = environmentManager.GetRandomTempFile(); logger.Info($"Move file \"{file.FullName}\" to \"{tempFile.FullName}\""); try { Retry.Do(() => file.MoveTo(tempFile.FullName), TimeSpan.FromSeconds(2)); } catch (Exception) { if (updateTask.IsImportantForUpdateProcess) { logger.Error("Moving file failed, revert other file movements of this task"); Revert(); throw; } logger.Warning( "Moving file failed, but because the task is not very important, we can just continue."); continue; } MoveFileInfos.Add(new RevertMoveFile(tempFile.FullName, file.FullName)); } }
public override void ExecuteTask(EnvironmentManager environmentManager, StopServiceTask updateTask, Logger logger, StatusUpdater statusUpdater) { var service = new ServiceController(updateTask.ServiceName); if (service.Status == ServiceControllerStatus.Running) { statusUpdater.UpdateStatus(statusUpdater.Translation.StopService, updateTask.ServiceName); //only save the service name when the service was running ServiceName = updateTask.ServiceName; service.Stop(); if (updateTask.WaitForExit) //throws a timeout exception { service.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(10)); } } else { logger.Info($"Service \"{updateTask.ServiceName}\" isn't running"); } }
public override void ExecuteTask(EnvironmentManager environmentManager, DeleteDirectoryTask updateTask, Logger logger, StatusUpdater statusUpdater) { var directory = new DirectoryInfo(environmentManager.TranslateFilename(updateTask.DirectoryPath)); if (!directory.Exists) { logger.Info("The directory does not exist."); return; } statusUpdater.UpdateStatus(statusUpdater.Translation.DeleteDirectory, statusUpdater.FormatFilename(directory.FullName)); var tempDirectory = environmentManager.GetRandomTempDirectory(); SourceDirectoryPath = directory.FullName; TempDirectory = tempDirectory.FullName; logger.Info($"Move directory {directory.FullName} to {tempDirectory.FullName}"); Retry.Do(() => FileExtensions.RobustMoveDirectory(directory.FullName, tempDirectory.FullName), TimeSpan.FromSeconds(2), 3, logger); }
public override void ExecuteTask(EnvironmentManager environmentManager, KillProcessTask updateTask, Logger logger, StatusUpdater statusUpdater) { Process[] processes; switch (updateTask.SearchMode) { case ProcessSearchMode.ProcessName: processes = Process.GetProcessesByName(updateTask.SearchString); break; case ProcessSearchMode.ProcessNameContains: processes = Process.GetProcesses().Where(x => x.ProcessName.IndexOf(updateTask.SearchString, StringComparison.OrdinalIgnoreCase) > -1) .ToArray(); break; case ProcessSearchMode.Filename: var filename = environmentManager.TranslateFilename(updateTask.SearchString); processes = Process.GetProcesses().Where(x => { try { return(string.Equals(x.MainModule.FileName, filename, StringComparison.OrdinalIgnoreCase)); } catch (Exception) //invalid access exception or something else { return(false); } }).ToArray(); break; default: throw new ArgumentOutOfRangeException(); } if (processes.Length == 0) { logger.Info("No processes found, finish task"); return; } logger.Info($"{processes.Length} process(es) found"); foreach (var process in processes) { statusUpdater.UpdateStatus(statusUpdater.Translation.KillProcess, process.ProcessName); var closedMainWindow = false; string processFilename = null; logger.Debug($"Get process filename of process {process.ProcessName}"); try { processFilename = process.MainModule.FileName; } catch (Exception e) { logger.Warning($"Getting process filename failed: {e.Message}"); } logger.Debug("Attempt to close main window"); try { closedMainWindow = process.CloseMainWindow(); } catch (Exception e) { logger.Warning($"Closing main window failed: {e.Message}"); } logger.Debug($"Closing main window result: {closedMainWindow}"); try { if (!closedMainWindow || !process.WaitForExit(3000)) { logger.Info("Kill process"); process.Kill(); } } catch (Exception e) { logger.Warning($"Killing process failed: {e.Message}"); if (updateTask.IsImportantForUpdateProcess) { throw; } continue; } if (processFilename != null) { if (KilledProcesses == null) { KilledProcesses = new List <string>(); } KilledProcesses.Add(processFilename); } } }