From 8cd2e5c7570ee111fb3d39a5241b3d63dffa29bc Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 26 May 2021 18:48:47 +0200 Subject: [PATCH] Update con gestione JSON --- WebConfigSetter/Objects.cs | 11 +++ WebConfigSetter/Program.cs | 106 +++++++++++++++++++++++-- WebConfigSetter/WebConfigSetter.csproj | 1 + 3 files changed, 111 insertions(+), 7 deletions(-) diff --git a/WebConfigSetter/Objects.cs b/WebConfigSetter/Objects.cs index 143e56d..302ded9 100644 --- a/WebConfigSetter/Objects.cs +++ b/WebConfigSetter/Objects.cs @@ -10,12 +10,23 @@ namespace WebConfigSetter writeConf } + public class jsonAppConfig + { + #region Public Fields + + public Dictionary ConnectionStrings = new Dictionary(); + + #endregion Public Fields + + } + public class SetCliente { #region Public Fields public Dictionary appSettRules = new Dictionary(); public Dictionary connStrRules = new Dictionary(); + public Dictionary jsonConnStrRules = new Dictionary(); #endregion Public Fields } diff --git a/WebConfigSetter/Program.cs b/WebConfigSetter/Program.cs index 187427b..abfc786 100644 --- a/WebConfigSetter/Program.cs +++ b/WebConfigSetter/Program.cs @@ -1,4 +1,5 @@ using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using System; using System.IO; using System.Reflection; @@ -49,6 +50,11 @@ namespace WebConfigSetter if (args == null || args.Length == 0) { Console.WriteLine(separatore); + Console.WriteLine("WebConfigSetter: Gestione configurazione config file per web applications"); + Console.WriteLine(""); + Console.WriteLine("Processa i file di applicazioni asp.net (XML) e dotnet core (Json), per queste ultime partendo dalla versione appsettings.Production.json"); + Console.WriteLine(separatore); + Console.WriteLine(""); Console.WriteLine("Sintassi: WebConfigSetter.exe $1 $2 $3"); Console.WriteLine("$1: Modalità operativa (0=read, 1=write)"); Console.WriteLine("$2: WebApp directory di base"); @@ -132,13 +138,20 @@ namespace WebConfigSetter private static void readConfToFiles() { - // cerca i file we.config dalla folder richiesta in giù... - string[] configFiles = Directory.GetFiles(baseWebAppDir, "web.config", SearchOption.AllDirectories); - XmlDocument doc = new XmlDocument(); - - foreach (var item in configFiles) + // cerca i file web.config dalla folder richiesta in giù... + string[] configFilesXml = Directory.GetFiles(baseWebAppDir, "web.config", SearchOption.AllDirectories); + string[] configFilesJson = Directory.GetFiles(baseWebAppDir, "appsettings.Production.json", SearchOption.AllDirectories); + // se fosse vuoto usa invece il file base + if (configFilesJson.Length == 0) { - Console.WriteLine($"Found: {item}"); + configFilesJson = Directory.GetFiles(baseWebAppDir, "appsettings.json", SearchOption.AllDirectories); + } + + // STEP 1: processo files XML (stile asp.net <= 4.8) + XmlDocument doc = new XmlDocument(); + foreach (var item in configFilesXml) + { + Console.WriteLine($"XML Found: {item}"); doc = new XmlDocument(); doc.Load(item); @@ -168,6 +181,36 @@ namespace WebConfigSetter } } + // STEP 2: processo files json (stile dotnetcore >= 5.0) + jsonAppConfig currJsonConf = new jsonAppConfig(); + foreach (var item in configFilesJson) + { + Console.WriteLine($"JSON Found: {item}"); + + string currFileData = File.ReadAllText(item); + if (!string.IsNullOrEmpty(currFileData)) + { + try + { + currJsonConf = JsonConvert.DeserializeObject(currFileData); + } + catch (Exception exc) + { + Console.WriteLine($"Eccezione in decodifica item {item}{Environment.NewLine}{exc}"); + } + if (currJsonConf.ConnectionStrings != null) + { + foreach (var chiave in currJsonConf.ConnectionStrings) + { + if (!currConfig.jsonConnStrRules.ContainsKey(chiave.Key)) + { + currConfig.jsonConnStrRules.Add(chiave.Key, chiave.Value); + } + } + } + } + } + // serializzo! string rawData = JsonConvert.SerializeObject(currConfig, Newtonsoft.Json.Formatting.Indented); @@ -188,11 +231,13 @@ namespace WebConfigSetter // cerca i file we.config dalla folder richiesta in giù... string[] configFiles = Directory.GetFiles(baseWebAppDir, "web.config", SearchOption.AllDirectories); + string[] configFilesJson = Directory.GetFiles(baseWebAppDir, "appsettings*.json", SearchOption.AllDirectories); XmlDocument doc = new XmlDocument(); + // STEP 1: processo files XML (stile asp.net <= 4.8) foreach (var item in configFiles) { - Console.Write($"Found: {item} --> "); + Console.Write($"XML Found: {item} --> "); doc = new XmlDocument(); doc.Load(item); @@ -227,6 +272,53 @@ namespace WebConfigSetter doc.Save(item); Console.WriteLine(" values updated!"); } + + // STEP 2: processo files json (stile dotnetcore >= 5.0) + JToken currJsonConf; + foreach (var item in configFilesJson) + { + Console.Write($"JSON Found: {item} --> "); + + string currFileData = File.ReadAllText(item); + bool changed = false; + if (!string.IsNullOrEmpty(currFileData)) + { + try + { + //currJsonConf = JsonConvert.DeserializeObject(currFileData); + currJsonConf = JToken.Parse(currFileData); + if (currJsonConf.HasValues) + { + if (currJsonConf["ConnectionStrings"] != null) + { + foreach (var keySubst in currConfig.jsonConnStrRules) + { + if (currJsonConf["ConnectionStrings"][keySubst.Key] != null) + { + currJsonConf["ConnectionStrings"][keySubst.Key].Replace(keySubst.Value); + changed = true; + } + } + } + } + string newFileData = JsonConvert.SerializeObject(currJsonConf, Newtonsoft.Json.Formatting.Indented); + if (changed) + { + // ora lo SALVO (il documento...) + File.WriteAllText(item, newFileData); + Console.WriteLine(" values updated!"); + } + else + { + Console.WriteLine("...no change..."); + } + } + catch (Exception exc) + { + Console.WriteLine($"Eccezione in decodifica item {item}{Environment.NewLine}{exc}"); + } + } + } } else { diff --git a/WebConfigSetter/WebConfigSetter.csproj b/WebConfigSetter/WebConfigSetter.csproj index fa9a39d..c5b36ac 100644 --- a/WebConfigSetter/WebConfigSetter.csproj +++ b/WebConfigSetter/WebConfigSetter.csproj @@ -3,6 +3,7 @@ Exe net5.0 + 1.0.2105.2618