Пример #1
0
        /// <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());
        }
Пример #2
0
        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());
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
 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);
     }
 }
Пример #5
0
 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);
     }
 }
Пример #6
0
        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());
            }
        }
Пример #7
0
        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);
                }
            }
        }
Пример #8
0
        public void LoadSqlMainSettings()
        {
            var res = LoadSqlMainSettingsFromSQL();

            if (!res.IsComplete)
            {
                NLogger.LogErrorToHdd(res.Message);
            }
        }
Пример #9
0
        public void LoadSqlLocalSettings()
        {
            var res = LoadSqlLocalSettingsFromSQL(MainSettings.MainSqlSettings.ComputerId);

            if (!res.IsComplete)
            {
                NLogger.LogErrorToHdd(res.Message);
            }
        }
Пример #10
0
 public static void SendOperationReport(int?operationId, string message, bool isCompleted)
 {
     if (operationId != null)
     {
         SqlWorks.ExecProc("SendOperationReport", operationId, isCompleted, message);
     }
     else
     {
         NLogger.LogErrorToHdd($"Ошибка отправки отчета для операции");
     }
 }
Пример #11
0
        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;
            }
        }
Пример #12
0
        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());
        }
Пример #13
0
        public static void SendAsyncMessage(CommunicationObject communicationObject)
        {
            var res = StartSettingsApplication();

            if (!res.IsComplete)
            {
                NLogger.LogErrorToHdd(res.Message, MainSettings.Constants.MAGIC_UPDATER);
            }
            CreateAsyncServerBase();
            _pipesAsyncServer.SendMessage(communicationObject);
        }
Пример #14
0
        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();
            }
        }
Пример #15
0
        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);
        }
Пример #16
0
        public TryLoadCommonGlobalSettings LoadCommonGlobalSettings()
        {
            var res = LoadCommonGlobalSettingsFromSQL();

            if (!res.IsComplete)
            {
                NLogger.LogErrorToHdd(res.Message);
                return(new TryLoadCommonGlobalSettings(false, res.Message));
            }
            else
            {
                return(new TryLoadCommonGlobalSettings());
            }
        }
Пример #17
0
 public bool Install()
 {
     try
     {
         UninstallBase();
         InstallBase();
         return(true);
     }
     catch (Exception ex)
     {
         Program.MainForm?.LogInstallServiceString(ex);
         NLogger.LogErrorToHdd(ex.ToString());
         AddMessage(ex.Message);
         return(false);
     }
 }
Пример #18
0
        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);
            }
        }
Пример #19
0
        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 компьютера."));
            }
        }
Пример #20
0
        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;
            }
        }
Пример #21
0
        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());
            }
        }
Пример #22
0
        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());
        }
Пример #23
0
        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
        }
Пример #24
0
        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);
            }
        }
Пример #25
0
        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();
        }