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();
        }
示例#2
0
文件: Program.cs 项目: Hona/SimplyBot
        internal async void IntervalFunctions(object state)
        {
            // TODO: Uncomment this when the tempus module is complete
            //await _tempusDataAccess.UpdateMapList();

            await _rankUpdater.UpdateRanks();

            await _statusUpdater.UpdateStatus();
        }
示例#3
0
        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");
            }
        }
示例#6
0
        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);
                }
            }
        }