/// <summary> /// Асинхронная отправка сообщения и ожидание подтверждения /// </summary> /// <param name="communicationObject"></param> /// <param name="timeout">Таймаут ожидания в миллисекундах</param> /// <returns></returns> public TrySendMessageAndWaitForResponse SendAsyncMessageAndWaitForResponse(CommunicationObject communicationObject, int timeout = 60000) { var res = StartSettingsApplication(); if (!res.IsComplete) { NLogger.LogErrorToHdd(res.Message, MainSettings.Constants.MAGIC_UPDATER); return(new TrySendMessageAndWaitForResponse(false, res.Message)); } CreateAsyncServerBase(); communicationObject.Tag = true; _pipesAsyncServer.SendMessage(communicationObject); while (!_isMessageRecieved) { Thread.Sleep(1); --timeout; if (timeout <= 0) { return(new TrySendMessageAndWaitForResponse(false, $"Сообщение не получено. Выход по таймауту.")); } } _isMessageRecieved = false; return(new TrySendMessageAndWaitForResponse()); }
public static TryGetExePath1C GetExePath1C(string version = null) { Version ver = null; if (!string.IsNullOrEmpty(version)) { Version.TryParse(version, out ver); } else { Version.TryParse(LocalSqlSettings.Version1C, out ver); } //Определение пути по службе 1С работает, но закоменчено, чтобы не было путаницы Load1CPathByVersion(ver); if (string.IsNullOrEmpty(ExePath1C)) { if (ver == null) { string msg = $"Версия 1С не указана в настройках"; NLogger.LogErrorToHdd(msg); return(new TryGetExePath1C(false, msg)); } else { string msg = $"Версия 1С ({ver}) не установлена на данном компьютере"; NLogger.LogErrorToHdd(msg); return(new TryGetExePath1C(false, msg)); } } return(new TryGetExePath1C()); }
public void RestartService() { const int RESTART_TIMEOUT = 60000; try { ServiceController service = new ServiceController(MainSettings.Constants.SERVICE_NAME); TimeSpan timeout = TimeSpan.FromMilliseconds(RESTART_TIMEOUT); if (service.Status == ServiceControllerStatus.Running) { service.Stop(); service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); service.Start(); service.WaitForStatus(ServiceControllerStatus.Running, timeout); } if (service.Status == ServiceControllerStatus.Stopped) { service.Start(); service.WaitForStatus(ServiceControllerStatus.Running, timeout); } } catch (Exception ex) { NLogger.LogErrorToHdd(ex.Message.ToString(), MainSettings.Constants.MAGIC_UPDATER_SETTINGS); MessageBox.Show(ex.Message.ToString(), "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
private static void RestoreCurrentVersionFromBackup() { try { if (Directory.Exists(_currentVersionBackupPath)) { foreach (var file in FilesWorks.GetFiles(_currentVersionBackupPath, _searchPatterns, SearchOption.TopDirectoryOnly)) { try { file.CopyTo(Path.Combine(_currentVersionPath, file.Name)); } catch (Exception ex) { NLogger.LogErrorToHdd($"Не критическая ошибка копирования файла из бекапа. Original: {ex.Message}", MainSettings.Constants.MAGIC_UPDATER_RESTART); } } } else { NLogger.LogErrorToHdd($"Ошибка восстановления текущей версии из бекапа. Бекапа не существует.", MainSettings.Constants.MAGIC_UPDATER_RESTART); } NLogger.LogDebugToHdd($"Восстановление ткущей версии из бекапа выполнено.", MainSettings.Constants.MAGIC_UPDATER_RESTART); } catch (Exception ex) { NLogger.LogErrorToHdd($"Ошибка восстановления текущей версии из бекапа. Original: {ex.Message}", MainSettings.Constants.MAGIC_UPDATER_RESTART); } }
public static DataSet ExecSql(string query) { try { using (SqlConnection conn = new SqlConnection(MainSettings.JsonSettings.ConnectionString)) { conn.Open(); using (SqlCommand command = new SqlCommand(query, conn)) { using (SqlDataAdapter da = new SqlDataAdapter()) { da.SelectCommand = command; DataSet ds = new DataSet(); da.Fill(ds); if (ds != null && ds.Tables.Count > 0) { foreach (DataTable t in ds.Tables) { if (t.Rows != null && t.Rows.Count > 0) { return(ds); } } } return(null); } } } } catch (Exception ex) { NLogger.LogErrorToHdd(ex.Message.ToString()); return(null); } }
private static void SendMessagesToOperation(bool isCompleted) { try { if (_operationId == 0) { return; } string logErrorPath = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "installServiceLogs/errors"); string logDebugPath = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "installServiceLogs/debug"); string errorLogText = null; string debugLogText = null; try { DirectoryInfo errorDirectoryInfo = new DirectoryInfo(logErrorPath); foreach (FileInfo errFile in errorDirectoryInfo.GetFiles()) { if (string.IsNullOrEmpty(errorLogText)) { errorLogText = File.ReadAllText(errFile.FullName, Encoding.GetEncoding("windows-1251")); } else { errorLogText += $"{Environment.NewLine}{File.ReadAllText(errFile.FullName, Encoding.GetEncoding("windows-1251"))}"; } } } catch { } try { DirectoryInfo debugDirectoryInfo = new DirectoryInfo(logDebugPath); foreach (FileInfo debugFile in debugDirectoryInfo.GetFiles()) { if (string.IsNullOrEmpty(errorLogText)) { debugLogText = File.ReadAllText(debugFile.FullName, Encoding.GetEncoding("windows-1251")); } else { debugLogText += $"{Environment.NewLine}{File.ReadAllText(debugFile.FullName, Encoding.GetEncoding("windows-1251"))}"; } } } catch { } string mess = $"Debug:{Environment.NewLine}{debugLogText}{Environment.NewLine}Errors:{Environment.NewLine}{errorLogText}"; //string mess = "sdasdasd"; Operation.SendOperationReport(_operationId, mess, isCompleted); Operation.AddOperState(_operationId, OperStates.End); } catch (Exception ex) { NLogger.LogErrorToHdd(ex.ToString()); } }
public static DataSet ExecProcExt(string _connectionString, string procName, out string exceptionMsg, params object[] args) { exceptionMsg = ""; using (SqlConnection sql = Connect(_connectionString)) { if (sql == null) { return(null); } try { SqlCommand proc = new SqlCommand(procName, sql); proc.CommandType = CommandType.StoredProcedure; if (sql.State == ConnectionState.Closed) { sql.Open(); } SqlCommandBuilder.DeriveParameters(proc); if (args.Length == proc.Parameters.Count - 1) { for (int i = 0; i < args.Length; i++) { SqlParameter p = proc.Parameters[i + 1]; p.Value = Convert.ChangeType(args[i], SqlDbTypeToType[p.SqlDbType]) ?? DBNull.Value; } } else { throw new IndexOutOfRangeException( $"Количество передаваемых аргументов не совпадает с количеством аргументов в хранимой процедуре: {procName}"); } using (SqlDataAdapter adap = new SqlDataAdapter(proc)) { DataSet ds = new DataSet(); adap.Fill(ds); if (ds != null && ds.Tables.Count > 0) { foreach (DataTable t in ds.Tables) { if (t.Rows != null && t.Rows.Count > 0) { return(ds); } } } return(null); } } catch (Exception ex) { //TODO Гасим и пишем ошибку в базу, возможно лучше не гасить и дать приложению свалиться (подумаем) exceptionMsg = ex.Message.ToString(); NLogger.LogErrorToHdd(ex.Message.ToString()); return(null); } } }
public void LoadSqlMainSettings() { var res = LoadSqlMainSettingsFromSQL(); if (!res.IsComplete) { NLogger.LogErrorToHdd(res.Message); } }
public void LoadSqlLocalSettings() { var res = LoadSqlLocalSettingsFromSQL(MainSettings.MainSqlSettings.ComputerId); if (!res.IsComplete) { NLogger.LogErrorToHdd(res.Message); } }
public static void SendOperationReport(int?operationId, string message, bool isCompleted) { if (operationId != null) { SqlWorks.ExecProc("SendOperationReport", operationId, isCompleted, message); } else { NLogger.LogErrorToHdd($"Ошибка отправки отчета для операции"); } }
private static void CopyNewVersionFiles() { //Мутим Backup try { FilesWorks.DeleteDirectoryFull(_currentVersionBackupPath); Directory.CreateDirectory(_currentVersionBackupPath); if (Directory.Exists(_currentVersionBackupPath)) { foreach (var file in FilesWorks.GetFiles(_currentVersionPath, _searchPatterns, SearchOption.TopDirectoryOnly)) { file.CopyTo(Path.Combine(_currentVersionBackupPath, file.Name), true); } } } catch (Exception ex) { NLogger.LogErrorToHdd($"Ошибка создания бекапа текущей версии {MainSettings.Constants.MAGIC_UPDATER}. Original: {ex.Message}", MainSettings.Constants.MAGIC_UPDATER_RESTART); return; } //Удаляем текущую версию try { foreach (var file in FilesWorks.GetFiles(_currentVersionPath, _searchPatterns, SearchOption.TopDirectoryOnly)) { if (file.Name != "settings.json") { file.Delete(); } } } catch (Exception ex) { NLogger.LogErrorToHdd($"Ошибка удаления текущей версии. Original: {ex.Message}", MainSettings.Constants.MAGIC_UPDATER_RESTART); RestoreCurrentVersionFromBackup(); return; } //Копируем новую версию try { foreach (var file in FilesWorks.GetFiles(_newVersionPath, _searchPatterns, SearchOption.TopDirectoryOnly)) { file.CopyTo(Path.Combine(_currentVersionPath, file.Name)); } } catch (Exception ex) { NLogger.LogErrorToHdd($"Ошибка копирования новой версии в попку текущей. Original: {ex.Message}", MainSettings.Constants.MAGIC_UPDATER_RESTART); RestoreCurrentVersionFromBackup(); return; } }
public TryLoadSettingsFromSql LoadSqlLocalSettings(int?computerId) { var res = LoadSqlLocalSettingsFromSQL(computerId); if (!res.IsComplete) { NLogger.LogErrorToHdd(res.Message); return(new TryLoadSettingsFromSql(false, res.Message)); } return(new TryLoadSettingsFromSql()); }
public static void SendAsyncMessage(CommunicationObject communicationObject) { var res = StartSettingsApplication(); if (!res.IsComplete) { NLogger.LogErrorToHdd(res.Message, MainSettings.Constants.MAGIC_UPDATER); } CreateAsyncServerBase(); _pipesAsyncServer.SendMessage(communicationObject); }
private void SettingsForm_Load(object sender, EventArgs e) { try { var loadFromJsonResult = MainSettings.LoadFromJson(); if (!loadFromJsonResult.IsComplete) { //NLogger.LogErrorToHdd(res.Message, MainSettings.Constants.MAGIC_UPDATER_SETTINGS); //MessageBox.Show(res.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } //JsonSettings txtServerTask.Text = MainSettings.JsonSettings.ServerTask; txtBaseTask.Text = MainSettings.JsonSettings.BaseTask; txtUserTask.Text = MainSettings.JsonSettings.UserTask; txtPasswordTask.Text = MainSettings.JsonSettings.PasswordTask; var loadSettingsResult = MainSettings.LoadSettings(); if (!loadSettingsResult.IsComplete) { return; } cbShopID.DisplayMember = "ShopId"; cbShopID.ValueMember = "ShopId"; cbShopID.DataSource = SqlWorks.ExecProc("SelectShopsList").Tables[0]; //SqlSettings cbShopID.Text = MainSettings.MainSqlSettings.ShopID; txtServer1C.Text = MainSettings.LocalSqlSettings.Server1C; txtBase1C.Text = MainSettings.LocalSqlSettings.Base1C; txtUser1C.Text = MainSettings.LocalSqlSettings.User1C; txtPass1C.Text = MainSettings.LocalSqlSettings.Pass1C; txtVersion1C.Text = MainSettings.LocalSqlSettings.Version1C; txtTimeOut.Text = MainSettings.LocalSqlSettings.OperationsListCheckTimeout.ToString(); txtSelfUpdatePath.Text = MainSettings.LocalSqlSettings.SelfUpdatePath; cbIsMainCashbox.Checked = MainSettings.MainSqlSettings.IsMainCashbox; cbIsServerLocated.Checked = MainSettings.MainSqlSettings.Is1CServer; cbIsCheck1C.Checked = MainSettings.LocalSqlSettings.IsCheck1C; } catch (Exception ex) { ConnectionToService?.DisposeAsyncClient(); MessageBox.Show(ex.Message.ToString(), "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); NLogger.LogErrorToHdd(ex.Message.ToString(), MainSettings.Constants.MAGIC_UPDATER_SETTINGS); Application.Exit(); } }
private bool Initialize() { if (!File.Exists(MainSettings.JsonSettingsFileFullPath)) { NLogger.LogErrorToHdd("Json - файл настроек не найден", MainSettings.Constants.MAGIC_UPDATER); return(false); } //Загружаем все настройки TryLoadMainSettings loadSettingsResult = MainSettings.LoadSettings(); while (!loadSettingsResult.IsComplete) { NLogger.LogErrorToHdd(loadSettingsResult.NamedMessage, MainSettings.Constants.MAGIC_UPDATER); Thread.Sleep(60000); loadSettingsResult = MainSettings.LoadSettings(); } if (MainSettings.MainSqlSettings.ComputerId == null || MainSettings.MainSqlSettings.ComputerId == 0) { NLogger.LogErrorToHdd("Ошибка регистрации компьютера. Не получен ComputerId.", MainSettings.Constants.MAGIC_UPDATER); return(false); } //Отчитываемся о том, что настройки прочитаны SqlWorks.ExecProc("SetIsAgentSettingsReaded", MainSettings.MainSqlSettings.ComputerId, true); //Если не режим отладки плагинов if (!_isPluginDebugMode) { SqlWorks.ExecProc("UpdateVersion", MainSettings.MainSqlSettings.ComputerId, Extensions.GetApplicationVersion()); TaskerReporter.Start(); RestartTaskerReporter.Start(); switch (MainSettings.LocalSqlSettings.PerformanceCounterMode) { case 0: break; case 1: PerformanceReporter.StartOnlyAvg(); break; case 2: PerformanceReporter.StartAll(); break; } } return(true); }
public TryLoadCommonGlobalSettings LoadCommonGlobalSettings() { var res = LoadCommonGlobalSettingsFromSQL(); if (!res.IsComplete) { NLogger.LogErrorToHdd(res.Message); return(new TryLoadCommonGlobalSettings(false, res.Message)); } else { return(new TryLoadCommonGlobalSettings()); } }
public bool Install() { try { UninstallBase(); InstallBase(); return(true); } catch (Exception ex) { Program.MainForm?.LogInstallServiceString(ex); NLogger.LogErrorToHdd(ex.ToString()); AddMessage(ex.Message); return(false); } }
protected override void ActExecution() { try { if (Tools.GetProcessesCount(MainSettings.Constants.MAGIC_UPDATER_RESTART) == 1) { bool restartSettingsConnected = false; Task.Factory.StartNew(() => { PipeClient pipeClient = new PipeClient(); pipeClient.SendSyncMessage(new CommunicationObject { ActionType = CommunicationActionType.StartMagicUpdaterSettings }); restartSettingsConnected = true; }); while (!restartSettingsConnected) { Thread.Sleep(1); _timeOut--; if (_timeOut <= 0) { this.SendReportToDB($"Выход по тайм-ауту. Не удалось запустить {MainSettings.Constants.MAGIC_UPDATER_SETTINGS}"); } } } else { this.SendReportToDB($"Отсутствует процесс \"{MainSettings.Constants.MAGIC_UPDATER_RESTART}\" для \"{MainSettings.Constants.MAGIC_UPDATER_SETTINGS}\".{Environment.NewLine}Приложение \"{MainSettings.Constants.MAGIC_UPDATER_SETTINGS}\" не запущено."); } } catch (Exception ex) { if (operationId > 0) { Operation.SendOperationReport(operationId, $"Не удалось перезапустить MagicUpdaterSettings. Original: {ex.ToString()}", false); } NLogger.LogErrorToHdd($"Не удалось перезапустить MagicUpdaterSettings. Original: {ex.ToString()}", MainSettings.Constants.MAGIC_UPDATER_RESTART); } }
public static TryRegisterComputerId RegisterComputerId(string shopId, bool is1CServer = true, bool isMainCashbox = false) { if (string.IsNullOrEmpty(shopId)) { return(new TryRegisterComputerId(0, false, "Пустой Id магазина")); } DataSet dsShop = SqlWorks.ExecProc("IsShopExists", shopId); if (dsShop == null || ConvertSafe.ToInt32(dsShop.Tables[0].Rows[0]["result"]) == 0) { return(new TryRegisterComputerId(0, false, $"Магазин с id = {shopId} отсутствует")); } DataSet ds = SqlWorks.ExecProc("RegisterComputer", shopId, Environment.MachineName, NetWork.GetLocalIPAddress(), is1CServer, isMainCashbox, HardwareInfo.GetMacAddress()); if (ds != null) { int?id = Convert.ToInt32(ds.Tables[0].Rows[0]["ComputerId"]); if (id.HasValue) { return(new TryRegisterComputerId(id.Value)); } else { NLogger.LogErrorToHdd("Ошибка регистрации. Не удалось получить ID компьютера.", MainSettings.Constants.MAGIC_UPDATER); return(new TryRegisterComputerId(0, false, "Ошибка регистрации. Не удалось получить ID компьютера.")); } } else { NLogger.LogErrorToHdd("Ошибка регистрации. Не удалось получить ID компьютера.", MainSettings.Constants.MAGIC_UPDATER); return(new TryRegisterComputerId(0, false, "Ошибка регистрации. Не удалось получить ID компьютера.")); } }
private void btnRestartService_Click(object sender, EventArgs e) { const int RESTART_TIMEOUT = 60000; Button button = sender as Button; button.Enabled = false; string buttonText = button.Text; button.Text = "......."; try { ServiceController service = new ServiceController(MainSettings.Constants.SERVICE_NAME); TimeSpan timeout = TimeSpan.FromMilliseconds(RESTART_TIMEOUT); if (service.Status == ServiceControllerStatus.Running) { service.Stop(); service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); service.Start(); service.WaitForStatus(ServiceControllerStatus.Running, timeout); } if (service.Status == ServiceControllerStatus.Stopped) { service.Start(); service.WaitForStatus(ServiceControllerStatus.Running, timeout); } } catch (Exception ex) { NLogger.LogErrorToHdd(ex.Message.ToString(), MainSettings.Constants.MAGIC_UPDATER_SETTINGS); MessageBox.Show(ex.Message.ToString(), "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { button.Text = buttonText; button.Enabled = true; } }
public void Uninstall() { try { UninstallBase(); if (Directory.Exists(MAGIC_UPDATER_PATH)) { FilesWorks.DeleteDirectoryFull(MAGIC_UPDATER_PATH); } if (Directory.Exists(MAGIC_UPDATER_NEW_VER_PATH)) { FilesWorks.DeleteDirectoryFull(MAGIC_UPDATER_NEW_VER_PATH); } } catch (Exception ex) { Program.MainForm?.LogInstallServiceString(ex); AddMessage(ex.Message); NLogger.LogErrorToHdd(ex.ToString()); } }
public static TryGetLogPath1C GetLogPath1C() { if (string.IsNullOrEmpty(ExePath1C)) { string msg = "Отсутствует путь к исполняемуом файлу 1С"; NLogger.LogErrorToHdd(msg); return(new TryGetLogPath1C(false, msg)); } string logs = Path.Combine(Path.GetTempPath(), "1CLogsForMagicUpdater"); if (!Directory.Exists(logs)) { try { Directory.CreateDirectory(logs); } catch (Exception ex) { NLogger.LogErrorToHdd(ex.Message.ToString()); return(new TryGetLogPath1C(false, ex.Message.ToString())); } } try { Extensions.AddDirectorySecurity(logs, System.Security.Principal.WindowsIdentity.GetCurrent().Name, System.Security.AccessControl.FileSystemRights.FullControl, System.Security.AccessControl.AccessControlType.Allow); } catch (Exception ex) { NLogger.LogErrorToHdd(ex.Message.ToString()); return(new TryGetLogPath1C(false, ex.Message.ToString())); } LogPath1C = Path.Combine(logs, "OutLog.log"); return(new TryGetLogPath1C()); }
private void UninstallBase() { TimeSpan timeout = TimeSpan.FromMilliseconds(30000); Program.MainForm?.LogInstallServiceString("Тормозим старую службу..."); //Тормозим старую службу try { service.Stop(); service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); AddMessage($"Старая служба {SERVICE_NAME} - остановлена"); Program.MainForm?.LogInstallServiceString($"Старая служба {SERVICE_NAME} - остановлена"); Program.MainForm?.LogInstallServiceString("Старая служба остановлена"); } catch (Exception ex) { AddMessage(ex.Message); Program.MainForm?.LogInstallServiceString(ex); } Console.WriteLine("Удаляем старую службу..."); //Удаляем старую службу try { using (ServiceInstaller ServiceInstallerObj = new ServiceInstaller()) { InstallContext Context = new InstallContext(null, null); ServiceInstallerObj.Context = Context; ServiceInstallerObj.ServiceName = SERVICE_NAME; ServiceInstallerObj.Uninstall(null); } Thread.Sleep(3000); AddMessage($"Старая служба {SERVICE_NAME} - удалена"); Program.MainForm?.LogInstallServiceString($"Старая служба {SERVICE_NAME} - удалена"); } catch (Exception ex) { AddMessage(ex.Message); Program.MainForm?.LogInstallServiceString(ex); } Program.MainForm?.LogInstallServiceString("Убиваем все процессы MagicUpdater..."); //Убиваем все процессы MagicUpdater Process[] procs = Process.GetProcessesByName(SERVICE_NAME); foreach (var proc in procs) { proc.Kill(); } Thread.Sleep(3000); AddMessage($"Все процессы {SERVICE_NAME} - убиты"); Program.MainForm?.LogInstallServiceString("Все процессы MagicUpdater завершены"); Program.MainForm?.LogInstallServiceString("Чистим реестр (автозагрузка MU как приложения в корне run)..."); //Чистим реестр (автозагрузка MU как приложения в корне run) #region Чистим реестр string keyName = @"Software\Microsoft\Windows\CurrentVersion\Run"; using (RegistryKey key = Registry.CurrentUser.OpenSubKey(keyName, true)) { if (key == null) { Program.MainForm?.LogInstallServiceString($"CurrentUser: Отсутствует путь в реестре {keyName}"); AddMessage($"CurrentUser: Отсутствует путь в реестре {keyName}"); } else { try { key.DeleteValue(SERVICE_NAME); Program.MainForm?.LogInstallServiceString($"CurrentUser: Значение реестра - {SERVICE_NAME} удалено"); AddMessage($"CurrentUser: Значение реестра - {SERVICE_NAME} удалено"); } catch (Exception ex) { NLogger.LogDebugToHdd($"CurrentUser: {ex.Message}"); AddMessage($"CurrentUser: {ex.Message}"); } } } using (RegistryKey key = Registry.LocalMachine.OpenSubKey(keyName, true)) { if (key == null) { NLogger.LogErrorToHdd($"LocalMachine: Отсутствует путь в реестре {keyName}"); AddMessage($"LocalMachine: Отсутствует путь в реестре {keyName}"); } else { try { key.DeleteValue(SERVICE_NAME); Program.MainForm?.LogInstallServiceString($"LocalMachine: Значение реестра - {SERVICE_NAME} удалено"); AddMessage($"LocalMachine: Значение реестра - {SERVICE_NAME} удалено"); } catch (Exception ex) { Program.MainForm?.LogInstallServiceString($"LocalMachine: {ex.Message}"); AddMessage($"LocalMachine: {ex.Message}"); } } } #endregion Чистим реестр Program.MainForm?.LogInstallServiceString("Удаляем все из папок MagicUpdater и MagicUpdaterNewVer..."); //Удаляем все из папок MagicUpdater и MagicUpdaterNewVer #region Удаляем все из папок MagicUpdater и MagicUpdaterNewVer try { DirectoryInfo di = new DirectoryInfo(_magicUpdaterPath); foreach (FileInfo file in di.GetFiles()) { if (file.Name.ToUpper() != MainSettings.Constants.SETTINGS_JSON_FILE_NAME.ToUpper()) { file.Delete(); } } foreach (DirectoryInfo dir in di.GetDirectories()) { dir.Delete(true); } Program.MainForm?.LogInstallServiceString($"Путь {_magicUpdaterPath} - очищен"); AddMessage($"Путь {_magicUpdaterPath} - очищен"); } catch (Exception ex) { Program.MainForm?.LogInstallServiceString(ex.Message); AddMessage(ex.Message); } try { DirectoryInfo di = new DirectoryInfo(MAGIC_UPDATER_NEW_VER_PATH); foreach (FileInfo file in di.GetFiles()) { file.Delete(); } foreach (DirectoryInfo dir in di.GetDirectories()) { dir.Delete(true); } Program.MainForm?.LogInstallServiceString($"Путь {MAGIC_UPDATER_NEW_VER_PATH} - очищен"); AddMessage($"Путь {MAGIC_UPDATER_NEW_VER_PATH} - очищен"); } catch (Exception ex) { Program.MainForm?.LogInstallServiceString(ex.Message); AddMessage(ex.Message); } #endregion Удаляем все из папок MagicUpdater и MagicUpdaterNewVer }
static void Main(string[] args) { #region Initialization //Загружаем все настройки var loadSettingsResult = MainSettings.LoadSettings(); if (!loadSettingsResult.IsComplete) { NLogger.LogErrorToHdd(loadSettingsResult.NamedMessage, MainSettings.Constants.MAGIC_UPDATER); return; } //Инициализируем переменные _currentVersionPath = Path.GetDirectoryName(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)); _newVersionPath = MainSettings.LocalSqlSettings.SelfUpdatePath; _currentVersionBackupPath = Path.Combine(_currentVersionPath, "backup"); _currentVersionExeName = Path.Combine(_currentVersionPath, MainSettings.Constants.MAGIC_UPDATER_EXE); _newVersionExeName = Path.Combine(_newVersionPath, MainSettings.Constants.MAGIC_UPDATER_EXE); _searchPatterns = new string[] { "*.exe", "*.dll", "*.xml", "*.config", "*.pdb", "*.manifest", }; _operationId = 0; #endregion Initialization if (args != null && args.Length == 2) { #region setOperationId try { _operationId = Convert.ToInt32(args[1]); } catch (Exception ex) { _operationId = 0; NLogger.LogErrorToHdd($"{ex.Message}{Environment.NewLine}{ex.ToString()}", MainSettings.Constants.MAGIC_UPDATER_RESTART); } #endregion setOperationId #region restart if (args[0] == MainSettings.Constants.RESTART_PARAMETER) { ServiceController service = new ServiceController(MainSettings.Constants.SERVICE_NAME); TimeSpan timeout = TimeSpan.FromMilliseconds(RESTART_TIMEOUT); try { if (service.Status == ServiceControllerStatus.Running) { service.Stop(); service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); Tools.WaitAllProcessByname(MainSettings.Constants.MAGIC_UPDATER); Thread.Sleep(3000); //Если эта зараза повисла то кильнем, иначе крышка foreach (var proc in Process.GetProcessesByName(MainSettings.Constants.MAGIC_UPDATER)) { proc.Kill(); } service.Start(); service.WaitForStatus(ServiceControllerStatus.Running, timeout); } else if (service.Status == ServiceControllerStatus.Stopped) { service.Start(); service.WaitForStatus(ServiceControllerStatus.Running, timeout); } //Отправляем сообщение еще одному приложению MagicUpdaterRestart для того чтобы оно запустило MagicUpdaterSettings с UI //new StartSettingsViaPipe(_operationId).ActRun(); //Меняем состояние операции if (_operationId > 0) { Operation.AddOperState(_operationId, OperStates.End); Operation.SendOperationReport(_operationId, "", true); } } catch (Exception ex) { //Если службу не удалось нормлаьно остановитиь, то киляем ее процесс и пробуем запустить. try { foreach (var proc in Process.GetProcessesByName(MainSettings.Constants.MAGIC_UPDATER)) { proc.Kill(); } Thread.Sleep(3000); service.Start(); service.WaitForStatus(ServiceControllerStatus.Running, timeout); if (_operationId > 0) { Operation.AddOperState(_operationId, OperStates.End); Operation.SendOperationReport(_operationId, $"Не удалось штатно остановить службу, служба была остановлена принудительно и перезапущена. Ошибка штатной остановки: {ex.Message}", true); } NLogger.LogErrorToHdd($"{ex.Message}{Environment.NewLine}{ex.ToString()}", MainSettings.Constants.MAGIC_UPDATER_RESTART); } catch (Exception exx) { if (_operationId > 0) { Operation.AddOperState(_operationId, OperStates.End); Operation.SendOperationReport(_operationId, $"Не удалось перезапустить службу MagicUpdater. Ошибка: {exx.Message}", false); } NLogger.LogErrorToHdd($"{exx.Message}{Environment.NewLine}{exx.ToString()}", MainSettings.Constants.MAGIC_UPDATER_RESTART); } } } #endregion restart #region updateRestart if (args[0] == MainSettings.Constants.UPDATE_RESTART_PARAMETER) { try { ServiceController service = new ServiceController(MainSettings.Constants.SERVICE_NAME); TimeSpan timeout = TimeSpan.FromMilliseconds(RESTART_TIMEOUT); if (service.Status == ServiceControllerStatus.Running) { service.Stop(); service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); Tools.WaitAllProcessByname(MainSettings.Constants.MAGIC_UPDATER); Thread.Sleep(3000); //Если эта зараза повисла то кильнем, иначе крышка foreach (var proc in Process.GetProcessesByName(MainSettings.Constants.MAGIC_UPDATER)) { proc.Kill(); } CopyNewVersionFiles(); Thread.Sleep(1000); service.Start(); service.WaitForStatus(ServiceControllerStatus.Running, timeout); } else if (service.Status == ServiceControllerStatus.Stopped) { CopyNewVersionFiles(); Thread.Sleep(3000); service.Start(); service.WaitForStatus(ServiceControllerStatus.Running, timeout); } //Отправляем сообщение еще одному приложению MagicUpdaterRestart для того чтобы оно запустило MagicUpdaterSettings с UI //new StartSettingsViaPipe(_operationId).ActRun(); //Меняем состояние операции if (_operationId > 0) { Operation.AddOperState(_operationId, OperStates.End); Operation.SendOperationReport(_operationId, "", true); } } catch (Exception ex) { if (_operationId > 0) { Operation.SendOperationReport(_operationId, $"Не удалось перезапустить обновленную версию службы службу MagicUpdater. Original: {ex.ToString()}", false); } NLogger.LogErrorToHdd($"Не удалось перезапустить обновленную версию службы службу MagicUpdater. Original: {ex.ToString()}", MainSettings.Constants.MAGIC_UPDATER_RESTART); } } #endregion updateRestart #region waitForStartMagicUpdaterSettingsViaPipe if (args[0] == MainSettings.Constants.WAIT_FOR_START_SETTINGS_PARAMETER) { try { bool startSettingsMessageRecieved = false; Task.Factory.StartNew(() => { PipeServer pipeServer = new PipeServer(); var res = pipeServer.RecieveSyncMessage(); if (res.ActionType == CommunicationActionType.StartMagicUpdaterSettings) { Tools.StartMagicUpdaterSettings(); } startSettingsMessageRecieved = true; }); while (!startSettingsMessageRecieved) { } } catch (Exception ex) { if (_operationId > 0) { Operation.SendOperationReport(_operationId, $"Не удалось запустить MagicUpdaterRestart для MagicUpdaterSettings. Original: {ex.ToString()}", false); } NLogger.LogErrorToHdd($"Не удалось запустить MagicUpdaterRestart для MagicUpdaterSettings. Original: {ex.ToString()}", MainSettings.Constants.MAGIC_UPDATER_RESTART); } } #endregion waitForStartMagicUpdaterSettingsViaPipe } else { NLogger.LogErrorToHdd($"Обшибочные параметры запуска.", MainSettings.Constants.MAGIC_UPDATER_RESTART); } }
static void Main(string[] args) { if (args != null && args.Length > 0) { try { _operationId = Convert.ToInt32(args[0]); } catch { _operationId = 0; } if (args.Length == 2) { try { _action = Convert.ToString(args[1]); } catch { _action = ""; } } } // TODO: Add code to start application here // Testing -------------- //string svcPath; //string svcName; //string svcDispName; //path to the service that you want to install //const string SERVICE_PATH = @"D:\GitProjects\MagicUpdater\MagicUpdater\bin\Release\MagicUpdater.exe"; const string SERVICE_PATH = @"C:\SystemUtils\MagicUpdater\MagicUpdater.exe"; const string SERVICE_DISPLAY_NAME = "MagicUpdater"; const string SERVICE_NAME = "MagicUpdater"; const string MAGIC_UPDATER_PATH = @"C:\SystemUtils\MagicUpdater"; const string MAGIC_UPDATER_NEW_VER_PATH = @"C:\SystemUtils\MagicUpdaterNewVer"; const string SETTINGS_FILE_NAME = "settings.json"; ServiceInstaller serviceInstaller = new ServiceInstaller(); ServiceController service = new ServiceController(SERVICE_NAME); try { if (string.IsNullOrEmpty(_action)) { TimeSpan timeout = TimeSpan.FromMilliseconds(30000); Console.WriteLine("Тормозим старую службу..."); //Тормозим старую службу try { service.Stop(); service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); AddMessage($"Старая служба {SERVICE_NAME} - остановлена"); NLogger.LogDebugToHdd($"Старая служба {SERVICE_NAME} - остановлена"); Console.WriteLine("Старая служба остановлена"); } catch (Exception ex) { AddMessage(ex.Message); NLogger.LogDebugToHdd(ex.Message); Console.WriteLine(ex.Message); } Console.WriteLine("Удаляем старую службу..."); //Удаляем старую службу try { serviceInstaller.UnInstallService(SERVICE_NAME); Thread.Sleep(3000); NLogger.LogDebugToHdd($"Старая служба {SERVICE_NAME} - удалена"); AddMessage($"Старая служба {SERVICE_NAME} - удалена"); Console.WriteLine($"Старая служба {SERVICE_NAME} - удалена"); } catch (Exception ex) { AddMessage(ex.Message); NLogger.LogDebugToHdd(ex.Message); Console.WriteLine(ex.Message); } Console.WriteLine("Убиваем все процессы MagicUpdater..."); //Убиваем все процессы MagicUpdater Process[] procs = Process.GetProcessesByName(SERVICE_NAME); foreach (var proc in procs) { proc.Kill(); } Thread.Sleep(3000); NLogger.LogDebugToHdd($"Все процессы {SERVICE_NAME} - убиты"); AddMessage($"Все процессы {SERVICE_NAME} - убиты"); Console.WriteLine("Все процессы MagicUpdater завершены"); Console.WriteLine("Чистим реестр (автозагрузка MU как приложения в корне run)..."); //Чистим реестр (автозагрузка MU как приложения в корне run) #region Чистим реестр string keyName = @"Software\Microsoft\Windows\CurrentVersion\Run"; using (RegistryKey key = Registry.CurrentUser.OpenSubKey(keyName, true)) { if (key == null) { Console.WriteLine($"CurrentUser: Отсутствует путь в реестре {keyName}"); NLogger.LogErrorToHdd($"CurrentUser: Отсутствует путь в реестре {keyName}"); AddMessage($"CurrentUser: Отсутствует путь в реестре {keyName}"); } else { try { key.DeleteValue(SERVICE_NAME); Console.WriteLine($"CurrentUser: Значение реестра - {SERVICE_NAME} удалено"); NLogger.LogDebugToHdd($"CurrentUser: Значение реестра - {SERVICE_NAME} удалено"); AddMessage($"CurrentUser: Значение реестра - {SERVICE_NAME} удалено"); } catch (Exception ex) { NLogger.LogDebugToHdd($"CurrentUser: {ex.Message}"); Console.WriteLine($"CurrentUser: {ex.Message}"); AddMessage($"CurrentUser: {ex.Message}"); } } } using (RegistryKey key = Registry.LocalMachine.OpenSubKey(keyName, true)) { if (key == null) { NLogger.LogErrorToHdd($"LocalMachine: Отсутствует путь в реестре {keyName}"); AddMessage($"LocalMachine: Отсутствует путь в реестре {keyName}"); } else { try { key.DeleteValue(SERVICE_NAME); Console.WriteLine($"LocalMachine: Значение реестра - {SERVICE_NAME} удалено"); NLogger.LogDebugToHdd($"LocalMachine: Значение реестра - {SERVICE_NAME} удалено"); AddMessage($"LocalMachine: Значение реестра - {SERVICE_NAME} удалено"); } catch (Exception ex) { Console.WriteLine($"LocalMachine: {ex.Message}"); NLogger.LogDebugToHdd($"LocalMachine: {ex.Message}"); AddMessage($"LocalMachine: {ex.Message}"); } } } #endregion Чистим реестр Console.WriteLine("Удаляем все из папок MagicUpdater и MagicUpdaterNewVer..."); //Удаляем все из папок MagicUpdater и MagicUpdaterNewVer #region Удаляем все из папок MagicUpdater и MagicUpdaterNewVer try { DirectoryInfo di = new DirectoryInfo(MAGIC_UPDATER_PATH); foreach (FileInfo file in di.GetFiles()) { if (file.Name.ToUpper() != SETTINGS_FILE_NAME.ToUpper()) { file.Delete(); } } foreach (DirectoryInfo dir in di.GetDirectories()) { dir.Delete(true); } Console.WriteLine($"Путь {MAGIC_UPDATER_PATH} - очищен"); NLogger.LogDebugToHdd($"Путь {MAGIC_UPDATER_PATH} - очищен"); AddMessage($"Путь {MAGIC_UPDATER_PATH} - очищен"); } catch (Exception ex) { Console.WriteLine(ex.Message); NLogger.LogErrorToHdd(ex.ToString()); AddMessage(ex.Message); } try { DirectoryInfo di = new DirectoryInfo(MAGIC_UPDATER_NEW_VER_PATH); foreach (FileInfo file in di.GetFiles()) { file.Delete(); } foreach (DirectoryInfo dir in di.GetDirectories()) { dir.Delete(true); } Console.WriteLine($"Путь {MAGIC_UPDATER_NEW_VER_PATH} - очищен"); NLogger.LogDebugToHdd($"Путь {MAGIC_UPDATER_NEW_VER_PATH} - очищен"); AddMessage($"Путь {MAGIC_UPDATER_NEW_VER_PATH} - очищен"); } catch (Exception ex) { Console.WriteLine(ex.Message); NLogger.LogErrorToHdd(ex.ToString()); AddMessage(ex.Message); } #endregion Удаляем все из папок MagicUpdater и MagicUpdaterNewVer Thread.Sleep(1000); Console.WriteLine("Скачиваем новую версию..."); //Копируем новый MagicUpdater целиком! #region Копируем новый MagicUpdater целиком! using (Ftp ftp = new Ftp()) { ftp.Connect("mskftp.sela.ru"); // or ConnectSSL for SSL ftp.Login("cis_obmen", "cisobmen836"); try { Directory.CreateDirectory(MAGIC_UPDATER_PATH); ftp.DownloadFiles("MagicUpdaterTest", MAGIC_UPDATER_PATH, new RemoteSearchOptions("*", true)); } finally { if (ftp.Connected) { ftp.Close(); } } } Console.WriteLine($"Закачка нового {SERVICE_NAME} - завешена"); NLogger.LogDebugToHdd($"Закачка нового {SERVICE_NAME} - завешена"); AddMessage($"Закачка нового {SERVICE_NAME} - завешена"); #endregion Копируем новый MagicUpdater целиком! //Устанавливаем службу с режимом автозапуска //Запускаем службу Thread.Sleep(3000); Console.WriteLine("Создаем задачу MuInstallService в планировщике для установки службы..."); NLogger.LogDebugToHdd("Создаем задачу MuInstallService в планировщике для установки службы..."); try { CreateMuInstallServiceSchedule("MuInstallService"); Console.WriteLine("Задача MuInstallService создана"); NLogger.LogDebugToHdd("Задача MuInstallService создана"); } catch (Exception ex) { Console.WriteLine($"Задача MuInstallService: {ex.Message}"); NLogger.LogErrorToHdd($"Задача MuInstallService: {ex.ToString()}"); } //string path = System.Reflection.Assembly.GetEntryAssembly().Location; //Process.Start(path, $"{_operationId.ToString()} restart"); } else if (_action == "restart") { serviceInstaller.InstallService(SERVICE_PATH, SERVICE_NAME, SERVICE_DISPLAY_NAME); Console.WriteLine($"Новая служба {SERVICE_NAME} - установлена и запущена"); NLogger.LogDebugToHdd($"Новая служба {SERVICE_NAME} - установлена и запущена"); AddMessage($"Новая служба {SERVICE_NAME} - установлена и запущена"); //serviceInstaller.UnInstallService(SERVICE_NAME); SendMessagesToOperation(true); DeleteSchedule("MuInstallService"); } else if (_action == "schedule") { CreateMuInstallServiceSchedule("MuInstallService"); } } catch (Exception ex) { Console.WriteLine(ex.Message); NLogger.LogErrorToHdd(ex.ToString()); AddMessage(ex.Message); SendMessagesToOperation(false); } //Console.Read(); }