/// <summary> /// Десериализация скрипта файла настроек /// </summary> /// <param name="path">Имя файла</param> /// <param name="script">Выходной текст скрипта настроек</param> /// <returns>Удалась десериализация или нет</returns> private bool CheckUpdateAppSettingsScript(string path, ref UpdateSettingsObject script) { var fileName = Path.GetFileName(path); if (!"updateAppSettings.script".Equals(fileName)) { return(false); } try { var jsonText = File.ReadAllText(path); script = JsonConvert.DeserializeObject <UpdateSettingsObject>(jsonText); return(true); } catch { _logger.Error($"Не удалось прочитать скрипт обновления файла настроек"); return(false); } }
/// <summary> /// Заменяет имеющиеся dll новыми версиями. Eсли возникла ошибка, делается откат /// </summary> /// <returns>Успешно ли прошла подмена dll</returns> private bool TryUpdate() { this.LogOnMethodEnter(); var result = true; if (AppDomain.CurrentDomain.IsDefaultAppDomain()) { // Get the startup path. string assemblyPath = Assembly.GetExecutingAssembly().Location; string assemblyDirectory = Path.GetDirectoryName(assemblyPath); // Check deleted files folders existance string backupDirectory = Path.Combine(assemblyDirectory, BACKUP_FILES_SUBFOLDER); string updateDirectory = Path.Combine(assemblyDirectory, UPDATE_FILES_SUBFOLDER); CreateCleanDirectory(backupDirectory); var updateFilesList = new List <string>(); // Коллекция с теми файлами, которые мы обновили в директории программы UpdateSettingsObject updateAppSettingsScript = null; try { if (Directory.Exists(updateDirectory)) { foreach (string newFile in Directory.GetFiles(updateDirectory, "*", SearchOption.AllDirectories)) { if (CheckUpdateAppSettingsScript(newFile, ref updateAppSettingsScript)) { continue; } //если есть файл sql, то надо обновить БД if (Path.GetExtension(newFile).Equals(".sql")) { UpdateDatabase(newFile); continue; } var fileName = Path.GetFileName(newFile); if (fileName == AGENT_NAME) { _logger.Info($"Пропускаем файл {fileName}"); continue; } string backupingFile = Path.Combine(assemblyDirectory, fileName); if (File.Exists(backupingFile)) // Забэкапим обновляемый файл, если он есть в директории программы { string backupedFile = Path.Combine(assemblyDirectory, BACKUP_FILES_SUBFOLDER, fileName); CreateDirectoryIfNotExists(backupedFile); _logger.Info($"Делаем бекап файла {fileName}"); File.Move(backupingFile, backupedFile); } // Скопируем новый файл и создадим структуру папок для него, если необходимо CreateDirectoryIfNotExists(backupingFile); _logger.Info($"Копируем файл {fileName}"); File.Copy(newFile, backupingFile, true); updateFilesList.Add(backupingFile); } UpdateAppSettings(updateAppSettingsScript); } } catch (Exception ex) { // Обновить не получилось. Будем откатываться result = false; // Удалим добавленные файлы foreach (var file in updateFilesList) { File.Delete(file); } // Восстановим файлы из бэкапа foreach (string file in Directory.GetFiles(backupDirectory, "*", SearchOption.AllDirectories)) { var fileName = Path.GetFileName(file); var backupFile = Path.Combine(assemblyDirectory, fileName); CreateDirectoryIfNotExists(backupFile); _logger.Info($"Возвращаем файл {fileName}"); File.Copy(file, backupFile, true); } _logger.Error(ErrorProcessing.ExceptionMessageToString(ex)); } } return(this.LogOnReturn(result)); }
/// <summary> /// Обновление скрипта файла настроек /// </summary> /// <param name="updateAppSettingsScript">текст скрипта</param> private void UpdateAppSettings(UpdateSettingsObject updateAppSettingsScript) { if (updateAppSettingsScript == null) { return; } try { _logger.Info($"Обновляем файл настроек..."); string assemblyPath = Assembly.GetExecutingAssembly().Location; string assemblyDirectory = Path.GetDirectoryName(assemblyPath); string appSettingsPath = Path.Combine(assemblyDirectory, "appsettings.json"); var currentSettingsText = File.ReadAllText(appSettingsPath); var currentSettings = JObject.Parse(currentSettingsText).SelectToken(""); if (updateAppSettingsScript.Remove?.Any() ?? false) { foreach (var item in updateAppSettingsScript.Remove) { try { var path = item.Split("."); var currentToken = currentSettings; for (int i = 0; i < path.Length - 1; i++) { currentToken = currentToken?.SelectToken(path[i]); } (currentToken as JObject)?.Property(path.Last())?.Remove(); _logger.Info($"Successfully removed {item}"); } catch (Exception ex) { _logger.Error($"Cannot remove {item}\r\n{ex.Message}"); } } } if (updateAppSettingsScript.Add?.Any() ?? false) { foreach (var item in updateAppSettingsScript.Add) { try { var path = item.Key.Split("."); var currentToken = currentSettings; for (int i = 0; i < path.Length - 1; i++) { currentToken = currentToken?.SelectToken(path[i]); } (currentToken as JObject)?.Add(path.Last(), new JValue(item.Value)); _logger.Info($"Successfully added {item.Key}"); } catch (Exception ex) { _logger.Error($"Cannot add {item.Key}\r\n{ex.Message}"); } } } if (updateAppSettingsScript.Set?.Any() ?? false) { foreach (var item in updateAppSettingsScript.Set) { try { var path = item.Key.Split("."); var currentToken = currentSettings; for (int i = 0; i < path.Length - 1; i++) { currentToken = currentToken?.SelectToken(path[i]); } (currentToken as JObject)?.Property(path.Last())?.Replace(new JValue(item.Value)); _logger.Info($"Successfully changed {item.Key}"); } catch (Exception ex) { _logger.Error($"Cannot change {item.Key}\r\n{ex.Message}"); } } } var newValue = currentSettings.ToString(); Console.WriteLine(newValue); File.WriteAllText("new.json", newValue); Console.SetCursorPosition(0, 0); Console.ReadKey(); _logger.Info($"Файл настроек успешно обновлен"); } catch { _logger.Error($"Не удалось выполнить скрипт обновления файла настроек"); } }