From c4dd04a22106dcc2e1d9616e96d971cc7a80f4b0 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Fri, 1 Mar 2024 17:15:55 +0100 Subject: [PATCH] modifiche x riordino chiavi in webCOnfigSetter --- README.md | 17 +++- README.pdf | Bin 0 -> 32122 bytes WebConfigSetter/CONF/ConfigDB.json | 53 +++++++++++++ WebConfigSetter/Objects.cs | 3 +- WebConfigSetter/Program.cs | 103 ++++++++++++++++++++----- WebConfigSetter/WebConfigSetter.csproj | 3 + 6 files changed, 159 insertions(+), 20 deletions(-) create mode 100644 README.pdf create mode 100644 WebConfigSetter/CONF/ConfigDB.json diff --git a/README.md b/README.md index 4442b1d..5c1f806 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,18 @@ # DeployUtils -Progetto per utility in fase di deploy \ No newline at end of file +Progetto per utility in fase di deploy + +## WebConfigSetter + +Console app dedicata alla gestione install delle web applications. +Viene impiegata per leggere conf da file *.xml (dotNet Framework) + *.json (dotNet core) x uniformare e gestire conf clienti su stringhe connessione, aprametri programmi + +## ConfMan.IOB + +Applicazione per la gestione, conversione dei file conf x IOB, e per la converzione del formato. + +Da completare insieme ad update dell'app IOB-WIN-NEXT. + +## MapoDataFiller + +Gestione fillup dati MAPO (alternativa ai simulatori) - LEGACY? \ No newline at end of file diff --git a/README.pdf b/README.pdf new file mode 100644 index 0000000000000000000000000000000000000000..483fa0072c2c1e455db66335678fde2d27cd3d06 GIT binary patch literal 32122 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 Ci*>dD literal 0 HcmV?d00001 diff --git a/WebConfigSetter/CONF/ConfigDB.json b/WebConfigSetter/CONF/ConfigDB.json new file mode 100644 index 0000000..1b4be5e --- /dev/null +++ b/WebConfigSetter/CONF/ConfigDB.json @@ -0,0 +1,53 @@ +{ + "appSettRules": { + "DbConfConnectionString": "Data Source=localhost\\sqlexpress;Initial Catalog=Jetco_MoonPro;Persist Security Info=True;User ID=steamware;Password=viadante16;", + "MoonProConnectionString": "Data Source=localhost\\sqlexpress;Initial Catalog=Jetco_MoonPro;Persist Security Info=True;User ID=steamware;Password=viadante16;", + "MoonProConnectionStringIS": "Data Source=localhost\\sqlexpress;Initial Catalog=Jetco_MoonPro_IS;Persist Security Info=True;User ID=steamware;Password=viadante16;", + "MoonProConnectionStringES3": "Data Source=localhost\\sqlexpress;Initial Catalog=Jetco_MoonPro_ES3;Persist Security Info=True;User ID=steamware;Password=viadante16;", + "PermessiConnectionString": "Data Source=localhost\\sqlexpress;Initial Catalog=Jetco_MoonPro;Persist Security Info=True;User ID=steamware;Password=viadante16;", + "UtenteCdcConnectionString": "Data Source=localhost\\sqlexpress;Initial Catalog=Jetco_Anagrafica;Persist Security Info=True;User ID=steamware;Password=viadante16;", + "VocabolarioConnectionString": "Data Source=localhost\\sqlexpress;Initial Catalog=Jetco_MoonPro;Persist Security Info=True;User ID=steamware;Password=viadante16;", + "CTrackConnectionString": "Data Source=localhost\\SQLEXPRESS;Initial Catalog=Jetco_C_TRACK;Persist Security Info=True;User id=steamware;Password=viadante16;", + "DevicesAuthConnectionString": "Data Source=localhost\\sqlexpress;Initial Catalog=Jetco_Anagrafica;Persist Security Info=True;User ID=steamware;Password=viadante16;", + "DevicesConnectionString": "Data Source=localhost\\sqlexpress;Initial Catalog=Jetco_Anagrafica;Persist Security Info=True;User ID=steamware;Password=viadante16;", + "MoonProConnectionStringArca": "Data Source=localhost\\sqlexpress;Initial Catalog=Jetco_MoonPro_IS;Persist Security Info=True;User ID=steamware;Password=viadante16;", + "MagDataConnectionString": "Data Source=localhost\\SQLEXPRESS;Initial Catalog=Jetco_MoonPro_MAG;Persist Security Info=True;User ID=steamware;Password=viadante16;", + "MoonProConnectionStringMAG": "Data Source=localhost\\SQLEXPRESS;Initial Catalog=Jetco_MoonPro_MAG;Persist Security Info=True;User ID=steamware;Password=viadante16;", + "mdbConnString": "mongodb://localhost:27017" + }, + "connStrRules": { + "MoonProConnectionString": "Data Source=localhost\\sqlexpress;Initial Catalog=Jetco_MoonPro;Persist Security Info=True;User ID=steamware;Password=viadante16;", + "MapoDb.Properties.Settings.MoonProConnectionString": "Data Source=localhost\\sqlexpress;Initial Catalog=Jetco_MoonPro;Persist Security Info=True;User ID=steamware;Password=viadante16;", + "MapoDb.Properties.Settings.MoonPro_IS_ConnectionString": "Data Source=localhost\\sqlexpress;Initial Catalog=Jetco_MoonPro_IS;Persist Security Info=True;User ID=steamware;Password=viadante16;", + "MapoDb.Properties.Settings.C_TRACKConnectionString": "Data Source=localhost\\sqlexpress;Initial Catalog=Jetco_C_TRACK;Persist Security Info=True;User ID=steamware;Password=viadante16;", + "MapoDb.Properties.Settings.MoonPro_ES3ConnectionString": "Data Source=localhost\\sqlexpress;Initial Catalog=Jetco_MoonPro_ES3;Persist Security Info=True;User ID=steamware;Password=viadante16;", + "ErrorLog": "Data Source=localhost\\sqlexpress;Initial Catalog=Elmah;Persist Security Info=True;User ID=steamware;Password=viadante16;", + "AppData.Properties.Settings.C_TRACKConnectionString": "Data Source=localhost\\SQLEXPRESS;Initial Catalog=Jetco_C_TRACK;Persist Security Info=True;User ID=steamware;Password=viadante16;", + "MoonProEntities": "metadata=res://*/Models.MPModel.csdl|res://*/Models.MPModel.ssdl|res://*/Models.MPModel.msl;provider=System.Data.SqlClient;provider connection string=\"data source=localhost\\SQLEXPRESS;initial catalog=Jetco_MoonPro;persist security info=True;user id=steamware;password=viadante16;multipleactiveresultsets=True;application name=EntityFramework\"", + "MagData.Properties.Settings.MoonPro_MAGConnectionString": "Data Source=localhost\\SQLEXPRESS;Initial Catalog=Jetco_MoonPro_MAG;Persist Security Info=True;User ID=steamware;Password=viadante16;", + "MapoMonEntities": "metadata=res://*/Models.MapoModel.csdl|res://*/Models.MapoModel.ssdl|res://*/Models.MapoModel.msl;provider=System.Data.SqlClient;provider connection string=\"data source=localhost\\SQLEXPRESS;initial catalog=Jetco_MoonPro;persist security info=True;user id=steamware;password=viadante16;multipleactiveresultsets=True;application name=EntityFramework\"", + "SteamWare.Properties.Settings.DbConfConnectionString": "Data Source=localhost\\sqlexpress;Initial Catalog=Jetco_MoonPro;Persist Security Info=True;User ID=steamware;Password=viadante16;" + }, + "jsonConnStrRules": { + "DefaultConnection": "Server=localhost\\SQLEXPRESS;Database=Jetco_MoonPro;Trusted_Connection=True;MultipleActiveResultSets=true", + "MP.Stats": "Server=localhost\\SQLEXPRESS;Database=Jetco_MoonPro_STATS;User ID=steamware;Password=viadante16;integrated security=False;MultipleActiveResultSets=True;App=MP.STATS;", + "MP.Prog": "Server=localhost\\SQLEXPRESS;Database=Jetco_MoonPro_PROG;User ID=steamware;Password=viadante16;integrated security=False;MultipleActiveResultSets=True;App=MP.Prog;", + "MP.Land": "Server=localhost\\SQLEXPRESS;Database=Jetco_MoonPro;User ID=steamware;Password=viadante16;integrated security=False;MultipleActiveResultSets=True;App=MP.Land;", + "MP.Mon": "Server=localhost\\SQLEXPRESS;Database=Jetco_MoonPro;User ID=steamware;Password=viadante16;integrated security=False;MultipleActiveResultSets=True;App=MP.Mon;", + "MP.Tab": "Server=localhost\\SQLEXPRESS;Database=Jetco_MoonPro; User ID=steamware;Password=viadante16; integrated security=False; MultipleActiveResultSets=True; App=MP.TAB3;", + "MP.Data": "Server=localhost\\SQLEXPRESS;Database=Jetco_MoonPro; User ID=steamware;Password=viadante16; integrated security=False; MultipleActiveResultSets=True; App=MP.Spec;", + "MP.Inve": "Server=localhost\\SQLEXPRESS;Database=Jetco_MoonPro_MAG; User ID=steamware;Password=viadante16; integrated security=False; MultipleActiveResultSets=True; App=MP.INVE;", + "MP.IS": "Server=localhost\\SQLEXPRESS;Database=Jetco_MoonPro_IS; User ID=steamware;Password=viadante16; integrated security=False; MultipleActiveResultSets=True; App=MP.INVE;", + "MP.All": "Server=localhost\\SQLEXPRESS;Database=Jetco_MoonPro; User ID=steamware; Password=viadante16; integrated security=False; MultipleActiveResultSets=True; App=MP.All;", + "MP.Mag": "Server=localhost\\SQLEXPRESS;Database=Jetco_MoonPro_MAG; User ID=steamware;Password=viadante16; integrated security=False; MultipleActiveResultSets=True; App=MP.Mag;", + "BaseUrl": "https://maposrv.egalware.com/", + "downloadPath": "C:\\Steamware\\installers\\MP", + "Redis": "localhost:6379,DefaultDatabase=1,connectTimeout=5000,syncTimeout=5000,asyncTimeout=5000,abortConnect=false,ssl=false", + "RedisAdmin": "localhost:6379,DefaultDatabase=1,connectTimeout=5000,syncTimeout=5000,asyncTimeout=5000,abortConnect=false,ssl=false,allowAdmin=true", + "maxAge": "2000", + "cacheCheckArtUsato": 2, + "redisLongTimeCache": 15, + "MpIoBaseUrl": "http://localhost/MP/IO/", + "BaseUrlJumper": "http://maposrv.egalware.com/mp/inve/Jumper?" + } +} \ No newline at end of file diff --git a/WebConfigSetter/Objects.cs b/WebConfigSetter/Objects.cs index b6f74a5..c0b649d 100644 --- a/WebConfigSetter/Objects.cs +++ b/WebConfigSetter/Objects.cs @@ -5,7 +5,8 @@ namespace WebConfigSetter public enum operationMode { readConf = 0, - writeConf + writeConf, + reorgConf } public class jsonAppConfig diff --git a/WebConfigSetter/Program.cs b/WebConfigSetter/Program.cs index dad6970..164a55d 100644 --- a/WebConfigSetter/Program.cs +++ b/WebConfigSetter/Program.cs @@ -2,6 +2,7 @@ using Newtonsoft.Json.Linq; using System; using System.IO; +using System.Linq; using System.Reflection; using System.Xml; @@ -22,9 +23,10 @@ namespace WebConfigSetter #region Protected Properties - protected static string baseDir { get; set; } = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);//@"c:\Steamware\WebConfigSetter"; + //@"c:\Steamware\WebConfigSetter"; + protected static string baseDir { get; set; } = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); #if DEBUG - protected static string baseWebAppDir { get; set; } = @"\\iis02\c$\inetpub\wwwroot\MP\"; + protected static string baseWebAppDir { get; set; } = @"\\iis01\c$\inetpub\wwwroot\MP\"; #else protected static string baseWebAppDir { get; set; } = @"c:\inetpub\wwwroot\MP\"; @@ -34,7 +36,7 @@ namespace WebConfigSetter protected static string currentSetFile { get; set; } = $@"{confDir}\default.json"; /// - /// modalità scrittura (altrimenti legge e carica conf parsando i files) + /// Modalità operativa: lettura/scrittura/riorg file conf /// protected static operationMode opMode { get; set; } = operationMode.readConf; @@ -56,7 +58,7 @@ namespace WebConfigSetter Console.WriteLine(separatore); Console.WriteLine(""); Console.WriteLine("Sintassi: WebConfigSetter.exe $1 $2 $3"); - Console.WriteLine("$1: Modalità operativa (0=read, 1=write)"); + Console.WriteLine("$1: Modalità operativa (0=read [default], 1=write, 2=riorganizzazione)"); Console.WriteLine("$2: WebApp directory di base"); Console.WriteLine("$3: SetName da applicare"); Console.WriteLine(separatore); @@ -67,16 +69,13 @@ namespace WebConfigSetter // carico parametri opzionali if (args.Length > 0) { - opMode = args[0] == "1" ? operationMode.writeConf : operationMode.readConf; + setOpMode(args[0]); } else { - Console.WriteLine($"Modalità operativa 0=read, 1=write [{opMode}]"); + Console.WriteLine($"Modalità operativa 0=read [default], 1=write, 2=riorganizzazione [{opMode}]"); userInput = Console.ReadLine(); - if (!string.IsNullOrEmpty(userInput)) - { - opMode = userInput == "1" ? operationMode.writeConf : operationMode.readConf; - } + setOpMode(userInput); } if (args.Length > 1) { @@ -119,20 +118,48 @@ namespace WebConfigSetter Console.WriteLine(separatore); } + /// + /// impostazione modalità operativa da parametro + /// + /// + private static void setOpMode(string currOpt) + { + switch (currOpt) + { + case "0": + opMode = operationMode.readConf; + break; + case "1": + opMode = operationMode.writeConf; + break; + case "2": + opMode = operationMode.reorgConf; + break; + default: + opMode = operationMode.readConf; + break; + } + } + /// /// Esecuzione richiesta principale /// private static void processRequest() { - // caso 1: acquisisco conf - if (opMode == operationMode.readConf) + switch (opMode) { - readConfToFiles(); - } - // caso 2: effettuo sostituzioni - else - { - writeConfToFiles(); + case operationMode.readConf: + readConfToFiles(); + break; + case operationMode.writeConf: + writeConfToFiles(); + break; + case operationMode.reorgConf: + reorgConfFile(); + break; + default: + readConfToFiles(); + break; } } @@ -234,6 +261,11 @@ namespace WebConfigSetter } } + // STEP 3: riordino blocchi configurazione + currConfig.appSettRules = currConfig.appSettRules.OrderBy(x => x.Key).ToDictionary(x => x.Key, x => x.Value); + currConfig.connStrRules = currConfig.connStrRules.OrderBy(x => x.Key).ToDictionary(x => x.Key, x => x.Value); + currConfig.jsonConnStrRules = currConfig.jsonConnStrRules.OrderBy(x => x.Key).ToDictionary(x => x.Key, x => x.Value); + // serializzo! string rawData = JsonConvert.SerializeObject(currConfig, Newtonsoft.Json.Formatting.Indented); @@ -365,6 +397,41 @@ namespace WebConfigSetter } } + private static void reorgConfFile() + { + // check file exists... + if (File.Exists(currentSetFile)) + { + // leggo il file delle configurazioni da applicare... + string rawData = File.ReadAllText(currentSetFile); + if (!string.IsNullOrEmpty(rawData)) + { + // leggo conf + currConfig = JsonConvert.DeserializeObject(rawData); + + // riordino blocchi configurazione + currConfig.appSettRules = currConfig.appSettRules.OrderBy(x => x.Key).ToDictionary(x => x.Key, x => x.Value); + currConfig.connStrRules = currConfig.connStrRules.OrderBy(x => x.Key).ToDictionary(x => x.Key, x => x.Value); + currConfig.jsonConnStrRules = currConfig.jsonConnStrRules.OrderBy(x => x.Key).ToDictionary(x => x.Key, x => x.Value); + + // salvo: serializzo! + rawData = JsonConvert.SerializeObject(currConfig, Newtonsoft.Json.Formatting.Indented); + + // salvo il file di conf! + File.WriteAllText(currentSetFile, rawData); + + } + else + { + Console.WriteLine($"Errore: file conf vuoto: {currentSetFile}"); + } + } + else + { + Console.WriteLine($"Errore: file conf non trovato: {currentSetFile}"); + } + } + #endregion Private Methods } } \ No newline at end of file diff --git a/WebConfigSetter/WebConfigSetter.csproj b/WebConfigSetter/WebConfigSetter.csproj index a447574..02d8c77 100644 --- a/WebConfigSetter/WebConfigSetter.csproj +++ b/WebConfigSetter/WebConfigSetter.csproj @@ -24,6 +24,9 @@ Always + + Always + Always