Commit 8e8a7bf0599696f5cfbbbefcc547a9a03a41edef

Authored by Schwirg László
1 parent 37bf94ab

jelentős fejleszetések

Vrh.Log4Pro.MaintenanceConsole/App.config
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 5 <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
6 </configSections> 6 </configSections>
7 <startup> 7 <startup>
8 - <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" /> 8 + <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
9 </startup> 9 </startup>
10 <appSettings> 10 <appSettings>
11 <add key="VRH.XmlParser:root" value="XmlParser.xml" /> 11 <add key="VRH.XmlParser:root" value="XmlParser.xml" />
@@ -16,11 +16,19 @@ @@ -16,11 +16,19 @@
16 <assemblyIdentity name="System.Reflection.TypeExtensions" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> 16 <assemblyIdentity name="System.Reflection.TypeExtensions" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
17 <bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" /> 17 <bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
18 </dependentAssembly> 18 </dependentAssembly>
  19 + <dependentAssembly>
  20 + <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
  21 + <bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0" />
  22 + </dependentAssembly>
19 </assemblyBinding> 23 </assemblyBinding>
20 </runtime> 24 </runtime>
21 - <entityFramework> 25 + <system.web>
  26 + <membership configSource="system.web.membership.config"/>
  27 + <roleManager configSource="system.web.roleManager.config"/>
  28 + </system.web>
  29 + <entityFramework>
22 <providers> 30 <providers>
23 <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 31 <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
24 </providers> 32 </providers>
25 </entityFramework> 33 </entityFramework>
26 -</configuration>  
27 \ No newline at end of file 34 \ No newline at end of file
  35 +</configuration>
Vrh.Log4Pro.MaintenanceConsole/Config.xml
@@ -152,10 +152,10 @@ @@ -152,10 +152,10 @@
152 </WindowsServices> 152 </WindowsServices>
153 153
154 <WebApplications> 154 <WebApplications>
155 - <WebApplication Id="WEBAPP_ANDON" Name="WebAndon" Description="@WEBANDONDESC@" AppPool="WebAndon" Website="Default Web Site" InstallDir="@DIR_WEBAPPWEBANDON@" SiteRootDir="@DIR_WEBAPPWEBANDON@" IdentityConfigFile="@WEBANDONIDENTITYCONFIG@" AppPoolUsername="" AppPoolPassword="" AppPoolPipeLineMode="" RecreateSite="false" RecreatePool="true" RecreateApp="true"/>  
156 - <WebApplication Id="WEBAPP_ALM" Name="WebALM" Description="@WEBALMDESC@" AppPool="WebALM" Website="Default Web Site" InstallDir="@DIR_WEBAPPWEBALM@" SiteRootDir="@DIR_WEBAPPWEBALM@" IdentityConfigFile="@WEBALMIDENTITYCONFIG@" AppPoolUsername="" AppPoolPassword="" AppPoolPipeLineMode="" RecreateSite="false" RecreatePool="true" RecreateApp="true"/>  
157 - <WebApplication Id="WEBAPP_CP" Name="WebPack" Description="@WEBPACKDESC@" AppPool="WebPack" Website="Default Web Site" InstallDir="@DIR_WEBAPPWEBPACK@" SiteRootDir="@DIR_WEBAPPWEBPACK@" IdentityConfigFile="@WEBPACKIDENTITYCONFIG@" AppPoolUsername="" AppPoolPassword="" AppPoolPipeLineMode="" RecreateSite="false" RecreatePool="true" RecreateApp="true"/>  
158 - <WebApplication Id="WEBAPP_LOG4PROIS" Name="Log4ProIS" Description="@WEBLOG4PROISDESC@" AppPool="Log4ProIS" Website="Default Web Site" InstallDir="@DIR_WEBAPPLOG4PROIS@" SiteRootDir="@DIR_WEBAPPLOG4PROIS@" IdentityConfigFile="@LOG4PROISIDENTITYCONFIG@" AppPoolUsername="" AppPoolPassword="" AppPoolPipeLineMode="" RecreateSite="false" RecreatePool="true" RecreateApp="true"/> 155 + <WebApplication Id="WEBAPP_ANDON" Name="WebAndon" Description="@WEBANDONDESC@" AppPool="WebAndon" Website="Default Web Site" InstallDir="@DIR_WEBAPPWEBANDON@" SiteRootDir="@DIR_WEBAPPWEBANDON@" ImpersonateIdentityConfigFile="@WEBANDONIDENTITYCONFIG@" AppPoolUsername="" AppPoolPassword="" AppPoolPipeLineMode="" RecreateSite="false" RecreatePool="true" RecreateApp="true"/>
  156 + <WebApplication Id="WEBAPP_ALM" Name="WebALM" Description="@WEBALMDESC@" AppPool="WebALM" Website="Default Web Site" InstallDir="@DIR_WEBAPPWEBALM@" SiteRootDir="@DIR_WEBAPPWEBALM@" ImpersonateIdentityConfigFile="@WEBALMIDENTITYCONFIG@" AppPoolUsername="" AppPoolPassword="" AppPoolPipeLineMode="" RecreateSite="false" RecreatePool="true" RecreateApp="true"/>
  157 + <WebApplication Id="WEBAPP_CP" Name="WebPack" Description="@WEBPACKDESC@" AppPool="WebPack" Website="Default Web Site" InstallDir="@DIR_WEBAPPWEBPACK@" SiteRootDir="@DIR_WEBAPPWEBPACK@" ImpersonateIdentityConfigFile="@WEBPACKIDENTITYCONFIG@" AppPoolUsername="" AppPoolPassword="" AppPoolPipeLineMode="" RecreateSite="false" RecreatePool="true" RecreateApp="true"/>
  158 + <WebApplication Id="WEBAPP_LOG4PROIS" Name="Log4ProIS" Description="@WEBLOG4PROISDESC@" AppPool="Log4ProIS" Website="Default Web Site" InstallDir="@DIR_WEBAPPLOG4PROIS@" SiteRootDir="@DIR_WEBAPPLOG4PROIS@" ImpersonateIdentityConfigFile="@LOG4PROISIDENTITYCONFIG@" AppPoolUsername="" AppPoolPassword="" AppPoolPipeLineMode="" RecreateSite="false" RecreatePool="true" RecreateApp="true"/>
159 </WebApplications> 159 </WebApplications>
160 160
161 <FileCleaner CleanupDays="7"> 161 <FileCleaner CleanupDays="7">
@@ -197,4 +197,18 @@ @@ -197,4 +197,18 @@
197 <ScheduledTask Name="CP_PurgeFiles_DAILY" Priority="7" Schedule="DAILY" StartTime="05:00" Enable="true" Run="false" Commandname="sc.exe" /> 197 <ScheduledTask Name="CP_PurgeFiles_DAILY" Priority="7" Schedule="DAILY" StartTime="05:00" Enable="true" Run="false" Commandname="sc.exe" />
198 </ScheduledTasks> 198 </ScheduledTasks>
199 199
  200 + <BackupPackages>
  201 + <BackupPackage Name="FULL" Description="Full backup package" IncludeFilenameMaskList="*.zip" PackageFilePath="{APPLICATION}_{SITE}_BackupPackage_{TIMESTAMP}_{PACKAGENAME}" CreateExe="true">
  202 + <BackupFolder Path="" Description="1" BackupToFile="1.zip" IncludeNameMask="*.bin" IncludePathRegexp=".*"/>
  203 + <BackupFolder Path="" Description="2" BackupToFile="2.zip" IncludeNameMask="*.xml" IncludePathRegexp=".*"/>
  204 + </BackupPackage>
  205 + </BackupPackages>
  206 +
  207 + <Log4ProUserManager SQLConnectionString="MAINDBLOG4PRO" PredefinedUsernameList="Admin,Administrator,Operator,Manager,Supervisor,lschwirg,imolnar">
  208 + <UserGroups>
  209 + <UserGroup Id="TEST" Displayname="All test users">^(T|t)est.*$</UserGroup>
  210 + <UserGroup Id="OL" Displayname="Operator and Lineleader">^(Operator|Lineleader)$</UserGroup>
  211 + <UserGroup Id="ALL" Displayname="All users except predefined" />
  212 + </UserGroups>
  213 + </Log4ProUserManager>
200 </Configuration> 214 </Configuration>
201 \ No newline at end of file 215 \ No newline at end of file
Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - ColorConsole.cs
@@ -11,7 +11,7 @@ using System.Diagnostics; @@ -11,7 +11,7 @@ using System.Diagnostics;
11 using Vrh.XmlProcessing; 11 using Vrh.XmlProcessing;
12 using System.Xml.Linq; 12 using System.Xml.Linq;
13 13
14 -namespace Vrh.Log4Pro.MaintenanceConsole 14 +namespace Vrh.Log4Pro.MaintenanceConsole.ColorConsoleNS
15 { 15 {
16 #region ColorConsole 16 #region ColorConsole
17 public static class ColorConsole 17 public static class ColorConsole
@@ -101,7 +101,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -101,7 +101,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
101 /// <param name="bracket"></param> 101 /// <param name="bracket"></param>
102 /// <param name="prefix"></param> 102 /// <param name="prefix"></param>
103 /// <returns></returns> 103 /// <returns></returns>
104 - public static string ReadLine(string text = null, ConsoleColor? f = null, ConsoleColor? b = null, string bracket = null, string prefix = "") 104 + public static string ReadLine(string text = null, ConsoleColor? f = null, ConsoleColor? b = null, string bracket = null, string prefix = "",string suffix = "")
105 { 105 {
106 if (silentMode) 106 if (silentMode)
107 { 107 {
@@ -115,7 +115,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -115,7 +115,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
115 } 115 }
116 else 116 else
117 { 117 {
118 - Write(text, f, b, bracket, prefix); 118 + Write(text, f, b, bracket, prefix,suffix);
119 return Console.ReadLine(); 119 return Console.ReadLine();
120 } 120 }
121 } 121 }
@@ -133,6 +133,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -133,6 +133,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole
133 133
134 public static int CursorLeft { get { return Console.CursorLeft; } } 134 public static int CursorLeft { get { return Console.CursorLeft; } }
135 public static int CursorTop { get { return Console.CursorTop; } } 135 public static int CursorTop { get { return Console.CursorTop; } }
  136 + public static int WindowWidth { get { return Console.WindowWidth; } }
  137 + public static int BufferWidth { get { return Console.BufferWidth; } }
  138 + public static int WindowHeight { get { return Console.WindowHeight; } }
  139 + public static int BufferHeight { get { return Console.BufferHeight; } }
  140 + public static int WindowLeft { get { return Console.WindowLeft; } }
  141 + public static int WindowTop { get { return Console.WindowTop; } }
136 142
137 public static void Clear() { Console.Clear(); } 143 public static void Clear() { Console.Clear(); }
138 144
Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - CommandLineParser.cs
@@ -8,10 +8,12 @@ using Microsoft.Web.Administration; @@ -8,10 +8,12 @@ using Microsoft.Web.Administration;
8 using System.Management; 8 using System.Management;
9 using System.Diagnostics; 9 using System.Diagnostics;
10 10
  11 +using Vrh.Log4Pro.MaintenanceConsole.ColorConsoleNS;
  12 +
11 using Vrh.XmlProcessing; 13 using Vrh.XmlProcessing;
12 using System.Xml.Linq; 14 using System.Xml.Linq;
13 15
14 -namespace Vrh.Log4Pro.MaintenanceConsole 16 +namespace Vrh.Log4Pro.MaintenanceConsole.CommandLineParserNS
15 { 17 {
16 #region CommandLineParser 18 #region CommandLineParser
17 public static class CommandLineParser 19 public static class CommandLineParser
@@ -74,7 +76,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -74,7 +76,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
74 } 76 }
75 else if (chr == ' ' && !quoted) 77 else if (chr == ' ' && !quoted)
76 { 78 {
77 - if (started) yield return result.ToString(); 79 + if (started) { yield return result.ToString(); }
78 result.Clear(); 80 result.Clear();
79 started = false; 81 started = false;
80 } 82 }
@@ -85,7 +87,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -85,7 +87,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
85 } 87 }
86 } 88 }
87 89
88 - if (started) yield return result.ToString(); 90 + if (started) { yield return result.ToString(); }
89 } 91 }
90 public static void UnitTest() 92 public static void UnitTest()
91 { 93 {
@@ -156,6 +158,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -156,6 +158,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
156 return; 158 return;
157 } 159 }
158 for (int i = 0; i < r.Length; i++) 160 for (int i = 0; i < r.Length; i++)
  161 + {
159 if (r[i] != sr[i]) 162 if (r[i] != sr[i])
160 { 163 {
161 ColorConsole.WriteLine($"ERROR:{id}"); 164 ColorConsole.WriteLine($"ERROR:{id}");
@@ -164,8 +167,9 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -164,8 +167,9 @@ namespace Vrh.Log4Pro.MaintenanceConsole
164 ColorConsole.WriteLine($" expected: {sexp}"); 167 ColorConsole.WriteLine($" expected: {sexp}");
165 return; 168 return;
166 } 169 }
  170 + }
167 } 171 }
168 - catch (Exception ex) 172 + catch
169 { 173 {
170 ColorConsole.WriteLine($"EXCEP:{id}"); 174 ColorConsole.WriteLine($"EXCEP:{id}");
171 ColorConsole.WriteLine($" cmdline : {cmd}"); 175 ColorConsole.WriteLine($" cmdline : {cmd}");
@@ -176,4 +180,119 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -176,4 +180,119 @@ namespace Vrh.Log4Pro.MaintenanceConsole
176 } 180 }
177 } 181 }
178 #endregion CommandLineParser 182 #endregion CommandLineParser
  183 + #region Commandline parameter definition class
  184 + public static class CLP
  185 + {
  186 + public const string CMD_MODULE = "-MODULE";
  187 + public const string CMD_FUNCTION = "-FUNCTION";
  188 + public const string CMD_SILENT = "-SILENT";
  189 + public const string CMD_APPCONFIG = "-APPCONFIG";
  190 + public static class Module
  191 + {
  192 + public static class Log4ProUserManager
  193 + {
  194 + public const string KEY = "LUM";
  195 + public static class Functions
  196 + {
  197 + public static class CreateSuperuser { public const string KEY = "CSU"; }
  198 + public static class CreateAdminusers { public const string KEY = "CAU"; }
  199 + public static class DeleteUsers { public const string KEY = "DEU"; }
  200 + }
  201 + }
  202 + public static class WebApplicationManager
  203 + {
  204 + public const string KEY = "WAM";
  205 + public static class Function
  206 + {
  207 + public const string CMD_WEBAPPS = "-WEBAPPS";
  208 + public static class Register { public const string KEY = "WAR"; }
  209 + public static class Unregister { public const string KEY = "WAU"; }
  210 + public static class SetImpersonateIdentity { public const string KEY = "WAI"; }
  211 + public static class PoolStart { public const string KEY = "APS"; }
  212 + public static class PoolStop { public const string KEY = "APF"; }
  213 + public static class PoolRecycle { public const string KEY = "APR"; }
  214 + public static class SiteStart { public const string KEY = "WSS"; }
  215 + public static class SiteStop { public const string KEY = "WSF"; }
  216 + public static class PoolSetUserAccount { public const string KEY = "APU"; }
  217 + public static class Restart { public const string KEY = "R"; }
  218 + }
  219 + }
  220 + public static class WindowsServiceManager
  221 + {
  222 + public const string KEY = "WSM";
  223 + public static class Function
  224 + {
  225 + public const string CMD_SERVICES = "-SERVICES";
  226 + public static class Register { public const string KEY = "WSR"; }
  227 + public static class Unregister { public const string KEY = "WSU"; }
  228 + public static class SetUserAccount { public const string KEY = "WSA"; }
  229 + public static class Start { public const string KEY = "WSS"; }
  230 + public static class Stop { public const string KEY = "WSX"; }
  231 + public static class Kill { public const string KEY = "WSK"; }
  232 + public static class Purge { public const string KEY = "WSP"; }
  233 + }
  234 + }
  235 + public static class FileCleanerManager
  236 + {
  237 + public const string KEY = "FCL";
  238 + public static class Functions
  239 + {
  240 + public const string CMD_FOLDERS = "-FOLDERS";
  241 + public static class FolderClean { public const string KEY = "CLN"; }
  242 + }
  243 + }
  244 + public static class ScheduledTaskManager
  245 + {
  246 + public const string KEY = "SCH";
  247 + public static class Function
  248 + {
  249 + public const string CMD_TASKS = "-TASKS";
  250 + public static class Install { public const string KEY = "INS"; }
  251 + public static class Uninstall { public const string KEY = "UIN"; }
  252 + public static class Run { public const string KEY = "RUN"; }
  253 + public static class End { public const string KEY = "END"; }
  254 + public static class Enable { public const string KEY = "ENA"; }
  255 + public static class Disable { public const string KEY = "DIS"; }
  256 + public static class ChangePriority { public const string KEY = "CHP"; }
  257 + }
  258 + }
  259 + public static class BackupPackageManager
  260 + {
  261 + public const string KEY = "BAK";
  262 + public static class Functions
  263 + {
  264 + public const string CMD_PACKAGES = "-PACKAGES";
  265 + public static class CreateBackupPackage
  266 + {
  267 + public const string KEY = "CRE";
  268 + }
  269 + }
  270 + }
  271 + public static class SQLDataBaseManager
  272 + {
  273 + public const string KEY = "SQL";
  274 + public static class Function
  275 + {
  276 + public const string CMD_DATABASES = "-DATABASES";
  277 + public static class BackupDataBase { public const string KEY = "BAK"; }
  278 + public static class CreateCodeScripts { public const string KEY = "CCS"; }
  279 + public static class CreateDataScripts { public const string KEY = "CDS"; }
  280 + public static class RestoreDataBase { public const string KEY = "RES"; public const string CMD_RESTOREFIRST = "-RESTOREFIRST";
  281 + }
  282 + public static class RelocatePhysicalFiles { public const string KEY = "COP"; }
  283 + }
  284 + }
  285 + public static class MaintenanceToolManager
  286 + {
  287 + public const string KEY = "TOL";
  288 + public static class Functions
  289 + {
  290 + public static class RegexTester { public const string KEY = "RGX"; }
  291 + public static class Tool1 { public const string KEY = "TL1"; }
  292 + public static class Tool2 { public const string KEY = "TL2"; }
  293 + }
  294 + }
  295 + }
  296 + }
  297 + #endregion Commandline parameter definition class
179 } 298 }
Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - Menu.cs
@@ -10,31 +10,44 @@ using Microsoft.Web.Administration; @@ -10,31 +10,44 @@ using Microsoft.Web.Administration;
10 using System.Management; 10 using System.Management;
11 using System.Diagnostics; 11 using System.Diagnostics;
12 12
  13 +using Vrh.Log4Pro.MaintenanceConsole.ColorConsoleNS;
  14 +
13 using Vrh.XmlProcessing; 15 using Vrh.XmlProcessing;
14 using VRH.Common; 16 using VRH.Common;
15 using System.Xml.Linq; 17 using System.Xml.Linq;
16 18
17 -namespace Vrh.Log4Pro.MaintenanceConsole 19 +namespace Vrh.Log4Pro.MaintenanceConsole.MenuNS
18 { 20 {
19 public class Menu 21 public class Menu
20 { 22 {
21 - public delegate Object MenuItemExecutorFunc(Object p, Object o); 23 + /// <summary>
  24 + /// Egy menupont executor függvény prototípusa
  25 + /// </summary>
  26 + /// <param name="p">az executor paramétereit tartalmazó osztály</param>
  27 + /// <param name="o">
  28 + /// több menupont kiválasztásakor ezt a paramétert az első menuponthoz tartozó executor tölti fel,
  29 + /// majd ezt az értéket megkapja a második, aki módosíthatja, majd megkapja a harmadik, és így tovább...
  30 + /// </param>
  31 + /// <returns></returns>
  32 + public delegate Object MenuItemExecutorFunc(Menu.ExecutorParameter p, Object o);
22 public delegate Object MenuItemDisplayerFunc(Object p, int i); 33 public delegate Object MenuItemDisplayerFunc(Object p, int i);
  34 + public delegate void MenuHeaderDisplayerFunc();
  35 +
23 public Menu(string title, string selectionprompt = null) { Title = title; if (!string.IsNullOrWhiteSpace(selectionprompt)) { SelectionPrompt = selectionprompt; } } 36 public Menu(string title, string selectionprompt = null) { Title = title; if (!string.IsNullOrWhiteSpace(selectionprompt)) { SelectionPrompt = selectionprompt; } }
24 #region private fields 37 #region private fields
25 private string title; 38 private string title;
26 private string Title { get { return ColorConsole.WideString(title); } set { title = value; } } 39 private string Title { get { return ColorConsole.WideString(title); } set { title = value; } }
27 private MenuItemDisplayerFunc MenuItemDisplayer; 40 private MenuItemDisplayerFunc MenuItemDisplayer;
  41 + private MenuHeaderDisplayerFunc MenuHeaderDisplayer;
28 private SelectionMode selectionMode = Menu.SelectionMode.Multi; 42 private SelectionMode selectionMode = Menu.SelectionMode.Multi;
29 - private static bool commandModeAllMenus = false;  
30 - private bool commandMode = false;  
31 - private int HeaderWidth = 9; 43 + private static bool commandMode = false;
  44 + private int MenuItemIndentWidth = 0;
32 private string SelectionPrompt = "Make Your selection!"; 45 private string SelectionPrompt = "Make Your selection!";
33 #endregion private fields 46 #endregion private fields
34 47
35 #region public properties 48 #region public properties
36 public List<Item> MenuItemList { get; private set; } = new List<Item>(); 49 public List<Item> MenuItemList { get; private set; } = new List<Item>();
37 - List<string> MenuKeyList { get { return MenuItemList.Where(x => !x.Separator).Select(x => x.Key).ToList(); } } 50 + List<string> MenuItemKeyList { get { return MenuItemList.Where(x => !x.Separator).Select(x => x.Key).ToList(); } }
38 #endregion public properties 51 #endregion public properties
39 52
40 #region public tools 53 #region public tools
@@ -45,7 +58,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -45,7 +58,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
45 /// <param name="partxt"></param> 58 /// <param name="partxt"></param>
46 public static void IncorrectSelection(string partxt = "") 59 public static void IncorrectSelection(string partxt = "")
47 { 60 {
48 - if (GetCommandModeAllMenus()) { return; } 61 + if (IsCommandMode()) { return; }
49 62
50 ColorConsole.WriteLine(); 63 ColorConsole.WriteLine();
51 ColorConsole.WriteLine($"Incorrect selection! {partxt} Make a new selection!", ConsoleColor.Red); 64 ColorConsole.WriteLine($"Incorrect selection! {partxt} Make a new selection!", ConsoleColor.Red);
@@ -59,51 +72,90 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -59,51 +72,90 @@ namespace Vrh.Log4Pro.MaintenanceConsole
59 /// <returns></returns> 72 /// <returns></returns>
60 public static ConsoleKeyInfo PressAnykeyToContinue(string text = null) 73 public static ConsoleKeyInfo PressAnykeyToContinue(string text = null)
61 { 74 {
62 - if (GetCommandModeAllMenus()) { return ColorConsole.GetConsoleKey(ConsoleKey.Enter); } 75 + if (IsCommandMode()) { return ColorConsole.GetConsoleKey(ConsoleKey.Enter); }
63 76
64 ColorConsole.WriteLine(text ?? "Press any key to continue...", ConsoleColor.Yellow); return ColorConsole.ReadKey(); 77 ColorConsole.WriteLine(text ?? "Press any key to continue...", ConsoleColor.Yellow); return ColorConsole.ReadKey();
65 } 78 }
66 79
  80 + /// <summary>
  81 + /// Beállítja a parancs módot a menükezelő számára
  82 + /// </summary>
  83 + /// <param name="commandmode"></param>
  84 + public static void SetCommandMode(bool commandmode=true) { commandMode = commandmode; }
67 85
68 - public static void SetCommandModeAllMenus() { commandModeAllMenus = true; } 86 + /// <summary>
  87 + /// true= a menükezelő parancs módban van
  88 + /// </summary>
  89 + /// <returns></returns>
  90 + public static bool IsCommandMode() { return commandMode; }
69 91
  92 + /// <summary>
  93 + /// Beállítja a menükezelő számára a displayer metódust, amelynek feladata
  94 + /// az egyes menüpontok információjának soronkénti előállítása
  95 + /// </summary>
  96 + /// <param name="displayer"></param>
  97 + /// <returns></returns>
70 public Menu SetMenuItemDisplayer(MenuItemDisplayerFunc displayer) 98 public Menu SetMenuItemDisplayer(MenuItemDisplayerFunc displayer)
71 { 99 {
72 MenuItemDisplayer = displayer; 100 MenuItemDisplayer = displayer;
73 return this; 101 return this;
74 } 102 }
  103 +
  104 + /// <summary>
  105 + /// Beállítja a menükezelő számára a header displayer metódust, amelynek feladata
  106 + /// a menu címe alatti terület információjának előállítása
  107 + /// </summary>
  108 + /// <param name="displayer"></param>
  109 + /// <returns></returns>
  110 + public Menu SetMenuHeaderDisplayer(MenuHeaderDisplayerFunc displayer)
  111 + {
  112 + MenuHeaderDisplayer = displayer;
  113 + return this;
  114 + }
  115 +
  116 + /// <summary>
  117 + /// Beállítja, hogy egy, vagy több menüpont választható
  118 + /// </summary>
  119 + /// <param name="sm"></param>
  120 + /// <returns></returns>
75 public Menu SetSelectionMode(SelectionMode sm) { selectionMode = sm; return this; } 121 public Menu SetSelectionMode(SelectionMode sm) { selectionMode = sm; return this; }
76 - public Menu SetCommandMode(bool commandmode = false) { commandMode = true; return this; }  
77 - public static bool GetCommandModeAllMenus() { return commandModeAllMenus; }  
78 - public bool GetCommandMode() { return commandMode || commandModeAllMenus; }  
79 - public Menu SetHeaderWidth(int hw) { HeaderWidth = hw; return this; } 122 +
  123 + /// <summary>
  124 + /// Létrehoz egy menüpontot
  125 + /// </summary>
  126 + /// <param name="mi"></param>
  127 + /// <returns></returns>
80 public Menu AddMenuItem(Item mi) 128 public Menu AddMenuItem(Item mi)
81 { 129 {
82 MenuItemList.Add(mi); 130 MenuItemList.Add(mi);
83 if (string.IsNullOrWhiteSpace(mi.Key)) { mi.Key = $"#$KEY{MenuItemList.IndexOf(mi)}"; } 131 if (string.IsNullOrWhiteSpace(mi.Key)) { mi.Key = $"#$KEY{MenuItemList.IndexOf(mi)}"; }
84 return this; 132 return this;
85 } 133 }
  134 +
  135 + /// <summary>
  136 + /// Törli a menüpontok listáját
  137 + /// </summary>
86 public void ClearMenuItemList() { MenuItemList.Clear(); } 138 public void ClearMenuItemList() { MenuItemList.Clear(); }
87 - public void ExecuteCmd(string[] args)  
88 - {  
89 - var module = CommandLine.GetCommandLineArgument(args, "-MODULE");  
90 - var sr = new Menu.Selection(module, args);  
91 - ExecuteSelection(sr);  
92 - }  
93 139
94 - public void ExecuteMenu() 140 + /// <summary>
  141 + /// Végrehajtja a menüt, azaz választási lehetőséget biztosít, majd végrehajtja a kiválasztott menupontokhoz tartozó executor metódusokat
  142 + /// </summary>
  143 + /// <param name="forcedselectionkeylist"></param>
  144 + public void ExecuteMenu(string forcedselectionkeylist=null)
95 { 145 {
96 try 146 try
97 { 147 {
98 while (true) 148 while (true)
99 { 149 {
100 DisplayTitle(); 150 DisplayTitle();
  151 + MenuHeaderDisplayer?.Invoke();
101 DisplayItems(); 152 DisplayItems();
102 - var sr = Select(); 153 + var sr = Select(forcedselectionkeylist);
103 if (sr.Result == Menu.SelectionResult.Exit) { return; } 154 if (sr.Result == Menu.SelectionResult.Exit) { return; }
104 else if (sr.Result == Menu.SelectionResult.None) { continue; } 155 else if (sr.Result == Menu.SelectionResult.None) { continue; }
105 else if (sr.Result == Menu.SelectionResult.Error) { continue; } 156 else if (sr.Result == Menu.SelectionResult.Error) { continue; }
106 ExecuteSelection(sr.SelectedKeyList); 157 ExecuteSelection(sr.SelectedKeyList);
  158 + if (Menu.IsCommandMode()) { return; }
107 } 159 }
108 } 160 }
109 catch (Exception ex) 161 catch (Exception ex)
@@ -113,33 +165,70 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -113,33 +165,70 @@ namespace Vrh.Log4Pro.MaintenanceConsole
113 Menu.PressAnykeyToContinue(); 165 Menu.PressAnykeyToContinue();
114 } 166 }
115 } 167 }
  168 +
  169 +
  170 + /// <summary>
  171 + /// Megjeleníti a menő fejlécét
  172 + /// </summary>
116 public void DisplayTitle() 173 public void DisplayTitle()
117 { 174 {
118 - if (GetCommandMode()) { return; } 175 + if (Menu.IsCommandMode()) { return; }
119 176
120 ColorConsole.Clear(); 177 ColorConsole.Clear();
121 ColorConsole.WriteLine(Title, ConsoleColor.White); 178 ColorConsole.WriteLine(Title, ConsoleColor.White);
122 ColorConsole.WriteLine(new string('-', Title.Length)); 179 ColorConsole.WriteLine(new string('-', Title.Length));
123 } 180 }
  181 +
  182 + private static int SetMenuItemHeaderWidth(List<Item> MenuItemList,int columns)
  183 + {
  184 + var menuItemmaxwidth = 0;
  185 + var i = 1;
  186 + foreach (var menuitem in MenuItemList)
  187 + {
  188 + var len = 0;
  189 + len += 1;//ColorConsole.Write($"[");
  190 + len += $"{i}".Length;// ColorConsole.Write($"{i}");
  191 + if (menuitem.Separator) { continue; }
  192 + if (!string.IsNullOrEmpty(menuitem.Key) && !menuitem.Key.StartsWith("#$KEY"))
  193 + {
  194 + len += 1;//ColorConsole.Write($":");
  195 + len += $"{menuitem.Key}".Length;//ColorConsole.Write(menuitem.Key, ConsoleColor.Yellow);
  196 + }
  197 + len += 1;//ColorConsole.Write($"]");
  198 + if (columns == 1)
  199 + {
  200 + if (menuItemmaxwidth == 0 || len > menuItemmaxwidth) { menuItemmaxwidth = len+1; }
  201 + }
  202 + i++;
  203 + }
  204 + return menuItemmaxwidth;
  205 + }
  206 +
  207 + /// <summary>
  208 + /// Megjeleníti a menüpontokat
  209 + /// </summary>
  210 + /// <param name="columns"></param>
  211 + /// <param name="columnlength"></param>
124 public void DisplayItems(int columns = 1, int columnlength = 0) 212 public void DisplayItems(int columns = 1, int columnlength = 0)
125 { 213 {
126 - if (GetCommandMode()) { return; } 214 + if (Menu.IsCommandMode()) { return; }
127 215
128 int columncounter = 0; 216 int columncounter = 0;
129 ColorConsole.WriteLine(); 217 ColorConsole.WriteLine();
130 var i = 1; 218 var i = 1;
131 ColorConsole.SetCursorPosition(0, ColorConsole.CursorTop); 219 ColorConsole.SetCursorPosition(0, ColorConsole.CursorTop);
  220 + MenuItemIndentWidth = SetMenuItemHeaderWidth(MenuItemList, columns);
132 foreach (var menuitem in MenuItemList) 221 foreach (var menuitem in MenuItemList)
133 { 222 {
134 if (menuitem.Separator && columns == 1) 223 if (menuitem.Separator && columns == 1)
135 { 224 {
136 - ColorConsole.SetCursorPosition(columnlength * columncounter + HeaderWidth, ColorConsole.CursorTop); 225 + ColorConsole.SetCursorPosition(MenuItemIndentWidth, ColorConsole.CursorTop);
137 var seplen = menuitem.SeparatorLength; 226 var seplen = menuitem.SeparatorLength;
138 if (menuitem.SeparatorLength == 0) 227 if (menuitem.SeparatorLength == 0)
139 { 228 {
140 - foreach (var mi in MenuItemList.Where(x => !x.Separator)) { if (mi.Text.Length > seplen) { seplen = mi.Text.Length; } } 229 + foreach (var mi in MenuItemList.Where(x => !x.Separator)) { if (!string.IsNullOrWhiteSpace(mi.Text) && mi.Text.Length > seplen) { seplen = mi.Text.Length; } }
141 } 230 }
142 - ColorConsole.WriteLine(new string(menuitem.SeparatorChar, seplen)); 231 + ColorConsole.WriteLine(new string(menuitem.SeparatorChar, seplen==0?20:seplen));
143 continue; 232 continue;
144 } 233 }
145 ColorConsole.Write($"["); 234 ColorConsole.Write($"[");
@@ -150,21 +239,18 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -150,21 +239,18 @@ namespace Vrh.Log4Pro.MaintenanceConsole
150 ColorConsole.Write(menuitem.Key, ConsoleColor.Yellow); 239 ColorConsole.Write(menuitem.Key, ConsoleColor.Yellow);
151 } 240 }
152 ColorConsole.Write($"]"); 241 ColorConsole.Write($"]");
153 - ColorConsole.SetCursorPosition(columnlength * columncounter + HeaderWidth, ColorConsole.CursorTop);  
154 -  
155 - if (!string.IsNullOrEmpty(menuitem.Text))  
156 - {  
157 - ColorConsole.Write(menuitem.Text);  
158 - }  
159 - if (columns == 1) 242 + if (columns == 1)
160 { 243 {
  244 + if (MenuItemIndentWidth == 0) { MenuItemIndentWidth = ColorConsole.CursorLeft + 1; }
  245 + ColorConsole.SetCursorPosition(MenuItemIndentWidth, ColorConsole.CursorTop);
  246 + if (!string.IsNullOrEmpty(menuitem.Text)) { ColorConsole.Write(menuitem.Text); }
161 if (!string.IsNullOrEmpty(menuitem.Text)) { ColorConsole.WriteLine(); } 247 if (!string.IsNullOrEmpty(menuitem.Text)) { ColorConsole.WriteLine(); }
162 if (MenuItemDisplayer != null) 248 if (MenuItemDisplayer != null)
163 { 249 {
164 for (var li = 0; li < 100; li++) 250 for (var li = 0; li < 100; li++)
165 { 251 {
166 - if (li > 0) { ColorConsole.Write(new string(' ', HeaderWidth)); }  
167 - var str = (string)MenuItemDisplayer(menuitem.Parameters, li); 252 + if (li > 0) { ColorConsole.Write(new string(' ', MenuItemIndentWidth)); }
  253 + var str = (string)MenuItemDisplayer.Invoke(menuitem.Parameters, li);
168 if (string.IsNullOrEmpty(str)) { ColorConsole.SetCursorPosition(0, ColorConsole.CursorTop); } 254 if (string.IsNullOrEmpty(str)) { ColorConsole.SetCursorPosition(0, ColorConsole.CursorTop); }
169 if (str == null) { break; } 255 if (str == null) { break; }
170 } 256 }
@@ -172,6 +258,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -172,6 +258,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole
172 } 258 }
173 else 259 else
174 { 260 {
  261 + ColorConsole.SetCursorPosition(columnlength * columncounter, ColorConsole.CursorTop);
  262 + if (!string.IsNullOrEmpty(menuitem.Text)) { ColorConsole.Write(menuitem.Text); }
175 columncounter++; 263 columncounter++;
176 if (columncounter == columns) { ColorConsole.WriteLine(); columncounter = 0; } 264 if (columncounter == columns) { ColorConsole.WriteLine(); columncounter = 0; }
177 else 265 else
@@ -189,28 +277,61 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -189,28 +277,61 @@ namespace Vrh.Log4Pro.MaintenanceConsole
189 } 277 }
190 ColorConsole.Write("EX", ConsoleColor.Red, bracket: "()"); ColorConsole.WriteLine(" Exit"); 278 ColorConsole.Write("EX", ConsoleColor.Red, bracket: "()"); ColorConsole.WriteLine(" Exit");
191 } 279 }
  280 + public static Selection SelectFromItemList(string listtitle, string selectionprompt, Dictionary<string, string> items, Menu.SelectionMode mode = SelectionMode.Single,bool getconfirmation=false)
  281 + {
  282 + var menubackupfiles = new Menu(listtitle, selectionprompt)
  283 + .SetSelectionMode(mode);
  284 +
  285 + foreach (var i in items)
  286 + {
  287 + menubackupfiles.AddMenuItem(new Item(null, i.Key, null, new ExecutorParameter(pars: i.Value)));
  288 + }
  289 + Menu.Selection ms;
  290 + while (true)
  291 + {
  292 + menubackupfiles.DisplayItems(1);
  293 + ms = menubackupfiles.Select();
  294 + if (ms.Result == SelectionResult.None) { continue; }
  295 + else if (ms.Result == SelectionResult.Error) { continue; }
  296 + else if (ms.Result == SelectionResult.Exit) { return null; }
  297 + else
  298 + {
  299 + if (!getconfirmation || getconfirmation && ColorConsole.ReadLine("Enter [CONFIRM] to confirm!", ConsoleColor.Yellow,suffix:" --> ").ToUpper() == "CONFIRM") { return ms; }
  300 + else { continue; }
  301 + }
  302 + }
  303 + }
  304 +
  305 +
  306 + /// <summary>
  307 + /// A Menuből való választás eredményét tartalmazza
  308 + /// </summary>
192 public class Selection 309 public class Selection
193 { 310 {
194 public Selection() { } 311 public Selection() { }
195 - public Selection(string selectedkey,object parameter) 312 + public Selection(string selectedkey, Menu.ExecutorParameter parameter)
196 { 313 {
197 Result = SelectionResult.Ok; 314 Result = SelectionResult.Ok;
198 SelectedKeyList = new List<string>() { { selectedkey } }; 315 SelectedKeyList = new List<string>() { { selectedkey } };
199 - SelectedParameterList = new List<object>() { { parameter } }; 316 + SelectedParameterList = new List<Menu.ExecutorParameter>() { { parameter } };
200 } 317 }
201 public List<string> SelectedKeyList = null; 318 public List<string> SelectedKeyList = null;
202 public SelectionResult Result; 319 public SelectionResult Result;
203 - public List<object> SelectedParameterList; 320 + public List<Menu.ExecutorParameter> SelectedParameterList;
204 } 321 }
205 public enum SelectionResult { Exit, None, Error, Ok, } 322 public enum SelectionResult { Exit, None, Error, Ok, }
206 public enum SelectionMode { Single, Multi, } 323 public enum SelectionMode { Single, Multi, }
  324 +
  325 + /// <summary>
  326 + /// A menüből való választás lebonyolítása
  327 + /// </summary>
  328 + /// <param name="forcedselectionkeylist"></param>
  329 + /// <returns></returns>
207 public Selection Select(string forcedselectionkeylist=null) 330 public Selection Select(string forcedselectionkeylist=null)
208 { 331 {
209 - List<string> selectionKeyList;  
210 - List<object> selectionParList;  
211 string selectionliststr; 332 string selectionliststr;
212 var result = new Selection(); 333 var result = new Selection();
213 - if (GetCommandMode()) 334 + if (Menu.IsCommandMode())
214 { 335 {
215 selectionliststr = forcedselectionkeylist??"EX"; 336 selectionliststr = forcedselectionkeylist??"EX";
216 } 337 }
@@ -246,47 +367,81 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -246,47 +367,81 @@ namespace Vrh.Log4Pro.MaintenanceConsole
246 result.SelectedKeyList = null; 367 result.SelectedKeyList = null;
247 return result; 368 return result;
248 } 369 }
249 - else if (selectionMode == SelectionMode.Multi && selectionliststr == "*") 370 + else if (selectionMode == SelectionMode.Single && selectionliststr == "*")
250 { 371 {
251 - selectionKeyList = new List<string>();  
252 - selectionParList = new List<object>();  
253 - var i = 1;  
254 - foreach (var mi in MenuItemList)  
255 - {  
256 - selectionKeyList.Add(mi.Key);  
257 - selectionParList.Add(mi.Parameters);  
258 - }  
259 - result.Result = SelectionResult.Ok;  
260 - result.SelectedKeyList = selectionKeyList;  
261 - result.SelectedParameterList = selectionParList; 372 + result.Result = SelectionResult.Error;
  373 + result.SelectedKeyList = null;
262 return result; 374 return result;
263 } 375 }
264 - selectionKeyList = new List<string>();  
265 - selectionParList = new List<object>();  
266 - foreach (var selection in selectionliststr.Split(',').ToList()) 376 + else if (selectionliststr == "*") { return ProcessOKSelection(MenuItemKeyList); } // all keys
  377 + else { return ProcessOKSelection(selectionliststr.Split(',').ToList()); } // selected list list
  378 + }
  379 + #region ProcessOKSelection
  380 + private Selection ProcessOKSelection(List<string> selectionKeyList)
  381 + {
  382 + var result = new Selection();
  383 + var return_selectionParList = new List<Menu.ExecutorParameter>();
  384 + List<string> return_selectionKeyList = new List<string>();
  385 + foreach (var selectedkeyorindex in selectionKeyList)
267 { 386 {
268 - string _selection = selection;  
269 - object _parameters = null;  
270 - if (!MenuKeyList.Contains(_selection)) 387 + string _selectedkey;
  388 + Item _selectedmenuitem;
  389 + if (MenuItemKeyList.Contains(selectedkeyorindex)) { _selectedkey = selectedkeyorindex; }
  390 + else
271 { 391 {
272 - if (!int.TryParse(_selection, out int indexselection) || indexselection < 1 || indexselection > MenuItemList.Count()) 392 + if (!int.TryParse(selectedkeyorindex, out int _selectedindex) || _selectedindex < 1 || _selectedindex > MenuItemList.Count())
273 { 393 {
274 - Menu.IncorrectSelection($"Selected item {_selection} is not valid!"); 394 + Menu.IncorrectSelection($"Selected item {selectedkeyorindex} is not valid!");
275 result.Result = SelectionResult.Error; 395 result.Result = SelectionResult.Error;
276 result.SelectedKeyList = null; 396 result.SelectedKeyList = null;
277 return result; 397 return result;
278 } 398 }
279 - _selection = GetItemKey(indexselection - 1);  
280 - _parameters = GetItem(indexselection - 1).Parameters; 399 + _selectedkey = GetItemKey(_selectedindex - 1);
281 } 400 }
282 - selectionKeyList.Add(_selection);  
283 - selectionParList.Add(_parameters); 401 + _selectedmenuitem = GetItem(_selectedkey);
  402 + ResolvemenuItemGroup(_selectedmenuitem, return_selectionKeyList, return_selectionParList);
284 } 403 }
285 result.Result = SelectionResult.Ok; 404 result.Result = SelectionResult.Ok;
286 - result.SelectedKeyList = selectionKeyList;  
287 - result.SelectedParameterList = selectionParList; 405 + result.SelectedKeyList = return_selectionKeyList;
  406 + result.SelectedParameterList = return_selectionParList;
288 return result; 407 return result;
289 } 408 }
  409 + #endregion ProcessOKSelection
  410 + #region ResolveGroup
  411 + private void ResolvemenuItemGroup(Menu.Item _selectedmenuitem,List<string> selectionKeyList,List<ExecutorParameter> selectionParList)
  412 + {
  413 + if (_selectedmenuitem.Group)
  414 + {
  415 + List<string> keysinmenuitemgroup;
  416 + if (_selectedmenuitem.GroupKeyList.Contains("*")) { keysinmenuitemgroup = MenuItemList.Where(x=>!x.Group && !x.Separator).Select(x=>x.Key).ToList(); }
  417 + else { keysinmenuitemgroup = _selectedmenuitem.GroupKeyList.Select(x => x).ToList(); }
  418 +
  419 + foreach (var ikey in keysinmenuitemgroup)
  420 + {
  421 + var mikey = GetItem(ikey);
  422 + if (mikey!=null && !mikey.Group)
  423 + {
  424 + if (selectionKeyList.Contains(ikey)) { continue; }
  425 + selectionKeyList.Add(ikey);
  426 + selectionParList.Add(mikey.Parameters);
  427 + }
  428 + else
  429 + {
  430 + throw new Exception($"MenuItem '{ikey}' referred by MenuItemGroup '{_selectedmenuitem.Key}' does not exist or is a group!");
  431 + }
  432 + }
  433 + }
  434 + else
  435 + {
  436 + selectionKeyList.Add(_selectedmenuitem.Key);
  437 + selectionParList.Add(_selectedmenuitem.Parameters);
  438 + }
  439 + }
  440 + #endregion ResolveGroup
  441 + /// <summary>
  442 + /// A menuből való választás alapján végrehajtja a kiválasztott menüpontokhoz rendelt executorokat
  443 + /// </summary>
  444 + /// <param name="selectedkeylist"></param>
290 public void ExecuteSelection(List<string> selectedkeylist) 445 public void ExecuteSelection(List<string> selectedkeylist)
291 { 446 {
292 object o = null; 447 object o = null;
@@ -300,18 +455,11 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -300,18 +455,11 @@ namespace Vrh.Log4Pro.MaintenanceConsole
300 Menu.PressAnykeyToContinue(); 455 Menu.PressAnykeyToContinue();
301 } 456 }
302 457
303 - public void ExecuteSelection(Menu.Selection sr)  
304 - {  
305 - object o = null;  
306 - foreach (var mi in MenuItemList)  
307 - {  
308 - if (sr.SelectedKeyList.Contains(mi.Key))  
309 - {  
310 - o = mi.Executor(sr.SelectedParameterList.ElementAt(sr.SelectedKeyList.IndexOf(mi.Key)), o);  
311 - }  
312 - }  
313 - Menu.PressAnykeyToContinue();  
314 - } 458 + /// <summary>
  459 + /// Visszadja a menupont kulcsához tartozó executor metódust
  460 + /// </summary>
  461 + /// <param name="key"></param>
  462 + /// <returns></returns>
315 public MenuItemExecutorFunc GetExecutor(string key) 463 public MenuItemExecutorFunc GetExecutor(string key)
316 { 464 {
317 return MenuItemList.ElementAt(GetItemIx(key)).Executor; 465 return MenuItemList.ElementAt(GetItemIx(key)).Executor;
@@ -319,31 +467,57 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -319,31 +467,57 @@ namespace Vrh.Log4Pro.MaintenanceConsole
319 #endregion public tools 467 #endregion public tools
320 468
321 #region private tools 469 #region private tools
  470 + /// <summary>
  471 + /// visszadja a megadott kulcsú menupont leíróját
  472 + /// </summary>
  473 + /// <param name="itemkey"></param>
  474 + /// <returns></returns>
322 private Menu.Item GetItem(string itemkey) 475 private Menu.Item GetItem(string itemkey)
323 { 476 {
324 return MenuItemList.FirstOrDefault(x => x.Key == itemkey); 477 return MenuItemList.FirstOrDefault(x => x.Key == itemkey);
325 } 478 }
  479 + /// <summary>
  480 + /// visszadja a megadott indexű menupont leíróját
  481 + /// </summary>
  482 + /// <param name="ix"></param>
  483 + /// <returns></returns>
326 private Menu.Item GetItem(int ix) 484 private Menu.Item GetItem(int ix)
327 { 485 {
328 var i = 0; 486 var i = 0;
329 foreach (var mi in MenuItemList) 487 foreach (var mi in MenuItemList)
330 { 488 {
331 if (mi.Separator) { continue; } 489 if (mi.Separator) { continue; }
332 - if (i == ix) return mi; 490 + if (i == ix) { return mi; }
333 i++; 491 i++;
334 } 492 }
335 return null; 493 return null;
336 //return MenuItemList.ElementAt(ix); 494 //return MenuItemList.ElementAt(ix);
337 } 495 }
  496 + /// <summary>
  497 + /// Visszadja a megadott kulcsú menüpont indexét
  498 + /// </summary>
  499 + /// <param name="itemkey"></param>
  500 + /// <returns></returns>
338 private int GetItemIx(string itemkey) 501 private int GetItemIx(string itemkey)
339 { 502 {
340 - return MenuKeyList.IndexOf(itemkey); 503 + return MenuItemKeyList.IndexOf(itemkey);
341 } 504 }
342 - private string GetItemKey(int ix) 505 + /// <summary>
  506 + /// Visszadja a megadott indexű menüpont kulcsát
  507 + /// </summary>
  508 + /// <param name="ix"></param>
  509 + /// <returns></returns>
  510 + string GetItemKey(int ix)
343 { 511 {
344 - return MenuKeyList.ElementAt(ix); 512 + return MenuItemKeyList.ElementAt(ix);
345 } 513 }
346 - public void SetExecutorParameters(Menu.Selection r, object p=null) 514 + /// <summary>
  515 + /// A kiválasztott menupontokhoz beállítja a megadott paramétereket a metódus paramétereként megadott paraméterre,
  516 + /// vagy ennek híján a Selection objektumban levő paraméterekre
  517 + /// </summary>
  518 + /// <param name="r">a Selection objektum</param>
  519 + /// <param name="p">a beállítandó paraméter</param>
  520 + public void SetExecutorParameters(Menu.Selection r, ExecutorParameter p =null)
347 { 521 {
348 foreach (var mi in this.MenuItemList) 522 foreach (var mi in this.MenuItemList)
349 { 523 {
@@ -355,6 +529,33 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -355,6 +529,33 @@ namespace Vrh.Log4Pro.MaintenanceConsole
355 } 529 }
356 } 530 }
357 #endregion private tools 531 #endregion private tools
  532 +
  533 + public class ExecutorParameter
  534 + {
  535 + public ExecutorParameter(object cfg=null, string[] args=null, object pars=null)
  536 + {
  537 + _config = cfg; Args = args;Parameters = pars;
  538 + }
  539 + public TXMLPROCESSORTYPE GetConfig<TXMLPROCESSORTYPE>()
  540 + where TXMLPROCESSORTYPE : XmlParser
  541 + {
  542 + return _config as TXMLPROCESSORTYPE;
  543 + }
  544 +
  545 + private object _config;
  546 + public object Parameters;
  547 + public string[] Args { get; set; }
  548 + }
  549 + public class ItemGroup: Item
  550 + {
  551 + public ItemGroup(string key, string text, List<string> keylist) : base()
  552 + {
  553 + Key = key;
  554 + Text = text;
  555 + Group = true;
  556 + GroupKeyList = keylist;
  557 + }
  558 + }
358 public class ItemSeparator : Item 559 public class ItemSeparator : Item
359 { 560 {
360 public ItemSeparator(char c = '-', int length = 0) : base() 561 public ItemSeparator(char c = '-', int length = 0) : base()
@@ -367,7 +568,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -367,7 +568,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
367 public class Item 568 public class Item
368 { 569 {
369 public Item() { } 570 public Item() { }
370 - public Item(string key, string text, MenuItemExecutorFunc executor = null, object parameters = null) 571 + public Item(string key, string text, MenuItemExecutorFunc executor = null, Menu.ExecutorParameter parameters = null)
371 { 572 {
372 Key = key; 573 Key = key;
373 Text = text; 574 Text = text;
@@ -377,7 +578,10 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -377,7 +578,10 @@ namespace Vrh.Log4Pro.MaintenanceConsole
377 public string Key; 578 public string Key;
378 public string Text; 579 public string Text;
379 public MenuItemExecutorFunc Executor; 580 public MenuItemExecutorFunc Executor;
380 - public object Parameters; 581 + public Menu.ExecutorParameter Parameters;
  582 +
  583 + public bool Group = false;
  584 + public List<string> GroupKeyList;
381 585
382 public bool Separator = false; 586 public bool Separator = false;
383 public char SeparatorChar = '-'; 587 public char SeparatorChar = '-';
Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - Tools - Membership.cs 0 → 100644
@@ -0,0 +1,1081 @@ @@ -0,0 +1,1081 @@
  1 +using System;
  2 +using System.Data.Linq.SqlClient;
  3 +using System.IO;
  4 +using System.IO.Compression;
  5 +using System.Collections.Generic;
  6 +using System.Linq;
  7 +using System.Security.Principal;
  8 +using System.Text;
  9 +using System.Text.RegularExpressions;
  10 +using System.Threading.Tasks;
  11 +using System.Threading;
  12 +
  13 +using Microsoft.Web.Administration;
  14 +using System.Management;
  15 +using System.Diagnostics;
  16 +
  17 +using Vrh.XmlProcessing;
  18 +using System.Xml.Linq;
  19 +using Vrh.Log4Pro.MaintenanceConsole.ColorConsoleNS;
  20 +using VRH.Common;
  21 +
  22 +using System.Data.Entity;
  23 +using System.ComponentModel.DataAnnotations;
  24 +using System.ComponentModel.DataAnnotations.Schema;
  25 +
  26 +namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS
  27 +{
  28 + using System.Web.Security;
  29 +
  30 + public static class MembershipTools
  31 + {
  32 + public static void SetConnectionString(string sqlcs)
  33 + {
  34 + MembershipDBContext = new DAL.MembershipContext(sqlcs);
  35 + m_MembershipProvider = System.Web.Security.Membership.Provider;
  36 + m_roleProvider = System.Web.Security.Roles.Provider;
  37 + }
  38 + private static MembershipProvider m_MembershipProvider;
  39 + private static RoleProvider m_roleProvider;
  40 + private static DAL.MembershipContext MembershipDBContext;
  41 +
  42 + #region Constants
  43 + public class Constants
  44 + {
  45 + public const string SCHEMA_NAME = "UAdmin";
  46 +
  47 + public const string ROLENAME_ADMINISTRATOR = "Administrator";
  48 + public const string ROLENAME_ADMIN = "Admin";
  49 + public const string USERNAME_ADMINISTRATOR = "Administrator";
  50 + public const string PASSWORD_ADMINISTRATOR = "Admin123";
  51 + public const string USERNAME_ADMIN = "Admin";
  52 + public const string PASSWORD_ADMIN = "Admin123";
  53 + public static readonly string[] SYSTEMUSERNAMELIST = new string[] { ROLENAME_ADMIN, USERNAME_ADMINISTRATOR };
  54 + public static readonly DateTime NEVERONLINE = new DateTime(2000, 1, 1);
  55 + }
  56 + #endregion Constants
  57 +
  58 + #region Users
  59 + public static class Users
  60 + {
  61 + #region IsSecondaryUser
  62 + /// <summary>
  63 + /// true-val tér vissza, ha léteznek ehhez az elsődleges userhez másodlagos user-ek
  64 + /// </summary>
  65 + /// <param name="primaryusername"></param>
  66 + /// <returns></returns>
  67 + public static bool IsSecondaryUserOfUser(string primaryusername)
  68 + {
  69 + var sUserList = MembershipDBContext.SecondaryUsers.Where(x => x.User != null && x.User.UserName == primaryusername);
  70 + return (sUserList != null && sUserList.Any());
  71 + }
  72 + #endregion IsSecondaryUser
  73 + #region DeleteSecondaryUsersOfUser methods
  74 + /// <summary>
  75 + /// Másodlagos felhasználó törlése a funkció nevének és a felhasználó nevének megadásával.
  76 + /// </summary>
  77 + /// <param name="primaryusername">Elsődleges felhasználó neve.</param>
  78 + /// <exception cref="ApplicationException">Ha nem található a törlendő másodlagos felhasználó.</exception>
  79 + public static void DeleteSecondaryUsersOfUser(string primaryusername)
  80 + {
  81 + var sUserList = MembershipDBContext.SecondaryUsers.Where(x => x.User!=null && x.User.UserName == primaryusername);
  82 + if (sUserList == null || !sUserList.Any())
  83 + {
  84 + throw new ApplicationException($"Secondary users for primary user '{primaryusername}' not found!");
  85 + }
  86 + else
  87 + {
  88 + foreach (var suser in sUserList)
  89 + {
  90 + var sllist = MembershipDBContext.SecondaryLogins.Where(sl => sl.SecondaryUserId == suser.Id);
  91 + if (sllist != null && sllist.Any()) { foreach (var sl in sllist) { MembershipDBContext.SecondaryLogins.Remove(sl); } }
  92 + MembershipDBContext.SecondaryUsers.Remove(suser);
  93 + }
  94 + MembershipDBContext.SaveChanges();
  95 + }
  96 + }
  97 + #endregion DeleteSecondaryUsersOfUser methods
  98 + #region Create
  99 + /// <summary>
  100 + /// Felhasználó létrehozása a paraméterlistában felsorolt paraméterek megadásával.
  101 + /// </summary>
  102 + /// <param name="username">Felhasználó neve.</param>
  103 + /// <param name="password">Felhasználó jelszava.</param>
  104 + /// <param name="administrator">hozzárendeli a usert az Admin és az Administrator szerepekhez</param>
  105 + /// <param name="superuser">hozzárendeli a usert minden létező szerephez és szerepkörhöz</param>
  106 + /// <param name="rolenames">a felhasználóhoz hozzárendelendő role nevek listája; ha a lista tartalmazza a * tagot, akkor minden role.</param>
  107 + /// <param name="rolegroupnames">a felhasználóhoz hozzárendelendő rolegroup nevek listája; ha a lista tartalmazza a * tagot, akkor minden rolegroup.</param>
  108 + /// <returns> A létrehozott felhasználó <c>MembershipUser</c> objektuma.</returns>
  109 + public static MembershipUser Create(string username, string password, bool administrator=false,bool superuser=false, string[] rolenames=null,string[]rolegroupnames=null)
  110 + {
  111 + #region ellenőrzések
  112 + if (String.IsNullOrWhiteSpace(username)) { throw new MembershipCreateUserException("Username is required!"); }
  113 +
  114 + string wrPrefix = "WebReq_";
  115 + string adPrefix = "AD_";
  116 + if (username.StartsWith(wrPrefix, StringComparison.OrdinalIgnoreCase) || username.StartsWith(adPrefix, StringComparison.OrdinalIgnoreCase))
  117 + {
  118 + throw new MembershipCreateUserException($"Username format is incorrect, it can not start with {wrPrefix}, {adPrefix}");
  119 + }
  120 + #endregion ellenőrzések
  121 +
  122 + CreateAdminRolesAndUsers();
  123 + MembershipUser user = Membership.GetUser(username);
  124 + if (user == null)
  125 + {
  126 + user = Membership.CreateUser(username, password);
  127 + user.LastActivityDate = Constants.NEVERONLINE;
  128 + user.LastLoginDate = Constants.NEVERONLINE;
  129 + user.Comment = "";
  130 + user.Email = "";
  131 + user.IsApproved = true;
  132 + Membership.UpdateUser(user);
  133 + //user.ChangePasswordQuestionAndAnswer(password, "", "");
  134 + }
  135 + if (superuser)
  136 + {
  137 + string rgnamelist = string.Join(",", MembershipDBContext.RoleGroups.Select(rg => rg.Name).ToArray());
  138 + if (!string.IsNullOrWhiteSpace(rgnamelist)) { Assign.RoleGroupsToUsers(rgnamelist, username); }
  139 + foreach (var rn in Roles.GetAllRoles())
  140 + {
  141 + if (!Users.IsInRole(username, rn)) { Roles.AddUserToRole(username, rn); }
  142 + }
  143 + }
  144 + else if (administrator)
  145 + {
  146 + if (!Roles.IsUserInRole(username, Constants.ROLENAME_ADMINISTRATOR)) { Roles.AddUserToRole(username, Constants.ROLENAME_ADMINISTRATOR); }
  147 + if (!Roles.IsUserInRole(username, Constants.ROLENAME_ADMIN)) { Roles.AddUserToRole(username, Constants.ROLENAME_ADMIN); }
  148 + }
  149 +
  150 + string[] selectedrolenames;
  151 + if (rolenames != null)
  152 + {
  153 + selectedrolenames = rolenames.Contains("*") ? Roles.GetAllRoles() : rolenames;
  154 + if (selectedrolenames != null && selectedrolenames.Any())
  155 + {
  156 + foreach (var rname in selectedrolenames) { if (!Roles.IsUserInRole(username, rname)) { Roles.AddUserToRole(username, rname); } }
  157 + }
  158 + }
  159 + string[] selectedrolegroupnames;
  160 + if (rolegroupnames != null)
  161 + {
  162 + selectedrolegroupnames = rolegroupnames.Contains("*") ? RoleGroups.GetAllNames().ToArray() : rolegroupnames;
  163 + if (selectedrolegroupnames != null && selectedrolegroupnames.Any())
  164 + {
  165 + foreach (var rgname in selectedrolegroupnames) { if (!RoleGroups.IsUserInRoleGroup(username, rgname)) { Assign.RoleGroupsToUsers(rgname, username); } }
  166 + }
  167 + }
  168 + return user;
  169 + }
  170 + #endregion Create
  171 + #region CreateAdminRolesAndUsers
  172 + public static void CreateAdminRolesAndUsers()
  173 + {
  174 + MembershipUser user;
  175 + if (!Roles.RoleExists(Constants.ROLENAME_ADMINISTRATOR)) { Roles.CreateRole(Constants.ROLENAME_ADMINISTRATOR); }
  176 + if (!Roles.RoleExists(Constants.ROLENAME_ADMIN)) { Roles.CreateRole(Constants.ROLENAME_ADMIN); }
  177 +
  178 + user = Membership.GetUser(Constants.USERNAME_ADMIN);
  179 + if (user == null)
  180 + {
  181 + user = Membership.CreateUser(Constants.USERNAME_ADMIN, Constants.PASSWORD_ADMIN);
  182 + }
  183 + if (!Roles.IsUserInRole(Constants.USERNAME_ADMIN, Constants.ROLENAME_ADMINISTRATOR)) { Roles.AddUserToRole(Constants.USERNAME_ADMIN, Constants.ROLENAME_ADMINISTRATOR); }
  184 + if (!Roles.IsUserInRole(Constants.USERNAME_ADMIN, Constants.ROLENAME_ADMIN)) { Roles.AddUserToRole(Constants.USERNAME_ADMIN, Constants.ROLENAME_ADMIN); }
  185 +
  186 + user = Membership.GetUser(Constants.USERNAME_ADMINISTRATOR);
  187 + if (user == null)
  188 + {
  189 + user = Membership.CreateUser(Constants.USERNAME_ADMINISTRATOR, Constants.PASSWORD_ADMINISTRATOR);
  190 + }
  191 + if (!Roles.IsUserInRole(Constants.USERNAME_ADMINISTRATOR, Constants.ROLENAME_ADMINISTRATOR)) { Roles.AddUserToRole(Constants.USERNAME_ADMINISTRATOR, Constants.ROLENAME_ADMINISTRATOR); }
  192 + if (!Roles.IsUserInRole(Constants.USERNAME_ADMINISTRATOR, Constants.ROLENAME_ADMIN)) { Roles.AddUserToRole(Constants.USERNAME_ADMINISTRATOR, Constants.ROLENAME_ADMIN); }
  193 + }
  194 + #endregion CreateAdminRolesAndUsers
  195 + #region IsInRole public method
  196 + /// <summary>
  197 + /// Annak jelzése, hogy a <paramref name="userName"/>-ben megadott nevű felhasználó
  198 + /// rendelkezik-e a <paramref name="roleName"/>-ben megadott nevű szereppel.
  199 + /// </summary>
  200 + /// <param name="userName">A felhasználó neve.</param>
  201 + /// <param name="roleName">A szerep neve.</param>
  202 + /// <returns>Igaz, ha a felhasználó rendelekezik a megadott szereppel.</returns>
  203 + public static bool IsInRole(string userName, string roleName)
  204 + {
  205 + return m_roleProvider.IsUserInRole(userName, roleName);
  206 + }
  207 + #endregion IsInRole public method
  208 + #region Get
  209 + public static MembershipUser Get(string userName)
  210 + {
  211 + return m_MembershipProvider.GetUser(userName, false);
  212 + }
  213 + #endregion Get
  214 + #region GetNameList
  215 + /// <summary>
  216 + /// A maszknak megfelelő felhasználónevek listáját adja vissza.
  217 + /// </summary>
  218 + /// <param name="usernamemask">SQL LIKE-ba illeszhető maszk</param>
  219 + /// <returns></returns>
  220 + public static List<string> GetNameList(string usernamemask)
  221 + {
  222 + if (usernamemask == null) { usernamemask = "%"; }
  223 + usernamemask = usernamemask.Replace("%", ".*").Replace("?", ".");
  224 + return MembershipDBContext.Users
  225 + .Select(u=>u.UserName)
  226 + .ToList()
  227 + .Where(un => Regex.Match(un, usernamemask).Success)
  228 + .ToList();
  229 + }
  230 + #endregion GetNameList
  231 + #region GetList
  232 + /// <summary>
  233 + /// Az összes felhasználót tartalmazó listát ad vissza.
  234 + /// </summary>
  235 + /// <param name="includetempuser">Ha hamis, akkor az ideiglenes felhasználók nincsenek a listában.</param>
  236 + /// <returns></returns>
  237 + public static List<MembershipUser> GetList(string usernamemask,bool includetempuser = false)
  238 + {
  239 + var result = new List<MembershipUser>();
  240 + if (!includetempuser)
  241 + { // az ideiglenes felhasználók nélkül
  242 + var qry = MembershipDBContext.Users // primary
  243 + .Where(u => SqlMethods.Like(u.UserName, usernamemask))
  244 + .GroupJoin(MembershipDBContext.UserSupplements, //foreign
  245 + pk => pk.UserId, // primary key
  246 + fk => fk.UserId, // foreign key
  247 + (pka, fkb) => new { u = pka, us = fkb })
  248 + .SelectMany(sm => sm.us.DefaultIfEmpty(), (sm, d) => new { User = sm.u, UserSupplement = d })
  249 + .Where(x => x.UserSupplement == null || x.UserSupplement.IsTemporary == false)
  250 + .Select(s => s.User);
  251 + if (qry != null && qry.Any())
  252 + {
  253 + foreach (var dbuser in qry)
  254 + {
  255 + MembershipUser user = m_MembershipProvider.GetUser(dbuser.UserId, false);
  256 + if (user != null)
  257 + {
  258 + result.Add(user);
  259 + }
  260 + }
  261 + }
  262 + }
  263 + else
  264 + { // itt mehet mind, nem kell szűrögetni
  265 + foreach (MembershipUser user in m_MembershipProvider.GetAllUsers(0, int.MaxValue, out int totalRecords))
  266 + {
  267 + result.Add(user);
  268 + }
  269 + }
  270 + return result;
  271 + }
  272 + #endregion GetList
  273 + #region CheckPassword
  274 + public static bool CheckPassword(string username, string userpassword)
  275 + {
  276 + var user = Membership.GetUser(username);
  277 + return user.GetPassword()==userpassword;
  278 + }
  279 + #endregion CheckPassword
  280 + #region Remove
  281 + /// <summary>
  282 + /// Törli a megadott nevű user-t és minden kapcsolatát
  283 + /// </summary>
  284 + /// <param name="sqlcs"></param>
  285 + /// <param name="username"></param>
  286 + /// <param name="userpsw"></param>
  287 + /// <returns></returns>
  288 + public static void Remove(string username)
  289 + {
  290 + if (string.IsNullOrWhiteSpace(username)) { throw new Exception("Username can not be null or empty or whitespace!"); }
  291 + if (Get(username) == null) { throw new ApplicationException($"User {username} does not exist!"); }
  292 + if (Constants.SYSTEMUSERNAMELIST.Contains(username)) { throw new MembershipCreateUserException($"System user {username} are not allowed to delete!"); }
  293 + Assign.RemoveOfUser(username);
  294 + if (Users.IsSecondaryUserOfUser(username)) { Users.DeleteSecondaryUsersOfUser(username); }
  295 + m_MembershipProvider.DeleteUser(username, true);
  296 + }
  297 + #endregion Remove
  298 + }
  299 + #endregion Users
  300 + #region RoleGroups
  301 + public static class RoleGroups
  302 + {
  303 + #region Get methods
  304 + /// <summary>
  305 + /// Szerepkör lekérése az egyedi azonosítója alapján.
  306 + /// </summary>
  307 + /// <param name="id">A keresett funkció azonosítója.</param>
  308 + /// <returns>A kért szerepkör, egyébként null.</returns>
  309 + public static DAL.RoleGroup Get(int id)
  310 + {
  311 + return MembershipDBContext.RoleGroups.FirstOrDefault(x => x.Id == id);
  312 + }
  313 + /// <summary>
  314 + /// Szerepkör lekérése az egyedi neve alapján.
  315 + /// </summary>
  316 + /// <param name="name">A keresett szerepkör egyedi neve.</param>
  317 + /// <returns>A kért szerepkör, egyébként null.</returns>
  318 + public static DAL.RoleGroup Get(string name)
  319 + {
  320 + return MembershipDBContext.RoleGroups.FirstOrDefault(x => x.Name == name);
  321 + }
  322 + /// <summary>
  323 + /// Szerepkör lekérése az egyedi neve alapján.
  324 + /// </summary>
  325 + /// <param name="name">A keresett szerepkör egyedi neve.</param>
  326 + /// <returns>A kért szerepkör, egyébként null.</returns>
  327 + public static List<string> GetAllNames()
  328 + {
  329 + return MembershipDBContext.RoleGroups.Select(rg=>rg.Name).ToList();
  330 + }
  331 + public static bool IsUserInRoleGroup(string username,string rolegroupname)
  332 + {
  333 + return MembershipDBContext.RoleGroupUsers.Select(rguass => rguass.User.UserName == username && rguass.RoleGroup.Name == rolegroupname).ToList().Any();
  334 + }
  335 + #endregion Get methods
  336 +
  337 + #region Create method
  338 + /// <summary>
  339 + /// Szerepkör létrehozása.
  340 + /// </summary>
  341 + /// <param name="roleGroup">A létrehozandó szerepkör.</param>
  342 + /// <exception cref="ApplicationException">
  343 + /// Ha üres vagy null a szerepkör neve.
  344 + /// Ha már létezik a megadott név.
  345 + /// </exception>
  346 + public static void Create(DAL.RoleGroup roleGroup)
  347 + {
  348 + if (String.IsNullOrWhiteSpace(roleGroup.Name)) { throw new ApplicationException("RoleGroup név megadása kötelező!"); }
  349 +
  350 + if (MembershipDBContext.RoleGroups.Any(x => x.Name == roleGroup.Name)) { throw new ApplicationException($"RoleGroup {roleGroup.Name} already exist!"); }
  351 +
  352 + MembershipDBContext.RoleGroups.Add(roleGroup);
  353 + MembershipDBContext.SaveChanges();
  354 + }
  355 + /// <summary>
  356 + /// Szerepkör létrehozása.
  357 + /// </summary>
  358 + /// <param name="name">A létrehozandó szerepkör.</param>
  359 + /// <exception cref="ApplicationException">
  360 + /// Ha üres vagy null a szerepkör neve.
  361 + /// Ha már létezik a megadott név.
  362 + /// </exception>
  363 + public static void Create(string name)
  364 + {
  365 + if (String.IsNullOrWhiteSpace(name)) { throw new ApplicationException("RoleGroup név megadása kötelező!"); }
  366 + if (MembershipDBContext.RoleGroups.Any(x => x.Name == name)) { throw new ApplicationException($"RoleGroup {name} already exist!"); }
  367 + MembershipDBContext.RoleGroups.Add(new DAL.RoleGroup { Name = name, });
  368 + MembershipDBContext.SaveChanges();
  369 + }
  370 + #endregion Create method
  371 +
  372 + #region Remove methods
  373 + /// <summary>
  374 + /// Szerepkör törlése az egyedi azonosítója megadásával.
  375 + /// A szerepkörhöz tartozó összerendelések is megszűnnek!
  376 + /// </summary>
  377 + /// <param name="id">Törlendő szerep egyedi azonosítója.</param>
  378 + /// <exception cref="ApplicationException">Ha nem található a törlendő szerepkör.</exception>
  379 + public static void Remove(int id)
  380 + {
  381 + var row = MembershipDBContext.RoleGroups.Find(id);
  382 + if (row == null) { throw new ApplicationException("RoleGroup does not exist!!"); }
  383 + else { MembershipDBContext.RoleGroups.Remove(row); MembershipDBContext.SaveChanges(); }
  384 + }
  385 + /// <summary>
  386 + /// Szerepkör törlése az egyedi név megadásával.
  387 + /// A szerepkörhöz tartozó összerendelések is megszűnnek!
  388 + /// </summary>
  389 + /// <param name="name">Törlendő szerepkör egyedi neve.</param>
  390 + /// <exception cref="ApplicationException">Ha nem található a törlendő szerepkör.</exception>
  391 + public static void Remove(string name)
  392 + {
  393 + var row = MembershipDBContext.RoleGroups.FirstOrDefault(x => x.Name == name);
  394 + if (row == null) { Remove(-1); }
  395 + else { Remove(row.Id); }
  396 + }
  397 + #endregion Remove methods
  398 + }
  399 + #endregion RoleGroups
  400 + #region Assign
  401 + public static class Assign
  402 + {
  403 + #region RemoveOfUser
  404 + public static void RemoveOfUser(string username)
  405 + {
  406 + if (string.IsNullOrWhiteSpace(username)) { throw new Exception("Username can not be empty!"); }
  407 + var user = MembershipDBContext.Users.FirstOrDefault(u => u.UserName == username);
  408 + if (user==null) { throw new Exception($"User '{username}' does not exist!"); }
  409 + var rguasslist = MembershipDBContext.RoleGroupUsers.Where(rg => rg.UserId == user.UserId);
  410 + if (rguasslist == null || !rguasslist.Any()) { return; }
  411 + foreach (var rguass in rguasslist) { MembershipDBContext.RoleGroupUsers.Remove(rguass); }
  412 + }
  413 + #endregion RemoveOfUser
  414 + #region RolesToUser public method
  415 + /// <summary>
  416 + /// Role-RoleGroup-User összerendelések
  417 + /// </summary>
  418 + /// <param name="mode">az összerendelés módját határozza meg</param>
  419 + /// <param name="rolenamecommalist">ezeket kell összerendelni...</param>
  420 + /// <param name="usernamecommalist">...ezekkel</param>
  421 + /// <returns></returns>
  422 + public static VRH.Common.ReturnInfoJSON RolesToUser(string rolenamecommalist, string usernamecommalist)
  423 + {
  424 + DAL.RoleGroup urg;
  425 + ReturnInfoJSON result = new ReturnInfoJSON() { ReturnMessage = "Assignment was successful!" };
  426 + try
  427 + {
  428 + if (m_roleProvider != null) { throw new Exception("RoleService is not enabled!"); }
  429 + var rolenamelist = rolenamecommalist != null ? new List<string>(rolenamecommalist.Split(',')) : new List<string>();
  430 + var usernamelist = usernamecommalist != null ? new List<string>(usernamecommalist.Split(',')) : new List<string>();
  431 + foreach (var rolename in rolenamelist)
  432 + {
  433 + CheckRoleExists(rolename);
  434 + foreach (var username in usernamelist)
  435 + {
  436 + CheckUsersExists(username);
  437 + if (!Users.IsInRole(username, rolename)) { Roles.AddUserToRole(username, rolename); }
  438 + }
  439 + }
  440 + }
  441 + catch (Exception ex)
  442 + {
  443 + result.ReturnValue = -1;
  444 + result.ReturnMessage = ex.Message;
  445 + }
  446 + return result;
  447 + }
  448 + #endregion RolesToUser public method
  449 + #region RolesToRoleGroups public method
  450 + public static VRH.Common.ReturnInfoJSON RolesToRoleGroups(string rolenamecommalist, string rolegroupnamecommalist)
  451 + {
  452 + DAL.RoleGroup urg;
  453 + ReturnInfoJSON result = new ReturnInfoJSON() { ReturnMessage = "Assignment was successful!" };
  454 + try
  455 + {
  456 + if (m_roleProvider != null) { throw new Exception("RoleService is not enabled!"); }
  457 + var rolenamelist = rolenamecommalist != null ? new List<string>(rolenamecommalist.Split(',')) : new List<string>();
  458 + var rolegroupnamelist = rolegroupnamecommalist != null ? new List<string>(rolegroupnamecommalist.Split(',')) : new List<string>();
  459 + foreach (var rolename in rolenamelist)
  460 + {
  461 + CheckRoleExists(rolename);
  462 + foreach (var rolegroupname in rolegroupnamelist)
  463 + {
  464 + CheckRoleGroupExists(rolegroupname);
  465 + DAL.Role role = MembershipDBContext.Roles.FirstOrDefault(x => x.RoleName == rolename);
  466 + urg = MembershipDBContext.RoleGroups.FirstOrDefault(x => x.Name == rolegroupname);
  467 + if (role != null && urg != null)
  468 + {
  469 + if (!urg.Roles.Any(x => x.Role.RoleName == rolename))
  470 + {
  471 + urg.Roles.Add(new DAL.RoleGroupRole { Role = role });
  472 + MembershipDBContext.SaveChanges();
  473 + UpdateUsersForUserRoleGroup(urg.Id);
  474 + }
  475 + }
  476 + }
  477 + }
  478 + }
  479 + catch (Exception ex)
  480 + {
  481 + result.ReturnValue = -1;
  482 + result.ReturnMessage = ex.Message;
  483 + }
  484 + return result;
  485 + }
  486 + #endregion RolesToRoleGroups public method
  487 + #region RoleGroupsToUsers public method
  488 + public static VRH.Common.ReturnInfoJSON RoleGroupsToUsers(string rolegroupnamecommalist, string usernamecommalist)
  489 + {
  490 + DAL.RoleGroup urg;
  491 + ReturnInfoJSON result = new ReturnInfoJSON() { ReturnMessage = "Assignment was successful!" };
  492 + try
  493 + {
  494 + if (m_roleProvider != null) { throw new Exception("RoleService is not enabled!"); }
  495 + var rolegroupnamelist = rolegroupnamecommalist != null ? new List<string>(rolegroupnamecommalist.Split(',')) : new List<string>();
  496 + var usernamelist = usernamecommalist != null ? new List<string>(usernamecommalist.Split(',')) : new List<string>();
  497 + foreach (var rolegroupname in rolegroupnamelist)
  498 + {
  499 + CheckRoleGroupExists(rolegroupname);
  500 + foreach (var username in usernamelist)
  501 + {
  502 + CheckUsersExists(username);
  503 + Guid userId = Guid.Empty;
  504 + if (Guid.TryParse(Users.Get(username).ProviderUserKey.ToString(), out userId))
  505 + {
  506 + urg = MembershipDBContext.RoleGroups.FirstOrDefault(x => x.Name == rolegroupname);
  507 + DAL.User u = MembershipDBContext.Users.FirstOrDefault(x => x.UserId == userId);
  508 + if (u != null && urg != null)
  509 + {
  510 + if (!urg.Users.Any(x => x.UserId == userId))
  511 + {
  512 + urg.Users.Add(new DAL.RoleGroupUser { User = u });
  513 + MembershipDBContext.SaveChanges();
  514 + UpdateRolesForUser(u.UserId);
  515 + }
  516 + }
  517 + }
  518 + }
  519 + }
  520 + }
  521 + catch (Exception ex)
  522 + {
  523 + result.ReturnValue = -1;
  524 + result.ReturnMessage = ex.Message;
  525 + }
  526 + return result;
  527 + }
  528 + #endregion RoleGroupsToUsers public method
  529 + #region private CheckRoleGroupExists,CheckRoleExists,CheckUsersExists
  530 + /// <summary>
  531 + /// Ellenőrzi, van-e ilyen role group
  532 + /// </summary>
  533 + /// <param name="roleGroup">ellenőrizendő role group</param>
  534 + private static void CheckRoleGroupExists(string roleGroup)
  535 + {
  536 + if (!MembershipDBContext.RoleGroups.Any(x => x.Name == roleGroup)) { throw new Exception($"RoleGroup {roleGroup} does not exist!"); }
  537 + }
  538 + /// <summary>
  539 + /// Ellenőrzi, van-e ilyen role
  540 + /// </summary>
  541 + /// <param name="role">az ellenőrizendő role</param>
  542 + private static void CheckRoleExists(string role)
  543 + {
  544 + if (!System.Web.Security.Roles.GetAllRoles().ToList().ConvertAll(r => r.ToUpper()).Contains(role.ToUpper()))
  545 + {
  546 + throw new Exception($"Role {role} does not exist!");
  547 + }
  548 + }
  549 + /// <summary>
  550 + /// Ellenőrzi van-e ilyen usernevű user
  551 + /// </summary>
  552 + /// <param name="userName">Ellenőrizendő user userneve</param>
  553 + private static void CheckUsersExists(string userName)
  554 + {
  555 + bool exists = false;
  556 + foreach (MembershipUser user in System.Web.Security.Membership.GetAllUsers())
  557 + {
  558 + if (user.UserName.ToUpper() == userName.ToUpper()) { exists = true; break; }
  559 + }
  560 + if (!exists) { throw new Exception($"User {userName} does not exist!"); }
  561 + }
  562 + #endregion private CheckRoleGroupExists,CheckRoleExists,CheckUsersExists
  563 +
  564 + #region private UpdateRolesForUser
  565 + /// <summary>
  566 + /// Frissíti a megadott felhasználó szerepeit a felhasználó szerepkörei alapján
  567 + /// </summary>
  568 + /// <param name="userId">felhasználó UserID-ja</param>
  569 + private static void UpdateRolesForUser(Guid userId)
  570 + {
  571 + MembershipUser user = System.Web.Security.Membership.GetUser(userId, false);
  572 + if (user != null)
  573 + {
  574 + // eltávolítjuk az összes szerepkörét a felhasználónak, majd a felhasználóhoz tartozó UserRoleGroup-okban lévő Roles-okat adjuk hozzá a felhasználóhoz
  575 + if (Roles.GetRolesForUser(user.UserName).Any())
  576 + {
  577 + Roles.RemoveUserFromRoles(user.UserName, Roles.GetRolesForUser(user.UserName));
  578 + }
  579 + foreach (DAL.RoleGroup urg in MembershipDBContext.RoleGroups.Where(x => x.Users.Any(y => y.UserId == userId)))
  580 + {
  581 + foreach (string roleName in urg.Roles.Select(x => x.Role.RoleName))
  582 + {
  583 + if (!Roles.IsUserInRole(user.UserName, roleName))
  584 + {
  585 + Roles.AddUserToRole(user.UserName, roleName);
  586 + }
  587 + }
  588 + }
  589 + }
  590 + }
  591 + #endregion private UpdateRolesForUser
  592 + #region private UpdateUsersForUserRoleGroup
  593 + /// <summary>
  594 + /// Frissíti a megadott szerepkörhöz tartozó felhasználók szerepeit a szerepkörök alapján
  595 + /// </summary>
  596 + /// <param name="userRoleGroupId">UserRoleGroup Id-ja</param>
  597 + private static void UpdateUsersForUserRoleGroup(int userRoleGroupId)
  598 + {
  599 + DAL.RoleGroup urg = MembershipDBContext.RoleGroups.SingleOrDefault(x => x.Id == userRoleGroupId);
  600 + if (urg != null)
  601 + {
  602 + foreach (Guid userId in urg.Users.Select(x => x.UserId))
  603 + {
  604 + UpdateRolesForUser(userId);
  605 + }
  606 + }
  607 + }
  608 + #endregion private UpdateUsersForUserRoleGroup
  609 + }
  610 + #endregion Assign
  611 + #region DAL
  612 + public static class DAL
  613 + {
  614 + #region tables
  615 + #region table-User
  616 + /// <summary>
  617 + /// DefaultMembershipProvider által létrehozott User tábla.
  618 + /// Ha változik az aktuális verzió, és emiatt a tábla szerkezete, akkor ezt módosítani kell.
  619 + /// </summary>
  620 + [Table("Users", Schema = "dbo")]
  621 + public partial class User
  622 + {
  623 + /// <summary>
  624 + /// Felhasználó egyedi azonosítója.
  625 + /// </summary>
  626 + [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
  627 + public Guid UserId { get; set; }
  628 +
  629 + /// <summary>
  630 + /// Melyik alkalmazás felhasználója.
  631 + /// </summary>
  632 + public Guid ApplicationId { get; set; }
  633 +
  634 + /// <summary>
  635 + /// Felhasználó neve.
  636 + /// </summary>
  637 + [Required, MaxLength(50)]
  638 + public string UserName { get; set; }
  639 +
  640 + /// <summary>
  641 + /// Felhasználó névtelenül bejelentjezhet-e.
  642 + /// </summary>
  643 + public bool IsAnonymous { get; set; }
  644 +
  645 + /// <summary>
  646 + /// Felhasználó utolsó aktivitésénak időpontja.
  647 + /// </summary>
  648 + public DateTime LastActivityDate { get; set; }
  649 +
  650 + #region Virtual Collections
  651 +
  652 + /// <summary>
  653 + /// A felhasználó szerepkörei.
  654 + /// </summary>
  655 + public virtual ICollection<RoleGroupUser> UserRoleGroupUsers { get; set; }
  656 +
  657 + #endregion Virtual Collections
  658 +
  659 + }
  660 + #endregion table-User
  661 + #region table-RoleGroupUser
  662 + /// <summary>
  663 + /// Szerepkörök és felhasználók összerendelése.
  664 + /// </summary>
  665 + [Table(nameof(MembershipContext.RoleGroupUsers), Schema = Constants.SCHEMA_NAME)]
  666 + public partial class RoleGroupUser
  667 + {
  668 + /// <summary>
  669 + /// Szerepkör egyedi azonosítója.
  670 + /// </summary>
  671 + [Key, Column(Order = 0), DatabaseGenerated(DatabaseGeneratedOption.None)]
  672 + public int RoleGroupId { get; set; }
  673 +
  674 + /// <summary>
  675 + /// Felhasználó egyedi azonosítója.
  676 + /// </summary>
  677 + [Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.None)]
  678 + public Guid UserId { get; set; }
  679 +
  680 + #region Virtual foreignkeys
  681 +
  682 + [ForeignKey(nameof(RoleGroupId))]
  683 + public virtual RoleGroup RoleGroup { get; set; }
  684 +
  685 + [ForeignKey(nameof(UserId))]
  686 + public virtual User User { get; set; }
  687 +
  688 + #endregion Virtual foreignkeys
  689 + }
  690 + #endregion table-RoleGroupUser
  691 + #region table-RoleGroupRole
  692 + /// <summary>
  693 + /// Szerepkörök és szerepek összerendelése.
  694 + /// </summary>
  695 + [Table(nameof(MembershipContext.RoleGroupRoles), Schema = Constants.SCHEMA_NAME)]
  696 + public partial class RoleGroupRole
  697 + {
  698 + /// <summary>
  699 + /// Szerepkör egyedi azonosítója.
  700 + /// </summary>
  701 + [Key, Column(Order = 0), DatabaseGenerated(DatabaseGeneratedOption.None)]
  702 + public int RoleGroupId { get; set; }
  703 +
  704 + /// <summary>
  705 + /// Szerep egyedi azonosítója.
  706 + /// </summary>
  707 + [Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.None)]
  708 + public Guid RoleId { get; set; }
  709 +
  710 + #region Virtual foreignkeys
  711 +
  712 + [ForeignKey(nameof(RoleGroupId))]
  713 + public virtual RoleGroup RoleGroup { get; set; }
  714 +
  715 + [ForeignKey(nameof(RoleId))]
  716 + public virtual Role Role { get; set; }
  717 +
  718 + #endregion Virtual foreignkeys
  719 + }
  720 + #endregion table-RoleGroupRole
  721 + #region table-RoleGroup
  722 + /// <summary>
  723 + /// Szerepkörök táblázata.
  724 + /// </summary>
  725 + [Table(nameof(MembershipContext.RoleGroups), Schema = Constants.SCHEMA_NAME)]
  726 + public partial class RoleGroup
  727 + {
  728 + #region Properties
  729 +
  730 + /// <summary>
  731 + /// Szerepkör egyedi azonosítója.
  732 + /// </summary>
  733 + [Key]
  734 + public int Id { get; set; }
  735 +
  736 + /// <summary>
  737 + /// Szerepkör egyedi megnevezése.
  738 + /// </summary>
  739 + [Required, MaxLength(256), Index(IsUnique = true)]
  740 + public string Name { get; set; }
  741 +
  742 + #endregion Properties
  743 +
  744 + #region Virtual Collections
  745 +
  746 + /// <summary>
  747 + /// A szerepkörhöz ezek a szerepek tartoznak.
  748 + /// </summary>
  749 + public virtual ICollection<RoleGroupRole> Roles { get; set; }
  750 +
  751 + /// <summary>
  752 + /// A szerepkörhöz ezek a felhasználók tartoznak.
  753 + /// </summary>
  754 + public virtual ICollection<RoleGroupUser> Users { get; set; }
  755 +
  756 + #endregion Virtual Collections
  757 +
  758 + #region Constructor
  759 + public RoleGroup()
  760 + {
  761 + Roles = new HashSet<RoleGroupRole>();
  762 + Users = new HashSet<RoleGroupUser>();
  763 + }
  764 + #endregion Constructor
  765 + }
  766 + #endregion table-RoleGroup
  767 + #region table-Role
  768 + /// <summary>
  769 + /// DefaultMembershipProvider által létrehozott User tábla.
  770 + /// </summary>
  771 + [Table("Roles", Schema = "dbo")]
  772 + public partial class Role
  773 + {
  774 + /// <summary>
  775 + /// Szerep egyedi azonosítója.
  776 + /// </summary>
  777 + [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
  778 + public Guid RoleId { get; set; }
  779 +
  780 + /// <summary>
  781 + /// Melyik alkalmazás szerepe.
  782 + /// </summary>
  783 + public Guid ApplicationId { get; set; }
  784 +
  785 + /// <summary>
  786 + /// Szerep neve.
  787 + /// </summary>
  788 + [Required, MaxLength(256)]
  789 + public string RoleName { get; set; }
  790 +
  791 + /// <summary>
  792 + /// Alkalmazás rövid leírása.
  793 + /// </summary>
  794 + [MaxLength(256)]
  795 + public string Description { get; set; }
  796 + }
  797 + #endregion table-Role
  798 + #region table-SecondaryFunction
  799 + /// <summary>
  800 + /// Lehetséges funkciókat tartalmazó táblázat, mely funkciókhoz
  801 + /// tartozhat a másodlagos felhasználó.
  802 + /// </summary>
  803 + [Table(nameof(MembershipContext.SecondaryFunctions), Schema = Constants.SCHEMA_NAME)]
  804 + public partial class SecondaryFunction
  805 + {
  806 + #region Properties
  807 +
  808 + /// <summary>
  809 + /// A funkció egyedi azonosítója.
  810 + /// </summary>
  811 + [Key]
  812 + public int Id { get; set; }
  813 +
  814 + /// <summary>
  815 + /// A funkció egyedi megnevezése.
  816 + /// </summary>
  817 + [Required, MaxLength(30), Index(IsUnique = true)]
  818 + public string Name { get; set; }
  819 +
  820 + #endregion Properties
  821 +
  822 + #region Virtual Collections
  823 +
  824 + /// <summary>
  825 + /// A funkcióhoz ezek a másodlagos felhasználók tartoznak tartoznak.
  826 + /// </summary>
  827 + public virtual ICollection<SecondaryUser> SecondaryUsers { get; set; }
  828 +
  829 + #endregion Virtual Collections
  830 +
  831 + #region Constructor
  832 + public SecondaryFunction()
  833 + {
  834 + SecondaryUsers = new HashSet<SecondaryUser>();
  835 + }
  836 + #endregion Constructor
  837 + }
  838 + #endregion table-SecondaryFunction
  839 + #region table-SecondaryUser
  840 + /// <summary>
  841 + /// Másodlagos felhasználók adatait tartalmazó táblázat.
  842 + /// </summary>
  843 + [Table(nameof(MembershipContext.SecondaryUsers), Schema = Constants.SCHEMA_NAME)]
  844 + public partial class SecondaryUser
  845 + {
  846 + private const string INDEX_FUNCTION_NAME = "IX_SecondaryUser_SecondaryFunctionId_Name";
  847 +
  848 + #region Properties
  849 +
  850 + /// <summary>
  851 + /// Másodlagos felhasználó belső egyedi azonosítója.
  852 + /// </summary>
  853 + [Key, Index(IsClustered = false)]
  854 + public int Id { get; set; }
  855 +
  856 + /// <summary>
  857 + /// Az elsődleges felhasználó egyedi azonosítója a dbo.Users táblából.
  858 + /// Ő hozzá tartozik a másodlagos felhasználó.
  859 + /// </summary>
  860 + public Guid UserId { get; set; }
  861 +
  862 + /// <summary>
  863 + /// Melyik funkcióhoz tartozik a másodlagos felhasználó.
  864 + /// </summary>
  865 + [Index(INDEX_FUNCTION_NAME, 1, IsUnique = true, IsClustered = true)]
  866 + public int SecondaryFunctionId { get; set; }
  867 +
  868 + /// <summary>
  869 + /// Másodlagos felhasználó neve.
  870 + /// </summary>
  871 + [Required, MaxLength(255)]
  872 + [Index(INDEX_FUNCTION_NAME, 2, IsUnique = true, IsClustered = true)]
  873 + public string Name { get; set; }
  874 +
  875 + /// <summary>
  876 + /// Másodlagos felhasználó jelszava.
  877 + /// </summary>
  878 + [MaxLength(255)]
  879 + public string Password { get; set; }
  880 +
  881 + /// <summary>
  882 + /// Másodlagos felhasználó érvényes-e jelenleg.
  883 + /// </summary>
  884 + public bool Active { get; set; } = true;
  885 +
  886 + #endregion Properties
  887 +
  888 + #region Virtual foreignkeys
  889 +
  890 + /// <summary>
  891 + /// A másodlagos felhasználó ehhez az elsődleges felhasználóhoz tartozik.
  892 + /// </summary>
  893 + [ForeignKey(nameof(UserId))]
  894 + public virtual User User { get; set; }
  895 +
  896 + /// <summary>
  897 + /// A másodlagos felhasználó ehhez a funkcióhoz tartozik.
  898 + /// </summary>
  899 + [ForeignKey(nameof(SecondaryFunctionId))]
  900 + public virtual SecondaryFunction SecondaryFunction { get; set; }
  901 +
  902 + #endregion Virtual foreignkeys
  903 +
  904 + #region Constructor
  905 + public SecondaryUser()
  906 + {
  907 + }
  908 + #endregion Constructor
  909 +
  910 + public override string ToString()
  911 + {
  912 + return String.Concat("{",
  913 + nameof(Id), "=", this.Id.ToString(), "; ",
  914 + nameof(UserId), "=", this.UserId, "; ",
  915 + nameof(SecondaryFunctionId), "=", this.SecondaryFunctionId.ToString(), "; ",
  916 + nameof(Name), "=", this.Name, "; ",
  917 + nameof(Password), "=", this.Password, "; ",
  918 + nameof(Active), "=", this.Active.ToString(),
  919 + "}"
  920 + );
  921 + }
  922 + }
  923 + #endregion table-SecondaryUser
  924 + #region table-SecondaryLogin
  925 + /// <summary>
  926 + /// Másodlagos felhasználók bejelentkezéseit nyilvántartó táblázat.
  927 + /// Egy másodlagos felhasználónak egy bejelentkezése tartozhat egy célhoz.
  928 + /// Vagyis a UserID+TargetId együtt egyedi kulcsot alkot.
  929 + /// </summary>
  930 + [Table(nameof(MembershipContext.SecondaryLogins), Schema = Constants.SCHEMA_NAME)]
  931 + public partial class SecondaryLogin
  932 + {
  933 + private const string INDEX_USER_TARGET = "IX_SecondaryLogin_UserId_TargetKey";
  934 +
  935 + #region Properties
  936 +
  937 + /// <summary>
  938 + /// A bejelentkezés belső egyedi azonosítója.
  939 + /// </summary>
  940 + [Key]
  941 + public int Id { get; set; }
  942 +
  943 + /// <summary>
  944 + /// Másodlagos felhasználó azonosítója, akinek a nevében történt a bejelentkezés.
  945 + /// </summary>
  946 + [Index(INDEX_USER_TARGET, 1, IsUnique = true)]
  947 + public int SecondaryUserId { get; set; }
  948 +
  949 + /// <summary>
  950 + /// A bejelentkezéshez tartozó azonosító. Értelmezése:
  951 + /// Mi célból történt a bejelentkezés?
  952 + /// </summary>
  953 + [MaxLength(20), Index(INDEX_USER_TARGET, 2, IsUnique = true)]
  954 + public string TargetKey { get; set; }
  955 +
  956 + /// <summary>
  957 + /// Bejelentkezés időpontja.
  958 + /// </summary>
  959 + public DateTime LoginTime { get; set; }
  960 +
  961 + /// <summary>
  962 + /// A legutóbbi aktivitás időpontja.
  963 + /// </summary>
  964 + public DateTime LastActivityTime { get; set; }
  965 +
  966 + #endregion Properties
  967 +
  968 + #region Virtual foreignkeys
  969 +
  970 + /// <summary>
  971 + /// A másodlagos felhasználóra mutató tulajdonság.
  972 + /// </summary>
  973 + [ForeignKey(nameof(SecondaryUserId))]
  974 + public virtual SecondaryUser SecondaryUser { get; set; }
  975 +
  976 + #endregion Virtual foreignkeys
  977 +
  978 + public override string ToString()
  979 + {
  980 + return String.Concat("{",
  981 + nameof(Id), "=", this.Id.ToString(), "; ",
  982 + nameof(SecondaryUserId), "=", this.SecondaryUserId.ToString(), "; ",
  983 + nameof(DAL.SecondaryUser.Name), "=", this.SecondaryUser.Name, "; ",
  984 + nameof(TargetKey), "=", this.TargetKey ?? "null", "; ",
  985 + nameof(LoginTime), "=", this.LoginTime.ToString("G"), "; ",
  986 + nameof(LastActivityTime), "=", this.LastActivityTime.ToString("G"),
  987 + "}"
  988 + );
  989 + }
  990 +
  991 + }
  992 + #endregion table-SecondaryLogin
  993 + #region table-UserSupplement
  994 + /// <summary>
  995 + /// A DefaultMembershipProvider 'User' táblájában nem szabad változtatásokat eszközölni
  996 + /// a jövőbeni esetleges Microsoft fejlesztések miatt.
  997 + /// Ez a tábla arra való, hogy a felhasználóra vonatkozó egyéb kiegészítő adatokat
  998 + /// legyen hol tárolni.
  999 + /// </summary>
  1000 + /// <remarks>
  1001 + /// Ha nincsenek a felhasználónak kiegészítő adatai akkor nem lesz itt rekordja.
  1002 + /// </remarks>
  1003 + [Table(nameof(MembershipContext.UserSupplements), Schema = Constants.SCHEMA_NAME)]
  1004 + public partial class UserSupplement
  1005 + {
  1006 + #region Properties
  1007 +
  1008 + /// <summary>
  1009 + /// A felhasználó egyedi azonosítója a 'User' táblából.
  1010 + /// Itt is csak 1 db azonosító lehet.
  1011 + /// </summary>
  1012 + [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
  1013 + public Guid UserId { get; set; }
  1014 +
  1015 + /// <summary>
  1016 + /// Annak jelzése, hogy a felhasználó ideiglenesen létrehozott felhasználó.
  1017 + /// Ha igaz, akkor ideiglenes, egyébként hamis. Ha nem létezik a felhasználónak
  1018 + /// itt rekordja, akkor nem ideiglenes felhasználó.
  1019 + /// Alapértelmezett érték: true.
  1020 + /// </summary>
  1021 + public bool IsTemporary { get; set; } = true;
  1022 +
  1023 + #endregion Properties
  1024 +
  1025 + #region Virtual foreignkeys
  1026 +
  1027 + [ForeignKey(nameof(UserId))]
  1028 + public virtual User User { get; set; }
  1029 +
  1030 + #endregion Virtual foreignkeys
  1031 + }
  1032 + #endregion table-UserSupplement
  1033 + #endregion tables
  1034 +
  1035 + #region MembershipContext
  1036 + public class MembershipContext : DbContext
  1037 + {
  1038 + #region Constructors
  1039 + // Your context has been configured to use a 'VrhWebMembership' connection string from your application's
  1040 + // configuration file (App.config or Web.config).
  1041 + public MembershipContext(string sqlcs) : base(sqlcs)
  1042 + {
  1043 + }
  1044 + #endregion Constructors
  1045 +
  1046 + #region DbSets
  1047 +
  1048 + #region !!! A migrációból kivett két tábla. Ezeket a DefaultMembershipProvider kezeli és hozza létre. !!!
  1049 + public virtual DbSet<Role> Roles { get; set; }
  1050 + public virtual DbSet<User> Users { get; set; }
  1051 + #endregion !!! A migrációból kivett két tábla. Ezeket a DefaultMembershipProvider kezeli és hozza létre. !!!
  1052 +
  1053 + // Saját táblák, melyek a Global.SCHEMA_NAME állandó szerinti sémában vannak.
  1054 + public virtual DbSet<RoleGroup> RoleGroups { get; set; }
  1055 + public virtual DbSet<RoleGroupRole> RoleGroupRoles { get; set; }
  1056 + public virtual DbSet<RoleGroupUser> RoleGroupUsers { get; set; }
  1057 + public virtual DbSet<SecondaryFunction> SecondaryFunctions { get; set; }
  1058 + public virtual DbSet<SecondaryLogin> SecondaryLogins { get; set; }
  1059 + public virtual DbSet<SecondaryUser> SecondaryUsers { get; set; }
  1060 + public virtual DbSet<UserSupplement> UserSupplements { get; set; }
  1061 + #endregion DbSets
  1062 +
  1063 + #region OnModelCreating
  1064 + protected override void OnModelCreating(DbModelBuilder modelBuilder)
  1065 + {
  1066 + //modelBuilder.HasDefaultSchema("GoodBill");
  1067 +
  1068 + //WA20160124: Sajnos az EF a kötelező idegen kulcsnál alapértelmezésként cascadeDelete értékét true-ra állítja,
  1069 + // ami sok esetben nem megfelelő (nem is értem, miért true a default :(( )
  1070 + // Ahol ez előfordul, ott a ForeignKey-eket itt kell definiálni.
  1071 + // HasRequired = many oldal virtual property
  1072 + // WithMany = ha a one oldalon lett definiálva ICollection a many-ra, akkor azt kell ide írni, egyébként üres
  1073 + // HasForeignKey = many oldalon a foreign key mező
  1074 + }
  1075 + #endregion OnModelCreating
  1076 + }
  1077 + #endregion MembershipContext
  1078 + }
  1079 + #endregion DAL
  1080 + }
  1081 +}
0 \ No newline at end of file 1082 \ No newline at end of file
Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - Tools.cs
1 using System; 1 using System;
2 using System.IO; 2 using System.IO;
  3 +using System.IO.Compression;
3 using System.Collections.Generic; 4 using System.Collections.Generic;
4 using System.Linq; 5 using System.Linq;
5 using System.Security.Principal; 6 using System.Security.Principal;
6 using System.Text; 7 using System.Text;
  8 +using System.Text.RegularExpressions;
7 using System.Threading.Tasks; 9 using System.Threading.Tasks;
8 using System.Threading; 10 using System.Threading;
9 11
@@ -13,11 +15,101 @@ using System.Diagnostics; @@ -13,11 +15,101 @@ using System.Diagnostics;
13 15
14 using Vrh.XmlProcessing; 16 using Vrh.XmlProcessing;
15 using System.Xml.Linq; 17 using System.Xml.Linq;
  18 +using Vrh.Log4Pro.MaintenanceConsole.ColorConsoleNS;
  19 +using VRH.Common;
16 20
17 -namespace Vrh.Log4Pro.MaintenanceConsole 21 +namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS
18 { 22 {
  23 + public static class ZipTools
  24 + {
  25 + public static void Extract1stFileFromZIP(string targetfilefullpath, string ZIPfilefullpath)
  26 + {
  27 + if (File.Exists(targetfilefullpath)) { File.Delete(targetfilefullpath); }
  28 + using (ZipArchive archive = ZipFile.Open(ZIPfilefullpath, ZipArchiveMode.Read))
  29 + {
  30 + foreach (var zipentry in archive.Entries)
  31 + {
  32 + zipentry.ExtractToFile(targetfilefullpath);
  33 + return;
  34 + }
  35 + }
  36 + }
  37 + public static void ExtractAllFileFromZIP(string targetdirectorypath, string ZIPfilefullpath)
  38 + {
  39 + if (!Directory.Exists(targetdirectorypath)) { Directory.CreateDirectory(targetdirectorypath); }
  40 + using (ZipArchive archive = ZipFile.Open(ZIPfilefullpath, ZipArchiveMode.Read))
  41 + {
  42 + foreach (var zipentry in archive.Entries)
  43 + {
  44 + zipentry.ExtractToFile(Path.Combine(targetdirectorypath, zipentry.FullName));
  45 + }
  46 + }
  47 + }
  48 +
  49 + public static void CreateEntriesFromDirectoryContent(string sourcefolderpath, string ZIPfilefullpath, string includefilenamemask, string includefullpathregex, bool removearchivedfiles = false,bool storepathinzip = true)
  50 + {
  51 + if (File.Exists(ZIPfilefullpath)) { File.Delete(ZIPfilefullpath); }
  52 + DirectoryInfo di = new DirectoryInfo(sourcefolderpath);
  53 + var rgx = new Regex(includefullpathregex??"");
  54 + var archivedfiles = new List<string>();
  55 + using (ZipArchive archive = ZipFile.Open(ZIPfilefullpath, ZipArchiveMode.Create))
  56 + {
  57 + ColorConsole.WriteLine($"ZIP-ping directory '{sourcefolderpath}'...", ConsoleColor.Yellow);
  58 + FileInfo[] fis = di.GetFiles(includefilenamemask, SearchOption.AllDirectories);
  59 + int maxfilefullpathlength = 0;
  60 + int cpt = ColorConsole.CursorTop;
  61 + int cpl = ColorConsole.CursorLeft;
  62 + foreach (var fi in fis)
  63 + {
  64 + var entryname = storepathinzip
  65 + ? fi.FullName.Substring((Path.GetPathRoot(fi.FullName)?.Length) ?? 0)
  66 + : fi.Name;
  67 + if (rgx.Match(fi.FullName).Success)
  68 + {
  69 + try
  70 + {
  71 + archive.CreateEntryFromFile(fi.FullName, entryname, CompressionLevel.Optimal);
  72 + ColorConsole.Write(fi.FullName, ConsoleColor.Yellow);
  73 + if (maxfilefullpathlength > fi.FullName.Length)
  74 + {
  75 + ColorConsole.Write(new string(' ', maxfilefullpathlength - fi.FullName.Length));
  76 + }
  77 + else { maxfilefullpathlength = fi.FullName.Length; }
  78 + ColorConsole.SetCursorPosition(cpl, cpt);
  79 + archivedfiles.Add(fi.FullName);
  80 + }
  81 + catch (Exception ex)
  82 + {
  83 + ColorConsole.WriteLine($"Error when accessing/zipping file '{fi.FullName}'!", ConsoleColor.Red);
  84 + ColorConsole.WriteLine(ex.Message, ConsoleColor.Red,prefix: "Exception message: ", bracket:"[]");
  85 + }
  86 + }
  87 + cpt = ColorConsole.CursorTop;
  88 + cpl = ColorConsole.CursorLeft;
  89 + }
  90 + ColorConsole.Write(new string(' ', maxfilefullpathlength));
  91 + ColorConsole.SetCursorPosition(cpl, cpt);
  92 + }
  93 + if (removearchivedfiles)
  94 + {
  95 + archivedfiles.ForEach(x => File.Delete(x));
  96 + string[] dirs = System.IO.Directory.GetDirectories(sourcefolderpath);
  97 + string[] files = System.IO.Directory.GetFiles(sourcefolderpath);
  98 + if (dirs.Length + files.Length == 0) { Directory.Delete(sourcefolderpath); }
  99 + }
  100 + }
  101 + }
19 public static class Tools 102 public static class Tools
20 { 103 {
  104 + public static T GetPropertyValue<T>(object obj, string propName) { return (T)obj.GetType().GetProperty(propName).GetValue(obj, null); }
  105 +
  106 + public static Dictionary<K, V> Merge<K, V>(IEnumerable<Dictionary<K, V>> dictionaries)
  107 + {
  108 + return dictionaries.SelectMany(x => x)
  109 + .GroupBy(d => d.Key)
  110 + .ToDictionary(x => x.Key, y => y.First().Value);
  111 + }
  112 +
21 public static bool IsElevated 113 public static bool IsElevated
22 { 114 {
23 get 115 get
@@ -72,5 +164,15 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -72,5 +164,15 @@ namespace Vrh.Log4Pro.MaintenanceConsole
72 return outputBuilder.ToString(); 164 return outputBuilder.ToString();
73 } 165 }
74 } 166 }
  167 +
  168 + public static string GetTemporaryFoldername(string directorypath)
  169 + {
  170 + return Path.Combine(directorypath, DateTime.Now.ToString($"TMP_yyyyMMddHHmmssfffffff"));
  171 + }
  172 + public static string GetTemporaryfilename(string directorypath, string extension)
  173 + {
  174 + if (extension == null) { extension = ".tmp"; }
  175 + return Path.Combine(directorypath, DateTime.Now.ToString($"TMP_yyyyMMddHHmmssfffffff.{extension}"));
  176 + }
75 } 177 }
76 } 178 }
Vrh.Log4Pro.MaintenanceConsole/Icon_Log4ProService.ico 0 → 100644
No preview for this file type
Vrh.Log4Pro.MaintenanceConsole/Manager - BackupPackageManager.cs 0 → 100644
@@ -0,0 +1,513 @@ @@ -0,0 +1,513 @@
  1 +using System;
  2 +using System.IO;
  3 +using System.IO.Compression;
  4 +using System.Configuration.Install;
  5 +using System.Collections.Generic;
  6 +using System.Linq;
  7 +using System.ServiceProcess;
  8 +using System.Text;
  9 +using System.Threading;
  10 +using System.Threading.Tasks;
  11 +
  12 +using Microsoft.Web.Administration;
  13 +using System.Management;
  14 +using System.Diagnostics;
  15 +
  16 +using Vrh.Log4Pro.MaintenanceConsole.MenuNS;
  17 +using Vrh.Log4Pro.MaintenanceConsole.ColorConsoleNS;
  18 +using Vrh.Log4Pro.MaintenanceConsole.ToolsNS;
  19 +using Vrh.Log4Pro.MaintenanceConsole.CommandLineParserNS;
  20 +
  21 +using Vrh.XmlProcessing;
  22 +using VRH.Common;
  23 +using System.Xml.Linq;
  24 +using System.Text.RegularExpressions;
  25 +
  26 +namespace Vrh.Log4Pro.MaintenanceConsole.BackupPackageManagerNS
  27 +{
  28 + #region BackupPackageManager class
  29 + public static class BackupPackageManager
  30 + {
  31 + private const string XMLCONNECTIONSTRING = "config=MAINTENANCECONSOLE_BACKUPMANAGER;";
  32 + private const string XMLCONNECTIONSTRING_DEFAULT = "file=Config.Xml;element=BackupPackages;";
  33 + private const string PACKAGESELECTIONPROMPT = "Select the backup package(s) to manage with function '{0}'!";
  34 +
  35 + #region Execute
  36 + public static object Execute(object o1 = null, object o2 = null)
  37 + {
  38 + var args = (o1 as Menu.ExecutorParameter).Args;
  39 + var functionkey = CommandLine.GetCommandLineArgument(args, CLP.CMD_FUNCTION);
  40 + var config = new BackupPackageManagerXmlProcessor(XMLCONNECTIONSTRING, "", "hu-HU");
  41 + var ep = new Menu.ExecutorParameter(config, args);
  42 +
  43 + var menufunctions = new Menu("Manage Backup Packages", "Select the management function!")
  44 + .AddMenuItem(new Menu.Item(CLP.Module.BackupPackageManager.Functions.CreateBackupPackage.KEY, "Create backup package", CreateBackupPackage,ep))
  45 + .SetSelectionMode(Menu.SelectionMode.Single)
  46 + .SetMenuHeaderDisplayer(BackupPackageListDisplayer);
  47 + menufunctions.ExecuteMenu(functionkey);
  48 + return o2;
  49 + }
  50 + #endregion Execute
  51 +
  52 + #region First level Executors with UI
  53 + private static object CreateBackupPackage(object parameter, object o)
  54 + {
  55 + var config = (parameter as Menu.ExecutorParameter).GetConfig< BackupPackageManagerXmlProcessor>();
  56 + var args = (parameter as Menu.ExecutorParameter).Args;
  57 +
  58 + var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.BackupPackageManager.Functions.CMD_PACKAGES);
  59 +
  60 + var menufolders = DisplayBackupPackageMenu(config, string.Format(PACKAGESELECTIONPROMPT,nameof(CreateBackupPackage)), silent:true);
  61 +
  62 + Menu.Selection sr = menufolders.Select(selectedtaskindexes);
  63 + if (sr.Result == Menu.SelectionResult.Exit) { return o; }
  64 + else if (sr.Result == Menu.SelectionResult.None) { return o; }
  65 + else if (sr.Result == Menu.SelectionResult.Error) { return o; }
  66 + else if (sr.Result == Menu.SelectionResult.Ok) { }
  67 + else { }
  68 +
  69 + var TS = DateTime.Now;
  70 + foreach (var p in sr.SelectedParameterList) { OnePackageToCreate(p.Parameters as BackupPackage,TS); }
  71 + return o;
  72 + }
  73 + private static void OnePackageToCreate(BackupPackage bp,DateTime? timestamp=null)
  74 + {
  75 + try
  76 + {
  77 + //packaget
  78 + var packagets = (timestamp.HasValue ? timestamp.Value : DateTime.Now).ToString("yyyyMMddHHmmss");
  79 + var vars = new Dictionary<string, string>();
  80 + vars.Add("PACKAGENAME", bp.Xml_PackageName);
  81 + vars.Add("PACKAGETS", packagets);
  82 +
  83 + var destinationfolder = Path.GetDirectoryName(bp.Xml_PackageFilePath);
  84 + if (!Path.IsPathRooted(destinationfolder)) { destinationfolder = Path.Combine(Directory.GetCurrentDirectory(), destinationfolder); }
  85 + if (!Directory.Exists(destinationfolder)) { Directory.CreateDirectory(destinationfolder); }
  86 +
  87 + var destinationfilename = Path.GetFileNameWithoutExtension(bp.Xml_PackageFilePath);
  88 + //string tempfolderpath = Tools.GetTemporaryFoldername(destinationfolder);
  89 + string tempfolderpath = StringConstructor.ResolveConstructor(vars, Path.Combine(destinationfolder,destinationfilename), "{}@@");
  90 + if (Directory.Exists(tempfolderpath)) { Directory.Delete(tempfolderpath, true); }
  91 +
  92 + if (!Directory.Exists(tempfolderpath)) { Directory.CreateDirectory(tempfolderpath); }
  93 +
  94 + foreach (var bf in bp.Xml_BackupFolderList)
  95 + {
  96 + BackupPackageManagerCore.FolderZipBackup(bf, tempfolderpath, vars);
  97 + }
  98 + foreach (var sqldb in bp.Xml_BackupSQLDataBaseList)
  99 + {
  100 + SQLDataBaseManagerNS.SQLDataBaseManager.Execute(sqldb.Xml_Key,sqldb.Xml_DBBackup,sqldb.Xml_ScriptBackup,sqldb.Xml_TableDataBackup, tempfolderpath, timestamp);
  101 + }
  102 +
  103 + BackupPackageManagerCore.CreatePackageFile(bp, tempfolderpath, vars);
  104 + if (Directory.Exists(tempfolderpath)) { Directory.Delete(tempfolderpath,true); }
  105 + }
  106 + catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); }
  107 + }
  108 + #endregion First level Executors with UI
  109 +
  110 + #region private methods
  111 + #region private DisplayBackupPackages
  112 + private static void BackupPackageListDisplayer() { DisplayBackupPackageMenu(); }
  113 + private static Menu DisplayBackupPackageMenu(BackupPackageManagerXmlProcessor config=null, string prompt=null, bool silent=false)
  114 + {
  115 + if (config==null) { config = new BackupPackageManagerXmlProcessor(XMLCONNECTIONSTRING, "", "hu-HU"); }
  116 + List<BackupPackage> bfdefList = config.GetDefinitionList();
  117 + var menubp = new Menu("Backup packages",prompt)
  118 + .SetMenuItemDisplayer(DisplayBackupPackageInfo)
  119 + .SetSelectionMode(Menu.SelectionMode.Multi);
  120 + menubp.ClearMenuItemList();
  121 + foreach (var bfdef in bfdefList)
  122 + {
  123 + var fi = CollectBackupPackageInfo(bfdef);
  124 + menubp.AddMenuItem(new Menu.Item(bfdef.Xml_Key, null, null, new Menu.ExecutorParameter(pars:fi)));
  125 + }
  126 + if (!silent) { menubp.DisplayItems(1); }
  127 + return menubp;
  128 + }
  129 + #endregion private DisplayBackupPackages
  130 +
  131 + #region private method: DisplayBackupPackageInfo
  132 + private static object DisplayBackupPackageInfo(object obj, int lineix)
  133 + {
  134 + BackupPackage bp = ((obj as Menu.ExecutorParameter).Parameters as BackupPackage);
  135 + if (lineix == 0)
  136 + {
  137 + ColorConsole.Write($"{bp.Xml_PackageName}", ConsoleColor.Black, ConsoleColor.White);
  138 + ColorConsole.Write($"{bp.Xml_Description}", ConsoleColor.White,prefix:", ");
  139 + ColorConsole.WriteLine("");
  140 + return " ";
  141 + }
  142 + if (lineix == 1)
  143 + {
  144 + ColorConsole.Write($"{bp.Xml_PackageFilePath}", ConsoleColor.White, prefix: "Package:");
  145 + ColorConsole.WriteLine("");
  146 + return " ";
  147 + }
  148 + if (lineix == 2)
  149 + {
  150 + ColorConsole.Write($"{bp.Xml_SourceIncludeFilenameMaskList}", ConsoleColor.White, prefix: "Mask:");
  151 + ColorConsole.Write($"{bp.SizePackageTotal}", ConsoleColor.White, prefix: ", Bytes to include:");
  152 + ColorConsole.WriteLine("");
  153 + return " ";
  154 + }
  155 + return null;
  156 + }
  157 + #endregion private method: DisplayBackupPackageInfo
  158 +
  159 + #region private CollectBackupPackageInfo
  160 + private static BackupPackage CollectBackupPackageInfo(BackupPackage bp)
  161 + {
  162 + bp.SizePackageTotal= 0;
  163 + foreach (var bf in bp.Xml_BackupFolderList)
  164 + {
  165 + bf.FolderExists = Directory.Exists(bf.Xml_Path);
  166 + if (bf.FolderExists)
  167 + {
  168 + var di = new DirectoryInfo(bf.Xml_Path);
  169 + bp.SizePackageTotal += Vrh.Log4Pro.MaintenanceConsole.FileCleanerManagerNS.FileCleanerManagerCore.DirSize(di, bf.Xml_IncludeFileNameMask, bf.Xml_IncludeFileFullPathRegex, recurse: true);
  170 + }
  171 + }
  172 + return bp;
  173 + }
  174 + #endregion private CollectBackupPackageInfo
  175 + #endregion private methods
  176 + }
  177 + #endregion BackupPackageManager class
  178 +
  179 + #region class BackupPackageManagerCore
  180 + public static class BackupPackageManagerCore
  181 + {
  182 + /// <summary>
  183 + /// Create zip package content file
  184 + /// </summary>
  185 + /// <param name="bf">BackupFolder descriptor</param>
  186 + /// <param name="destinationfolderpath">the target directory path where the zip file is created</param>
  187 + /// <param name="vars">filename substitution variables</param>
  188 + public static void FolderZipBackup(BackupPackage.BackupFolder bf, string destinationfolderpath, Dictionary<string, string> vars)
  189 + {
  190 + string foldertobackuppath = bf.Xml_Path;
  191 +
  192 + string destinationbackupfile = bf.Xml_BackupToFile;
  193 + if (string.IsNullOrEmpty(destinationbackupfile)) { destinationbackupfile = (new DirectoryInfo(foldertobackuppath)).Name + ".zip"; }
  194 + string includefilenamemask = bf.Xml_IncludeFileNameMask;
  195 + string includefullpathregex = bf.Xml_IncludeFileFullPathRegex;
  196 +
  197 + var destinationfile = Path.GetFileNameWithoutExtension(destinationbackupfile);
  198 + var destinationext = Path.GetExtension(destinationbackupfile); if (string.IsNullOrWhiteSpace(destinationext)) { destinationext = ".zip"; }
  199 + destinationbackupfile = Path.Combine(destinationfolderpath, destinationfile+destinationext);
  200 +
  201 + destinationbackupfile = VRH.Common.StringConstructor.ResolveConstructor(vars, destinationbackupfile, "{}@@");
  202 +
  203 + if (File.Exists(destinationbackupfile)) { File.Delete(destinationbackupfile); }
  204 +
  205 + if (!Path.IsPathRooted(foldertobackuppath)) { foldertobackuppath = Path.Combine(Directory.GetCurrentDirectory(), foldertobackuppath); }
  206 + ZipTools.CreateEntriesFromDirectoryContent(foldertobackuppath, destinationbackupfile, includefilenamemask,includefullpathregex);
  207 + ColorConsole.WriteLine($"Folder backup created. Name:{foldertobackuppath}", ConsoleColor.DarkGreen);
  208 + }
  209 + /// <summary>
  210 + /// Create package compressed file
  211 + /// </summary>
  212 + /// <param name="bp">package descriptor</param>
  213 + /// <param name="sourcedirectorypath">source directory, where the package content files are located;
  214 + /// the package file will be created with the same name with zip or exe extension in its parent directory</param>
  215 + /// <param name="vars">substitution vars</param>
  216 + public static void CreatePackageFile(BackupPackage bp,string sourcedirectorypath, Dictionary<string,string> vars)
  217 + {
  218 + string[] sourceincludefilenamemasklist = bp.Xml_SourceIncludeFilenameMaskList.Split(',');
  219 + bool createselfextractor = bp.Xml_CreateExe;
  220 +
  221 + if (!Path.IsPathRooted(sourcedirectorypath)) { sourcedirectorypath = Path.Combine(Directory.GetCurrentDirectory(), sourcedirectorypath); }
  222 +
  223 + var destinationfolder = Path.GetDirectoryName(sourcedirectorypath);
  224 + if (!Path.IsPathRooted(destinationfolder)) { destinationfolder = Path.Combine(Directory.GetCurrentDirectory(), destinationfolder); }
  225 + var destinationfile = Path.GetFileNameWithoutExtension(sourcedirectorypath);
  226 +
  227 + string package___filepath = Path.Combine(destinationfolder, destinationfile);
  228 + package___filepath=VRH.Common.StringConstructor.ResolveConstructor(vars, package___filepath, "{}@@");
  229 +
  230 + string packageEXEfilepath = package___filepath + ".exe";
  231 + string packageZIPfilepath = package___filepath + ".zip";
  232 + if (File.Exists(packageEXEfilepath)) { File.Delete(packageEXEfilepath); }
  233 + if (File.Exists(packageZIPfilepath)) { File.Delete(packageZIPfilepath); }
  234 +
  235 + List<string> includefilepathlist = new List<string>();
  236 + foreach (var includefilenamemask in sourceincludefilenamemasklist) { includefilepathlist.Add(Path.Combine(sourcedirectorypath, includefilenamemask)); }
  237 +
  238 + string includeliststr = String.Join(" ", includefilepathlist.ToArray());
  239 + string recursesubdirs = "-r";
  240 + string addfilecommand = "a";
  241 + string response;
  242 + string packagefile;
  243 + if (createselfextractor)
  244 + {
  245 + string archivetype_7z = "-t7z";
  246 + string createsfx = "-sfx";
  247 + packagefile = packageEXEfilepath;
  248 + response = Tools.ExecuteAndGetStdIo("7z.exe", $"{addfilecommand} {packagefile} {includeliststr} {recursesubdirs} {archivetype_7z} {createsfx}");
  249 + }
  250 + else
  251 + {
  252 + string archivetype_zip = "-tzip";
  253 + packagefile = packageZIPfilepath;
  254 + response = Tools.ExecuteAndGetStdIo("7z.exe", $"{addfilecommand} {packagefile} {includeliststr} {recursesubdirs} {archivetype_zip}");
  255 + }
  256 + ColorConsole.WriteLine($"Backup package created. Package name:{bp.Xml_PackageName}, package file: {packagefile}", ConsoleColor.Green);
  257 +
  258 +
  259 + // 7 - Zip[64] 16.04 : Copyright(c) 1999 - 2016 Igor Pavlov : 2016 - 10 - 04
  260 + //
  261 + // Usage: 7z<command>[< switches > ...] < archive_name > [< file_names > ...] [< @listfiles...>]
  262 + // Sample:
  263 + // 7z a -t7z -sfx __7zTESTTXT.EXE *.txt -- create __7zTESTTXT.EXE self extracting archive of all files of current directory with txt extension
  264 + // 7z a -tzip __7zTESTTXT.ZIP *.txt -- create __7zTESTTXT.ZIP archive of all files of current directory with txt extension
  265 + //
  266 + // <Commands>
  267 + // a : Add files to archive
  268 + // b : Benchmark
  269 + // d : Delete files from archive
  270 + // e : Extract files from archive (without using directory names)
  271 + // h : Calculate hash values for files
  272 + // i : Show information about supported formats
  273 + // l : List contents of archive
  274 + // rn: Rename files in archive
  275 + // t : Test integrity of archive
  276 + // u : Update files to archive
  277 + // x : eXtract files with full paths
  278 + //
  279 + // <Switches>
  280 + // -- : Stop switches parsing
  281 + // -ai[r[-| 0]]{ @listfile | !wildcard} : Include archives
  282 + // -ax[r[-| 0]]{ @listfile | !wildcard} : eXclude archives
  283 + // -ao{ a | s | t | u} : set Overwrite mode
  284 + // -an : disable archive_name field
  285 + // -bb[0 - 3] : set output log level
  286 + // -bd : disable progress indicator
  287 + // -bs{ o | e | p} { 0 | 1 | 2} : set output stream for output / error / progress line
  288 + // -bt : show execution time statistics
  289 + // -i[r[-| 0]]{ @listfile | !wildcard} : Include filenames
  290 + // -m{ Parameters} : set compression Method
  291 + // -mmt[N] : set number of CPU threads
  292 + // -o{ Directory} : set Output directory
  293 + // -p{ Password} : set Password
  294 + // -r[-| 0] : Recurse subdirectories
  295 + // -sa{ a | e | s} : set Archive name mode
  296 + // -scc{ UTF - 8 | WIN | DOS} : set charset for for console input/ output
  297 + // -scs{ UTF - 8 | UTF - 16LE | UTF - 16BE | WIN | DOS |{ id} } : set charset for list files
  298 + // -scrc[CRC32 | CRC64 | SHA1 | SHA256 | *] : set hash function for x, e, h commands
  299 + // -sdel : delete files after compression
  300 + // -seml[.] : send archive by email
  301 + // -sfx[{ name}] : Create SFX archive
  302 + // -si[{ name}] : read data from stdin
  303 + // -slp : set Large Pages mode
  304 + // -slt : show technical information for l(List) command
  305 + // -snh : store hard links as links
  306 + // -snl : store symbolic links as links
  307 + // -sni : store NT security information
  308 + // -sns[-] : store NTFS alternate streams
  309 + // -so : write data to stdout
  310 + // -spd : disable wildcard matching for file names
  311 + // -spe : eliminate duplication of root folder for extract command
  312 + // -spf : use fully qualified file paths
  313 + // -ssc[-] : set sensitive case mode
  314 + // -ssw : compress shared files
  315 + // -stl : set archive timestamp from the most recently modified file
  316 + // -stm{HexMask} : set CPU thread affinity mask(hexadecimal number)
  317 + // -stx{Type} : exclude archive type
  318 + // -t{Type} : Set type of archive
  319 + // -u[-][p#][q#][r#][x#][y#][z#][!newArchiveName] : Update options
  320 + // -v{ Size} [b| k | m | g] : Create volumes
  321 + // -w[{ path}] : assign Work directory.Empty path means a temporary directory
  322 + // -x[r[-| 0]]{ @listfile | !wildcard} : eXclude filenames
  323 + // -y : assume Yes on all queries
  324 +
  325 + }
  326 + }
  327 + #endregion class BackupPackageManagerCore
  328 +
  329 + #region BackupPackageManagerXmlProcessor class
  330 + public class BackupPackageManagerXmlProcessor : XmlParser
  331 + {
  332 + private List<BackupPackage> _backuppackagelist;
  333 + #region constructor
  334 + public BackupPackageManagerXmlProcessor(string xmlcs, string basefolder, string lcid) : base(xmlcs, basefolder, lcid, null)
  335 + {
  336 + _backuppackagelist = new List<BackupPackage>();
  337 + var bpxmllist = GetAllXElements(nameof(BackupPackage.XmlStructure.BackupPackage));
  338 + if (bpxmllist != null && bpxmllist.Any())
  339 + {
  340 + foreach (var bpxml in bpxmllist) { var bp = new BackupPackage(bpxml); if (bp.Valid) { _backuppackagelist.Add(bp); } }
  341 + }
  342 + }
  343 + #endregion constructor
  344 + #region GetDefinitionList
  345 + public List<BackupPackage> GetDefinitionList() { return _backuppackagelist; }
  346 + #endregion GetDefinitionList
  347 + }
  348 + #endregion BackupPackageManagerXmlProcessor class
  349 +
  350 + #region BackupPackage class
  351 + public class BackupPackage : XmlLinqBase
  352 + {
  353 + #region fields
  354 + public bool Valid = true;
  355 + public string Xml_Key;
  356 + public string Xml_PackageName;
  357 + public string Xml_Description;
  358 + public string Xml_PackageFilePath;
  359 + public string Xml_SourceIncludeFilenameMaskList;
  360 + public bool Xml_CreateExe;
  361 + public List<BackupFolder> Xml_BackupFolderList;
  362 + public List<BackupSQLDataBase> Xml_BackupSQLDataBaseList;
  363 +
  364 + public long SizePackageTotal;
  365 + #endregion fields
  366 +
  367 + #region basic constructor
  368 + public BackupPackage() { }
  369 + #endregion basic constructor
  370 +
  371 + #region xml constructor
  372 + public BackupPackage(XElement backupackagexml)
  373 + {
  374 + Valid = true;
  375 + string ATTRIBUTEMANDATORY = nameof(XmlStructure.BackupPackage) + " attribute is mandatory! Name: {0}";
  376 + Xml_Key = GetValue(nameof(XmlStructure.BackupPackage.Attributes.Key), backupackagexml, XmlStructure.BackupPackage.Attributes.Key.Values.DEFAULT);
  377 + Xml_PackageName = backupackagexml.Attribute(XName.Get(nameof(XmlStructure.BackupPackage.Attributes.Name)))?.Value;
  378 + if (string.IsNullOrWhiteSpace(Xml_PackageName)) { throw new ApplicationException(string.Format(ATTRIBUTEMANDATORY, nameof(XmlStructure.BackupPackage.Attributes.Name))); }
  379 + Xml_Description = GetValue(nameof(XmlStructure.BackupPackage.Attributes.Description), backupackagexml, Xml_PackageName);
  380 + Xml_PackageFilePath = GetValue(nameof(XmlStructure.BackupPackage.Attributes.PackageFilePath), backupackagexml, "");
  381 + if (string.IsNullOrWhiteSpace(Xml_PackageFilePath)) { throw new ApplicationException(string.Format(ATTRIBUTEMANDATORY, XmlStructure.BackupPackage.Attributes.PackageFilePath.Values.DEFAULT)); }
  382 +
  383 + Xml_SourceIncludeFilenameMaskList = GetValue(nameof(XmlStructure.BackupPackage.Attributes.IncludeFilenameMaskList), backupackagexml, XmlStructure.BackupPackage.Attributes.IncludeFilenameMaskList.Values.DEFAULT);
  384 +
  385 + string XmlCreateExestring = GetValue(nameof(XmlStructure.BackupPackage.Attributes.CreateExe), backupackagexml, XmlStructure.BackupPackage.Attributes.CreateExe.Values.DEFAULT.ToString());
  386 + if (string.IsNullOrWhiteSpace(XmlCreateExestring)) { XmlCreateExestring = XmlStructure.BackupPackage.Attributes.CreateExe.Values.DEFAULT.ToString(); }
  387 + Xml_CreateExe = bool.Parse(XmlCreateExestring);
  388 +
  389 + Xml_BackupFolderList = new List<BackupFolder>();
  390 + //var conditionxmlList = GetAllXElements(foldertocleanxml, nameof(XmlStructure.FolderToClean.Conditions), nameof(XmlStructure.FolderToClean.Conditions.Condition));
  391 + var backupfolderxmlList = backupackagexml.Elements(XName.Get(nameof(XmlStructure.BackupPackage.BackupFolder)));
  392 + if (backupfolderxmlList!=null && backupfolderxmlList.Any())
  393 + {
  394 + foreach (var backupfolderxml in backupfolderxmlList) { Xml_BackupFolderList.Add(new BackupFolder(backupfolderxml)); }
  395 + }
  396 + Xml_BackupSQLDataBaseList = new List<BackupSQLDataBase>();
  397 + //var conditionxmlList = GetAllXElements(foldertocleanxml, nameof(XmlStructure.FolderToClean.Conditions), nameof(XmlStructure.FolderToClean.Conditions.Condition));
  398 + var backupsqldbxmlList = backupackagexml.Elements(XName.Get(nameof(XmlStructure.BackupPackage.BackupSQLDataBase)));
  399 + if (backupsqldbxmlList != null && backupsqldbxmlList.Any())
  400 + {
  401 + foreach (var backupsqldbxml in backupsqldbxmlList) { Xml_BackupSQLDataBaseList.Add(new BackupSQLDataBase(backupsqldbxml)); }
  402 + }
  403 + }
  404 + #endregion xml constructor
  405 +
  406 + #region cloner constructor
  407 + public BackupPackage(BackupPackage bp)
  408 + {
  409 + Valid = bp.Valid;
  410 + Xml_Key = bp.Xml_Key;
  411 + Xml_PackageName = bp.Xml_PackageName;
  412 + Xml_Description = bp.Xml_Description;
  413 + Xml_BackupFolderList = bp.Xml_BackupFolderList.Select(c=>new BackupFolder(c)).ToList(); ;
  414 + Xml_PackageFilePath=bp.Xml_PackageFilePath;
  415 + Xml_BackupSQLDataBaseList = bp.Xml_BackupSQLDataBaseList.Select(c => new BackupSQLDataBase(c)).ToList(); ;
  416 + Xml_SourceIncludeFilenameMaskList = bp.Xml_SourceIncludeFilenameMaskList;
  417 + }
  418 + #endregion cloner constructor
  419 +
  420 + #region XmlStructure
  421 + public static class XmlStructure
  422 + {
  423 + public static class BackupPackage
  424 + {
  425 + public static class Attributes
  426 + {
  427 + public static class Key { public static class Values { public const string DEFAULT = ""; } }
  428 + public static class Name { }
  429 + public static class Description { }
  430 + public static class CreateExe { public static class Values { public const bool DEFAULT = true; } }
  431 + public static class IncludeFilenameMaskList { public static class Values { public const string DEFAULT = "*"; } }
  432 + public static class PackageFilePath{ public static class Values { public const string DEFAULT = "BackupPackage_{TIMESTAMP}_{PACKAGENAME}"; } }
  433 + }
  434 + public static class BackupFolder
  435 + {
  436 + public static class Attributes
  437 + {
  438 + public static class Path { public static class Values { public const string DEFAULT = ""; } }
  439 + public static class Description { }
  440 + public static class BackupToFile { }
  441 + public static class IncludeNameMask { public class Values { public const string DEFAULT = "*"; } }
  442 + public static class IncludePathRegexp { public class Values { public const string DEFAULT = ".*"; } }
  443 + }
  444 + }
  445 + public static class BackupSQLDataBase
  446 + {
  447 + public static class Attributes
  448 + {
  449 + public static class DBBackup { public static class Values { public const bool DEFAULT = true; } }
  450 + public static class ScriptBackup { public static class Values { public const bool DEFAULT = true; } }
  451 + public static class TableDataBackup { public static class Values { public const bool DEFAULT = true; } }
  452 + public static class Key { public static class Values { public const string DEFAULT = ""; } }
  453 + }
  454 + }
  455 + }
  456 + }
  457 + #endregion XmlStructure
  458 +
  459 + #region BackupFolder class
  460 + public class BackupFolder : XmlLinqBase
  461 + {
  462 + public BackupFolder(XElement backupfolderxml)
  463 + {
  464 + Xml_Path = GetValue(nameof(XmlStructure.BackupPackage.BackupFolder.Attributes.Path), backupfolderxml, XmlStructure.BackupPackage.BackupFolder.Attributes.Path.Values.DEFAULT);
  465 + Xml_Description = GetValue(nameof(XmlStructure.BackupPackage.BackupFolder.Attributes.Description), backupfolderxml, Xml_Path);
  466 + Xml_BackupToFile = GetValue(nameof(XmlStructure.BackupPackage.BackupFolder.Attributes.BackupToFile), backupfolderxml, "");
  467 + Xml_IncludeFileNameMask = GetValue(nameof(XmlStructure.BackupPackage.BackupFolder.Attributes.IncludeNameMask), backupfolderxml, XmlStructure.BackupPackage.BackupFolder.Attributes.IncludeNameMask.Values.DEFAULT);
  468 + Xml_IncludeFileFullPathRegex = GetValue(nameof(XmlStructure.BackupPackage.BackupFolder.Attributes.IncludePathRegexp), backupfolderxml, XmlStructure.BackupPackage.BackupFolder.Attributes.IncludePathRegexp.Values.DEFAULT);
  469 + }
  470 + public BackupFolder(BackupFolder bf)
  471 + {
  472 + Xml_Path = bf.Xml_Path;
  473 + Xml_Description = bf.Xml_Description;
  474 + Xml_BackupToFile = bf.Xml_BackupToFile;
  475 + FolderExists = bf.FolderExists;
  476 + Xml_IncludeFileNameMask = bf.Xml_IncludeFileNameMask;
  477 + Xml_IncludeFileFullPathRegex = bf.Xml_IncludeFileFullPathRegex;
  478 + }
  479 + public string Xml_Path;
  480 + public string Xml_Description;
  481 + public string Xml_BackupToFile;
  482 + public string Xml_IncludeFileNameMask;
  483 + public string Xml_IncludeFileFullPathRegex;
  484 + public bool FolderExists;
  485 + }
  486 + #endregion BackupFolder class
  487 + #region BackupSQLDataBase class
  488 + public class BackupSQLDataBase : XmlLinqBase
  489 + {
  490 + public BackupSQLDataBase(XElement backupfolderxml)
  491 + {
  492 + Xml_Key = GetValue(nameof(XmlStructure.BackupPackage.BackupSQLDataBase.Attributes.Key), backupfolderxml, XmlStructure.BackupPackage.BackupSQLDataBase.Attributes.Key.Values.DEFAULT);
  493 + Xml_DBBackup = GetValue(nameof(XmlStructure.BackupPackage.BackupSQLDataBase.Attributes.DBBackup), backupfolderxml, XmlStructure.BackupPackage.BackupSQLDataBase.Attributes.DBBackup.Values.DEFAULT);
  494 + Xml_ScriptBackup = GetValue(nameof(XmlStructure.BackupPackage.BackupSQLDataBase.Attributes.ScriptBackup), backupfolderxml, XmlStructure.BackupPackage.BackupSQLDataBase.Attributes.ScriptBackup.Values.DEFAULT);
  495 + Xml_TableDataBackup = GetValue(nameof(XmlStructure.BackupPackage.BackupSQLDataBase.Attributes.TableDataBackup), backupfolderxml, XmlStructure.BackupPackage.BackupSQLDataBase.Attributes.TableDataBackup.Values.DEFAULT);
  496 + }
  497 + public BackupSQLDataBase(BackupSQLDataBase bf)
  498 + {
  499 + Xml_Key = bf.Xml_Key;
  500 + Xml_DBBackup = bf.Xml_DBBackup;
  501 + Xml_ScriptBackup = bf.Xml_ScriptBackup;
  502 + Xml_TableDataBackup = bf.Xml_TableDataBackup;
  503 + }
  504 + public string Xml_Key;
  505 + public bool Xml_DBBackup;
  506 + public bool Xml_ScriptBackup;
  507 + public bool Xml_TableDataBackup;
  508 + }
  509 + #endregion BackupSQLDataBase class
  510 +
  511 + }
  512 + #endregion BackupPackage class
  513 +}
Vrh.Log4Pro.MaintenanceConsole/Manager - FileCleanerManager.cs
1 using System; 1 using System;
2 using System.IO; 2 using System.IO;
  3 +using System.IO.Compression;
3 using System.Configuration.Install; 4 using System.Configuration.Install;
4 using System.Collections.Generic; 5 using System.Collections.Generic;
5 using System.Linq; 6 using System.Linq;
@@ -12,97 +13,95 @@ using Microsoft.Web.Administration; @@ -12,97 +13,95 @@ using Microsoft.Web.Administration;
12 using System.Management; 13 using System.Management;
13 using System.Diagnostics; 14 using System.Diagnostics;
14 15
  16 +using Vrh.Log4Pro.MaintenanceConsole.MenuNS;
  17 +using Vrh.Log4Pro.MaintenanceConsole.ColorConsoleNS;
  18 +using Vrh.Log4Pro.MaintenanceConsole.CommandLineParserNS;
  19 +
15 using Vrh.XmlProcessing; 20 using Vrh.XmlProcessing;
  21 +using VRH.Common;
16 using System.Xml.Linq; 22 using System.Xml.Linq;
17 using System.Text.RegularExpressions; 23 using System.Text.RegularExpressions;
18 24
19 -namespace Vrh.Log4Pro.MaintenanceConsole 25 +namespace Vrh.Log4Pro.MaintenanceConsole.FileCleanerManagerNS
20 { 26 {
21 #region FileCleanerManager class 27 #region FileCleanerManager class
22 public static class FileCleanerManager 28 public static class FileCleanerManager
23 { 29 {
  30 + private const string XMLCONNECTIONSTRING = "config=MAINTENANCECONSOLE_FILECLEANERMANAGER;";
  31 + private const string XMLCONNECTIONSTRING_DEFAULT = "file=Config.Xml;element=FileCleaner;";
  32 +
24 #region Execute 33 #region Execute
25 public static object Execute(object o1 = null, object o2 = null) 34 public static object Execute(object o1 = null, object o2 = null)
26 { 35 {
27 - string xmlcs = "file=Config.Xml;element=FileCleaner;";  
28 - var config = new FileCleanerManagerCoreXmlProcessor(xmlcs, "", "hu-HU"); 36 + var args = (o1 as Menu.ExecutorParameter).Args;
  37 + var functionkey = CommandLine.GetCommandLineArgument(args, CLP.CMD_FUNCTION);
  38 + var config = new FileCleanerManagerXmlProcessor(XMLCONNECTIONSTRING, "", "hu-HU");
  39 + var ep = new Menu.ExecutorParameter(config, args);
29 40
30 var menufunctions = new Menu("Manage Folders To Clean", "Select the management function!") 41 var menufunctions = new Menu("Manage Folders To Clean", "Select the management function!")
31 - .AddMenuItem(new Menu.Item("CLN", "Clean folder", CleanFolder))  
32 - .SetSelectionMode(Menu.SelectionMode.Single);  
33 -  
34 - while (true)  
35 - {  
36 - Menu.Selection sr;  
37 -  
38 - menufunctions.DisplayTitle();  
39 - var menuservices = DisplayFolders(config);  
40 - menufunctions.DisplayItems();  
41 - sr = menufunctions.Select();  
42 - if (sr.Result == Menu.SelectionResult.Exit) { break; }  
43 - else if (sr.Result == Menu.SelectionResult.None) { continue; }  
44 - else if (sr.Result == Menu.SelectionResult.Error) { continue; }  
45 - menufunctions.SetExecutorParameters(sr,config);  
46 - menufunctions.ExecuteSelection(sr.SelectedKeyList);  
47 - }  
48 - return null; 42 + .AddMenuItem(new Menu.Item(CLP.Module.FileCleanerManager.Functions.FolderClean.KEY, "Clean folder", FolderClean, ep))
  43 + .SetSelectionMode(Menu.SelectionMode.Single)
  44 + .SetMenuHeaderDisplayer(FolderToCleanListDisplayer);
  45 + menufunctions.ExecuteMenu(functionkey);
  46 + return o2;
49 } 47 }
50 #endregion Execute 48 #endregion Execute
51 49
52 #region First level Executors with UI 50 #region First level Executors with UI
53 - private static object CleanFolder(object parameter, object o) 51 + private static object FolderClean(object parameter, object o)
54 { 52 {
55 - var config = parameter as FileCleanerManagerCoreXmlProcessor; 53 + var config = (parameter as Menu.ExecutorParameter).GetConfig<FileCleanerManagerXmlProcessor>();
  54 + var args = (parameter as Menu.ExecutorParameter).Args;
56 55
57 - var menufolders = DisplayFolders(config, $"Select the folder(s) to manage with function '{nameof(CleanFolder)}'!", silent: true); 56 + var selectedftcindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.FileCleanerManager.Functions.CMD_FOLDERS);
58 57
59 - Menu.Selection sr = menufolders.Select(); 58 + var menufolders = DisplayFolderMenu(config, $"Select the folder(s) to manage with function '{nameof(FolderClean)}'!", silent: true);
  59 +
  60 + Menu.Selection sr = menufolders.Select(selectedftcindexes);
60 if (sr.Result == Menu.SelectionResult.Exit) { return o; } 61 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
61 else if (sr.Result == Menu.SelectionResult.None) { return o; } 62 else if (sr.Result == Menu.SelectionResult.None) { return o; }
62 else if (sr.Result == Menu.SelectionResult.Error) { return o; } 63 else if (sr.Result == Menu.SelectionResult.Error) { return o; }
63 else if (sr.Result == Menu.SelectionResult.Ok) { } 64 else if (sr.Result == Menu.SelectionResult.Ok) { }
64 else { } 65 else { }
65 - foreach (var p in sr.SelectedParameterList) 66 + foreach (var p in sr.SelectedParameterList) { OneFolderClean(p.Parameters as FolderToClean); }
  67 + return o;
  68 + }
  69 + private static void OneFolderClean(FolderToClean ftc)
  70 + {
  71 + try
66 { 72 {
67 - FolderToClean ftc = p as FolderToClean;  
68 - try  
69 - {  
70 - var di = new DirectoryInfo(ftc.Xml_DirectoryPath);  
71 - var success = FileCleanerManagerCore.CleanFolderFiles(di,ftc, delete: true);  
72 - ColorConsole.WriteLine($"Folder cleaned. Name:{ftc.Xml_DirectoryPath}", ConsoleColor.Green);  
73 - }  
74 - catch (Exception ex)  
75 - {  
76 - ColorConsole.WriteLine(ex.Message, ConsoleColor.Red);  
77 - } 73 + var di = new DirectoryInfo(ftc.Xml_DirectoryPath);
  74 + var success = FileCleanerManagerCore.CleanFolderFiles(di, ftc, delete: true);
  75 + ColorConsole.WriteLine($"Folder cleaned. Name:{ftc.Xml_DirectoryPath}", ConsoleColor.Green);
78 } 76 }
79 - return o; 77 + catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); }
80 } 78 }
81 #endregion First level Executors with UI 79 #endregion First level Executors with UI
82 80
83 #region private methods 81 #region private methods
84 - #region private DisplayFolders  
85 - private static Menu DisplayFolders(FileCleanerManagerCoreXmlProcessor config,string prompt = null,bool silent=false) 82 + #region private DisplayFolderMenu
  83 + private static void FolderToCleanListDisplayer() { DisplayFolderMenu(); }
  84 + private static Menu DisplayFolderMenu(FileCleanerManagerXmlProcessor config=null,string prompt = null,bool silent=false)
86 { 85 {
  86 + if (config==null) { config = new FileCleanerManagerXmlProcessor(XMLCONNECTIONSTRING, "", "hu-HU"); }
87 List<FolderToClean> fctdefList = config.GetDefinitionList(); 87 List<FolderToClean> fctdefList = config.GetDefinitionList();
88 var menufct = new Menu("Folder to clean",prompt) 88 var menufct = new Menu("Folder to clean",prompt)
89 .SetMenuItemDisplayer(DisplayFolderInfo) 89 .SetMenuItemDisplayer(DisplayFolderInfo)
90 - .SetSelectionMode(Menu.SelectionMode.Multi)  
91 - .SetHeaderWidth(4); 90 + .SetSelectionMode(Menu.SelectionMode.Multi);
92 menufct.ClearMenuItemList(); 91 menufct.ClearMenuItemList();
93 foreach (var fctdef in fctdefList) 92 foreach (var fctdef in fctdefList)
94 { 93 {
95 var fi = CollectFolderInfo(fctdef); 94 var fi = CollectFolderInfo(fctdef);
96 - menufct.AddMenuItem(new Menu.Item(null, null, null, fi)); 95 + menufct.AddMenuItem(new Menu.Item(fctdef.Xml_Key, null, null, new Menu.ExecutorParameter(pars:fi)));
97 } 96 }
98 if (!silent) { menufct.DisplayItems(1); } 97 if (!silent) { menufct.DisplayItems(1); }
99 return menufct; 98 return menufct;
100 } 99 }
101 - #endregion private DisplayFolders 100 + #endregion private DisplayFolderMenu
102 #region private method: DisplayFolderInfo 101 #region private method: DisplayFolderInfo
103 private static object DisplayFolderInfo(object obj, int lineix) 102 private static object DisplayFolderInfo(object obj, int lineix)
104 { 103 {
105 - FolderToClean ws = obj as FolderToClean; 104 + FolderToClean ws = (obj as Menu.ExecutorParameter).Parameters as FolderToClean;
106 if (lineix == 0) 105 if (lineix == 0)
107 { 106 {
108 ColorConsole.Write($"{ws.Xml_DirectoryPath}", ConsoleColor.Black, ConsoleColor.White); 107 ColorConsole.Write($"{ws.Xml_DirectoryPath}", ConsoleColor.Black, ConsoleColor.White);
@@ -214,7 +213,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -214,7 +213,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole
214 bool conditionresult = false; 213 bool conditionresult = false;
215 if (c.Type == FolderToClean.ConditionType.TimeStampInName) 214 if (c.Type == FolderToClean.ConditionType.TimeStampInName)
216 { 215 {
217 - var fileTSstr = VRH.Common.StringConstructor.ResolveConstructor<string>(groupnamevalues, c.TimestampConstructor, "{}"); 216 + var fileTSstr = VRH.Common.StringConstructor.ResolveConstructor<string>(groupnamevalues, c.TimestampConstructor, "{}@@");
  217 +
218 try { var fileTS = DateTime.Parse(fileTSstr); conditionresult = DateTime.Now.Subtract(fileTS).TotalDays > c.Limit; } 218 try { var fileTS = DateTime.Parse(fileTSstr); conditionresult = DateTime.Now.Subtract(fileTS).TotalDays > c.Limit; }
219 catch 219 catch
220 { 220 {
@@ -288,12 +288,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -288,12 +288,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole
288 #endregion class FileCleanerManagerCore 288 #endregion class FileCleanerManagerCore
289 289
290 #region FileCleanerManagerCoreXmlProcessor class 290 #region FileCleanerManagerCoreXmlProcessor class
291 - public class FileCleanerManagerCoreXmlProcessor : XmlParser 291 + public class FileCleanerManagerXmlProcessor : XmlParser
292 { 292 {
293 private List<FolderToClean> _foldertocleanlist; 293 private List<FolderToClean> _foldertocleanlist;
294 private int commoncleanupdays; 294 private int commoncleanupdays;
295 #region constructor 295 #region constructor
296 - public FileCleanerManagerCoreXmlProcessor(string xmlcs, string basefolder, string lcid) : base(xmlcs, basefolder, lcid, null) 296 + public FileCleanerManagerXmlProcessor(string xmlcs, string basefolder, string lcid) : base(xmlcs, basefolder, lcid, null)
297 { 297 {
298 _foldertocleanlist = new List<FolderToClean>(); 298 _foldertocleanlist = new List<FolderToClean>();
299 commoncleanupdays = GetValue(nameof(FolderToClean.XmlStructure.Attributes.CleanupDays),this.RootElement, FolderToClean.XmlStructure.Attributes.CleanupDays.Values.DEFAULT); 299 commoncleanupdays = GetValue(nameof(FolderToClean.XmlStructure.Attributes.CleanupDays),this.RootElement, FolderToClean.XmlStructure.Attributes.CleanupDays.Values.DEFAULT);
@@ -315,6 +315,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -315,6 +315,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
315 { 315 {
316 #region fields 316 #region fields
317 public bool Valid = true; 317 public bool Valid = true;
  318 + public string Xml_Key;
318 public string Xml_DirectoryPath; 319 public string Xml_DirectoryPath;
319 public bool Xml_Recurse; 320 public bool Xml_Recurse;
320 public bool Xml_RemoveEmptyFolder; 321 public bool Xml_RemoveEmptyFolder;
@@ -339,6 +340,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -339,6 +340,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
339 { 340 {
340 Valid = true; 341 Valid = true;
341 string ATTRIBUTEMANDATORY = nameof(XmlStructure.FolderToClean) + " attribute is mandatory! Name: {0}"; 342 string ATTRIBUTEMANDATORY = nameof(XmlStructure.FolderToClean) + " attribute is mandatory! Name: {0}";
  343 + Xml_Key = GetValue(nameof(XmlStructure.FolderToClean.Attributes.Key), foldertocleanxml, XmlStructure.FolderToClean.Attributes.Key.Values.DEFAULT);
342 Xml_DirectoryPath = foldertocleanxml.Attribute(XName.Get(nameof(XmlStructure.FolderToClean.Attributes.Directory)))?.Value; 344 Xml_DirectoryPath = foldertocleanxml.Attribute(XName.Get(nameof(XmlStructure.FolderToClean.Attributes.Directory)))?.Value;
343 if (string.IsNullOrWhiteSpace(Xml_DirectoryPath)) { throw new ApplicationException(string.Format(ATTRIBUTEMANDATORY, nameof(XmlStructure.FolderToClean.Attributes.Directory))); } 345 if (string.IsNullOrWhiteSpace(Xml_DirectoryPath)) { throw new ApplicationException(string.Format(ATTRIBUTEMANDATORY, nameof(XmlStructure.FolderToClean.Attributes.Directory))); }
344 Xml_Recurse = GetValue(nameof(XmlStructure.FolderToClean.Attributes.Recurse), foldertocleanxml, XmlStructure.FolderToClean.Attributes.Recurse.Values.DEFAULT); 346 Xml_Recurse = GetValue(nameof(XmlStructure.FolderToClean.Attributes.Recurse), foldertocleanxml, XmlStructure.FolderToClean.Attributes.Recurse.Values.DEFAULT);
@@ -361,6 +363,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -361,6 +363,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
361 public FolderToClean(FolderToClean ftc) 363 public FolderToClean(FolderToClean ftc)
362 { 364 {
363 Valid = ftc.Valid; 365 Valid = ftc.Valid;
  366 + Xml_Key= ftc.Xml_Key;
364 Xml_DirectoryPath = ftc.Xml_DirectoryPath; 367 Xml_DirectoryPath = ftc.Xml_DirectoryPath;
365 Xml_Recurse = ftc.Xml_Recurse; 368 Xml_Recurse = ftc.Xml_Recurse;
366 Xml_RemoveEmptyFolder = ftc.Xml_RemoveEmptyFolder; 369 Xml_RemoveEmptyFolder = ftc.Xml_RemoveEmptyFolder;
@@ -414,6 +417,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -414,6 +417,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
414 { 417 {
415 public static class Attributes 418 public static class Attributes
416 { 419 {
  420 + public static class Key { public static class Values { public const string DEFAULT = ""; } }
417 public static class Directory { } 421 public static class Directory { }
418 public static class CleanupDays 422 public static class CleanupDays
419 { 423 {
Vrh.Log4Pro.MaintenanceConsole/Manager - MaintenanceToolManager.cs
@@ -12,40 +12,35 @@ using Microsoft.Web.Administration; @@ -12,40 +12,35 @@ using Microsoft.Web.Administration;
12 using System.Management; 12 using System.Management;
13 using System.Diagnostics; 13 using System.Diagnostics;
14 14
  15 +using Vrh.Log4Pro.MaintenanceConsole.MenuNS;
  16 +using Vrh.Log4Pro.MaintenanceConsole.ColorConsoleNS;
  17 +using Vrh.Log4Pro.MaintenanceConsole.CommandLineParserNS;
  18 +
15 using Vrh.XmlProcessing; 19 using Vrh.XmlProcessing;
16 using System.Xml.Linq; 20 using System.Xml.Linq;
17 using System.Text.RegularExpressions; 21 using System.Text.RegularExpressions;
18 22
19 -namespace Vrh.Log4Pro.MaintenanceConsole 23 +namespace Vrh.Log4Pro.MaintenanceConsole.MaintenanceToolManagerNS
20 { 24 {
21 #region MaintenanceTools class 25 #region MaintenanceTools class
22 public static class MaintenanceToolManager 26 public static class MaintenanceToolManager
23 { 27 {
  28 + private const string XMLCONNECTIONSTRING = "config=MAINTENANCECONSOLE_MAINTENANCETOOLMANAGER;";
  29 + private const string XMLCONNECTIONSTRING_DEFAULT = "file=Config.Xml;element=MaintenanceTools;";
  30 +
24 #region Execute 31 #region Execute
25 public static object Execute(object o1 = null, object o2 = null) 32 public static object Execute(object o1 = null, object o2 = null)
26 { 33 {
27 - string xmlcs = "file=Config.Xml;element=WindowsServices;"; 34 + var args = (o1 as Menu.ExecutorParameter).Args;
  35 + string xmlcs = XMLCONNECTIONSTRING;
28 var config = new MaintenanceToolsXmlProcessor(xmlcs, "", "hu-HU"); 36 var config = new MaintenanceToolsXmlProcessor(xmlcs, "", "hu-HU");
29 37
30 var menufunctions = new Menu("Maintenance Tools", "Select function!") 38 var menufunctions = new Menu("Maintenance Tools", "Select function!")
31 - .AddMenuItem(new Menu.Item("RGX", "Regex tester", RegexTester))  
32 - .AddMenuItem(new Menu.Item("TL1", "Tool #1", Tool1))  
33 - .AddMenuItem(new Menu.Item("TL2", "Tool #2", Tool2)) 39 + .AddMenuItem(new Menu.Item(CLP.Module.MaintenanceToolManager.Functions.RegexTester.KEY, "Regex tester", RegexTester,new Menu.ExecutorParameter(cfg:config)))
  40 + .AddMenuItem(new Menu.Item(CLP.Module.MaintenanceToolManager.Functions.Tool1.KEY, "Tool #1", Tool1, new Menu.ExecutorParameter(cfg: config, null)))
  41 + .AddMenuItem(new Menu.Item(CLP.Module.MaintenanceToolManager.Functions.Tool2.KEY, "Tool #2", Tool2, new Menu.ExecutorParameter(cfg: config, null)))
34 .SetSelectionMode(Menu.SelectionMode.Single); 42 .SetSelectionMode(Menu.SelectionMode.Single);
35 -  
36 - while (true)  
37 - {  
38 - Menu.Selection sr;  
39 -  
40 - menufunctions.DisplayTitle();  
41 - menufunctions.DisplayItems();  
42 - sr = menufunctions.Select();  
43 - if (sr.Result == Menu.SelectionResult.Exit) { break; }  
44 - else if (sr.Result == Menu.SelectionResult.None) { continue; }  
45 - else if (sr.Result == Menu.SelectionResult.Error) { continue; }  
46 - menufunctions.SetExecutorParameters(sr,config);  
47 - menufunctions.ExecuteSelection(sr.SelectedKeyList);  
48 - } 43 + menufunctions.ExecuteMenu();
49 return null; 44 return null;
50 } 45 }
51 #endregion Execute 46 #endregion Execute
@@ -54,7 +49,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -54,7 +49,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
54 #region RegexTester 49 #region RegexTester
55 private static object RegexTester(object parameter, object o) 50 private static object RegexTester(object parameter, object o)
56 { 51 {
57 - var config = parameter as MaintenanceToolsXmlProcessor; 52 + var config = (parameter as Menu.ExecutorParameter).GetConfig<MaintenanceToolsXmlProcessor>();
58 var regexptesterconfig = config.RegexpTesterConfig; 53 var regexptesterconfig = config.RegexpTesterConfig;
59 while(true) 54 while(true)
60 { 55 {
Vrh.Log4Pro.MaintenanceConsole/Manager - SQLDataBaseManager.cs 0 → 100644
@@ -0,0 +1,1113 @@ @@ -0,0 +1,1113 @@
  1 +using System;
  2 +using System.IO;
  3 +using System.IO.Compression;
  4 +using System.Configuration.Install;
  5 +using System.Collections.Generic;
  6 +using System.Linq;
  7 +using System.ServiceProcess;
  8 +using System.Text;
  9 +using System.Threading;
  10 +using System.Threading.Tasks;
  11 +
  12 +using Microsoft.Web.Administration;
  13 +using System.Management;
  14 +using System.Diagnostics;
  15 +
  16 +using Vrh.Log4Pro.MaintenanceConsole.MenuNS;
  17 +using Vrh.Log4Pro.MaintenanceConsole.ColorConsoleNS;
  18 +using Vrh.Log4Pro.MaintenanceConsole.ToolsNS;
  19 +using Vrh.Log4Pro.MaintenanceConsole.CommandLineParserNS;
  20 +
  21 +using Vrh.XmlProcessing;
  22 +using VRH.Common;
  23 +using System.Xml.Linq;
  24 +using System.Text.RegularExpressions;
  25 +
  26 +using Microsoft.SqlServer.Management.Common;
  27 +using Microsoft.SqlServer.Management.Smo;
  28 +
  29 +namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
  30 +{
  31 + #region SQLDataBaseManager class
  32 + public static class SQLDataBaseManager
  33 + {
  34 + private const string XMLCONNECTIONSTRING = "config=MAINTENANCECONSOLE_SQLDATABASEMANAGER;";
  35 + private const string XMLCONNECTIONSTRING_DEFAULT = "file=Config.Xml;element=SQLDataBases;";
  36 +
  37 + #region Execute
  38 + public static object Execute(object o1 = null, object o2 = null)
  39 + {
  40 + var args = (o1 as Menu.ExecutorParameter).Args;
  41 + var functionkey = CommandLine.GetCommandLineArgument(args, CLP.CMD_FUNCTION);
  42 +
  43 + var config = new SQLDataBaseManagerXmlProcessor(XMLCONNECTIONSTRING, "", "hu-HU");
  44 + var ep = new Menu.ExecutorParameter(config, args);
  45 + var menufunctions = new Menu("Manage Scheduled tasks", "Select the management function!")
  46 + .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.BackupDataBase.KEY, "Backup database", BackupDataBase, ep))
  47 + .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.CreateCodeScripts.KEY, "Create code scripts", CreateCodeScripts, ep))
  48 + .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.CreateDataScripts.KEY, "Create data scripts", CreateDataScripts, ep))
  49 + .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.RestoreDataBase.KEY, "Restore database backup", RestoreDataBase, ep))
  50 + .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.RelocatePhysicalFiles.KEY, "Copy database and or relocate its physical files", RelocatePhysicalFiles, ep))
  51 + .SetSelectionMode(Menu.SelectionMode.Single)
  52 + .SetMenuHeaderDisplayer(DataBaseListDisplayer);
  53 + menufunctions.ExecuteMenu(functionkey);
  54 + return o2;
  55 + }
  56 + public static void Execute(string key, bool enabledbbackup, bool enablescriptbackup, bool enabletabledatabackup, string targetfolder=null,DateTime? timestamp = null)
  57 + {
  58 + var packagets = (timestamp.HasValue ? timestamp.Value : DateTime.Now).ToString("yyyyMMddHHmmss");
  59 + var config = new SQLDataBaseManagerXmlProcessor(XMLCONNECTIONSTRING, "", "hu-HU");
  60 + var origsqld = config.GetDefinitionList().FirstOrDefault(x => x.Xml_Key == key);
  61 + if (origsqld != null)
  62 + {
  63 + var sqld = new SQLDataBase(origsqld);
  64 + if (!string.IsNullOrWhiteSpace(targetfolder)) { sqld.Xml_BackupTargetDirectoryPath = targetfolder; }
  65 + if (enabledbbackup) { SQLDataBaseManagerCore.CreateBackup(sqld.Xml_BackupTargetDirectoryPath, sqld.SQLCS, sqld.Xml_BackupFileNameMask, sqld.Xml_CreateZip, timestamp); }
  66 + if (enablescriptbackup) { SQLDataBaseManagerCore.BackupSqlScripts(sqld.Xml_BackupTargetDirectoryPath, sqld.Xml_BackupFileNameMask, sqld.SQLCS, sqld.Xml_CreateZip, timestamp); }
  67 + if (enabletabledatabackup) { SQLDataBaseManagerCore.BackupSqlData(sqld, timestamp); }
  68 + }
  69 + }
  70 + #endregion Execute
  71 +
  72 + #region First level Executors with UI
  73 + private static object CreateDataScripts(object parameter, object o)
  74 + {
  75 + var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>();
  76 + var args = (parameter as Menu.ExecutorParameter).Args;
  77 +
  78 + var selectedsqldbindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.SQLDataBaseManager.Function.CMD_DATABASES);
  79 +
  80 + var menufolders = DisplaySQLDataBaseMenu(config, $"Select the scheduled task(s) to manage with function '{nameof(CreateDataScripts)}'!", silent: true);
  81 +
  82 + Menu.Selection sr = menufolders.Select(selectedsqldbindexes);
  83 + if (sr.Result == Menu.SelectionResult.Exit) { return o; }
  84 + else if (sr.Result == Menu.SelectionResult.None) { return o; }
  85 + else if (sr.Result == Menu.SelectionResult.Error) { return o; }
  86 + else if (sr.Result == Menu.SelectionResult.Ok) { }
  87 + else { }
  88 +
  89 + DateTime TS = DateTime.Now;
  90 + foreach (var p in sr.SelectedParameterList)
  91 + {
  92 + SQLDataBase sqld = p.Parameters as SQLDataBase;
  93 + try
  94 + {
  95 + SQLDataBaseManagerCore.BackupSqlData(sqld,TS);
  96 + ColorConsole.WriteLine($"SQLDB data scripts created. Name:{sqld.Xml_Description}", ConsoleColor.Green);
  97 + }
  98 + catch (Exception ex)
  99 + {
  100 + ColorConsole.WriteLine(ex.Message, ConsoleColor.Red);
  101 + }
  102 + }
  103 + return o;
  104 + }
  105 + private static object CreateCodeScripts(object parameter, object o)
  106 + {
  107 + var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>();
  108 + var args = (parameter as Menu.ExecutorParameter).Args;
  109 +
  110 + var selectedsqldbindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.SQLDataBaseManager.Function.CMD_DATABASES);
  111 +
  112 + var menufolders = DisplaySQLDataBaseMenu(config, $"Select the scheduled task(s) to manage with function '{nameof(CreateCodeScripts)}'!", silent: true);
  113 +
  114 + Menu.Selection sr = menufolders.Select(selectedsqldbindexes);
  115 + if (sr.Result == Menu.SelectionResult.Exit) { return o; }
  116 + else if (sr.Result == Menu.SelectionResult.None) { return o; }
  117 + else if (sr.Result == Menu.SelectionResult.Error) { return o; }
  118 + else if (sr.Result == Menu.SelectionResult.Ok) { }
  119 + else { }
  120 +
  121 + DateTime TS = DateTime.Now;
  122 + foreach (var p in sr.SelectedParameterList)
  123 + {
  124 + SQLDataBase sqld = p.Parameters as SQLDataBase;
  125 + try
  126 + {
  127 +
  128 + SQLDataBaseManagerCore.BackupSqlScripts(sqld.Xml_BackupTargetDirectoryPath, sqld.Xml_BackupFileNameMask,sqld.SQLCS,sqld.Xml_CreateZip,TS);
  129 + ColorConsole.WriteLine($"SQLDB code scripts created. Name:{sqld.Xml_Description}", ConsoleColor.Green);
  130 + }
  131 + catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); }
  132 + }
  133 + return o;
  134 + }
  135 + private static object BackupDataBase(object parameter, object o)
  136 + {
  137 + var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>();
  138 + var args = (parameter as Menu.ExecutorParameter).Args;
  139 +
  140 + var selectedsqldbindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.SQLDataBaseManager.Function.CMD_DATABASES);
  141 +
  142 + var menufolders = DisplaySQLDataBaseMenu(config, $"Select the scheduled task(s) to manage with function '{nameof(BackupDataBase)}'!", silent: true);
  143 +
  144 + Menu.Selection sr = menufolders.Select(selectedsqldbindexes);
  145 + if (sr.Result == Menu.SelectionResult.Exit) { return o; }
  146 + else if (sr.Result == Menu.SelectionResult.None) { return o; }
  147 + else if (sr.Result == Menu.SelectionResult.Error) { return o; }
  148 + else if (sr.Result == Menu.SelectionResult.Ok) { }
  149 + else { }
  150 +
  151 + var TS = DateTime.Now;
  152 + foreach (var p in sr.SelectedParameterList)
  153 + {
  154 + SQLDataBase ssqldb = p.Parameters as SQLDataBase;
  155 + try
  156 + {
  157 + SQLDataBaseManagerCore.CreateBackup(ssqldb.Xml_BackupTargetDirectoryPath, ssqldb.SQLCS, ssqldb.Xml_BackupFileNameMask, ssqldb.Xml_CreateZip,TS);
  158 + ColorConsole.WriteLine($"Database backup created. Name:{ssqldb.DBName}", ConsoleColor.Green);
  159 + }
  160 + catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); }
  161 + }
  162 + return o;
  163 + }
  164 + private static object RestoreDataBase(object parameter, object o)
  165 + {
  166 + var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>();
  167 + var args = (parameter as Menu.ExecutorParameter).Args;
  168 +
  169 + var selectedsqldbindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.SQLDataBaseManager.Function.CMD_DATABASES);
  170 + bool restorefirst = CommandLine.GetCommandLineArgument(args, CLP.Module.SQLDataBaseManager.Function.RestoreDataBase.CMD_RESTOREFIRST,switchtype:true)!=null;
  171 +
  172 + var menufolders = DisplaySQLDataBaseMenu(config, $"Select the sql database(s) to manage with function '{nameof(RestoreDataBase)}'!", silent: true);
  173 +
  174 + Menu.Selection sr = menufolders.Select(selectedsqldbindexes);
  175 + if (sr.Result == Menu.SelectionResult.Exit) { return o; }
  176 + else if (sr.Result == Menu.SelectionResult.None) { return o; }
  177 + else if (sr.Result == Menu.SelectionResult.Error) { return o; }
  178 + else if (sr.Result == Menu.SelectionResult.Ok) { }
  179 + else { }
  180 + foreach (var p in sr.SelectedParameterList)
  181 + {
  182 + SQLDataBase st = p.Parameters as SQLDataBase;
  183 + try
  184 + {
  185 + var targetdirectorypath = st.Xml_PhysicalFilesDirectoryPath;
  186 + var targetdbname= st.DBName;
  187 + bool restorefromzip = st.Xml_CreateZip;
  188 + var backupfilelist = SQLDataBaseManagerCore.GetBackupFilePathList(st);
  189 + if (backupfilelist != null && backupfilelist.Any())
  190 + {
  191 + string selectedbackupfilepath;
  192 + if (restorefirst)
  193 + {
  194 + selectedbackupfilepath = backupfilelist.First().FullName;
  195 + }
  196 + else
  197 + {
  198 + var selectionlist = backupfilelist
  199 + .Select(x => new KeyValuePair<string,string>($"{x.Name}({x.Length}bytes,created:{x.CreationTime})", x.FullName))
  200 + .ToDictionary(x=>x.Key,x=>x.Value);
  201 + var ms = Menu.SelectFromItemList($"Backup files of {st.DBName}", "Select the backup file to restore! First is the newest!", selectionlist,Menu.SelectionMode.Single,getconfirmation:true);
  202 + if (ms == null) { continue; }
  203 + selectedbackupfilepath = ms.SelectedParameterList.First().Parameters.ToString();
  204 + }
  205 + SQLDataBaseManagerCore.RestoreBackup(st.SQLCS, selectedbackupfilepath, targetdirectorypath, restorefromzip, targetdbname);
  206 + ColorConsole.WriteLine($"Database '{st.DBName}' restored to '{targetdbname}' into directory '{targetdirectorypath}'.", ConsoleColor.Green);
  207 + }
  208 + else
  209 + {
  210 + ColorConsole.WriteLine($"Database '{st.DBName}' restore FAILED, as no backup to restore!", ConsoleColor.Red);
  211 + }
  212 + }
  213 + catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); }
  214 + }
  215 + return o;
  216 + }
  217 + private static object RelocatePhysicalFiles(object parameter, object o)
  218 + {
  219 + var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>();
  220 + var args = (parameter as Menu.ExecutorParameter).Args;
  221 +
  222 + var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.ScheduledTaskManager.Function.CMD_TASKS);
  223 +
  224 + var menufolders = DisplaySQLDataBaseMenu(config, $"Select the sql database(s) to manage with function '{nameof(RelocatePhysicalFiles)}'!", silent: true);
  225 +
  226 + Menu.Selection sr = menufolders.Select(selectedtaskindexes);
  227 + if (sr.Result == Menu.SelectionResult.Exit) { return o; }
  228 + else if (sr.Result == Menu.SelectionResult.None) { return o; }
  229 + else if (sr.Result == Menu.SelectionResult.Error) { return o; }
  230 + else if (sr.Result == Menu.SelectionResult.Ok) { }
  231 + else { }
  232 + foreach (var p in sr.SelectedParameterList)
  233 + {
  234 + SQLDataBase sqld = p.Parameters as SQLDataBase;
  235 + try
  236 + {
  237 + var restoredbname = ColorConsole.ReadLine($"Enter the name of the DB to copy '{sqld.DBName}' to. Empty={sqld.DBName}. EX=exit.", ConsoleColor.Yellow, suffix: " --> ");
  238 + if (restoredbname == "EX") { continue; }
  239 + else if (string.IsNullOrWhiteSpace(restoredbname)) { restoredbname = sqld.DBName; }
  240 + ColorConsole.WriteLine("Enter the path for the DB physical files.", ConsoleColor.Yellow);
  241 + ColorConsole.WriteLine(sqld.PhysicalFilesDirectoryPath, ConsoleColor.Yellow, prefix: $" Empty=current location of source DB: ", bracket: "[]");
  242 + ColorConsole.WriteLine(SQLDataBaseManagerCore.GetServerDefaultPhysicalDATFileLocation(sqld.SQLCS), ConsoleColor.Yellow,prefix: $" DEFAULT= sql server default location.",bracket:"[]");
  243 + var targetdirectory = ColorConsole.ReadLine($"Enter the target path.EX=exit.", ConsoleColor.Yellow, suffix: " --> ");
  244 + if (targetdirectory == "EX") { continue; }
  245 + else if (targetdirectory == "DEFAULT") { targetdirectory = null; ; }
  246 + else if (string.IsNullOrWhiteSpace(targetdirectory)) { targetdirectory = sqld.PhysicalFilesDirectoryPath; }
  247 +
  248 + if (restoredbname == sqld.DBName && targetdirectory == sqld.PhysicalFilesDirectoryPath) { continue; }
  249 +
  250 + SQLDataBaseManagerCore.RelocatePhysicalFiles(sqld, targetdirectory, restoredbname);
  251 + ColorConsole.WriteLine($"Database physical files relocated. Name:{sqld.DBName}", ConsoleColor.Green);
  252 + }
  253 + catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); }
  254 + }
  255 + return o;
  256 + }
  257 + #endregion First level Executors with UI
  258 +
  259 + #region private methods
  260 + #region private DisplaySQLDataBaseMenu
  261 + private static void DataBaseListDisplayer() { DisplaySQLDataBaseMenu(); }
  262 + private static Menu DisplaySQLDataBaseMenu(SQLDataBaseManagerXmlProcessor config = null, string prompt = null, bool silent = false)
  263 + {
  264 + if (config == null) { config = new SQLDataBaseManagerXmlProcessor(XMLCONNECTIONSTRING, "", "hu-HU"); }
  265 + List<SQLDataBase> schtskdefList = config.GetDefinitionList();
  266 + var menufct = new Menu("SQL Databases", prompt)
  267 + .SetMenuItemDisplayer(DisplayDataBaseInfo)
  268 + .SetSelectionMode(Menu.SelectionMode.Multi);
  269 + menufct.ClearMenuItemList();
  270 + foreach (var schtskdef in schtskdefList)
  271 + {
  272 + var st = SQLDataBaseManagerCore.CollectDataBaseInfo(schtskdef);
  273 + menufct.AddMenuItem(new Menu.Item(schtskdef.Xml_Key, null, null, new Menu.ExecutorParameter(pars: st)));
  274 + }
  275 + if (!silent) { menufct.DisplayItems(1); }
  276 + return menufct;
  277 + }
  278 + #endregion private DisplaySQLDataBaseMenu
  279 + #region private method: DisplayDataBaseInfo
  280 + private static object DisplayDataBaseInfo(object obj, int lineix)
  281 + {
  282 + SQLDataBase st = (obj as Menu.ExecutorParameter).Parameters as SQLDataBase;
  283 + if (lineix == 0)
  284 + {
  285 + ColorConsole.Write($"{st.Xml_Description}", ConsoleColor.Black, ConsoleColor.White);
  286 + var statuscolor = st.Status == SQLDataBaseManagerCore.SQLDBStatus.NoAccess ? ConsoleColor.Red:ConsoleColor.Green;
  287 + ColorConsole.Write(st.Status.ToString(), statuscolor, bracket: "[]", prefix: " ", suffix: ". ");
  288 + if (st.Status != SQLDataBaseManagerCore.SQLDBStatus.NoAccess)
  289 + {
  290 + ColorConsole.Write(st.DBName, statuscolor, bracket: "[]", prefix: "Database ", suffix: ". ");
  291 + ColorConsole.Write(st.DataSource, statuscolor, bracket: "[]", prefix: "from server ", suffix: ". ");
  292 + }
  293 + ColorConsole.WriteLine();
  294 + return " ";
  295 + }
  296 + else if (lineix == 1)
  297 + {
  298 + ColorConsole.Write($"{st.Xml_BackupFileNameMask}", ConsoleColor.Yellow, prefix: "Backup to:", suffix: ".xxx");
  299 + ColorConsole.WriteLine();
  300 + return "";
  301 + }
  302 + else if (lineix == 2)
  303 + {
  304 + ColorConsole.Write($"{st.SQLCS}", ConsoleColor.Yellow, prefix: "SQL DB connection:", suffix: ", ");
  305 + ColorConsole.WriteLine(" ");
  306 + return " ";
  307 + }
  308 + else if (lineix == 3)
  309 + {
  310 + var phypath = SQLDataBaseManagerCore.GetPhysicalFilesLocation(st.SQLCS);
  311 + ColorConsole.Write($"{phypath}", ConsoleColor.Yellow, prefix: "DB files physical location:", suffix: " ");
  312 + ColorConsole.WriteLine(" ");
  313 + return " ";
  314 + }
  315 + return null;
  316 + }
  317 + #endregion private method: DisplayDataBaseInfo
  318 + #endregion private methods
  319 + }
  320 + #endregion SQLDataBaseManager class
  321 +
  322 + #region class SQLDataBaseManager
  323 + public static class SQLDataBaseManagerCore
  324 + {
  325 + #region public CollectDataBaseInfo
  326 + public static SQLDataBase CollectDataBaseInfo(SQLDataBase sqld)
  327 + {
  328 + sqld.Status = GetStatus(sqld.SQLCS);
  329 + sqld.PhysicalFilesDirectoryPath = GetPhysicalFilesLocation(sqld.SQLCS);
  330 + sqld.DBName = GetDBName(sqld.SQLCS);
  331 + sqld.DataSource = GetDataSource(sqld.SQLCS);
  332 + return sqld;
  333 + }
  334 + #endregion public CollectDataBaseInfo
  335 +
  336 + public static void RelocatePhysicalFiles(SQLDataBase sqld, string targetdirectory, string restoredbname)
  337 + {
  338 + var dbbackupfilepath = CreateBackup(sqld.Xml_BackupTargetDirectoryPath, sqld.SQLCS, sqld.Xml_BackupFileNameMask, false);
  339 + RestoreBackup(sqld.SQLCS, dbbackupfilepath, targetdirectory, false, restoredbname);
  340 + if (File.Exists(dbbackupfilepath)) { File.Delete(dbbackupfilepath); }
  341 + }
  342 + public static void RestoreBackup(string sqlcs, string sourcesqlbackupfilepath, string targetdbphysicalfilesdirectorypath, bool restorefromZIP = false, string restoretodbname = null)
  343 + {
  344 + string backupfilepath;
  345 + if (restorefromZIP)
  346 + {
  347 + backupfilepath = Path.Combine(Path.GetDirectoryName(sourcesqlbackupfilepath), Path.GetFileNameWithoutExtension(sourcesqlbackupfilepath) + ".bak");
  348 + ZipTools.Extract1stFileFromZIP(backupfilepath, sourcesqlbackupfilepath);
  349 + var starttime = DateTime.Now;
  350 + while (DateTime.Now.Subtract(starttime).TotalSeconds > 5) { if (File.Exists(backupfilepath)) { break; } Thread.Sleep(500); }
  351 + }
  352 + else { backupfilepath = sourcesqlbackupfilepath; }
  353 + var sqlserver = SQLServerConnect(sqlcs);
  354 +
  355 + var smoRestore = new Restore();
  356 + smoRestore.NoRecovery = false;
  357 + smoRestore.ReplaceDatabase = true;
  358 + smoRestore.Action = RestoreActionType.Database;
  359 + smoRestore.PercentCompleteNotification = 5;
  360 + var backupdevice = new BackupDeviceItem(backupfilepath, DeviceType.File);
  361 + smoRestore.Devices.Add(backupdevice);
  362 + smoRestore.Database = string.IsNullOrWhiteSpace(restoretodbname)
  363 + ? smoRestore.ReadBackupHeader(sqlserver).Rows[0]["DatabaseName"].ToString()
  364 + : restoretodbname;
  365 +
  366 + var dbfilelist = smoRestore.ReadFileList(sqlserver);
  367 + var smorestoreDATfile = new RelocateFile();
  368 + string targetdbphysicalfilesdirectorypathDAT = targetdbphysicalfilesdirectorypath;
  369 + if (string.IsNullOrEmpty(targetdbphysicalfilesdirectorypathDAT)) { targetdbphysicalfilesdirectorypathDAT = sqlserver.DefaultFile; }
  370 + if (string.IsNullOrEmpty(targetdbphysicalfilesdirectorypathDAT)) { targetdbphysicalfilesdirectorypathDAT = sqlserver.MasterDBPath; }
  371 + smorestoreDATfile.PhysicalFileName = Path.Combine(targetdbphysicalfilesdirectorypathDAT, smoRestore.Database + "_Data.mdf");
  372 + smorestoreDATfile.LogicalFileName = dbfilelist.Select("Type='D'")[0]["LogicalName"].ToString();
  373 + smoRestore.RelocateFiles.Add(smorestoreDATfile);
  374 +
  375 + var smorestoreLOGfile = new RelocateFile();
  376 + string targetdbphysicalfilesdirectorypathLOG = targetdbphysicalfilesdirectorypath;
  377 + if (string.IsNullOrEmpty(targetdbphysicalfilesdirectorypathLOG)) { targetdbphysicalfilesdirectorypathLOG = sqlserver.DefaultLog; }
  378 + if (string.IsNullOrEmpty(targetdbphysicalfilesdirectorypathLOG)) { targetdbphysicalfilesdirectorypathLOG = sqlserver.MasterDBLogPath; }
  379 + smorestoreLOGfile.PhysicalFileName = Path.Combine(targetdbphysicalfilesdirectorypathLOG, smoRestore.Database + "_Log.ldf");
  380 + smorestoreLOGfile.LogicalFileName = dbfilelist.Select("Type='L'")[0]["LogicalName"].ToString();
  381 + smoRestore.RelocateFiles.Add(smorestoreLOGfile);
  382 +
  383 + sqlserver.KillAllProcesses(smoRestore.Database);
  384 +
  385 + smoRestore.SqlRestore(sqlserver);
  386 + if (restorefromZIP)
  387 + {
  388 + if (File.Exists(backupfilepath)) { File.Delete(backupfilepath); }
  389 + }
  390 + }
  391 + public static string CreateBackup(string backupdirectorypath, string sqlconnectionstring, string backupfilenamemask, bool createzip = false,DateTime? timestamp=null)
  392 + {
  393 + var sqlserver = SQLServerConnect(sqlconnectionstring);
  394 +
  395 + var backupts = (timestamp.HasValue ? timestamp.Value : DateTime.Now).ToString("yyyyMMddHHmmss");
  396 +
  397 + string backupfileNameOnly = Path.GetFileNameWithoutExtension(backupfilenamemask);
  398 + var vars = new Dictionary<string, string>();
  399 + vars.Add(nameof(DBSubstitutionName.DATABASE), GetDBName(sqlconnectionstring));
  400 + vars.Add(nameof(DBSubstitutionName.DATASOURCE), GetDataSource(sqlconnectionstring));
  401 + vars.Add(nameof(DBSubstitutionName.DBOTYPE), "DBBACKUP");
  402 + vars.Add(nameof(DBSubstitutionName.DBONAME), "");
  403 + vars.Add(nameof(DBSubstitutionName.DBDATAGROUP), "");
  404 + vars.Add(nameof(DBSubstitutionName.BACKUPTS), backupts);
  405 +
  406 + backupfileNameOnly = VRH.Common.StringConstructor.ResolveConstructor(vars, backupfileNameOnly, "{}@@");
  407 +
  408 + string backupfilename = backupfileNameOnly + ".bak";
  409 + string backupFullName = Path.Combine(backupdirectorypath, backupfileNameOnly);
  410 + if (File.Exists(backupFullName)) { File.Delete(backupFullName); }
  411 +
  412 + var smoBackup = new Backup();
  413 + smoBackup.Action = BackupActionType.Database;
  414 + smoBackup.BackupSetDescription = $"Full Backup of {sqlserver.ConnectionContext.DatabaseName}";
  415 + smoBackup.BackupSetName = sqlserver.ConnectionContext.DatabaseName + " Backup";
  416 + smoBackup.Database = sqlserver.ConnectionContext.DatabaseName;
  417 + smoBackup.MediaDescription = "Disk";
  418 + smoBackup.Devices.AddDevice(backupFullName, DeviceType.File);
  419 + smoBackup.SqlBackup(sqlserver);
  420 +
  421 + if (createzip)
  422 + {
  423 + string ZIPbackupfilename = backupfileNameOnly + ".zip";
  424 + string ZIPbackupFullName = Path.Combine(backupdirectorypath, ZIPbackupfilename);
  425 + if (File.Exists(ZIPbackupFullName)) { File.Delete(ZIPbackupFullName); }
  426 +
  427 + ZipTools.CreateEntriesFromDirectoryContent(backupdirectorypath, ZIPbackupFullName, backupfilename, "", removearchivedfiles: false, storepathinzip: false);
  428 + if (File.Exists(backupFullName)) { File.Delete(backupFullName); }
  429 + return ZIPbackupFullName;
  430 +
  431 + }
  432 + return backupFullName;
  433 + }
  434 +
  435 + #region private methods
  436 + public static List<FileInfo> GetBackupFilePathList(SQLDataBase sqld)
  437 + {
  438 + var filenamemask = Path.GetFileNameWithoutExtension(sqld.Xml_BackupFileNameMask);
  439 + var vars = new Dictionary<string, string>();
  440 + vars.Add(nameof(DBSubstitutionName.DATABASE), sqld.DBName);
  441 + vars.Add(nameof(DBSubstitutionName.DATASOURCE), "");
  442 + vars.Add(nameof(DBSubstitutionName.DBOTYPE), "DBBACKUP");
  443 + vars.Add(nameof(DBSubstitutionName.DBONAME), "");
  444 + vars.Add(nameof(DBSubstitutionName.DBDATAGROUP), "");
  445 + vars.Add(nameof(DBSubstitutionName.BACKUPTS), "*");
  446 + filenamemask = VRH.Common.StringConstructor.ResolveConstructor(vars, filenamemask, "{}@@");
  447 + var filelist = new DirectoryInfo(sqld.Xml_BackupTargetDirectoryPath)?.GetFiles(filenamemask)?.ToList();
  448 + var filelistordered = filelist?.OrderByDescending(x => x.CreationTime).ToList();
  449 + return filelistordered;
  450 + }
  451 +
  452 + /// <summary>
  453 + /// Enable sa user and set/change its password
  454 + /// </summary>
  455 + /// <param name="cs"></param>
  456 + /// <param name="password"></param>
  457 + /// <param name="newsapassword"></param>
  458 + /// <returns></returns>
  459 + public static string ConfigureSaUser(string cs,string password, string newsapassword)
  460 + {
  461 + var sqlserver = SQLServerConnect(cs);
  462 + sqlserver.Settings.LoginMode= ServerLoginMode.Mixed;
  463 + sqlserver.Logins["sa"].Enable();
  464 + sqlserver.Logins.ItemById(10).Enable();
  465 + sqlserver.Logins["sa"].ChangePassword(newsapassword);
  466 + sqlserver.Alter();
  467 + sqlserver.Logins["a"].Refresh();
  468 + return SQLServerConnect(cs).ConnectionContext.ConnectionString;
  469 + }
  470 + public static void ConfigureWindowsUser(string cs, string sapassword, string databasename, string windowsfullusername,string windowsuserpassword,List<string> rolenamelist)
  471 + {
  472 + var sqlserver = SQLServerConnect(cs);
  473 + if (!sqlserver.Logins.Contains(windowsfullusername))
  474 + {
  475 + var wul = new Microsoft.SqlServer.Management.Smo.Login(sqlserver, windowsfullusername);
  476 + wul.LoginType = LoginType.WindowsUser;
  477 + wul.Create(windowsuserpassword,LoginCreateOptions.None);
  478 + if (!string.IsNullOrWhiteSpace(databasename))
  479 + {
  480 + var dbobject = sqlserver.Databases[databasename];
  481 + if (dbobject==null) { throw new Exception($"Specified databas '{databasename}' does not exist!"); }
  482 + if (dbobject.Users.Contains(windowsfullusername)) { dbobject.Users[windowsfullusername].Drop(); }
  483 + var dbuser = new Microsoft.SqlServer.Management.Smo.User(dbobject, windowsfullusername);
  484 + dbuser.Login = windowsfullusername;
  485 + dbuser.Create(windowsuserpassword);
  486 + foreach (var rn in rolenamelist)
  487 + {
  488 + var dbrole = dbobject.Roles[rn];
  489 + dbrole.AddMember(windowsfullusername);
  490 + dbrole.Alter();
  491 + }
  492 + }
  493 + }
  494 + }
  495 + public static void DropDatabase(string cs,string databasename,string sapassword)
  496 + {
  497 + var sqlserver = SQLServerConnect(cs);
  498 + if (sqlserver.Databases.Contains(databasename))
  499 + {
  500 + sqlserver.KillAllProcesses(databasename);
  501 + sqlserver.Databases[databasename].Drop();
  502 + }
  503 + else { throw new Exception($"Specified databas '{databasename}' does not exist!"); }
  504 + }
  505 + public static string GetServerDefaultPhysicalDATFileLocation(string cs)
  506 + {
  507 + var sqlserver = SQLDataBaseManagerCore.SQLServerConnect(cs);
  508 + return string.IsNullOrEmpty(sqlserver.DefaultFile) ? sqlserver.MasterDBPath : sqlserver.DefaultFile;
  509 + }
  510 + public static string GetServerDefaultPhysicalLOGFileLocation(string cs)
  511 + {
  512 + var sqlserver = SQLDataBaseManagerCore.SQLServerConnect(cs);
  513 + return string.IsNullOrEmpty(sqlserver.DefaultLog) ? sqlserver.MasterDBLogPath : sqlserver.DefaultLog;
  514 + }
  515 + public static string GetDBName(string cs)
  516 + {
  517 + var sqlc = new Microsoft.Data.SqlClient.SqlConnection(cs);
  518 + return sqlc.Database;
  519 + }
  520 + public static string GetDataSource(string cs)
  521 + {
  522 + var sqlc = new Microsoft.Data.SqlClient.SqlConnection(cs);
  523 + return sqlc.DataSource;
  524 + }
  525 + public enum SQLDBStatus { NoAccess, OK, }
  526 + public static SQLDBStatus GetStatus(string cs)
  527 + {
  528 + try { var s = GetPhysicalFilesLocation(cs); if (s == null) { throw new Exception(); }; return SQLDBStatus.OK; } catch { return SQLDBStatus.NoAccess; }
  529 + }
  530 + public static Server SQLServerConnect(string sqlconnectionstring)
  531 + {
  532 + try
  533 + {
  534 + var sqlconnection = new Microsoft.Data.SqlClient.SqlConnection(sqlconnectionstring);
  535 + var serverconnection = new ServerConnection(sqlconnection);
  536 + var sqlserver = new Server(serverconnection);
  537 + if (string.IsNullOrEmpty(sqlserver.Information.Version.ToString())) { throw new Exception("Connection not established!"); }
  538 + return sqlserver;
  539 + }
  540 + catch (Exception ex) { throw ex; }
  541 + }
  542 + #region GetPhysicalFilesLocation
  543 + /// <summary>
  544 + /// Returns the physical path to the directory that holds the files of the database
  545 + /// </summary>
  546 + /// <param name="sqlconnectionstring"></param>
  547 + /// <returns>the path, or null, if any error occurs</returns>
  548 + public static string GetPhysicalFilesLocation(string sqlconnectionstring)
  549 + {
  550 + int commandtimeout = 5000;
  551 + string scripttext = "";
  552 + scripttext += " DECLARE @physicalpath varchar(1000) = NULL;";
  553 + scripttext += " SELECT @physicalpath = f.physical_name";
  554 + scripttext += " FROM sys.master_files as f inner join sys.databases as d on f.database_id = d.database_id";
  555 + scripttext += " where d.name = '{DATABASE}' and f.type_desc = 'ROWS';";
  556 + scripttext += " SELECT 1 AS RETURNCODE, @physicalpath AS RETURNMESSAGE;";
  557 + var vars = new Dictionary<string, string>();
  558 + vars.Add(nameof(DBSubstitutionName.DATABASE), GetDBName(sqlconnectionstring));
  559 + vars.Add(nameof(DBSubstitutionName.DATASOURCE), "");
  560 + var result = ExecuteSQLScript(sqlconnectionstring, scripttext, commandtimeout, vars);
  561 + if (result.ReturnValue != 0) { return Path.GetDirectoryName(result.ReturnMessage); } else { return null; };
  562 + }
  563 + #endregion GetPhysicalFilesLocation
  564 + #region DBSubstitution
  565 + public enum DBSubstitutionName
  566 + {
  567 + DATABASE,DATASOURCE,DBOTYPE,DBONAME,DBDATAGROUP,BACKUPTS,
  568 + }
  569 + #endregion DBSubstitution
  570 + #region ExecuteSQLScript
  571 + /// <summary>
  572 + /// Egy SQL script végrehajtása (GO-val lezárt batch-eket tartalmazhat)
  573 + /// </summary>
  574 + /// <param name="sqlconnectionstring">sql connection string</param>
  575 + /// <param name="sqltxt">a script</param>
  576 + /// <param name="commandtimeout">az egyes batch-ek végrehajtási időzítése</param>
  577 + /// <param name="vars">
  578 + /// behelyettesítendő változók (a scriptben ezek nevei {} között kell legyenek)
  579 + /// a következő neveket felismeri akkor is, ha nincsenek benne a sztótárban:
  580 + /// DATASOURCE: a sql server neve domain/név formában
  581 + /// DATABASE: az aadatbázis neve
  582 + /// </param>
  583 + /// <returns>
  584 + /// egy ReturnInfoJSON struktúrát, amiben a ReturnValue és ReturnMessage a script által előállított két
  585 + /// (egy int és egy string) értéket tartalmazza pl. egy ilyen eredményt: SELECT @returncode, @returnmessage;
  586 + /// Ha a végrehajtás nem ad vissza eredményt, akkor az első érték 0, a második pedig null;
  587 + ///
  588 + /// </returns>
  589 + public static ReturnInfoJSON ExecuteSQLScript(string sqlconnectionstring, string sqltxt, int commandtimeout, Dictionary<string, string> vars)
  590 + {
  591 + var sqlc = new Microsoft.Data.SqlClient.SqlConnection(sqlconnectionstring);
  592 +
  593 + sqltxt = VRH.Common.StringConstructor.ResolveConstructor(vars, sqltxt, "{}@@");
  594 +
  595 + sqlc.Open();
  596 + string SQLBatchTxt = ""; // ebben lesznek az sql script-en belüli batch-ek összerakva
  597 + int SQLBatchIndex = 0; // az aktuális batch indexe
  598 + int scriptlineindex = 0; // az aktuális script sor indexe
  599 + System.Data.DataSet DataSet = null; // ebben lesz az eredmény (az utolsó batch eredménye)
  600 + sqltxt += "\r\nGO";// ha esetleg nem lenne, odatesszük a végére az utolsó batch-et lezáró GO-t
  601 + foreach (var scriptline in sqltxt.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries))
  602 + {
  603 + scriptlineindex += 1;
  604 + if (Regex.Match(scriptline, @"^GO$").Success)// a batch utolső sora
  605 + {
  606 + if (!string.IsNullOrWhiteSpace(SQLBatchTxt))
  607 + {
  608 + SQLBatchIndex += 1;
  609 + DataSet = ExecuteSQLScriptBatch(sqlc, SQLBatchTxt, commandtimeout);
  610 + SQLBatchTxt = "";
  611 + }
  612 + }
  613 + else if (!string.IsNullOrWhiteSpace(scriptline))
  614 + {
  615 + SQLBatchTxt += scriptline + "\r\n";
  616 + }
  617 + }
  618 + sqlc.Close();
  619 + if (DataSet != null && DataSet.Tables != null)
  620 + {
  621 + var firstreturnedtable = DataSet.Tables[0];
  622 + var firstreturnedrow = firstreturnedtable.Rows[0];
  623 + var firstreturnedvalue = firstreturnedrow[0];
  624 + var secondreturnedvalue = firstreturnedrow[1];
  625 + var rv = Convert.ToInt32(firstreturnedvalue);
  626 + var rm = Convert.ToString(secondreturnedvalue);
  627 + return new ReturnInfoJSON() { ReturnValue = rv, ReturnMessage = rm, };
  628 + }
  629 + else { return new ReturnInfoJSON() { ReturnValue = 0, ReturnMessage = null, }; }
  630 + }
  631 + private static System.Data.DataSet ExecuteSQLScriptBatch(Microsoft.Data.SqlClient.SqlConnection sqlc, string sqlbatchtxt, int commandtimeout)
  632 + {
  633 + var sqlcommand = sqlc.CreateCommand();
  634 + sqlcommand.CommandText = sqlbatchtxt;
  635 + sqlcommand.CommandTimeout = commandtimeout;
  636 + var DataAdapter = new Microsoft.Data.SqlClient.SqlDataAdapter(sqlcommand);
  637 + var DataSet = new System.Data.DataSet();
  638 + DataAdapter.Fill(DataSet);
  639 + return DataSet;
  640 + }
  641 + #endregion ExecuteSQLScript
  642 + #region ExecuteSQLStoredProcedure
  643 + /// <summary>
  644 + /// Egy SQL script végrehajtása (GO-val lezárt batch-eket tartalmazhat)
  645 + /// </summary>
  646 + /// <param name="sqlconnectionstring">sql connection string</param>
  647 + /// <param name="sqltxt">a script</param>
  648 + /// <param name="commandtimeout">az egyes batch-ek végrehajtási időzítése</param>
  649 + /// <param name="vars">
  650 + /// behelyettesítendő változók (a scriptben ezek nevei {} között kell legyenek)
  651 + /// a következő neveket felismeri akkor is, ha nincsenek benne a sztótárban:
  652 + /// DATASOURCE: a sql server neve domain/név formában
  653 + /// DATABASE: az aadatbázis neve
  654 + /// </param>
  655 + /// <returns>
  656 + /// egy ReturnInfoJSON struktúrát, amiben a ReturnValue és ReturnMessage a script által előállított két
  657 + /// (egy int és egy string) értéket tartalmazza pl. egy ilyen eredményt: SELECT @returncode, @returnmessage;
  658 + /// Ha a végrehajtás nem ad vissza eredményt, akkor az első érték 0, a második pedig null;
  659 + ///
  660 + /// </returns>
  661 + public class SPparameter
  662 + {
  663 + public string Name;
  664 + public object Value;
  665 + public System.Data.SqlDbType Type;
  666 + public int Typepar;
  667 + public System.Data.ParameterDirection Direction;
  668 + public SPparameter() { }
  669 + public SPparameter(Microsoft.Data.SqlClient.SqlParameter p)
  670 + {
  671 + Name = p.ParameterName;
  672 + Value = p.Value;
  673 + Type = p.SqlDbType;
  674 + Typepar = p.Size;
  675 + Direction = p.Direction;
  676 + }
  677 + }
  678 +
  679 + public static List<SPparameter> ExecuteSQLStoredProcedure(string sqlconnectionstring, string storedprocedurename, int commandtimeout, List<SPparameter> SPparameters)
  680 + {
  681 + var sqlc = new Microsoft.Data.SqlClient.SqlConnection(sqlconnectionstring);
  682 + var sqlcommand = sqlc.CreateCommand();
  683 + sqlcommand.Connection = sqlc;
  684 + sqlcommand.CommandText = storedprocedurename;
  685 + sqlcommand.CommandTimeout = commandtimeout;
  686 + sqlcommand.CommandType= System.Data.CommandType.StoredProcedure;
  687 + //var DataAdapter = new Microsoft.Data.SqlClient.SqlDataAdapter(sqlcommand);
  688 + sqlc.Open();
  689 + foreach (var p in SPparameters)
  690 + {
  691 + var sqlparameter = new Microsoft.Data.SqlClient.SqlParameter()
  692 + {
  693 + ParameterName = p.Name,
  694 + SqlDbType = p.Type,
  695 + Size = p.Typepar,
  696 + Direction = p.Direction,
  697 + Value = p.Value,
  698 + };
  699 + sqlcommand.Parameters.Add(sqlparameter);
  700 + }
  701 + sqlcommand.ExecuteNonQuery();
  702 +
  703 + var sqlresult = new List<SPparameter>();
  704 + foreach (var p in SPparameters)
  705 + {
  706 + if (p.Direction == System.Data.ParameterDirection.Output)
  707 + {
  708 + sqlresult.Add(new SPparameter(sqlcommand.Parameters[p.Name]));
  709 + }
  710 + }
  711 + sqlc.Close();
  712 + return sqlresult;
  713 + }
  714 + #endregion ExecuteSQLStoredProcedure
  715 + #region BackupSqlScripts
  716 + public static void BackupSqlScripts(string backupdirectorypath,string backupfilenamemask,string sqlcs,bool createZip, DateTime? timestamp=null)
  717 + {
  718 + var sqlserver = SQLServerConnect(sqlcs);
  719 + if (sqlserver!=null)
  720 + {
  721 + string backupts = (timestamp.HasValue? timestamp.Value:DateTime.Now).ToString("yyyyMMddHHmmss");
  722 + var vars = new Dictionary<string, string>();
  723 + vars.Add(nameof(DBSubstitutionName.DATABASE), GetDBName(sqlcs));
  724 + vars.Add(nameof(DBSubstitutionName.DATASOURCE), GetDataSource(sqlcs));
  725 + vars.Add(nameof(DBSubstitutionName.BACKUPTS), backupts);
  726 + vars.Add(nameof(DBSubstitutionName.DBOTYPE), "Scripts");
  727 +
  728 + string zipfilefullpath = null;
  729 + string tempbackupdirectorypath;
  730 + if (createZip)
  731 + {
  732 + vars[nameof(DBSubstitutionName.DBONAME)] = "";
  733 + vars[nameof(DBSubstitutionName.DBDATAGROUP)] = "";
  734 + string zipfilename = VRH.Common.StringConstructor.ResolveConstructor(vars, backupfilenamemask, "{}@@") + ".zip";
  735 + zipfilefullpath = Path.Combine(backupdirectorypath, zipfilename);
  736 + tempbackupdirectorypath = Path.Combine(backupdirectorypath, "TEMP_" + Path.GetFileNameWithoutExtension(zipfilename));
  737 + if (Directory.Exists(tempbackupdirectorypath)) { Directory.Delete(tempbackupdirectorypath, recursive: true); }
  738 + if (!Directory.Exists(tempbackupdirectorypath)) { Directory.CreateDirectory(tempbackupdirectorypath); }
  739 + }
  740 + else { tempbackupdirectorypath = backupdirectorypath; }
  741 +
  742 + if (!Directory.Exists(backupdirectorypath)) { Directory.CreateDirectory(backupdirectorypath); }
  743 + var directorynameonly = new DirectoryInfo(backupdirectorypath).Name;
  744 + var backupfilenameext = Path.GetExtension(backupfilenamemask); if (string.IsNullOrWhiteSpace(backupfilenameext)) { backupfilenameext = ".sql"; }
  745 + backupfilenamemask = Path.GetFileNameWithoutExtension(backupfilenamemask);
  746 + var sqldatabase = sqlserver.Databases[sqlserver.ConnectionContext.DatabaseName];
  747 +
  748 + ScriptOneObject(sqlserver, tempbackupdirectorypath, backupfilenamemask + backupfilenameext, new List<SqlSmoObject> { sqldatabase }, vars);
  749 + ScriptOneObject(sqlserver, tempbackupdirectorypath, backupfilenamemask + backupfilenameext, sqldatabase.UserDefinedFunctions.Cast<SqlSmoObject>().ToList(), vars);
  750 + ScriptOneObject(sqlserver, tempbackupdirectorypath, backupfilenamemask + backupfilenameext, sqldatabase.StoredProcedures.Cast<SqlSmoObject>().ToList(), vars);
  751 + ScriptOneObject(sqlserver, tempbackupdirectorypath, backupfilenamemask + backupfilenameext, sqldatabase.Views.Cast<SqlSmoObject>().ToList(), vars);
  752 + ScriptOneObject(sqlserver, tempbackupdirectorypath, backupfilenamemask + backupfilenameext, sqldatabase.Tables.Cast<SqlSmoObject>().ToList(), vars);
  753 + ScriptOneObject(sqlserver, tempbackupdirectorypath, backupfilenamemask + backupfilenameext, sqldatabase.Triggers.Cast<SqlSmoObject>().ToList(), vars);
  754 + if (createZip)
  755 + {
  756 + ZipTools.CreateEntriesFromDirectoryContent(tempbackupdirectorypath, zipfilefullpath, "*.sql", backupts,removearchivedfiles:true, storepathinzip: false);
  757 + }
  758 + }
  759 +
  760 + }
  761 + private static void ScriptOneObject(Server sqlserver,string backupdirectory,string backupfilenamemask,List<SqlSmoObject> sqldbobjects,Dictionary<string, string> vars)
  762 + {
  763 + var sqldbname = sqlserver.ConnectionContext.DatabaseName;
  764 + string lastfilename = null;
  765 + foreach (var sqldbobj in sqldbobjects)
  766 + {
  767 + bool systemobject = true;
  768 + try { systemobject = sqldbobj.Properties["IsSystemObject"].Value.ToString().ToUpper() == bool.TrueString.ToUpper(); } catch { }
  769 + if (systemobject) { continue; }
  770 +
  771 + string namevalue=null;
  772 + if (namevalue == null) { try { namevalue = Tools.GetPropertyValue<string>(sqldbobj, "Name"); } catch { namevalue = null; } }
  773 + if (namevalue == null) { try { namevalue = sqldbobj.Properties["Name"].Value.ToString(); } catch { namevalue = null; } }
  774 + if (namevalue == null) { namevalue = "UNDEFINED"; }
  775 +
  776 + vars[nameof(DBSubstitutionName.DBONAME)]=namevalue;
  777 + vars[nameof(DBSubstitutionName.DBDATAGROUP)]=sqldbobj.GetType().Name;
  778 +
  779 + string filename = VRH.Common.StringConstructor.ResolveConstructor(vars, backupfilenamemask, "{}@@");
  780 + if (lastfilename!=filename)
  781 + {
  782 + var i = 2;
  783 + string filenamesav = filename;
  784 + while (true)
  785 + {
  786 + if (!File.Exists(filename)) { break; }
  787 + filename = filenamesav + $" ({i})";
  788 + i++;
  789 + }
  790 + using (var sw = File.AppendText(Path.Combine(backupdirectory, filename)))
  791 + {
  792 + sw.WriteLine($"use [{sqldbname}]");
  793 + }
  794 + lastfilename = filename;
  795 + }
  796 + var myscripter = new Microsoft.SqlServer.Management.Smo.Scripter();
  797 + myscripter.Server = sqlserver;
  798 + myscripter.Options.FileName = Path.Combine(backupdirectory, filename);
  799 + myscripter.Options.AppendToFile = true;
  800 + myscripter.Options.ScriptSchema = true;
  801 + myscripter.Options.ScriptData = false;
  802 + myscripter.Options.SchemaQualify = true;
  803 + myscripter.Options.AllowSystemObjects = false;
  804 + myscripter.Options.IncludeHeaders = true;
  805 + myscripter.Options.IncludeIfNotExists = true;
  806 + myscripter.Options.ClusteredIndexes = true;
  807 + myscripter.Options.DriAll = true;
  808 + myscripter.Options.ToFileOnly = true;
  809 + myscripter.Options.Indexes = true;
  810 + myscripter.Options.Permissions = true;
  811 + myscripter.Options.WithDependencies = false;
  812 + myscripter.Options.AnsiFile=true;
  813 +
  814 + var o = new SqlSmoObject[] { sqldbobj };
  815 + //create the drop statement
  816 + myscripter.Options.ScriptDrops = true;
  817 + List<string> scripttexts = myscripter.Script(o).Cast<string>().ToList();
  818 + //create the create statement
  819 + myscripter.Options.ScriptDrops = false;
  820 + List<string> scripttexts2 = myscripter.Script(o).Cast<string>().ToList();
  821 + }
  822 + return;
  823 + }
  824 + #endregion BackupSqlScripts
  825 + #region BackupSqlData
  826 + public static void BackupSqlData(SQLDataBase sqld,DateTime? timestamp=null)
  827 + {
  828 + string sqlcs = sqld.SQLCS;
  829 + var sqlserver = SQLServerConnect(sqlcs);
  830 + if (sqlserver != null)
  831 + {
  832 + string backupts = (timestamp.HasValue ? timestamp.Value : DateTime.Now).ToString("yyyyMMddHHmmss");
  833 + bool createZip = sqld.Xml_CreateZip;
  834 + string backupdirectorypath = sqld.Xml_BackupTargetDirectoryPath;
  835 + string backupfilenamemask = sqld.Xml_BackupFileNameMask;
  836 +
  837 + var backupfilenameext = Path.GetExtension(backupfilenamemask); if (string.IsNullOrWhiteSpace(backupfilenameext)) { backupfilenameext = ".sql"; }
  838 + backupfilenamemask = Path.GetFileNameWithoutExtension(backupfilenamemask);
  839 +
  840 + var vars = new Dictionary<string, string>();
  841 + vars.Add(nameof(DBSubstitutionName.DATABASE), GetDBName(sqlcs));
  842 + vars.Add(nameof(DBSubstitutionName.DATASOURCE), GetDataSource(sqlcs));
  843 + vars.Add(nameof(DBSubstitutionName.BACKUPTS), backupts);
  844 + vars.Add(nameof(DBSubstitutionName.DBOTYPE), "TableData");
  845 +
  846 + string zipfilefullpath=null;
  847 + string tempbackupdirectorypath;
  848 + if (createZip)
  849 + {
  850 + vars[nameof(DBSubstitutionName.DBONAME)] = "";
  851 + vars[nameof(DBSubstitutionName.DBDATAGROUP)] = "";
  852 + string zipfilename = VRH.Common.StringConstructor.ResolveConstructor(vars, backupfilenamemask, "{}@@") + ".zip";
  853 + tempbackupdirectorypath = Path.Combine(backupdirectorypath, "TEMP_"+Path.GetFileNameWithoutExtension(zipfilename));
  854 + zipfilefullpath = Path.Combine(backupdirectorypath, zipfilename);
  855 + if (Directory.Exists(tempbackupdirectorypath)) { Directory.Delete(tempbackupdirectorypath, recursive: true); }
  856 + if (!Directory.Exists(tempbackupdirectorypath)) { Directory.CreateDirectory(tempbackupdirectorypath); }
  857 + }
  858 + else { tempbackupdirectorypath = backupdirectorypath; }
  859 +
  860 +
  861 + if (!Directory.Exists(backupdirectorypath)) { Directory.CreateDirectory(backupdirectorypath); }
  862 +
  863 +
  864 + List<string> backupfilepathlist = new List<string>();
  865 + foreach (var sqldata in sqld.Xml_SQLDataList)
  866 + {
  867 + vars[nameof(DBSubstitutionName.DBDATAGROUP)] = sqldata.Group;
  868 + var sqlfilescreated = ScriptOneDataGroup(sqlserver, tempbackupdirectorypath, backupfilenamemask + backupfilenameext, sqldata.TableNameList, vars);
  869 + backupfilepathlist.AddRange(sqlfilescreated);
  870 + }
  871 +
  872 + if (createZip)
  873 + {
  874 + string fullpathregex = Regex.Escape(string.Join(";",backupfilepathlist)).Replace(';','|');
  875 + ZipTools.CreateEntriesFromDirectoryContent(tempbackupdirectorypath, zipfilefullpath, "*.sql", fullpathregex, removearchivedfiles: true, storepathinzip: false);
  876 + }
  877 + }
  878 + }
  879 + private static List<string> ScriptOneDataGroup(Server sqlserver, string backupdirectorypath, string backupfilenamemask, List<string> tablenamelist, Dictionary<string, string> vars)
  880 + {
  881 + string filename =null , filefullname=null, lastfilefullname = null;
  882 + var myscripter = new Microsoft.SqlServer.Management.Smo.Scripter();
  883 + myscripter.Server = sqlserver;
  884 + myscripter.Options.ScriptSchema = false;
  885 + myscripter.Options.ScriptData = true;
  886 + myscripter.Options.NoCommandTerminator = true;
  887 + myscripter.Options.FileName = null;
  888 + myscripter.Options.ToFileOnly = true;
  889 + myscripter.Options.AnsiFile = true;
  890 + //myscripter.Options.AppendToFile = true;
  891 + //myscripter.Options.SchemaQualify = true;
  892 + //myscripter.Options.AllowSystemObjects = false;
  893 + //myscripter.Options.IncludeHeaders = true;
  894 + //myscripter.Options.IncludeIfNotExists = true;
  895 + //myscripter.Options.ClusteredIndexes = true;
  896 + //myscripter.Options.DriAll = true;
  897 + //myscripter.Options.Indexes = true;
  898 + //myscripter.Options.Permissions = true;
  899 + //myscripter.Options.WithDependencies = false;
  900 + var backupfilelist = new List<string>();
  901 + var urnstoscript = new UrnCollection();
  902 + var deletefromlist = new List<string>();
  903 + foreach (var tn in tablenamelist)
  904 + {
  905 + string tn_dbname = tn.Split('.')[0];
  906 + tn_dbname = sqlserver.ConnectionContext.DatabaseName;
  907 + string tn_schemaname = tn.Split('.')[1];
  908 + string tn_name = tn.Split('.')[2];
  909 + vars[nameof(DBSubstitutionName.DBONAME)] = $"{tn_schemaname}.{tn_name}";
  910 + filename = VRH.Common.StringConstructor.ResolveConstructor(vars, backupfilenamemask, "{}@@");
  911 + filefullname = Path.Combine(backupdirectorypath, filename);
  912 + if (lastfilefullname!=filefullname && lastfilefullname!=null)
  913 + {
  914 + backupfilelist.Add(CreateOneSqlFile(urnstoscript, deletefromlist,sqlserver, myscripter, lastfilefullname));
  915 + lastfilefullname = filefullname;
  916 + deletefromlist.Clear();
  917 + urnstoscript.Clear();
  918 + }
  919 + //powershell: $Urn = "$($sqlserver.Urn)/Database[@Name='$($tuple.Database)']/Table[@Name='$($tuple.Table)' and @Schema='$($tuple.Schema)']";
  920 + string urnstring = $"{sqlserver.Urn}/Database[@Name='{tn_dbname}']/Table[@Name='{tn_name}' and @Schema='{tn_schemaname}']";
  921 + deletefromlist=deletefromlist.Prepend($"DELETE FROM [{tn_dbname}].[{tn_schemaname}].[{tn_name}]\r\nGO").ToList();// törlés sorrendje fordított a létrehozáséhoz képest!
  922 + urnstoscript.Add(new Microsoft.SqlServer.Management.Sdk.Sfc.Urn(urnstring));
  923 + lastfilefullname = filefullname;
  924 + }
  925 + backupfilelist.Add(CreateOneSqlFile(urnstoscript, deletefromlist,sqlserver,myscripter,filefullname));
  926 + return backupfilelist;
  927 + }
  928 + private static string CreateOneSqlFile( UrnCollection urnstoscript,List<string> deletefromlist,Server sqlserver,Scripter myscripter, string sqlfilefullname)
  929 + {
  930 + myscripter.Options.FileName = sqlfilefullname;
  931 + if (urnstoscript.Any()) { myscripter.EnumScript(urnstoscript); }
  932 + var scripttext = File.ReadAllText(sqlfilefullname);
  933 + deletefromlist = deletefromlist.Prepend($"use [{sqlserver.ConnectionContext.DatabaseName}]").ToList();
  934 + File.WriteAllText(sqlfilefullname, string.Join("\r\n",deletefromlist) +"\r\n\r\n" + scripttext, Encoding.UTF8);//????????????????
  935 + return sqlfilefullname;
  936 + }
  937 + #endregion BackupSqlData
  938 + #endregion private methods
  939 + }
  940 + #endregion class SQLDataBaseManager
  941 +
  942 + #region SQLDataBaseManager class
  943 + public class SQLDataBaseManagerXmlProcessor : XmlParser
  944 + {
  945 + #region fields
  946 + private List<SQLDataBase> _sqldatabaselist;
  947 + #endregion fields
  948 + #region constructor
  949 + public SQLDataBaseManagerXmlProcessor(string xmlcs, string basefolder, string lcid) : base(xmlcs, basefolder, lcid, null)
  950 + {
  951 + _sqldatabaselist = new List<SQLDataBase>();
  952 + var schtskxmllist = GetAllXElements(nameof(SQLDataBase.XmlStructure.SQLDataBase));
  953 + var common = new SQLDataBase()
  954 + {
  955 + Xml_CreateZip = GetValue(nameof(SQLDataBase.XmlStructure.Attributes.CreateZip), this.RootElement, SQLDataBase.XmlStructure.Attributes.CreateZip.Values.DEFAULT),
  956 + Xml_BackupFileNameMask = GetValue(nameof(SQLDataBase.XmlStructure.Attributes.BackupFileNameMask), this.RootElement, SQLDataBase.XmlStructure.Attributes.BackupFileNameMask.Values.DEFAULT),
  957 + Xml_RestoreFileNameMask = GetValue(nameof(SQLDataBase.XmlStructure.Attributes.RestoreFileNameMask), this.RootElement, SQLDataBase.XmlStructure.Attributes.RestoreFileNameMask.Values.DEFAULT),
  958 + Xml_BackupTargetDirectoryPath = GetValue(nameof(SQLDataBase.XmlStructure.Attributes.BackupTargetDirectoryPath), this.RootElement, SQLDataBase.XmlStructure.Attributes.BackupTargetDirectoryPath.Values.DEFAULT),
  959 + Xml_PhysicalFilesDirectoryPath = GetValue(nameof(SQLDataBase.XmlStructure.Attributes.PhysicalFilesDirectoryPath), this.RootElement, SQLDataBase.XmlStructure.Attributes.PhysicalFilesDirectoryPath.Values.DEFAULT),
  960 +
  961 + };
  962 + if (schtskxmllist != null && schtskxmllist.Any())
  963 + {
  964 + foreach (var schtskxml in schtskxmllist) { var st = new SQLDataBase(schtskxml,common); if (st.Valid) { _sqldatabaselist.Add(st); } }
  965 + }
  966 + }
  967 + #endregion constructor
  968 + #region GetDefinitionList
  969 + public List<SQLDataBase> GetDefinitionList() { return _sqldatabaselist; }
  970 + #endregion GetDefinitionList
  971 + }
  972 + #endregion SQLDataBaseManager class
  973 +
  974 + #region SQLDataBase class
  975 + public class SQLDataBase : XmlLinqBase
  976 + {
  977 + #region fields
  978 + public bool Valid = true;
  979 + public bool Xml_CreateZip= true;
  980 + public string Xml_Key;
  981 + public string Xml_Description;
  982 + public string Xml_BackupFileNameMask;
  983 + public string Xml_RestoreFileNameMask;
  984 + public string Xml_BackupTargetDirectoryPath;
  985 + public string Xml_SQLConnectionString;
  986 + public string Xml_PhysicalFilesDirectoryPath;
  987 + public List<SQLData> Xml_SQLDataList;
  988 +
  989 + public string DBName;
  990 + public string DataSource;
  991 + public SQLDataBaseManagerCore.SQLDBStatus Status;
  992 + public string PhysicalFilesDirectoryPath;
  993 + public string SQLCS
  994 + {
  995 + get { return XmlProcessing.ConnectionStringStore.GetSQL(this.Xml_SQLConnectionString); }
  996 + }
  997 + #endregion fields
  998 +
  999 + #region basic constructor
  1000 + public SQLDataBase() { }
  1001 + #endregion basic constructor
  1002 + #region xml constructor
  1003 + public SQLDataBase(XElement sqldatabasexml, SQLDataBase common)
  1004 + {
  1005 + Valid = true;
  1006 + string ATTRIBUTEMANDATORY = nameof(XmlStructure.SQLDataBase) + " attribute is mandatory! Name: {0}";
  1007 + Xml_Key= GetValue(nameof(XmlStructure.SQLDataBase.Attributes.Key), sqldatabasexml, XmlStructure.SQLDataBase.Attributes.Key.Values.DEFAULT);
  1008 + Xml_Description = sqldatabasexml.Attribute(XName.Get(nameof(XmlStructure.SQLDataBase.Attributes.Description)))?.Value;
  1009 + if (string.IsNullOrWhiteSpace(Xml_Description)) { throw new ApplicationException(string.Format(ATTRIBUTEMANDATORY, nameof(XmlStructure.SQLDataBase.Attributes.Description))); }
  1010 + Xml_BackupFileNameMask = GetValue(nameof(XmlStructure.SQLDataBase.Attributes.BackupFileNameMask), sqldatabasexml, common.Xml_BackupFileNameMask);
  1011 + Xml_RestoreFileNameMask = GetValue(nameof(XmlStructure.SQLDataBase.Attributes.RestoreFileNameMask), sqldatabasexml, common.Xml_RestoreFileNameMask);
  1012 + Xml_BackupTargetDirectoryPath = GetValue(nameof(XmlStructure.SQLDataBase.Attributes.BackupTargetDirectoryPath), sqldatabasexml, common.Xml_BackupTargetDirectoryPath);
  1013 + Xml_SQLConnectionString = GetValue(nameof(XmlStructure.SQLDataBase.Attributes.SQLConnectionString), sqldatabasexml, XmlStructure.SQLDataBase.Attributes.SQLConnectionString.Values.DEFAULT);
  1014 +
  1015 + var sqldataXmlList = GetAllXElements(sqldatabasexml, nameof(XmlStructure.SQLDataBase.SQLData));
  1016 + Xml_CreateZip = GetValue(nameof(XmlStructure.SQLDataBase.Attributes.CreateZip), sqldatabasexml, common.Xml_CreateZip);
  1017 + Xml_PhysicalFilesDirectoryPath = GetValue(nameof(XmlStructure.SQLDataBase.Attributes.PhysicalFilesDirectoryPath), sqldatabasexml, common.Xml_PhysicalFilesDirectoryPath);
  1018 + Xml_SQLDataList = new List<SQLData>();
  1019 + if (sqldataXmlList!=null) { foreach (var sqldataXml in sqldataXmlList) { Xml_SQLDataList.Add(new SQLData(sqldataXml)); } }
  1020 + }
  1021 + #endregion xml constructor
  1022 + #region cloner constructor
  1023 + public SQLDataBase(SQLDataBase sqld)
  1024 + {
  1025 + Valid = sqld.Valid;
  1026 + Xml_CreateZip = sqld.Xml_CreateZip;
  1027 + Xml_Key = sqld.Xml_Key;
  1028 + Xml_Description = sqld.Xml_Description;
  1029 + Xml_BackupFileNameMask = sqld.Xml_BackupFileNameMask;
  1030 + Xml_RestoreFileNameMask = sqld.Xml_RestoreFileNameMask;
  1031 + Xml_BackupTargetDirectoryPath = sqld.Xml_BackupTargetDirectoryPath;
  1032 + Xml_SQLConnectionString = sqld.Xml_SQLConnectionString;
  1033 + Xml_PhysicalFilesDirectoryPath = sqld.Xml_PhysicalFilesDirectoryPath;
  1034 + Xml_SQLDataList = sqld.Xml_SQLDataList.Select(x => x).ToList();
  1035 + }
  1036 + #endregion cloner constructor
  1037 + #region XmlStructure
  1038 + public static class XmlStructure
  1039 + {
  1040 + public static class Attributes
  1041 + {
  1042 + public static class BackupFileNameMask { public static class Values { public const string DEFAULT = ""; } }
  1043 + public static class RestoreFileNameMask { public static class Values { public const string DEFAULT = ""; } }
  1044 + public static class BackupTargetDirectoryPath { public static class Values { public const string DEFAULT = ""; } }
  1045 + public static class PhysicalFilesDirectoryPath { public static class Values { public const string DEFAULT = ""; } }
  1046 +
  1047 +
  1048 + public static class CreateZip{ public static class Values { public const bool DEFAULT = true; } }
  1049 + }
  1050 + public static class SQLDataBase
  1051 + {
  1052 + public static class Attributes
  1053 + {
  1054 + public static class Key { public static class Values { public const string DEFAULT = ""; } }
  1055 + public static class Description { }
  1056 + public static class SQLConnectionString { public static class Values { public const string DEFAULT = ""; } }
  1057 + public static class BackupFileNameMask { }
  1058 + public static class RestoreFileNameMask { }
  1059 + public static class BackupTargetDirectoryPath { }
  1060 + public static class CreateZip { }
  1061 + public static class PhysicalFilesDirectoryPath { }
  1062 + }
  1063 + public static class SQLData
  1064 + {
  1065 + public static class Values { public const string DEFAULT = ""; }
  1066 + public static class Attributes
  1067 + {
  1068 + public static class Group { public static class Values { public const string DEFAULT = ""; } }
  1069 + }
  1070 + }
  1071 + }
  1072 + }
  1073 + #endregion XmlStructure
  1074 + #region SQLData class
  1075 + public class SQLData : XmlLinqBase
  1076 + {
  1077 + #region fields
  1078 + public string Group = "";
  1079 + public List<string> TableNameList;
  1080 + #endregion fields
  1081 + #region constructors
  1082 + public SQLData() { }
  1083 + public SQLData(SQLData sqld) { Group = sqld.Group; TableNameList = sqld.TableNameList.Select(x => x).ToList(); }
  1084 + public SQLData(XElement sqldXml)
  1085 + {
  1086 + Group = GetValue(nameof(XmlStructure.SQLDataBase.SQLData.Attributes.Group), sqldXml, XmlStructure.SQLDataBase.SQLData.Attributes.Group.Values.DEFAULT);
  1087 + string tablenamecommalist = GetValue(sqldXml, XmlStructure.SQLDataBase.SQLData.Values.DEFAULT);
  1088 + if (string.IsNullOrWhiteSpace(tablenamecommalist)) { TableNameList = new List<string>(); }
  1089 + else
  1090 + {
  1091 + var temptablenamelist = tablenamecommalist.Split(new char[]{ ','},StringSplitOptions.RemoveEmptyEntries).ToList();
  1092 + TableNameList = new List<string>();
  1093 + foreach (string tn in temptablenamelist)
  1094 + {
  1095 + var tnparts = tn.Split('.');
  1096 + string fullqualifiedname = null;
  1097 + switch (tnparts.Length)
  1098 + {
  1099 + case 1: fullqualifiedname = $"{{DBNAME}}.dbo.{tnparts[0]}"; break;
  1100 + case 2: fullqualifiedname = $"{{DBNAME}}.{tnparts[0]}.{tnparts[1]}"; break;
  1101 + case 3: fullqualifiedname = tn; break;
  1102 + default: throw new Exception($"Table name is incorrect! {nameof(SQLData)} Type:{Group}, table name:{tn}.");
  1103 + }
  1104 + TableNameList.Add(fullqualifiedname);
  1105 + }
  1106 + }
  1107 + }
  1108 + #endregion constructors
  1109 + }
  1110 + #endregion SQLData class
  1111 + }
  1112 + #endregion SQLDataBase class
  1113 +}
Vrh.Log4Pro.MaintenanceConsole/Manager - ScheduledTaskManager.cs
@@ -12,72 +12,56 @@ using Microsoft.Web.Administration; @@ -12,72 +12,56 @@ using Microsoft.Web.Administration;
12 using System.Management; 12 using System.Management;
13 using System.Diagnostics; 13 using System.Diagnostics;
14 14
  15 +using Vrh.Log4Pro.MaintenanceConsole.MenuNS;
  16 +using Vrh.Log4Pro.MaintenanceConsole.ColorConsoleNS;
  17 +using Vrh.Log4Pro.MaintenanceConsole.ToolsNS;
  18 +using Vrh.Log4Pro.MaintenanceConsole.CommandLineParserNS;
  19 +
15 using Vrh.XmlProcessing; 20 using Vrh.XmlProcessing;
16 using VRH.Common; 21 using VRH.Common;
17 using System.Xml.Linq; 22 using System.Xml.Linq;
18 using System.Text.RegularExpressions; 23 using System.Text.RegularExpressions;
19 24
20 -namespace Vrh.Log4Pro.MaintenanceConsole 25 +namespace Vrh.Log4Pro.MaintenanceConsole.ScheduledTaskManagerNS
21 { 26 {
22 #region ScheduledTaskManager class 27 #region ScheduledTaskManager class
23 - public static class ScheduledTaskmanagerManager 28 + public static class ScheduledTaskManager
24 { 29 {
25 - private const string XMLCONNECTIONSTRING = "file=Config.Xml;element=ScheduledTasks;"; 30 + private const string XMLCONNECTIONSTRING = "config=MAINTENANCECONSOLE_SCHEDULEDTASKMANAGER;";
  31 + private const string XMLCONNECTIONSTRING_DEFAULT = "file=Config.Xml;element=ScheduledTasks;";
26 32
27 #region Execute 33 #region Execute
28 public static object Execute(object o1 = null, object o2 = null) 34 public static object Execute(object o1 = null, object o2 = null)
29 { 35 {
30 - var args = o1 as string[];  
31 - var module = CommandLine.GetCommandLineArgument(args, "-MODULE");  
32 - var functionkey = CommandLine.GetCommandLineArgument(args, "-FUNCTION"); 36 + var args = (o1 as Menu.ExecutorParameter).Args;
  37 + var functionkey = CommandLine.GetCommandLineArgument(args, CLP.CMD_FUNCTION);
33 38
34 - string xmlcs = XMLCONNECTIONSTRING;  
35 - var config = new ScheduledTaskManagerCoreXmlProcessor(xmlcs, "", "hu-HU"); 39 + var config = new ScheduledTaskManagerXmlProcessor(XMLCONNECTIONSTRING, "", "hu-HU");
  40 + var ep = new Menu.ExecutorParameter(config, args);
36 var menufunctions = new Menu("Manage Scheduled tasks", "Select the management function!") 41 var menufunctions = new Menu("Manage Scheduled tasks", "Select the management function!")
37 - .AddMenuItem(new Menu.Item("INS", "Install scheduled task", Install))  
38 - .AddMenuItem(new Menu.Item("UIN", "Uninstall scheduled task", Uninstall))  
39 - .AddMenuItem(new Menu.Item("RUN", "Start scheduled task", Run))  
40 - .AddMenuItem(new Menu.Item("END", "Stop scheduled task", End))  
41 - .AddMenuItem(new Menu.Item("ENA", "Enable scheduled task", Enable))  
42 - .AddMenuItem(new Menu.Item("DIS", "Disable scheduled task", Disable))  
43 - .AddMenuItem(new Menu.Item("CHP", "Change scheduled task priority", ChangePriority))  
44 - .SetSelectionMode(Menu.SelectionMode.Single);  
45 -  
46 - while (true)  
47 - {  
48 - Menu.Selection sr;  
49 -  
50 - menufunctions.DisplayTitle();  
51 - DisplayTasks(config);  
52 - menufunctions.DisplayItems();  
53 - sr = menufunctions.Select(functionkey);  
54 - if (sr.Result == Menu.SelectionResult.Exit) { break; }  
55 - else if (sr.Result == Menu.SelectionResult.None) { continue; }  
56 - else if (sr.Result == Menu.SelectionResult.Error) { continue; }  
57 - menufunctions.SetExecutorParameters(sr, new ScheduledTaskExecutorParameter (config,args));  
58 - menufunctions.ExecuteSelection(sr.SelectedKeyList);  
59 - if (menufunctions.GetCommandMode()) { break; }  
60 - } 42 + .AddMenuItem(new Menu.Item(CLP.Module.ScheduledTaskManager.Function.Install.KEY, "Install scheduled task", Install, ep))
  43 + .AddMenuItem(new Menu.Item(CLP.Module.ScheduledTaskManager.Function.Install.KEY, "Uninstall scheduled task", Uninstall, ep))
  44 + .AddMenuItem(new Menu.Item(CLP.Module.ScheduledTaskManager.Function.Install.KEY, "Start scheduled task", Run, ep))
  45 + .AddMenuItem(new Menu.Item(CLP.Module.ScheduledTaskManager.Function.Install.KEY, "Stop scheduled task", End, ep))
  46 + .AddMenuItem(new Menu.Item(CLP.Module.ScheduledTaskManager.Function.Install.KEY, "Enable scheduled task", Enable, ep))
  47 + .AddMenuItem(new Menu.Item(CLP.Module.ScheduledTaskManager.Function.Install.KEY, "Disable scheduled task", Disable, ep))
  48 + .AddMenuItem(new Menu.Item(CLP.Module.ScheduledTaskManager.Function.Install.KEY, "Change scheduled task priority", ChangePriority, ep))
  49 + .SetSelectionMode(Menu.SelectionMode.Single)
  50 + .SetMenuHeaderDisplayer(ScheduledTaskListDisplayer);
  51 + menufunctions.ExecuteMenu(functionkey);
61 return o2; 52 return o2;
62 } 53 }
63 #endregion Execute 54 #endregion Execute
64 - #region ScheduledTaskFunctionExecutorParameter  
65 - public class ScheduledTaskExecutorParameter  
66 - {  
67 - public ScheduledTaskExecutorParameter(ScheduledTaskManagerCoreXmlProcessor cfg, string[] args) { Config = cfg;Args = args; }  
68 - public ScheduledTaskManagerCoreXmlProcessor Config;  
69 - public string[] Args;  
70 - }  
71 - #endregion ScheduledTaskFunctionExecutorParameter 55 +
72 #region First level Executors with UI 56 #region First level Executors with UI
73 private static object ChangePriority(object parameter, object o) 57 private static object ChangePriority(object parameter, object o)
74 { 58 {
75 - var config = (parameter as ScheduledTaskExecutorParameter).Config;  
76 - var args = (parameter as ScheduledTaskExecutorParameter).Args; 59 + var config = (parameter as Menu.ExecutorParameter).GetConfig<ScheduledTaskManagerXmlProcessor>();
  60 + var args = (parameter as Menu.ExecutorParameter).Args;
77 61
78 - var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, "-TASKS"); 62 + var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.ScheduledTaskManager.Function.CMD_TASKS);
79 63
80 - var menufolders = DisplayTasks(config, $"Select the scheduled task(s) to manage with function '{nameof(ChangePriority)}'!"); 64 + var menufolders = DisplayScheduledTaskMenu(config, $"Select the scheduled task(s) to manage with function '{nameof(ChangePriority)}'!",silent:true);
81 65
82 Menu.Selection sr = menufolders.Select(selectedtaskindexes); 66 Menu.Selection sr = menufolders.Select(selectedtaskindexes);
83 if (sr.Result == Menu.SelectionResult.Exit) { return o; } 67 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
@@ -87,7 +71,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -87,7 +71,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
87 else { } 71 else { }
88 foreach (var p in sr.SelectedParameterList) 72 foreach (var p in sr.SelectedParameterList)
89 { 73 {
90 - ScheduledTask st = p as ScheduledTask; 74 + ScheduledTask st = p.Parameters as ScheduledTask;
91 try 75 try
92 { 76 {
93 ScheduledTaskManagerCore.SetPriority(st.Xml_Name,st.Xml_Priority); 77 ScheduledTaskManagerCore.SetPriority(st.Xml_Name,st.Xml_Priority);
@@ -99,12 +83,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -99,12 +83,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole
99 } 83 }
100 private static object Disable(object parameter, object o) 84 private static object Disable(object parameter, object o)
101 { 85 {
102 - var config = (parameter as ScheduledTaskExecutorParameter).Config;  
103 - var args = (parameter as ScheduledTaskExecutorParameter).Args; 86 + var config = (parameter as Menu.ExecutorParameter).GetConfig<ScheduledTaskManagerXmlProcessor>();
  87 + var args = (parameter as Menu.ExecutorParameter).Args;
104 88
105 - var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, "-TASKS"); 89 + var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.ScheduledTaskManager.Function.CMD_TASKS);
106 90
107 - var menufolders = DisplayTasks(config, $"Select the scheduled task(s) to manage with function '{nameof(Disable)}'!"); 91 + var menufolders = DisplayScheduledTaskMenu(config, $"Select the scheduled task(s) to manage with function '{nameof(Disable)}'!", silent:true);
108 92
109 Menu.Selection sr = menufolders.Select(selectedtaskindexes); 93 Menu.Selection sr = menufolders.Select(selectedtaskindexes);
110 if (sr.Result == Menu.SelectionResult.Exit) { return o; } 94 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
@@ -114,7 +98,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -114,7 +98,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
114 else { } 98 else { }
115 foreach (var p in sr.SelectedParameterList) 99 foreach (var p in sr.SelectedParameterList)
116 { 100 {
117 - ScheduledTask st = p as ScheduledTask; 101 + ScheduledTask st = p.Parameters as ScheduledTask;
118 try 102 try
119 { 103 {
120 ScheduledTaskManagerCore.DisableTask(st.Xml_Name); 104 ScheduledTaskManagerCore.DisableTask(st.Xml_Name);
@@ -126,12 +110,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -126,12 +110,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole
126 } 110 }
127 private static object Enable(object parameter, object o) 111 private static object Enable(object parameter, object o)
128 { 112 {
129 - var config = (parameter as ScheduledTaskExecutorParameter).Config;  
130 - var args = (parameter as ScheduledTaskExecutorParameter).Args; 113 + var config = (parameter as Menu.ExecutorParameter).GetConfig<ScheduledTaskManagerXmlProcessor>();
  114 + var args = (parameter as Menu.ExecutorParameter).Args;
131 115
132 - var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, "-TASKS"); 116 + var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.ScheduledTaskManager.Function.CMD_TASKS);
133 117
134 - var menufolders = DisplayTasks(config, $"Select the scheduled task(s) to manage with function '{nameof(Enable)}'!"); 118 + var menufolders = DisplayScheduledTaskMenu(config, $"Select the scheduled task(s) to manage with function '{nameof(Enable)}'!", silent: true);
135 119
136 Menu.Selection sr = menufolders.Select(selectedtaskindexes); 120 Menu.Selection sr = menufolders.Select(selectedtaskindexes);
137 if (sr.Result == Menu.SelectionResult.Exit) { return o; } 121 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
@@ -141,7 +125,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -141,7 +125,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
141 else { } 125 else { }
142 foreach (var p in sr.SelectedParameterList) 126 foreach (var p in sr.SelectedParameterList)
143 { 127 {
144 - ScheduledTask st = p as ScheduledTask; 128 + ScheduledTask st = p.Parameters as ScheduledTask;
145 try 129 try
146 { 130 {
147 ScheduledTaskManagerCore.EnableTask(st.Xml_Name); 131 ScheduledTaskManagerCore.EnableTask(st.Xml_Name);
@@ -153,12 +137,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -153,12 +137,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole
153 } 137 }
154 private static object End(object parameter, object o) 138 private static object End(object parameter, object o)
155 { 139 {
156 - var config = (parameter as ScheduledTaskExecutorParameter).Config;  
157 - var args = (parameter as ScheduledTaskExecutorParameter).Args; 140 + var config = (parameter as Menu.ExecutorParameter).GetConfig<ScheduledTaskManagerXmlProcessor>();
  141 + var args = (parameter as Menu.ExecutorParameter).Args;
158 142
159 - var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, "-TASKS"); 143 + var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.ScheduledTaskManager.Function.CMD_TASKS);
160 144
161 - var menufolders = DisplayTasks(config, $"Select the scheduled task(s) to manage with function '{nameof(End)}'!"); 145 + var menufolders = DisplayScheduledTaskMenu(config, $"Select the scheduled task(s) to manage with function '{nameof(End)}'!", silent: true);
162 146
163 Menu.Selection sr = menufolders.Select(selectedtaskindexes); 147 Menu.Selection sr = menufolders.Select(selectedtaskindexes);
164 if (sr.Result == Menu.SelectionResult.Exit) { return o; } 148 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
@@ -168,7 +152,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -168,7 +152,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
168 else { } 152 else { }
169 foreach (var p in sr.SelectedParameterList) 153 foreach (var p in sr.SelectedParameterList)
170 { 154 {
171 - ScheduledTask st = p as ScheduledTask; 155 + ScheduledTask st = p.Parameters as ScheduledTask;
172 try 156 try
173 { 157 {
174 ScheduledTaskManagerCore.EndTask(st.Xml_Name); 158 ScheduledTaskManagerCore.EndTask(st.Xml_Name);
@@ -180,12 +164,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -180,12 +164,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole
180 } 164 }
181 private static object Run(object parameter, object o) 165 private static object Run(object parameter, object o)
182 { 166 {
183 - var config = (parameter as ScheduledTaskExecutorParameter).Config;  
184 - var args = (parameter as ScheduledTaskExecutorParameter).Args; 167 + var config = (parameter as Menu.ExecutorParameter).GetConfig<ScheduledTaskManagerXmlProcessor>();
  168 + var args = (parameter as Menu.ExecutorParameter).Args;
185 169
186 - var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, "-TASKS"); 170 + var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.ScheduledTaskManager.Function.CMD_TASKS);
187 171
188 - var menufolders = DisplayTasks(config, $"Select the scheduled task(s) to manage with function '{nameof(Run)}'!"); 172 + var menufolders = DisplayScheduledTaskMenu(config, $"Select the scheduled task(s) to manage with function '{nameof(Run)}'!", silent: true);
189 173
190 Menu.Selection sr = menufolders.Select(selectedtaskindexes); 174 Menu.Selection sr = menufolders.Select(selectedtaskindexes);
191 if (sr.Result == Menu.SelectionResult.Exit) { return o; } 175 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
@@ -195,7 +179,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -195,7 +179,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
195 else { } 179 else { }
196 foreach (var p in sr.SelectedParameterList) 180 foreach (var p in sr.SelectedParameterList)
197 { 181 {
198 - ScheduledTask st = p as ScheduledTask; 182 + ScheduledTask st = p.Parameters as ScheduledTask;
199 try 183 try
200 { 184 {
201 ScheduledTaskManagerCore.RunTask(st.Xml_Name); 185 ScheduledTaskManagerCore.RunTask(st.Xml_Name);
@@ -210,12 +194,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -210,12 +194,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole
210 } 194 }
211 private static object Uninstall(object parameter, object o) 195 private static object Uninstall(object parameter, object o)
212 { 196 {
213 - var config = (parameter as ScheduledTaskExecutorParameter).Config;  
214 - var args = (parameter as ScheduledTaskExecutorParameter).Args; 197 + var config = (parameter as Menu.ExecutorParameter).GetConfig<ScheduledTaskManagerXmlProcessor>();
  198 + var args = (parameter as Menu.ExecutorParameter).Args;
215 199
216 - var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, "-TASKS"); 200 + var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.ScheduledTaskManager.Function.CMD_TASKS);
217 201
218 - var menufolders = DisplayTasks(config, $"Select the scheduled task(s) to manage with function '{nameof(Uninstall)}'!"); 202 + var menufolders = DisplayScheduledTaskMenu(config, $"Select the scheduled task(s) to manage with function '{nameof(Uninstall)}'!", silent: true);
219 203
220 Menu.Selection sr = menufolders.Select(selectedtaskindexes); 204 Menu.Selection sr = menufolders.Select(selectedtaskindexes);
221 if (sr.Result == Menu.SelectionResult.Exit) { return o; } 205 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
@@ -225,7 +209,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -225,7 +209,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
225 else { } 209 else { }
226 foreach (var p in sr.SelectedParameterList) 210 foreach (var p in sr.SelectedParameterList)
227 { 211 {
228 - ScheduledTask st = p as ScheduledTask; 212 + ScheduledTask st = p.Parameters as ScheduledTask;
229 try 213 try
230 { 214 {
231 ScheduledTaskManagerCore.EndTask(st.Xml_Name); 215 ScheduledTaskManagerCore.EndTask(st.Xml_Name);
@@ -238,12 +222,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -238,12 +222,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole
238 } 222 }
239 private static object Install(object parameter, object o) 223 private static object Install(object parameter, object o)
240 { 224 {
241 - var config = (parameter as ScheduledTaskExecutorParameter).Config;  
242 - var args = (parameter as ScheduledTaskExecutorParameter).Args; 225 + var config = (parameter as Menu.ExecutorParameter).GetConfig<ScheduledTaskManagerXmlProcessor>();
  226 + var args = (parameter as Menu.ExecutorParameter).Args;
243 227
244 - var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, "-TASKS"); 228 + var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.ScheduledTaskManager.Function.CMD_TASKS);
245 229
246 - var menufolders = DisplayTasks(config, $"Select the scheduled task(s) to manage with function '{nameof(Install)}'!"); 230 + var menufolders = DisplayScheduledTaskMenu(config, $"Select the scheduled task(s) to manage with function '{nameof(Install)}'!", silent: true);
247 231
248 Menu.Selection sr = menufolders.Select(selectedtaskindexes); 232 Menu.Selection sr = menufolders.Select(selectedtaskindexes);
249 if (sr.Result == Menu.SelectionResult.Exit) { return o; } 233 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
@@ -253,7 +237,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -253,7 +237,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
253 else { } 237 else { }
254 foreach (var p in sr.SelectedParameterList) 238 foreach (var p in sr.SelectedParameterList)
255 { 239 {
256 - ScheduledTask st = p as ScheduledTask; 240 + ScheduledTask st = p.Parameters as ScheduledTask;
257 try 241 try
258 { 242 {
259 ScheduledTaskManagerCore.EndTask(st.Xml_Name); 243 ScheduledTaskManagerCore.EndTask(st.Xml_Name);
@@ -269,27 +253,28 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -269,27 +253,28 @@ namespace Vrh.Log4Pro.MaintenanceConsole
269 253
270 #region private methods 254 #region private methods
271 #region private DisplayTasks 255 #region private DisplayTasks
272 - private static Menu DisplayTasks(ScheduledTaskManagerCoreXmlProcessor config,string prompt = null) 256 + private static void ScheduledTaskListDisplayer() { DisplayScheduledTaskMenu(); }
  257 + private static Menu DisplayScheduledTaskMenu(ScheduledTaskManagerXmlProcessor config = null, string prompt = null, bool silent = false)
273 { 258 {
  259 + if (config == null) { config = new ScheduledTaskManagerXmlProcessor(XMLCONNECTIONSTRING, "", "hu-HU"); }
274 List<ScheduledTask> schtskdefList = config.GetDefinitionList(); 260 List<ScheduledTask> schtskdefList = config.GetDefinitionList();
275 - var menufct = new Menu("Scheduled tasks",prompt) 261 + var menufct = new Menu("Scheduled tasks", prompt)
276 .SetMenuItemDisplayer(DisplayTaskInfo) 262 .SetMenuItemDisplayer(DisplayTaskInfo)
277 - .SetSelectionMode(Menu.SelectionMode.Multi)  
278 - .SetHeaderWidth(4); 263 + .SetSelectionMode(Menu.SelectionMode.Multi);
279 menufct.ClearMenuItemList(); 264 menufct.ClearMenuItemList();
280 foreach (var schtskdef in schtskdefList) 265 foreach (var schtskdef in schtskdefList)
281 { 266 {
282 - var st = CollectTaskInfo(schtskdef);  
283 - menufct.AddMenuItem(new Menu.Item(null, null, null, st)); 267 + var st = ScheduledTaskManagerCore.CollectTaskInfo(schtskdef);
  268 + menufct.AddMenuItem(new Menu.Item(schtskdef.Xml_Key, null, null, new Menu.ExecutorParameter(pars: st)));
284 } 269 }
285 - menufct.DisplayItems(1); 270 + if (!silent) { menufct.DisplayItems(1); }
286 return menufct; 271 return menufct;
287 } 272 }
288 #endregion private DisplayTasks 273 #endregion private DisplayTasks
289 #region private method: DisplayTaskInfo 274 #region private method: DisplayTaskInfo
290 private static object DisplayTaskInfo(object obj, int lineix) 275 private static object DisplayTaskInfo(object obj, int lineix)
291 { 276 {
292 - ScheduledTask st = obj as ScheduledTask; 277 + ScheduledTask st = (obj as Menu.ExecutorParameter).Parameters as ScheduledTask;
293 if (lineix == 0) 278 if (lineix == 0)
294 { 279 {
295 ColorConsole.Write($"{st.Xml_Name}", ConsoleColor.Black, ConsoleColor.White); 280 ColorConsole.Write($"{st.Xml_Name}", ConsoleColor.Black, ConsoleColor.White);
@@ -316,8 +301,15 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -316,8 +301,15 @@ namespace Vrh.Log4Pro.MaintenanceConsole
316 return null; 301 return null;
317 } 302 }
318 #endregion private method: DisplayTaskInfo 303 #endregion private method: DisplayTaskInfo
319 - #region private CollectTaskInfo  
320 - private static ScheduledTask CollectTaskInfo(ScheduledTask schtsk) 304 + #endregion private methods
  305 + }
  306 + #endregion ScheduledTaskManager class
  307 +
  308 + #region class ScheduledTaskManagerCore
  309 + public static class ScheduledTaskManagerCore
  310 + {
  311 + #region public CollectTaskInfo
  312 + public static ScheduledTask CollectTaskInfo(ScheduledTask schtsk)
321 { 313 {
322 string status = Tools.ExecuteAndGetStdIo("schtasks.exe", $"/Query /FO TABLE /TN {schtsk.Xml_Name}"); 314 string status = Tools.ExecuteAndGetStdIo("schtasks.exe", $"/Query /FO TABLE /TN {schtsk.Xml_Name}");
323 315
@@ -326,7 +318,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -326,7 +318,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
326 var statuslines = status.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); 318 var statuslines = status.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
327 var statussplitted = statuslines[3] 319 var statussplitted = statuslines[3]
328 .Split(new string[] { " ", "+" }, StringSplitOptions.RemoveEmptyEntries); 320 .Split(new string[] { " ", "+" }, StringSplitOptions.RemoveEmptyEntries);
329 - if (statussplitted[1]=="N/A") 321 + if (statussplitted[1] == "N/A")
330 { 322 {
331 schtsk.NextRun = ""; 323 schtsk.NextRun = "";
332 schtsk.Priority = -1; 324 schtsk.Priority = -1;
@@ -354,14 +346,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -354,14 +346,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole
354 } 346 }
355 return schtsk; 347 return schtsk;
356 } 348 }
357 - #endregion private CollectTaskInfo  
358 - #endregion private methods  
359 - }  
360 - #endregion ScheduledTaskManager class 349 + #endregion public CollectTaskInfo
361 350
362 - #region class ScheduledTaskManagerCore  
363 - public static class ScheduledTaskManagerCore  
364 - {  
365 public static int GetPriority(string taskname) 351 public static int GetPriority(string taskname)
366 { 352 {
367 try 353 try
@@ -409,7 +395,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -409,7 +395,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
409 public static void CreateTask(ScheduledTask st) 395 public static void CreateTask(ScheduledTask st)
410 { 396 {
411 string taskname = st.Xml_Name; 397 string taskname = st.Xml_Name;
412 - string tasktorunpars = st.Xml_Commandname; 398 + string tasktorunpars = st.Xml_Commandname.Quote();
413 399
414 string schedulepars = ""; 400 string schedulepars = "";
415 if (st.Xml_Schedule==nameof(ScheduledTask.XmlStructure.ScheduledTask.Attributes.Schedule.Values.MONTHLY)) { schedulepars += "/SC MONTHLY /D 1"; } 401 if (st.Xml_Schedule==nameof(ScheduledTask.XmlStructure.ScheduledTask.Attributes.Schedule.Values.MONTHLY)) { schedulepars += "/SC MONTHLY /D 1"; }
@@ -424,6 +410,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -424,6 +410,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
424 string prioritypars = "/RL HIGHEST"; 410 string prioritypars = "/RL HIGHEST";
425 411
426 var args = $"/Create /TR {tasktorunpars} {schedulepars} {starttimepars} {passwordpars} {forcecreatepars} {prioritypars} /TN {taskname}"; 412 var args = $"/Create /TR {tasktorunpars} {schedulepars} {starttimepars} {passwordpars} {forcecreatepars} {prioritypars} /TN {taskname}";
  413 +
427 var result = Tools.ExecuteAndGetStdIo("schtasks.exe", args); 414 var result = Tools.ExecuteAndGetStdIo("schtasks.exe", args);
428 415
429 if (st.Xml_Enable) { EnableTask(taskname); } else { DisableTask(taskname); } 416 if (st.Xml_Enable) { EnableTask(taskname); } else { DisableTask(taskname); }
@@ -433,11 +420,11 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -433,11 +420,11 @@ namespace Vrh.Log4Pro.MaintenanceConsole
433 #endregion class ScheduledTaskManagerCore 420 #endregion class ScheduledTaskManagerCore
434 421
435 #region ScheduledTaskManagerCoreXmlProcessor class 422 #region ScheduledTaskManagerCoreXmlProcessor class
436 - public class ScheduledTaskManagerCoreXmlProcessor : XmlParser 423 + public class ScheduledTaskManagerXmlProcessor : XmlParser
437 { 424 {
438 private List<ScheduledTask> _scheduledtasklist; 425 private List<ScheduledTask> _scheduledtasklist;
439 #region constructor 426 #region constructor
440 - public ScheduledTaskManagerCoreXmlProcessor(string xmlcs, string basefolder, string lcid) : base(xmlcs, basefolder, lcid, null) 427 + public ScheduledTaskManagerXmlProcessor(string xmlcs, string basefolder, string lcid) : base(xmlcs, basefolder, lcid, null)
441 { 428 {
442 _scheduledtasklist = new List<ScheduledTask>(); 429 _scheduledtasklist = new List<ScheduledTask>();
443 var schtskxmllist = GetAllXElements(nameof(ScheduledTask.XmlStructure.ScheduledTask)); 430 var schtskxmllist = GetAllXElements(nameof(ScheduledTask.XmlStructure.ScheduledTask));
@@ -458,6 +445,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -458,6 +445,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
458 { 445 {
459 #region fields 446 #region fields
460 public bool Valid = true; 447 public bool Valid = true;
  448 + public string Xml_Key;
461 public string Xml_Name; 449 public string Xml_Name;
462 public int Xml_Priority; 450 public int Xml_Priority;
463 public string Xml_Schedule; 451 public string Xml_Schedule;
@@ -495,6 +483,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -495,6 +483,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
495 { 483 {
496 Valid = true; 484 Valid = true;
497 string ATTRIBUTEMANDATORY = nameof(XmlStructure.ScheduledTask) + " attribute is mandatory! Name: {0}"; 485 string ATTRIBUTEMANDATORY = nameof(XmlStructure.ScheduledTask) + " attribute is mandatory! Name: {0}";
  486 + Xml_Key= GetValue(nameof(XmlStructure.ScheduledTask.Attributes.Key), scheduledtaskxml, XmlStructure.ScheduledTask.Attributes.Key.Values.DEFAULT);
498 Xml_Name = scheduledtaskxml.Attribute(XName.Get(nameof(XmlStructure.ScheduledTask.Attributes.Name)))?.Value; 487 Xml_Name = scheduledtaskxml.Attribute(XName.Get(nameof(XmlStructure.ScheduledTask.Attributes.Name)))?.Value;
499 if (string.IsNullOrWhiteSpace(Xml_Name)) { throw new ApplicationException(string.Format(ATTRIBUTEMANDATORY, nameof(XmlStructure.ScheduledTask.Attributes.Name))); } 488 if (string.IsNullOrWhiteSpace(Xml_Name)) { throw new ApplicationException(string.Format(ATTRIBUTEMANDATORY, nameof(XmlStructure.ScheduledTask.Attributes.Name))); }
500 Xml_Priority = GetValue(nameof(XmlStructure.ScheduledTask.Attributes.Priority), scheduledtaskxml, XmlStructure.ScheduledTask.Attributes.Priority.Values.DEFAULT); 489 Xml_Priority = GetValue(nameof(XmlStructure.ScheduledTask.Attributes.Priority), scheduledtaskxml, XmlStructure.ScheduledTask.Attributes.Priority.Values.DEFAULT);
@@ -502,7 +491,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -502,7 +491,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
502 Xml_StartTime = DateTime.Parse(GetValue(nameof(XmlStructure.ScheduledTask.Attributes.StartTime), scheduledtaskxml, XmlStructure.ScheduledTask.Attributes.StartTime.Values.DEFAULT)); 491 Xml_StartTime = DateTime.Parse(GetValue(nameof(XmlStructure.ScheduledTask.Attributes.StartTime), scheduledtaskxml, XmlStructure.ScheduledTask.Attributes.StartTime.Values.DEFAULT));
503 Xml_Enable = GetValue(nameof(XmlStructure.ScheduledTask.Attributes.Enable), scheduledtaskxml, XmlStructure.ScheduledTask.Attributes.Enable.Values.DEFAULT); 492 Xml_Enable = GetValue(nameof(XmlStructure.ScheduledTask.Attributes.Enable), scheduledtaskxml, XmlStructure.ScheduledTask.Attributes.Enable.Values.DEFAULT);
504 Xml_Run = GetValue(nameof(XmlStructure.ScheduledTask.Attributes.Run), scheduledtaskxml, XmlStructure.ScheduledTask.Attributes.Run.Values.DEFAULT); 493 Xml_Run = GetValue(nameof(XmlStructure.ScheduledTask.Attributes.Run), scheduledtaskxml, XmlStructure.ScheduledTask.Attributes.Run.Values.DEFAULT);
505 - Xml_Commandname = GetValue(nameof(XmlStructure.ScheduledTask.Attributes.Commandname), scheduledtaskxml, ""); 494 + Xml_Commandname = GetValue(nameof(XmlStructure.ScheduledTask.Attributes.Command), scheduledtaskxml, "");
506 //var conditionxmlList = GetAllXElements(foldertocleanxml, nameof(XmlStructure.FolderToClean.Conditions), nameof(XmlStructure.FolderToClean.Conditions.Condition)); 495 //var conditionxmlList = GetAllXElements(foldertocleanxml, nameof(XmlStructure.FolderToClean.Conditions), nameof(XmlStructure.FolderToClean.Conditions.Condition));
507 } 496 }
508 #endregion xml constructor 497 #endregion xml constructor
@@ -510,6 +499,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -510,6 +499,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
510 public ScheduledTask(ScheduledTask ftc) 499 public ScheduledTask(ScheduledTask ftc)
511 { 500 {
512 Valid = ftc.Valid; 501 Valid = ftc.Valid;
  502 + Xml_Key= ftc.Xml_Key;
513 Xml_Name = ftc.Xml_Name; 503 Xml_Name = ftc.Xml_Name;
514 Xml_Priority = ftc.Xml_Priority; 504 Xml_Priority = ftc.Xml_Priority;
515 Xml_Schedule = ftc.Xml_Schedule; 505 Xml_Schedule = ftc.Xml_Schedule;
@@ -526,14 +516,9 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -526,14 +516,9 @@ namespace Vrh.Log4Pro.MaintenanceConsole
526 { 516 {
527 public static class Attributes 517 public static class Attributes
528 { 518 {
  519 + public static class Key { public static class Values { public const string DEFAULT = ""; } }
529 public static class Name { } 520 public static class Name { }
530 - public static class StartTime  
531 - {  
532 - public static class Values  
533 - {  
534 - public const string DEFAULT = "04:00";  
535 - }  
536 - } 521 + public static class StartTime { public static class Values { public const string DEFAULT = "04:00"; } }
537 public static class Priority 522 public static class Priority
538 { 523 {
539 public static class Values 524 public static class Values
@@ -567,7 +552,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -567,7 +552,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
567 public const bool DEFAULT = false; 552 public const bool DEFAULT = false;
568 } 553 }
569 } 554 }
570 - public static class Commandname { } 555 + public static class Command { }
571 } 556 }
572 } 557 }
573 } 558 }
Vrh.Log4Pro.MaintenanceConsole/Manager - UserManager.cs 0 → 100644
@@ -0,0 +1,236 @@ @@ -0,0 +1,236 @@
  1 +using System;
  2 +using System.IO;
  3 +using System.Configuration.Install;
  4 +using System.Collections.Generic;
  5 +using System.Linq;
  6 +using System.ServiceProcess;
  7 +using System.Text;
  8 +using System.Threading;
  9 +using System.Threading.Tasks;
  10 +
  11 +using Microsoft.Web.Administration;
  12 +using System.Management;
  13 +using System.Diagnostics;
  14 +
  15 +using Vrh.Log4Pro.MaintenanceConsole.MenuNS;
  16 +using Vrh.Log4Pro.MaintenanceConsole.ColorConsoleNS;
  17 +using Vrh.Log4Pro.MaintenanceConsole.CommandLineParserNS;
  18 +using Vrh.Log4Pro.MaintenanceConsole.ToolsNS;
  19 +
  20 +using Vrh.XmlProcessing;
  21 +using System.Xml.Linq;
  22 +using System.Text.RegularExpressions;
  23 +
  24 +namespace Vrh.Log4Pro.MaintenanceConsole.UserManagerNS
  25 +{
  26 + #region MaintenanceTools class
  27 + public static class UserManager
  28 + {
  29 + private static Log4ProUserManagerXmlProcessor Config;
  30 + private const string XMLCONNECTIONSTRING = "config=MAINTENANCECONSOLE_LOG4PROUSERMANAGER;";
  31 + private const string XMLCONNECTIONSTRING_DEFAULT = "file=Config.Xml;element=Log4ProUserManager;";
  32 +
  33 + #region Execute
  34 + public static object Execute(object o1 = null, object o2 = null)
  35 + {
  36 + var args = (o1 as Menu.ExecutorParameter).Args;
  37 + string xmlcs = XMLCONNECTIONSTRING;
  38 + var config = new Log4ProUserManagerXmlProcessor(xmlcs, "", "hu-HU");
  39 + Config = config;
  40 + var sqlcs = XmlProcessing.ConnectionStringStore.GetSQL(config.Xml_SQLConnectionString);
  41 + MembershipTools.SetConnectionString(sqlcs);
  42 +
  43 + var menufunctions = new Menu("Log4Pro User Manager", "Select function!")
  44 + .AddMenuItem(new Menu.Item(CLP.Module.Log4ProUserManager.Functions.CreateSuperuser.KEY, "Create superuser", CreateSuperuser, new Menu.ExecutorParameter(cfg: config)))
  45 + .AddMenuItem(new Menu.Item(CLP.Module.Log4ProUserManager.Functions.CreateAdminusers.KEY, "Create Admin and Administrator roles and users", CreateAdminusers, new Menu.ExecutorParameter(cfg: config, null)))
  46 + .AddMenuItem(new Menu.Item(CLP.Module.Log4ProUserManager.Functions.DeleteUsers.KEY, "Remove user", DeleteUsers, new Menu.ExecutorParameter(cfg: config, null)))
  47 + .SetMenuHeaderDisplayer(UserListDisplayer)
  48 + .SetSelectionMode(Menu.SelectionMode.Single);
  49 + menufunctions.ExecuteMenu();
  50 + return null;
  51 + }
  52 + #endregion Execute
  53 + #region private UserListDisplayer
  54 + private static void UserListDisplayer()
  55 + {
  56 + int totallinelength = 0;
  57 + ColorConsole.Write("", ConsoleColor.Yellow, prefix: "Usernames:");
  58 + foreach (var un in MembershipTools.Users.GetNameList(null))
  59 + {
  60 + var predefined = Config.ProtectedUser(un);
  61 + totallinelength += un.Length + (predefined?3:2);
  62 + if (totallinelength > ColorConsole.BufferWidth) { ColorConsole.WriteLine(""); }
  63 + ColorConsole.Write("[");
  64 + if (predefined) { ColorConsole.Write("*", ConsoleColor.Red); }
  65 + ColorConsole.Write(un, ConsoleColor.Yellow);
  66 + ColorConsole.Write("]");
  67 + }
  68 + ColorConsole.WriteLine("");
  69 + }
  70 + #endregion private UserListDisplayer
  71 +
  72 + #region First level Executors with UI
  73 + #region CreateSuperuser
  74 + private static object CreateSuperuser(object parameter, object o)
  75 + {
  76 + var config = (parameter as Menu.ExecutorParameter).GetConfig<Log4ProUserManagerXmlProcessor>();
  77 + var suname = ColorConsole.ReadLine($"Enter Superuser name:", ConsoleColor.Yellow);
  78 + if (suname == "EX") { return null; }
  79 + var supsw = ColorConsole.ReadLine($"Enter Superuser password:", ConsoleColor.Yellow);
  80 + if (supsw == "EX") { return null; }
  81 +
  82 + try
  83 + {
  84 + MembershipTools.Users.Create(suname, supsw, superuser: true);
  85 + ColorConsole.WriteLine($"Creating superuser '{suname}' was successful!", ConsoleColor.Green);
  86 + }
  87 + catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); }
  88 + return o;
  89 + }
  90 + #endregion CreateSuperuser
  91 + #region CreateAdminusers
  92 + private static object CreateAdminusers(object parameter, object o)
  93 + {
  94 + var config = (parameter as Menu.ExecutorParameter).GetConfig<Log4ProUserManagerXmlProcessor>();
  95 + try
  96 + {
  97 + MembershipTools.Users.CreateAdminRolesAndUsers();
  98 + ColorConsole.WriteLine($"Creating admin users was successful!", ConsoleColor.Green);
  99 + }
  100 + catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); }
  101 + return o;
  102 + }
  103 + #endregion CreateAdminusers
  104 + #region DeleteUsers
  105 + private static object DeleteUsers(object parameter, object o)
  106 + {
  107 + var config = (parameter as Menu.ExecutorParameter).GetConfig<Log4ProUserManagerXmlProcessor>();
  108 + var uname = ColorConsole.ReadLine($"Enter username:", ConsoleColor.Yellow);
  109 + if (uname == "EX") { return null; }
  110 +
  111 + try
  112 + {
  113 + if (!config.ProtectedUser(uname))
  114 + {
  115 + MembershipTools.Users.Remove(uname);
  116 + ColorConsole.WriteLine($"Deleting user '{uname}' was successwful!", ConsoleColor.Green);
  117 + }
  118 + else { throw new Exception($"User '{uname}' is protected, can not be deleted!"); }
  119 + }
  120 + catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); }
  121 + return o;
  122 + }
  123 + #endregion DeleteUsers
  124 + #endregion First level Executors with UI
  125 + }
  126 + #endregion MaintenanceTools class
  127 + #region MaintenanceToolsXmlProcessor class
  128 + public class Log4ProUserManagerXmlProcessor : XmlParser
  129 + {
  130 + #region fields
  131 + public string Xml_SQLConnectionString;
  132 + public string Xml_ProtectedUserNameCommaList;
  133 + public List<UserGroup> UserGroupList;
  134 + public List<string> ProtectedUserNameList;
  135 + #endregion fields
  136 + #region constructor
  137 + public Log4ProUserManagerXmlProcessor(string xmlcs, string basefolder, string lcid) : base(xmlcs, basefolder, lcid, null)
  138 + {
  139 + Xml_SQLConnectionString = RootElement.Attribute(XName.Get(nameof(XmlStructure.Attributes.SQLConnectionString)))?.Value;
  140 + if (string.IsNullOrEmpty(Xml_SQLConnectionString)) { Xml_SQLConnectionString = XmlStructure.Attributes.SQLConnectionString.Values.DEFAULT; }
  141 +
  142 + Xml_ProtectedUserNameCommaList = RootElement.Attribute(XName.Get(nameof(XmlStructure.Attributes.ProtectedUsernameList)))?.Value;
  143 + if (string.IsNullOrEmpty(Xml_ProtectedUserNameCommaList)) { Xml_ProtectedUserNameCommaList = XmlStructure.Attributes.ProtectedUsernameList.Values.DEFAULT; }
  144 + ProtectedUserNameList = Xml_ProtectedUserNameCommaList.Split(',').ToList();
  145 + UserGroupList = new List<UserGroup>();
  146 + var ugxmllist = RootElement.Element(XName.Get(nameof(XmlStructure.UserGroups))).Elements(XName.Get(nameof(XmlStructure.UserGroups.UserGroup)));
  147 + if (ugxmllist!=null && ugxmllist.Any())
  148 + {
  149 + foreach (var ugxml in ugxmllist)
  150 + {
  151 + UserGroupList.Add(new UserGroup(ugxml));
  152 + };
  153 + }
  154 + }
  155 + #region ProtectedUser
  156 + /// <summary>
  157 + /// Igazzal tésr vissza, ha a user benne van a protected listában
  158 + /// </summary>
  159 + /// <param name="uname"></param>
  160 + /// <returns></returns>
  161 + public bool ProtectedUser(string uname)
  162 + {
  163 + return ProtectedUserNameList.Select(un=>un.ToUpper()).Contains(uname.ToUpper());
  164 + }
  165 + #endregion ProtectedUser
  166 + #endregion constructor
  167 + #region XmlStructure
  168 + public static class XmlStructure
  169 + {
  170 + public static class Attributes
  171 + {
  172 + public static class SQLConnectionString { public static class Values { public const string DEFAULT = ""; } }
  173 + public static class ProtectedUsernameList { public static class Values { public const string DEFAULT = "Admin,Administrator"; } }
  174 +
  175 + }
  176 + public static class UserGroups
  177 + {
  178 + public static class UserGroup
  179 + {
  180 + public static class Values
  181 + {
  182 + public const string DEFAULT = ".*";
  183 + }
  184 + public static class Attributes
  185 + {
  186 + public static class Id {}
  187 + public static class DisplayName {}
  188 + public static class GroupType
  189 + {
  190 + public static class Values
  191 + {
  192 + public const UserGroupType DEFAULT = UserGroupType.UserName;
  193 + }
  194 + }
  195 + }
  196 +
  197 + }
  198 + public static class Values { public const string DEFAULT = "Admin,Administrator"; }
  199 + }
  200 + }
  201 + #endregion XmlStructure
  202 + #region UserGroup
  203 + public class UserGroup:XmlLinqBase
  204 + {
  205 + public UserGroup() { }
  206 + public UserGroup(XElement ugxml)
  207 + {
  208 + Id = ugxml.Attribute(XName.Get(nameof(XmlStructure.UserGroups.UserGroup.Attributes.Id)))?.Value;
  209 + if (string.IsNullOrEmpty(Id)) { throw new Exception ($"Attribute is mandatory! Name {nameof(XmlStructure.UserGroups.UserGroup.Attributes.Id)}."); }
  210 +
  211 + Displayname = ugxml.Attribute(XName.Get(nameof(XmlStructure.UserGroups.UserGroup.Attributes.DisplayName)))?.Value;
  212 + if (string.IsNullOrEmpty(Displayname)) { Displayname = Id; }
  213 +
  214 + string grouptypestring = ugxml.Attribute(XName.Get(nameof(XmlStructure.UserGroups.UserGroup.Attributes.GroupType)))?.Value;
  215 + if (string.IsNullOrEmpty(grouptypestring)) { GroupType = XmlStructure.UserGroups.UserGroup.Attributes.GroupType.Values.DEFAULT; }
  216 + else
  217 + {
  218 + try { GroupType = (UserGroupType)Enum.Parse(typeof(UserGroupType), grouptypestring); }
  219 + catch { throw new Exception($"Attribute value is incorrect! Name {nameof(XmlStructure.UserGroups.UserGroup.Attributes.GroupType)}, Value: {grouptypestring}."); }
  220 + }
  221 +
  222 + Regex = ugxml.Value;
  223 + if (Regex==null) { Regex = XmlStructure.UserGroups.UserGroup.Values.DEFAULT; }
  224 + }
  225 + public UserGroup(UserGroup ug) { Id = ug.Id;Displayname = ug.Displayname;GroupType = ug.GroupType;Regex = ug.Regex; }
  226 + public string Id;
  227 + public string Displayname;
  228 + public UserGroupType GroupType;
  229 + public string Regex;
  230 + }
  231 + public enum UserGroupType { RoleName,RoleGroupName,UserName,}
  232 +
  233 + #endregion UserGroup
  234 + }
  235 + #endregion MaintenanceToolsXmlProcessor class
  236 +}
Vrh.Log4Pro.MaintenanceConsole/Manager - WebApplicationManager.cs
@@ -10,160 +10,118 @@ using Microsoft.Web.Administration; @@ -10,160 +10,118 @@ using Microsoft.Web.Administration;
10 using System.Management; 10 using System.Management;
11 using System.Diagnostics; 11 using System.Diagnostics;
12 12
  13 +using Vrh.Log4Pro.MaintenanceConsole.CommandLineParserNS;
  14 +using Vrh.Log4Pro.MaintenanceConsole.MenuNS;
  15 +using Vrh.Log4Pro.MaintenanceConsole.ColorConsoleNS;
  16 +
13 using Vrh.XmlProcessing; 17 using Vrh.XmlProcessing;
  18 +using VRH.Common;
14 using System.Xml.Linq; 19 using System.Xml.Linq;
15 20
16 -namespace Vrh.Log4Pro.MaintenanceConsole 21 +namespace Vrh.Log4Pro.MaintenanceConsole.WebApplicationManagerNS
17 { 22 {
18 #region WebApplicationManager 23 #region WebApplicationManager
19 public static class WebApplicationManager 24 public static class WebApplicationManager
20 { 25 {
  26 + private const string XMLCONNECTIONSTRING = "config=MAINTENANCECONSOLE_WEBAPPLICATIONMANAGER;";
  27 + private const string XMLCONNECTIONSTRING_DEFAULT = "file=Config.Xml;element=WebApplications;";
  28 +
21 #region public method: Execute 29 #region public method: Execute
22 public static object Execute(object o1=null,object o2=null) 30 public static object Execute(object o1=null,object o2=null)
23 { 31 {
24 - string xmlcs = "file=Config.xml;element=WebApplications;";  
25 - var config = new WebApplicationManagerXmlProcessor(xmlcs, "", "hu-HU"); 32 + var args = (o1 as Menu.ExecutorParameter).Args;
  33 + var functionkey = CommandLine.GetCommandLineArgument(args, CLP.CMD_FUNCTION);
  34 + var config = new WebApplicationManagerXmlProcessor(XMLCONNECTIONSTRING, "", "hu-HU");
  35 + var ep = new Menu.ExecutorParameter(config, args);
26 36
27 var menufunctions = new Menu("Manage Web Applications","Select the management function!") 37 var menufunctions = new Menu("Manage Web Applications","Select the management function!")
28 - .AddMenuItem(new Menu.Item("WAR", "Register WebApplication",Register))  
29 - .AddMenuItem(new Menu.Item("WAU", "Unregister WebApplication",Unregister))  
30 - .AddMenuItem(new Menu.Item("WAI", "Set impersonate identity",SetImpersonateIdentity))  
31 - .AddMenuItem(new Menu.Item("APS", "Start application Pool",PoolStart))  
32 - .AddMenuItem(new Menu.Item("APF", "Stop application Pool",PoolStop))  
33 - .AddMenuItem(new Menu.Item("APR", "Recycle application Pool",PoolRecycle))  
34 - .AddMenuItem(new Menu.Item("WSS", "Start website",SiteStart))  
35 - .AddMenuItem(new Menu.Item("WSF", "Stop website",SiteStop))  
36 - .AddMenuItem(new Menu.Item("APU", "Set pool user account",PoolSetUserAccount))  
37 - .AddMenuItem(new Menu.Item("R", "Restart website and pool",Restart))  
38 - .SetSelectionMode(Menu.SelectionMode.Single);  
39 -  
40 - var menuapplications = new Menu("Web applications","Select the web application(s) to manage!")  
41 - .SetMenuItemDisplayer(DisplayWebAppInfo)  
42 - .SetSelectionMode(Menu.SelectionMode.Multi)  
43 - .SetHeaderWidth(4);  
44 -  
45 - while (true)  
46 - {  
47 - List<WebApplication> wadefList = config.GetDefinitionList();  
48 - Menu.Selection sr;  
49 - using (ServerManager sm = new ServerManager())  
50 - {  
51 - var sites = sm.Sites;  
52 - var pools = sm.ApplicationPools;  
53 - menufunctions.DisplayTitle(); 38 + .AddMenuItem(new Menu.Item(CLP.Module.WebApplicationManager.Function.Register.KEY, "Register WebApplication",Register,ep))
  39 + .AddMenuItem(new Menu.Item(CLP.Module.WebApplicationManager.Function.Unregister.KEY, "Unregister WebApplication",Unregister, ep))
  40 + .AddMenuItem(new Menu.Item(CLP.Module.WebApplicationManager.Function.SetImpersonateIdentity.KEY, "Set impersonate identity",SetImpersonateIdentity, ep))
  41 + .AddMenuItem(new Menu.Item(CLP.Module.WebApplicationManager.Function.PoolStart.KEY, "Start application Pool",PoolStart, ep))
  42 + .AddMenuItem(new Menu.Item(CLP.Module.WebApplicationManager.Function.PoolStop.KEY, "Stop application Pool",PoolStop, ep))
  43 + .AddMenuItem(new Menu.Item(CLP.Module.WebApplicationManager.Function.PoolRecycle.KEY, "Recycle application Pool",PoolRecycle, ep))
  44 + .AddMenuItem(new Menu.Item(CLP.Module.WebApplicationManager.Function.SiteStart.KEY, "Start website",SiteStart, ep))
  45 + .AddMenuItem(new Menu.Item(CLP.Module.WebApplicationManager.Function.SiteStop.KEY, "Stop website",SiteStop, ep))
  46 + .AddMenuItem(new Menu.Item(CLP.Module.WebApplicationManager.Function.PoolSetUserAccount.KEY, "Set pool user account",PoolSetUserAccount, ep))
  47 + .AddMenuItem(new Menu.Item(CLP.Module.WebApplicationManager.Function.Restart.KEY, "Restart website and pool",Restart, ep))
  48 + .SetSelectionMode(Menu.SelectionMode.Single)
  49 + .SetMenuHeaderDisplayer(WebApplicationListDisplayer);
54 50
55 - menuapplications.ClearMenuItemList();  
56 - foreach (var wadef in wadefList)  
57 - {  
58 - var w = WebApplicationManagerCore.CollectWebAppInfo(sites, pools, wadef);  
59 - menuapplications.AddMenuItem(new Menu.Item(null, null, null, w));  
60 - }  
61 - }  
62 - menuapplications.DisplayItems(1);  
63 -  
64 - menufunctions.DisplayItems(3,35);  
65 - sr = menufunctions.Select();  
66 - if (sr.Result == Menu.SelectionResult.Exit) { break; }  
67 - else if (sr.Result == Menu.SelectionResult.None) { continue; }  
68 - else if (sr.Result == Menu.SelectionResult.Error) { continue; }  
69 - var functionexecutor = menufunctions.GetExecutor(sr.SelectedKeyList.First());  
70 -  
71 - foreach (var mi in menuapplications.MenuItemList) { mi.Executor=functionexecutor; }  
72 -  
73 - sr = menuapplications.Select();  
74 - if (sr.Result == Menu.SelectionResult.Exit) { break; }  
75 - else if (sr.Result == Menu.SelectionResult.None) { continue; }  
76 - else if (sr.Result == Menu.SelectionResult.Error) { continue; }  
77 - else if (sr.Result == Menu.SelectionResult.Ok) { }  
78 - else { }  
79 - menuapplications.ExecuteSelection(sr.SelectedKeyList);  
80 - }  
81 - return null; 51 + menufunctions.ExecuteMenu(functionkey);
  52 + return o2;
82 } 53 }
83 #endregion public method: Execute 54 #endregion public method: Execute
84 - #region private method: DisplayWebAppInfo  
85 - private static object DisplayWebAppInfo(object waobj,int lineix) 55 +
  56 + #region private DisplayWebApplicationMenu
  57 + private static void WebApplicationListDisplayer() { DisplayWebApplicationMenu(); }
  58 + private static Menu DisplayWebApplicationMenu(WebApplicationManagerXmlProcessor config= null, string prompt = null, bool silent=false)
86 { 59 {
87 - WebApplication wa = waobj as WebApplication;  
88 - if (lineix==0)  
89 - {  
90 - ColorConsole.WriteLine($"{wa.Xml_Description}", ConsoleColor.Black, ConsoleColor.White);  
91 - }  
92 - else if (lineix == 1)  
93 - {  
94 - ColorConsole.Write($"Web app:");  
95 - ColorConsole.Write($"{wa.Xml_AppName}", ConsoleColor.Cyan);  
96 - var fc2 = wa.ApplicationState.Contains("Unregistered") ? ConsoleColor.Red : ConsoleColor.Green;  
97 - ColorConsole.Write($"{wa.ApplicationState}", fc2, bracket: "()");  
98 - ColorConsole.Write($", Log.path:");  
99 - ColorConsole.Write($"{wa.ApplicationPath}", ConsoleColor.White);  
100 - ColorConsole.Write($", Phy.path:");  
101 - ColorConsole.WriteLine($"{wa.Xml_AppPhysicalPath}", ConsoleColor.White);  
102 - }  
103 - else if (lineix == 2)  
104 - {  
105 - ColorConsole.Write($"impersonate identity:");  
106 - ColorConsole.WriteLine($"{wa.AppImpersonateIdentity}", ConsoleColor.White);  
107 - }  
108 - else if (lineix == 3)  
109 - {  
110 - ColorConsole.Write($"Site:");  
111 - ColorConsole.Write($"{wa.Xml_SiteName}", ConsoleColor.Cyan);  
112 - var fc0 =  
113 - wa.SiteState.Contains("Started") ? ConsoleColor.Green  
114 - : wa.SiteState.Contains("Unregistered") ? ConsoleColor.Red  
115 - : ConsoleColor.Yellow;  
116 - ColorConsole.Write($"{wa.SiteState}", fc0, bracket: "()");  
117 - ColorConsole.Write($", Ports:");  
118 - ColorConsole.Write($"{wa.SitePortList}", ConsoleColor.White);  
119 - ColorConsole.Write($", Phy.path:");  
120 - ColorConsole.WriteLine($"{wa.Xml_SitePhysicalPath}", ConsoleColor.White);  
121 - }  
122 - else if (lineix == 4)  
123 - {  
124 - ColorConsole.Write($"Pool:");  
125 - ColorConsole.Write($"{wa.Xml_PoolName}", ConsoleColor.Cyan);  
126 - var fc1 = wa.PoolState == null ? ConsoleColor.Red  
127 - : wa.PoolState.Contains("Started") ? ConsoleColor.Green  
128 - : wa.PoolState.Contains("Unregistered") ? ConsoleColor.Red  
129 - : ConsoleColor.Yellow;  
130 - string waps = wa.PoolState == null ? "Unregistered/Unknown" : wa.PoolState;  
131 - ColorConsole.Write($"{waps}", fc1, bracket: "()");  
132 - ColorConsole.Write($", identity:");  
133 - ColorConsole.WriteLine($"{wa.PoolAccount}", ConsoleColor.White);  
134 - }  
135 - else if (lineix==5)  
136 - {  
137 - ColorConsole.WriteLine();  
138 - }  
139 - else 60 + if (config == null) { config = new WebApplicationManagerXmlProcessor(XMLCONNECTIONSTRING, "", "hu-HU"); }
  61 + List<WebApplication> wadefList = config.GetDefinitionList();
  62 + var menuwa = new Menu("Web applications", prompt)
  63 + .SetMenuItemDisplayer(DisplayWebAppInfo)
  64 + .SetSelectionMode(Menu.SelectionMode.Multi);
  65 + menuwa.ClearMenuItemList();
  66 + foreach (var wadef in wadefList)
140 { 67 {
141 - return null; 68 + var wa = WebApplicationManagerCore.CollectWebAppInfo(wadef);
  69 + menuwa.AddMenuItem(new Menu.Item(wadef.Xml_Key, null, null, new Menu.ExecutorParameter(pars: wa)));
142 } 70 }
143 - return ""; 71 + if (!silent) { menuwa.DisplayItems(1); }
  72 + return menuwa;
144 } 73 }
145 - #endregion private method: DisplayWebAppInfo  
146 - #region  
147 - private static object Restart(object dobj, object parameters) 74 + #endregion private DisplayWebApplicationMenu
  75 +
  76 + #region 1st level Executors
  77 + private static object Restart(object parameters, object o)
148 { 78 {
149 - WebApplication d = dobj as WebApplication;  
150 - using (ServerManager sm = new ServerManager()) 79 + var config = (parameters as Menu.ExecutorParameter).GetConfig<WebApplicationManagerXmlProcessor>();
  80 + var args = (parameters as Menu.ExecutorParameter).Args;
  81 + var selectedwaindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.WebApplicationManager.Function.CMD_WEBAPPS);
  82 + var menuwapps = DisplayWebApplicationMenu(config, "Select the web application(s) to manage!",silent:true);
  83 + Menu.Selection sr = menuwapps.Select(selectedwaindexes);
  84 +
  85 + if (sr.Result == Menu.SelectionResult.Exit) { return o; }
  86 + else if (sr.Result == Menu.SelectionResult.None) { return o; }
  87 + else if (sr.Result == Menu.SelectionResult.Error) { return o; }
  88 + else if (sr.Result == Menu.SelectionResult.Ok) { }
  89 + else { }
  90 + foreach (var p in sr.SelectedParameterList)
151 { 91 {
152 - try { WebApplicationManagerCore.GetPool(sm, d.Xml_PoolName)?.Stop(); } catch { ColorConsole.WriteLine($"Pool {d.Xml_PoolName} already stopped."); }  
153 - try { WebApplicationManagerCore.GetSite(sm, d.Xml_SiteName)?.Stop(); } catch { ColorConsole.WriteLine($"Site {d.Xml_SiteName} already stopped."); } 92 + WebApplication wa = p.Parameters as WebApplication;
  93 + using (ServerManager sm = new ServerManager())
  94 + {
  95 + try { WebApplicationManagerCore.GetPool(sm, wa.Xml_PoolName)?.Stop(); } catch { ColorConsole.WriteLine($"Pool {wa.Xml_PoolName} already stopped."); }
  96 + try { WebApplicationManagerCore.GetSite(sm, wa.Xml_SiteName)?.Stop(); } catch { ColorConsole.WriteLine($"Site {wa.Xml_SiteName} already stopped."); }
154 97
155 - SiteStart(d, parameters);  
156 - PoolStart(d, parameters);  
157 - PoolRecycle(d, parameters); 98 + SiteStart(wa, o);
  99 + PoolStart(wa, o);
  100 + PoolRecycle(wa, o);
158 101
159 - ColorConsole.WriteLine($"Pool {d.Xml_PoolName} and site {d.Xml_SiteName} restarted.");  
160 - return parameters; 102 + ColorConsole.WriteLine($"Pool {wa.Xml_PoolName} and site {wa.Xml_SiteName} restarted.");
  103 + }
161 } 104 }
  105 + return o;
  106 + }
  107 + private static object PoolStart(object parameters, object o)
  108 + {
  109 + var config = (parameters as Menu.ExecutorParameter).GetConfig<WebApplicationManagerXmlProcessor>();
  110 + var args = (parameters as Menu.ExecutorParameter).Args;
  111 + var selectedwaindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.WebApplicationManager.Function.CMD_WEBAPPS);
  112 + var menuwapps = DisplayWebApplicationMenu(config, "Select the web application(s) to manage!", silent: true);
  113 + Menu.Selection sr = menuwapps.Select(selectedwaindexes);
  114 +
  115 + if (sr.Result == Menu.SelectionResult.Exit) { return o; }
  116 + else if (sr.Result == Menu.SelectionResult.None) { return o; }
  117 + else if (sr.Result == Menu.SelectionResult.Error) { return o; }
  118 + else if (sr.Result == Menu.SelectionResult.Ok) { }
  119 + else { }
  120 + foreach (var wa in sr.SelectedParameterList) { OnePoolStart(wa.Parameters as WebApplication); }
  121 + return o;
162 } 122 }
163 - private  
164 - static object PoolStart(object dobj, object parameters) 123 + private static void OnePoolStart(WebApplication d)
165 { 124 {
166 - WebApplication d = dobj as WebApplication;  
167 using (ServerManager sm = new ServerManager()) 125 using (ServerManager sm = new ServerManager())
168 { 126 {
169 bool success = false; 127 bool success = false;
@@ -181,12 +139,26 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -181,12 +139,26 @@ namespace Vrh.Log4Pro.MaintenanceConsole
181 } 139 }
182 var successstr = success ? "started" : "NOT started"; 140 var successstr = success ? "started" : "NOT started";
183 ColorConsole.WriteLine($"{d.Xml_PoolName} {successstr}."); 141 ColorConsole.WriteLine($"{d.Xml_PoolName} {successstr}.");
184 - return parameters;  
185 } 142 }
186 } 143 }
187 - private static object PoolRecycle(object dobj, object parameters) 144 + private static object PoolRecycle(object parameters, object o)
  145 + {
  146 + var config = (parameters as Menu.ExecutorParameter).GetConfig<WebApplicationManagerXmlProcessor>();
  147 + var args = (parameters as Menu.ExecutorParameter).Args;
  148 + var selectedwaindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.WebApplicationManager.Function.CMD_WEBAPPS);
  149 + var menuwapps = DisplayWebApplicationMenu(config, "Select the web application(s) to manage!", silent: true);
  150 + Menu.Selection sr = menuwapps.Select(selectedwaindexes);
  151 +
  152 + if (sr.Result == Menu.SelectionResult.Exit) { return o; }
  153 + else if (sr.Result == Menu.SelectionResult.None) { return o; }
  154 + else if (sr.Result == Menu.SelectionResult.Error) { return o; }
  155 + else if (sr.Result == Menu.SelectionResult.Ok) { }
  156 + else { }
  157 + foreach (var wa in sr.SelectedParameterList) { OnePoolRecycle(wa.Parameters as WebApplication); }
  158 + return o;
  159 + }
  160 + private static void OnePoolRecycle(WebApplication d)
188 { 161 {
189 - WebApplication d = dobj as WebApplication;  
190 using (ServerManager sm = new ServerManager()) 162 using (ServerManager sm = new ServerManager())
191 { 163 {
192 bool success = false; 164 bool success = false;
@@ -203,58 +175,100 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -203,58 +175,100 @@ namespace Vrh.Log4Pro.MaintenanceConsole
203 } 175 }
204 var successstr = success ? "recycled" : "NOT recycled"; 176 var successstr = success ? "recycled" : "NOT recycled";
205 ColorConsole.WriteLine($"{d.Xml_PoolName} {successstr}."); 177 ColorConsole.WriteLine($"{d.Xml_PoolName} {successstr}.");
206 - return parameters;  
207 } 178 }
208 } 179 }
209 - private static object PoolStop(object dobj, object parameters) 180 + private static object PoolStop(object parameters, object o)
  181 + {
  182 + var config = (parameters as Menu.ExecutorParameter).GetConfig<WebApplicationManagerXmlProcessor>();
  183 + var args = (parameters as Menu.ExecutorParameter).Args;
  184 + var selectedwaindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.WebApplicationManager.Function.CMD_WEBAPPS);
  185 + var menuwapps = DisplayWebApplicationMenu(config, "Select the web application(s) to manage!", silent: true);
  186 + Menu.Selection sr = menuwapps.Select(selectedwaindexes);
  187 +
  188 + if (sr.Result == Menu.SelectionResult.Exit) { return o; }
  189 + else if (sr.Result == Menu.SelectionResult.None) { return o; }
  190 + else if (sr.Result == Menu.SelectionResult.Error) { return o; }
  191 + else if (sr.Result == Menu.SelectionResult.Ok) { }
  192 + else { }
  193 + foreach (var wa in sr.SelectedParameterList) { OnePoolStop(wa.Parameters as WebApplication); }
  194 + return o;
  195 + }
  196 + private static void OnePoolStop(WebApplication wa)
210 { 197 {
211 using (ServerManager sm = new ServerManager()) 198 using (ServerManager sm = new ServerManager())
212 { 199 {
213 - WebApplication d = dobj as WebApplication;  
214 bool success = false; 200 bool success = false;
215 for (var i = 1; i <= 10; i++) 201 for (var i = 1; i <= 10; i++)
216 { 202 {
217 - var p = WebApplicationManagerCore.GetPool(sm, d.Xml_PoolName); 203 + var p = WebApplicationManagerCore.GetPool(sm, wa.Xml_PoolName);
218 if (p != null && p.State == ObjectState.Started) { p.Stop(); success = true; break; } 204 if (p != null && p.State == ObjectState.Started) { p.Stop(); success = true; break; }
219 else 205 else
220 { 206 {
221 - ColorConsole.WriteLine($"Trying to stop pool {d.Xml_PoolName} ... Press key 'X' to exit..."); 207 + ColorConsole.WriteLine($"Trying to stop pool {wa.Xml_PoolName} ... Press key 'X' to exit...");
222 if (ColorConsole.KeyAvailable) { if (ColorConsole.ReadKey().KeyChar.ToString().ToUpper() == "X") { break; } } 208 if (ColorConsole.KeyAvailable) { if (ColorConsole.ReadKey().KeyChar.ToString().ToUpper() == "X") { break; } }
223 209
224 Thread.Sleep(1000); 210 Thread.Sleep(1000);
225 } 211 }
226 } 212 }
227 var successstr = success ? "stopped" : "NOT stopped"; 213 var successstr = success ? "stopped" : "NOT stopped";
228 - ColorConsole.WriteLine($"{d.Xml_PoolName} {successstr}.");  
229 - return parameters; 214 + ColorConsole.WriteLine($"{wa.Xml_PoolName} {successstr}.");
230 } 215 }
231 } 216 }
232 - private static object SiteStart(object dobj, object parameters) 217 + private static object SiteStart(object parameters, object o)
233 { 218 {
234 - WebApplication d = dobj as WebApplication;  
235 - using (ServerManager sm = new ServerManager()) 219 + var config = (parameters as Menu.ExecutorParameter).GetConfig<WebApplicationManagerXmlProcessor>();
  220 + var args = (parameters as Menu.ExecutorParameter).Args;
  221 + var selectedwaindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.WebApplicationManager.Function.CMD_WEBAPPS);
  222 + var menuwapps = DisplayWebApplicationMenu(config, "Select the web application(s) to manage!", silent: true);
  223 + Menu.Selection sr = menuwapps.Select(selectedwaindexes);
  224 +
  225 + if (sr.Result == Menu.SelectionResult.Exit) { return o; }
  226 + else if (sr.Result == Menu.SelectionResult.None) { return o; }
  227 + else if (sr.Result == Menu.SelectionResult.Error) { return o; }
  228 + else if (sr.Result == Menu.SelectionResult.Ok) { }
  229 + else { }
  230 + foreach (var wa in sr.SelectedParameterList) { OneSiteStart(wa.Parameters as WebApplication); }
  231 + return o;
  232 + }
  233 + private static void OneSiteStart(WebApplication wa)
  234 + {
  235 + using (ServerManager sm = new ServerManager())
236 { 236 {
237 bool success = false; 237 bool success = false;
238 for (var i = 1; i < 4; i++) 238 for (var i = 1; i < 4; i++)
239 { 239 {
240 - var s = WebApplicationManagerCore.GetSite(sm, d.Xml_SiteName); 240 + var s = WebApplicationManagerCore.GetSite(sm, wa.Xml_SiteName);
241 if (s != null && s.State == ObjectState.Stopped) { s.Start(); success = true; break; } 241 if (s != null && s.State == ObjectState.Stopped) { s.Start(); success = true; break; }
242 else 242 else
243 { 243 {
244 - ColorConsole.WriteLine($"Trying to start site {d.Xml_SiteName} ... Press key 'X' to exit..."); 244 + ColorConsole.WriteLine($"Trying to start site {wa.Xml_SiteName} ... Press key 'X' to exit...");
245 if (ColorConsole.KeyAvailable) { if (ColorConsole.ReadKey().KeyChar.ToString().ToUpper() == "X") { break; } } 245 if (ColorConsole.KeyAvailable) { if (ColorConsole.ReadKey().KeyChar.ToString().ToUpper() == "X") { break; } }
246 Thread.Sleep(1000); 246 Thread.Sleep(1000);
247 } 247 }
248 } 248 }
249 var successstr = success ? "started" : "NOT started"; 249 var successstr = success ? "started" : "NOT started";
250 - ColorConsole.WriteLine($"{d.Xml_SiteName} {successstr}.");  
251 - return parameters; 250 + ColorConsole.WriteLine($"{wa.Xml_SiteName} {successstr}.");
252 } 251 }
253 } 252 }
254 - private static object SiteStop(object dobj, object parameters) 253 + private static object SiteStop(object parameters, object o)
255 { 254 {
256 - WebApplication d = dobj as WebApplication;  
257 - using (ServerManager sm = new ServerManager()) 255 + var config = (parameters as Menu.ExecutorParameter).GetConfig<WebApplicationManagerXmlProcessor>();
  256 + var args = (parameters as Menu.ExecutorParameter).Args;
  257 + var selectedwaindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.WebApplicationManager.Function.CMD_WEBAPPS);
  258 + var menuwapps = DisplayWebApplicationMenu(config, "Select the web application(s) to manage!", silent: true);
  259 + Menu.Selection sr = menuwapps.Select(selectedwaindexes);
  260 +
  261 + if (sr.Result == Menu.SelectionResult.Exit) { return o; }
  262 + else if (sr.Result == Menu.SelectionResult.None) { return o; }
  263 + else if (sr.Result == Menu.SelectionResult.Error) { return o; }
  264 + else if (sr.Result == Menu.SelectionResult.Ok) { }
  265 + else { }
  266 + foreach (var wa in sr.SelectedParameterList) { OneSiteStop(wa.Parameters as WebApplication); }
  267 + return o;
  268 + }
  269 + private static void OneSiteStop(WebApplication d)
  270 + {
  271 + using (ServerManager sm = new ServerManager())
258 { 272 {
259 bool success = false; 273 bool success = false;
260 for (var i = 1; i < 4; i++) 274 for (var i = 1; i < 4; i++)
@@ -270,57 +284,120 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -270,57 +284,120 @@ namespace Vrh.Log4Pro.MaintenanceConsole
270 } 284 }
271 var successstr = success ? "stopped" : "NOT stopped"; 285 var successstr = success ? "stopped" : "NOT stopped";
272 ColorConsole.WriteLine($"{d.Xml_SiteName} {successstr}."); 286 ColorConsole.WriteLine($"{d.Xml_SiteName} {successstr}.");
273 - return parameters;  
274 } 287 }
275 } 288 }
276 - private static object Register(object dobj, object parameters) 289 + private static object Register(object parameters, object o)
277 { 290 {
278 - WebApplication d = dobj as WebApplication;  
279 - WebApplicationManagerCore.RegisterWebApplication(d.Xml_SiteName, d.Xml_PoolName, d.Xml_AppName, d.Xml_AppPhysicalPath, d.Xml_SitePhysicalPath, 8080, d.Xml_RecreatePool, d.Xml_RecreateSite, d.Xml_RecreateApp, d.Xml_PoolPipeLineMode);  
280 - ColorConsole.WriteLine($"{d.Xml_AppName} is registered in site {d.Xml_SiteName} using pool {d.Xml_PoolName}.");  
281 - return parameters; 291 + var config = (parameters as Menu.ExecutorParameter).GetConfig<WebApplicationManagerXmlProcessor>();
  292 + var args = (parameters as Menu.ExecutorParameter).Args;
  293 + var selectedwaindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.WebApplicationManager.Function.CMD_WEBAPPS);
  294 + var menuwapps = DisplayWebApplicationMenu(config, "Select the web application(s) to manage!", silent: true);
  295 + Menu.Selection sr = menuwapps.Select(selectedwaindexes);
  296 +
  297 + if (sr.Result == Menu.SelectionResult.Exit) { return o; }
  298 + else if (sr.Result == Menu.SelectionResult.None) { return o; }
  299 + else if (sr.Result == Menu.SelectionResult.Error) { return o; }
  300 + else if (sr.Result == Menu.SelectionResult.Ok) { }
  301 + else { }
  302 + foreach (var p in sr.SelectedParameterList)
  303 + {
  304 + WebApplication wa=p.Parameters as WebApplication;
  305 + WebApplicationManagerCore.RegisterWebApplication(wa.Xml_SiteName, wa.Xml_PoolName, wa.Xml_AppName, wa.Xml_AppPhysicalPath, wa.Xml_SitePhysicalPath, 8080, wa.Xml_RecreatePool, wa.Xml_RecreateSite, wa.Xml_RecreateApp, wa.Xml_PoolPipeLineMode);
  306 + ColorConsole.WriteLine($"{wa.Xml_AppName} is registered in site {wa.Xml_SiteName} using pool {wa.Xml_PoolName}.");
  307 + }
  308 + return o;
  309 + }
  310 + private static object Unregister(object parameters, object o)
  311 + {
  312 + var config = (parameters as Menu.ExecutorParameter).GetConfig<WebApplicationManagerXmlProcessor>();
  313 + var args = (parameters as Menu.ExecutorParameter).Args;
  314 + var selectedwaindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.WebApplicationManager.Function.CMD_WEBAPPS);
  315 + var menuwapps = DisplayWebApplicationMenu(config, "Select the web application(s) to manage!", silent: true);
  316 + Menu.Selection sr = menuwapps.Select(selectedwaindexes);
  317 +
  318 + if (sr.Result == Menu.SelectionResult.Exit) { return o; }
  319 + else if (sr.Result == Menu.SelectionResult.None) { return o; }
  320 + else if (sr.Result == Menu.SelectionResult.Error) { return o; }
  321 + else if (sr.Result == Menu.SelectionResult.Ok) { }
  322 + else { }
  323 + foreach (var p in sr.SelectedParameterList)
  324 + {
  325 + WebApplication wa = p.Parameters as WebApplication;
  326 + WebApplicationManagerCore.UnRegisterWebApplication(wa.Xml_AppName, wa.Xml_PoolName, wa.Xml_SiteName, wa.Xml_ForceRemovePool, wa.Xml_ForceRemoveSite);
  327 + ColorConsole.WriteLine($"{wa.Xml_AppName} is unregistered from site {wa.Xml_SiteName} and from pool {wa.Xml_PoolName}.");
  328 + }
  329 + return o;
282 } 330 }
283 - private static object Unregister(object dobj, object parameters) 331 + private static object SetImpersonateIdentity(object parameters, object o)
284 { 332 {
285 - WebApplication d = dobj as WebApplication;  
286 - WebApplicationManagerCore.UnRegisterWebApplication(d.Xml_AppName, d.Xml_PoolName, d.Xml_SiteName, d.Xml_ForceRemovePool, d.Xml_ForceRemoveSite);  
287 - ColorConsole.WriteLine($"{d.Xml_AppName} is unregistered from site {d.Xml_SiteName} and from pool {d.Xml_PoolName}.");  
288 - return parameters; 333 + var config = (parameters as Menu.ExecutorParameter).GetConfig<WebApplicationManagerXmlProcessor>();
  334 + var args = (parameters as Menu.ExecutorParameter).Args;
  335 + var selectedwaindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.WebApplicationManager.Function.CMD_WEBAPPS);
  336 + var menuwapps = DisplayWebApplicationMenu(config, "Select the web application(s) to manage!", silent: true);
  337 + Menu.Selection sr = menuwapps.Select(selectedwaindexes);
  338 +
  339 + if (sr.Result == Menu.SelectionResult.Exit) { return o; }
  340 + else if (sr.Result == Menu.SelectionResult.None) { return o; }
  341 + else if (sr.Result == Menu.SelectionResult.Error) { return o; }
  342 + else if (sr.Result == Menu.SelectionResult.Ok) { }
  343 + else { }
  344 + foreach (var p in sr.SelectedParameterList)
  345 + {
  346 + var wa = p.Parameters as WebApplication;
  347 + GetImpersonateInfo(wa, out string username, out string password, out string impersonate);
  348 + if (username == "EX" || password == "EX" || impersonate == "EX") { return o; }
  349 + string olduserinfo = WebApplicationManagerCore.GetCurrentImpersonateIdentityInfo(wa);
  350 + WebApplicationManagerCore.SetImpersonateIdentity(wa.Xml_ImpersonateIdentityConfigFile, impersonate, username, password);
  351 + ColorConsole.WriteLine($"Impersonate identity changed for webapp {wa.Xml_AppName}.");
  352 + ColorConsole.WriteLine($"From '{olduserinfo}' to '{WebApplicationManagerCore.GetCurrentImpersonateIdentityInfo(wa)}'");
  353 + }
  354 + return o;
289 } 355 }
290 - private static object SetImpersonateIdentity(object dobj, object parameters) 356 + private static void GetImpersonateInfo(WebApplication wa,out string username, out string password, out string impersonate)
291 { 357 {
292 - WebApplication d = dobj as WebApplication;  
293 - string username="", password = "",impersonate="FALSE";  
294 - bool parametersarealreadyset = parameters != null;  
295 - string olduserinfo = WebApplicationManagerCore.GetImpersonateIdentityInfo(d.Xml_IdentityConfigFile);  
296 - if (parametersarealreadyset) 358 + username = ""; password = ""; impersonate = bool.FalseString.ToUpper();
  359 + if (Menu.IsCommandMode())
297 { 360 {
298 - impersonate = ((Dictionary<string, string>)parameters)["impersonate"];  
299 - username = ((Dictionary<string, string>)parameters)["username"];  
300 - password = ((Dictionary<string, string>)parameters)["password"]; 361 + impersonate = wa.Xml_ImpersonateIdentity.ToString();
  362 + username = wa.Xml_ImpersonateIdentityUsername;
  363 + password = wa.Xml_ImpersonateIdentityPassword;
301 } 364 }
302 else 365 else
303 { 366 {
304 - while(true) 367 + string olduserinfo = WebApplicationManagerCore.GetCurrentImpersonateIdentityInfo(wa);
  368 + while (true)
305 { 369 {
306 - 370 + var defaultinxml = WebApplicationManagerCore.GetDefaultImpersonateIdentityInfo(wa);
307 ColorConsole.WriteLine($"Current user info: {olduserinfo}"); 371 ColorConsole.WriteLine($"Current user info: {olduserinfo}");
308 - ColorConsole.WriteLine("Set impersonate-on status (true/false), then [Enter], EX=exit."); 372 + ColorConsole.WriteLine($"Set impersonate-on status (true/false).[Enter]=finish input.EX=exit");
  373 + ColorConsole.WriteLine($"Empty in XML={defaultinxml}");
309 impersonate = ColorConsole.ReadLine().ToUpper(); 374 impersonate = ColorConsole.ReadLine().ToUpper();
310 - if (impersonate == "EX") { return null; }  
311 - else if (impersonate == "FALSE") { break; }  
312 - else if (impersonate == "TRUE") 375 + if (impersonate == "EX") { return; }
  376 + else if (impersonate == "")
  377 + {
  378 + username = wa.Xml_ImpersonateIdentityUsername;
  379 + password = wa.Xml_ImpersonateIdentityPassword;
  380 + impersonate = wa.Xml_ImpersonateIdentity.ToString();
  381 + return;
  382 + }
  383 + else if (impersonate == bool.FalseString.ToUpper())
  384 + {
  385 + username = "";
  386 + password = "";
  387 + return;
  388 + }
  389 + else if (impersonate == bool.TrueString.ToUpper())
313 { 390 {
314 - ColorConsole.WriteLine("Enter username, then [Enter].");  
315 - var un = !string.IsNullOrWhiteSpace(d.Xml_PoolUsername) ? $"empty={d.Xml_PoolUsername }," : "";  
316 - ColorConsole.WriteLine($"{un}EX=exit"); 391 + ColorConsole.WriteLine($"Enter username.[Enter]=finish input.EX=exit");
  392 + if (wa.Xml_ImpersonateIdentity) { ColorConsole.WriteLine(defaultinxml); }
317 username = ColorConsole.ReadLine().ToUpper(); 393 username = ColorConsole.ReadLine().ToUpper();
318 - if (impersonate == "EX") { return null; }  
319 - ColorConsole.WriteLine("Enter password, then [Enter]");  
320 - var pw = !string.IsNullOrWhiteSpace(d.Xml_PoolPassword) ? $"empty={d.Xml_PoolPassword}," : "";  
321 - ColorConsole.WriteLine($"{pw}EX=exit"); 394 + if (username == "EX") { return; }
  395 + else if (wa.Xml_ImpersonateIdentity && username == "")
  396 + {
  397 + }
  398 + ColorConsole.WriteLine($"Enter password.[Enter]=finish input.Empty=no password.EX=exit");
322 password = ColorConsole.ReadLine().ToUpper(); 399 password = ColorConsole.ReadLine().ToUpper();
323 - if (impersonate == "EX") { return null; } 400 + if (password == "EX") { return; }
324 break; 401 break;
325 //bool valid = System.Web.ApplicationSerices.AuthenticationService.ValidateUser(username, password, mull); 402 //bool valid = System.Web.ApplicationSerices.AuthenticationService.ValidateUser(username, password, mull);
326 } 403 }
@@ -330,126 +407,209 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -330,126 +407,209 @@ namespace Vrh.Log4Pro.MaintenanceConsole
330 continue; 407 continue;
331 } 408 }
332 } 409 }
333 - parameters = new Dictionary<string, string> { { "impersonate", impersonate }, { "username", username }, { "password", password }, };  
334 } 410 }
335 - WebApplicationManagerCore.SetImpersonateIdentity(d.Xml_IdentityConfigFile, impersonate, username, password);  
336 - ColorConsole.WriteLine($"Impersonate identity changed for webapp {d.Xml_AppName}.");  
337 - ColorConsole.WriteLine($"From '{olduserinfo}' to '{WebApplicationManagerCore.GetImpersonateIdentityInfo(d.Xml_IdentityConfigFile)}'");  
338 -  
339 - return parameters;  
340 } 411 }
341 - private static object PoolSetUserAccount(object dobj, object parameters) 412 + private static object PoolSetUserAccount(object parameters, object o)
342 { 413 {
343 - WebApplication d = dobj as WebApplication;  
344 - string username, password = "";  
345 - bool parametersarealreadyset = parameters != null;  
346 - string olduserinfo = WebApplicationManagerCore.GetUserInfo(d.Xml_PoolName);  
347 - if (parametersarealreadyset) 414 + var config = (parameters as Menu.ExecutorParameter).GetConfig<WebApplicationManagerXmlProcessor>();
  415 + var args = (parameters as Menu.ExecutorParameter).Args;
  416 + var selectedwaindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.WebApplicationManager.Function.CMD_WEBAPPS);
  417 + var menuwapps = DisplayWebApplicationMenu(config, "Select the web application(s) to manage!", silent: true);
  418 + Menu.Selection sr = menuwapps.Select(selectedwaindexes);
  419 +
  420 + if (sr.Result == Menu.SelectionResult.Exit) { return o; }
  421 + else if (sr.Result == Menu.SelectionResult.None) { return o; }
  422 + else if (sr.Result == Menu.SelectionResult.Error) { return o; }
  423 + else if (sr.Result == Menu.SelectionResult.Ok) { }
  424 + else { }
  425 + foreach (var p in sr.SelectedParameterList)
348 { 426 {
349 - username = ((Dictionary<string, string>)parameters)["username"];  
350 - password = ((Dictionary<string, string>)parameters)["password"]; 427 + var wa = p.Parameters as WebApplication;
  428 + GetPoolIdentityInfo(wa, out string username, out string password);
  429 + if (username == "EX" || password == "EX") { return o; }
  430 + string olduserinfo = WebApplicationManagerCore.GetCurrentPoolIdentityInfo(wa);
  431 + WebApplicationManagerCore.SetPoolUserAccount(wa.Xml_AppName, wa.Xml_SiteName, username, password);
  432 + ColorConsole.WriteLine($"Pool identity changed for webapp {wa.Xml_AppName}.");
  433 + ColorConsole.WriteLine($"From '{olduserinfo}' to '{WebApplicationManagerCore.GetCurrentPoolIdentityInfo(wa)}'");
  434 + }
  435 + return o;
  436 + }
  437 + private static void GetPoolIdentityInfo(WebApplication wa, out string username, out string password)
  438 + {
  439 + username = ""; password = "";
  440 + if (Menu.IsCommandMode())
  441 + {
  442 + username = wa.Xml_PoolName;
  443 + password = wa.Xml_PoolPassword;
351 } 444 }
352 else 445 else
353 { 446 {
  447 + var defaultinxml = WebApplicationManagerCore.GetDefaultPoolIdentityInfo(wa);
  448 + username=""; password = "";
  449 + string olduserinfo = WebApplicationManagerCore.GetCurrentPoolIdentityInfo(wa);
354 ColorConsole.WriteLine($"Current user info: {olduserinfo}"); 450 ColorConsole.WriteLine($"Current user info: {olduserinfo}");
355 - ColorConsole.WriteLine("Enter username, then [Enter].");  
356 - ColorConsole.WriteLine("Special usernames are: (Empty=API) "); 451 + var un = $"Empty from XML={defaultinxml}.";
  452 + ColorConsole.WriteLine($"Enter username.[Enter]=finish input.{un}EX=exit.");
  453 + ColorConsole.WriteLine("Special usernames are:");
357 ColorConsole.WriteLine($" (API) {nameof(ProcessModelIdentityType.ApplicationPoolIdentity)}"); 454 ColorConsole.WriteLine($" (API) {nameof(ProcessModelIdentityType.ApplicationPoolIdentity)}");
358 ColorConsole.WriteLine($" (LSE) {nameof(ProcessModelIdentityType.LocalService)}"); 455 ColorConsole.WriteLine($" (LSE) {nameof(ProcessModelIdentityType.LocalService)}");
359 ColorConsole.WriteLine($" (LSY) {nameof(ProcessModelIdentityType.LocalSystem)}"); 456 ColorConsole.WriteLine($" (LSY) {nameof(ProcessModelIdentityType.LocalSystem)}");
360 ColorConsole.WriteLine($" (NSE) {nameof(ProcessModelIdentityType.NetworkService)}"); 457 ColorConsole.WriteLine($" (NSE) {nameof(ProcessModelIdentityType.NetworkService)}");
361 - ColorConsole.WriteLine();  
362 - ColorConsole.Write(" (EX) ", ConsoleColor.Red); ColorConsole.WriteLine("Exit");  
363 username = ColorConsole.ReadLine().ToUpper(); 458 username = ColorConsole.ReadLine().ToUpper();
364 - if (username == "EX") { return null; }  
365 - if (string.IsNullOrEmpty(username)) { username = nameof(ProcessModelIdentityType.ApplicationPoolIdentity); };  
366 - if (username == "API" || username == nameof(ProcessModelIdentityType.ApplicationPoolIdentity)) { username = nameof(ProcessModelIdentityType.ApplicationPoolIdentity); } 459 + if (username == "EX") { return; }
  460 + else if (string.IsNullOrEmpty(username)) { username=wa.Xml_PoolUsername; password = wa.Xml_PoolPassword; }
  461 + else if (username == "API" || username == nameof(ProcessModelIdentityType.ApplicationPoolIdentity)) { username = nameof(ProcessModelIdentityType.ApplicationPoolIdentity); }
367 else if (username == "LSE" || username == nameof(ProcessModelIdentityType.LocalService)) { username = nameof(ProcessModelIdentityType.LocalService); } 462 else if (username == "LSE" || username == nameof(ProcessModelIdentityType.LocalService)) { username = nameof(ProcessModelIdentityType.LocalService); }
368 else if (username == "LSY" || username == nameof(ProcessModelIdentityType.LocalSystem)) { username = nameof(ProcessModelIdentityType.LocalSystem); } 463 else if (username == "LSY" || username == nameof(ProcessModelIdentityType.LocalSystem)) { username = nameof(ProcessModelIdentityType.LocalSystem); }
369 else if (username == "NSE" || username == nameof(ProcessModelIdentityType.NetworkService)) { username = nameof(ProcessModelIdentityType.NetworkService); } 464 else if (username == "NSE" || username == nameof(ProcessModelIdentityType.NetworkService)) { username = nameof(ProcessModelIdentityType.NetworkService); }
370 else 465 else
371 { 466 {
372 - ColorConsole.WriteLine("Enter password, then [Enter]"); 467 + ColorConsole.WriteLine("Enter password.[Enter]=finish input.Empty=no password.EX=exit");
373 password = ColorConsole.ReadLine().ToUpper(); 468 password = ColorConsole.ReadLine().ToUpper();
374 //bool valid = System.Web.ApplicationSerices.AuthenticationService.ValidateUser(username, password, mull); 469 //bool valid = System.Web.ApplicationSerices.AuthenticationService.ValidateUser(username, password, mull);
375 } 470 }
376 - parameters = new Dictionary<string, string> { { "username", username }, { "password", password }, };  
377 } 471 }
378 - WebApplicationManagerCore.SetPoolUserAccount(d.Xml_AppName, d.Xml_SiteName, username, password);  
379 - ColorConsole.WriteLine($"Pool user changed from {olduserinfo} to {WebApplicationManagerCore.GetUserInfo(d.Xml_PoolName)} for pool {d.Xml_PoolName}.");  
380 - return parameters;  
381 } 472 }
382 - #endregion 473 + #endregion 1st level Executors
  474 +
  475 + #region private method: DisplayWebAppInfo
  476 + private static object DisplayWebAppInfo(object obj, int lineix)
  477 + {
  478 + WebApplication wa = (obj as Menu.ExecutorParameter).Parameters as WebApplication;
  479 + if (lineix == 0)
  480 + {
  481 + ColorConsole.WriteLine($"{wa.Xml_Description}", ConsoleColor.Black, ConsoleColor.White);
  482 + }
  483 + else if (lineix == 1)
  484 + {
  485 + ColorConsole.Write($"Web app:");
  486 + ColorConsole.Write($"{wa.Xml_AppName}", ConsoleColor.Cyan);
  487 + var fc2 = wa.ApplicationState.Contains("Unregistered") ? ConsoleColor.Red : ConsoleColor.Green;
  488 + ColorConsole.Write($"{wa.ApplicationState}", fc2, bracket: "()");
  489 + ColorConsole.Write($", Log.path:");
  490 + ColorConsole.Write($"{wa.ApplicationPath}", ConsoleColor.White);
  491 + ColorConsole.Write($", Phy.path:");
  492 + ColorConsole.WriteLine($"{wa.Xml_AppPhysicalPath}", ConsoleColor.White);
  493 + }
  494 + else if (lineix == 2)
  495 + {
  496 + ColorConsole.Write($"impersonate identity:");
  497 + ColorConsole.WriteLine($"{wa.AppImpersonateIdentity}", ConsoleColor.White);
  498 + }
  499 + else if (lineix == 3)
  500 + {
  501 + ColorConsole.Write($"Site:");
  502 + ColorConsole.Write($"{wa.Xml_SiteName}", ConsoleColor.Cyan);
  503 + var fc0 =
  504 + wa.SiteState.Contains("Started") ? ConsoleColor.Green
  505 + : wa.SiteState.Contains("Unregistered") ? ConsoleColor.Red
  506 + : ConsoleColor.Yellow;
  507 + ColorConsole.Write($"{wa.SiteState}", fc0, bracket: "()");
  508 + ColorConsole.Write($", Ports:");
  509 + ColorConsole.Write($"{wa.SitePortList}", ConsoleColor.White);
  510 + ColorConsole.Write($", Phy.path:");
  511 + ColorConsole.WriteLine($"{wa.Xml_SitePhysicalPath}", ConsoleColor.White);
  512 + }
  513 + else if (lineix == 4)
  514 + {
  515 + ColorConsole.Write($"Pool:");
  516 + ColorConsole.Write($"{wa.Xml_PoolName}", ConsoleColor.Cyan);
  517 + var fc1 = wa.PoolState == null ? ConsoleColor.Red
  518 + : wa.PoolState.Contains("Started") ? ConsoleColor.Green
  519 + : wa.PoolState.Contains("Unregistered") ? ConsoleColor.Red
  520 + : ConsoleColor.Yellow;
  521 + string waps = wa.PoolState == null ? "Unregistered/Unknown" : wa.PoolState;
  522 + ColorConsole.Write($"{waps}", fc1, bracket: "()");
  523 + ColorConsole.Write($", identity:");
  524 + ColorConsole.WriteLine($"{wa.PoolAccount}", ConsoleColor.White);
  525 + }
  526 + else if (lineix == 5)
  527 + {
  528 + ColorConsole.WriteLine();
  529 + }
  530 + else
  531 + {
  532 + return null;
  533 + }
  534 + return "";
  535 + }
  536 + #endregion private method: DisplayWebAppInfo
383 } 537 }
384 538
385 public static class WebApplicationManagerCore 539 public static class WebApplicationManagerCore
386 { 540 {
387 #region private method: CollectWebAppInfo 541 #region private method: CollectWebAppInfo
388 - public static WebApplication CollectWebAppInfo(SiteCollection sites,ApplicationPoolCollection pools, WebApplication wadef) 542 + public static WebApplication CollectWebAppInfo(WebApplication wadef)
389 { 543 {
390 - var wa = new WebApplication(wadef);  
391 - try 544 + using (ServerManager sm = new ServerManager())
392 { 545 {
393 - wa.Site = sites[wa.Xml_SiteName];  
394 - if (wa.Site == null) { throw new Exception(); }  
395 - else 546 + var sites = sm.Sites;
  547 + var pools = sm.ApplicationPools;
  548 +
  549 + var wa = new WebApplication(wadef);
  550 + try
396 { 551 {
397 - var ss = wa.Site.State;  
398 - wa.SiteState = ss.ToString();  
399 - wa.SitePortList = "";  
400 - foreach (var binding in wa.Site.Bindings)  
401 - {  
402 - if (binding?.EndPoint?.Port != null) { wa.SitePortList += $"[{binding.EndPoint.Port}]"; }  
403 - }  
404 - var wn = Path.Combine("/", wa.Xml_AppName);  
405 - var _wa = wa.Site.Applications[wn];  
406 - if (_wa == null) 552 + wa.Site = sites[wa.Xml_SiteName];
  553 + if (wa.Site == null) { throw new Exception(); }
  554 + else
407 { 555 {
408 - wa.ApplicationState = "Unregistered/Unknown";  
409 - wa.ApplicationPath = "";  
410 - wa.Application = null;  
411 - wa.AppImpersonateIdentity = ""; 556 + var ss = wa.Site.State;
  557 + wa.SiteState = ss.ToString();
  558 + wa.SitePortList = "";
  559 + foreach (var binding in wa.Site.Bindings)
  560 + {
  561 + if (binding?.EndPoint?.Port != null) { wa.SitePortList += $"[{binding.EndPoint.Port}]"; }
  562 + }
  563 + var wn = Path.Combine("/", wa.Xml_AppName);
  564 + var _wa = wa.Site.Applications[wn];
  565 + if (_wa == null)
  566 + {
  567 + wa.ApplicationState = "Unregistered/Unknown";
  568 + wa.ApplicationPath = "";
  569 + wa.Application = null;
  570 + wa.AppImpersonateIdentity = "";
  571 + }
  572 + else
  573 + {
  574 + wa.ApplicationState = "Registered";
  575 + wa.ApplicationPath = _wa.Path;
  576 + wa.Application = _wa;
  577 + wa.AppImpersonateIdentity = GetCurrentImpersonateIdentityInfo(wa);
  578 + }
412 } 579 }
  580 + }
  581 + catch
  582 + {
  583 + wa.Site = null;
  584 + wa.SiteState = "Unregistered/Unknown";
  585 + wa.SitePortList = "";
  586 + wa.Application = null;
  587 + wa.ApplicationState = "Unregistered/Unknown";
  588 + wa.ApplicationPath = "";
  589 + };
  590 + try
  591 + {
  592 + wa.ApplicationPool = pools[wa.Xml_PoolName];
  593 + if (wa.ApplicationPool == null) { throw new Exception(); }
413 else 594 else
414 { 595 {
415 - wa.ApplicationState = "Registered";  
416 - wa.ApplicationPath = _wa.Path;  
417 - wa.Application = _wa;  
418 - wa.AppImpersonateIdentity = GetImpersonateIdentityInfo(wa.Xml_IdentityConfigFile); 596 + wa.PoolState = wa.ApplicationPool.State.ToString();
  597 + string pa = $"{wa.ApplicationPool.ProcessModel.IdentityType}";
  598 + if (wa.ApplicationPool.ProcessModel.IdentityType == ProcessModelIdentityType.SpecificUser)
  599 + {
  600 + pa += $"({wa.ApplicationPool.ProcessModel.UserName}[{wa.ApplicationPool.ProcessModel.Password}])";
  601 + }
  602 + wa.PoolAccount = pa;
419 } 603 }
420 } 604 }
421 - }  
422 - catch (Exception ex)  
423 - {  
424 - wa.Site = null;  
425 - wa.SiteState = "Unregistered/Unknown";  
426 - wa.SitePortList = "";  
427 - wa.Application = null;  
428 - wa.ApplicationState = "Unregistered/Unknown";  
429 - wa.ApplicationPath = "";  
430 - };  
431 - try  
432 - {  
433 - wa.ApplicationPool = pools[wa.Xml_PoolName];  
434 - if (wa.ApplicationPool == null) { throw new Exception(); }  
435 - else 605 + catch
436 { 606 {
437 - wa.PoolState = wa.ApplicationPool.State.ToString();  
438 - string pa = $"{wa.ApplicationPool.ProcessModel.IdentityType}";  
439 - if (wa.ApplicationPool.ProcessModel.IdentityType == ProcessModelIdentityType.SpecificUser)  
440 - {  
441 - pa += $"({wa.ApplicationPool.ProcessModel.UserName}[{wa.ApplicationPool.ProcessModel.Password}])";  
442 - }  
443 - wa.PoolAccount = pa; 607 + wa.ApplicationPool = null;
  608 + wa.PoolState = "Unregistered/Unknown";
  609 + wa.PoolAccount = "";
444 } 610 }
  611 + return wa;
445 } 612 }
446 - catch  
447 - {  
448 - wa.ApplicationPool = null;  
449 - wa.PoolState = "Unregistered/Unknown";  
450 - wa.PoolAccount = "";  
451 - }  
452 - return wa;  
453 } 613 }
454 #endregion private method: CollectWebAppInfo 614 #endregion private method: CollectWebAppInfo
455 615
@@ -541,8 +701,9 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -541,8 +701,9 @@ namespace Vrh.Log4Pro.MaintenanceConsole
541 #endregion private method:CommitChanges 701 #endregion private method:CommitChanges
542 702
543 #region private methods: Get information (with no ServerManager parameter) 703 #region private methods: Get information (with no ServerManager parameter)
544 - public static string GetImpersonateIdentityInfo(string filepath) 704 + public static string GetCurrentImpersonateIdentityInfo(WebApplication wa)
545 { 705 {
  706 + var filepath = wa.Xml_ImpersonateIdentityConfigFile;
546 try 707 try
547 { 708 {
548 var xml = XElement.Load(filepath); 709 var xml = XElement.Load(filepath);
@@ -553,6 +714,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -553,6 +714,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
553 var impersonate = identityXml.Attribute(XName.Get("impersonate"))?.Value; 714 var impersonate = identityXml.Attribute(XName.Get("impersonate"))?.Value;
554 var username = identityXml.Attribute(XName.Get("userName"))?.Value; 715 var username = identityXml.Attribute(XName.Get("userName"))?.Value;
555 var password = identityXml.Attribute(XName.Get("password"))?.Value; 716 var password = identityXml.Attribute(XName.Get("password"))?.Value;
  717 +
556 string unpswinfo = $", username[password]: {username}[{password}]"; 718 string unpswinfo = $", username[password]: {username}[{password}]";
557 var userinfo = impersonate.ToLower() == "true" && !string.IsNullOrWhiteSpace(username) ? unpswinfo : ""; 719 var userinfo = impersonate.ToLower() == "true" && !string.IsNullOrWhiteSpace(username) ? unpswinfo : "";
558 var retinfo = $"Impersonate={impersonate}{userinfo}"; 720 var retinfo = $"Impersonate={impersonate}{userinfo}";
@@ -561,22 +723,40 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -561,22 +723,40 @@ namespace Vrh.Log4Pro.MaintenanceConsole
561 } 723 }
562 catch { return "no info (exception)"; } 724 catch { return "no info (exception)"; }
563 } 725 }
564 - public static string GetUserInfo(string poolname) 726 + public static string GetDefaultImpersonateIdentityInfo(WebApplication wa)
  727 + {
  728 + var impersonate = wa.Xml_ImpersonateIdentity;
  729 + var username = wa.Xml_ImpersonateIdentityUsername;
  730 + var password = wa.Xml_ImpersonateIdentityPassword;
  731 +
  732 + string unpswinfo = $", username[password]: {username}[{password}]";
  733 + var userinfo = impersonate && !string.IsNullOrWhiteSpace(username) ? unpswinfo : "";
  734 + var retinfo = $"Impersonate={impersonate}{userinfo}";
  735 + return retinfo;
  736 + }
  737 + public static string GetDefaultPoolIdentityInfo(WebApplication wa)
  738 + {
  739 + var pit = wa.Xml_PoolIdentitytype;
  740 + var pun = wa.Xml_PoolUsername;
  741 + var ppw = wa.Xml_PoolPassword;
  742 + string userinfo = $"Identity type:{pit}";
  743 + if (pit == ProcessModelIdentityType.SpecificUser) { userinfo += $", username[password]:{pun}[{ppw}]"; }
  744 + return userinfo;
  745 + }
  746 + public static string GetCurrentPoolIdentityInfo(WebApplication wa)
565 { 747 {
  748 + string poolname = wa.Xml_PoolName;
566 using (var sm2 = new ServerManager()) 749 using (var sm2 = new ServerManager())
567 { 750 {
568 - var pool = sm2.ApplicationPools[poolname];  
569 string userinfo = ""; 751 string userinfo = "";
  752 + var pool = sm2.ApplicationPools[poolname];
570 if (pool != null) 753 if (pool != null)
571 { 754 {
572 - if (pool.ProcessModel.IdentityType == ProcessModelIdentityType.SpecificUser)  
573 - {  
574 - userinfo = $"{pool.ProcessModel.UserName}({pool.ProcessModel.Password})";  
575 - }  
576 - else  
577 - {  
578 - userinfo = $"{pool.ProcessModel.IdentityType}";  
579 - } 755 + var pit = pool.ProcessModel.IdentityType;
  756 + var pun = pool.ProcessModel.UserName;
  757 + var ppw = pool.ProcessModel.IdentityType;
  758 + userinfo = $"Identity type:{pit}";
  759 + if (pit == ProcessModelIdentityType.SpecificUser) { userinfo += $", username[password]:{pun}[{ppw}]"; }
580 } 760 }
581 return userinfo; 761 return userinfo;
582 } 762 }
@@ -824,6 +1004,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -824,6 +1004,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
824 public class WebApplication : XmlLinqBase 1004 public class WebApplication : XmlLinqBase
825 { 1005 {
826 #region properties from Xml definition 1006 #region properties from Xml definition
  1007 + public string Xml_Key;
827 public string Xml_AppName; 1008 public string Xml_AppName;
828 public string Xml_Description; 1009 public string Xml_Description;
829 public string Xml_PoolName; 1010 public string Xml_PoolName;
@@ -831,10 +1012,13 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -831,10 +1012,13 @@ namespace Vrh.Log4Pro.MaintenanceConsole
831 public string Xml_AppPhysicalPath; 1012 public string Xml_AppPhysicalPath;
832 public ManagedPipelineMode Xml_PoolPipeLineMode; 1013 public ManagedPipelineMode Xml_PoolPipeLineMode;
833 public string Xml_SitePhysicalPath; 1014 public string Xml_SitePhysicalPath;
834 - public string Xml_IdentityConfigFile; 1015 + public string Xml_ImpersonateIdentityConfigFile;
835 public ProcessModelIdentityType Xml_PoolIdentitytype; 1016 public ProcessModelIdentityType Xml_PoolIdentitytype;
836 public string Xml_PoolUsername; 1017 public string Xml_PoolUsername;
837 public string Xml_PoolPassword; 1018 public string Xml_PoolPassword;
  1019 + public string Xml_ImpersonateIdentityUsername;
  1020 + public string Xml_ImpersonateIdentityPassword;
  1021 + public bool Xml_ImpersonateIdentity;
838 public bool Xml_RecreatePool; 1022 public bool Xml_RecreatePool;
839 public bool Xml_RecreateSite; 1023 public bool Xml_RecreateSite;
840 public bool Xml_RecreateApp; 1024 public bool Xml_RecreateApp;
@@ -859,6 +1043,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -859,6 +1043,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
859 { 1043 {
860 string ATTRIBUTEMANDATORY = nameof(XmlStructure.WebApplication) + " attribute is mandatory! Name: {0}"; 1044 string ATTRIBUTEMANDATORY = nameof(XmlStructure.WebApplication) + " attribute is mandatory! Name: {0}";
861 1045
  1046 + Xml_Key= GetValue(nameof(XmlStructure.WebApplication.Attributes.Key), webappXml, XmlStructure.WebApplication.Attributes.Key.Values.DEFAULT);
862 Xml_AppName = webappXml.Attribute(XName.Get(nameof(XmlStructure.WebApplication.Attributes.Name)))?.Value; 1047 Xml_AppName = webappXml.Attribute(XName.Get(nameof(XmlStructure.WebApplication.Attributes.Name)))?.Value;
863 if (string.IsNullOrWhiteSpace(Xml_AppName)) { throw new ApplicationException(string.Format(ATTRIBUTEMANDATORY, nameof(XmlStructure.WebApplication.Attributes.Name))); } 1048 if (string.IsNullOrWhiteSpace(Xml_AppName)) { throw new ApplicationException(string.Format(ATTRIBUTEMANDATORY, nameof(XmlStructure.WebApplication.Attributes.Name))); }
864 1049
@@ -876,7 +1061,6 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -876,7 +1061,6 @@ namespace Vrh.Log4Pro.MaintenanceConsole
876 Xml_PoolPipeLineMode = GetValue(nameof(XmlStructure.WebApplication.Attributes.AppPoolPipeLineMode), webappXml, ManagedPipelineMode.Integrated); 1061 Xml_PoolPipeLineMode = GetValue(nameof(XmlStructure.WebApplication.Attributes.AppPoolPipeLineMode), webappXml, ManagedPipelineMode.Integrated);
877 } 1062 }
878 Xml_SitePhysicalPath = GetValue(nameof(XmlStructure.WebApplication.Attributes.SiteRootDir), webappXml, Xml_AppPhysicalPath); 1063 Xml_SitePhysicalPath = GetValue(nameof(XmlStructure.WebApplication.Attributes.SiteRootDir), webappXml, Xml_AppPhysicalPath);
879 - Xml_IdentityConfigFile = webappXml.Attribute(XName.Get(nameof(XmlStructure.WebApplication.Attributes.IdentityConfigFile)))?.Value;  
880 1064
881 Xml_PoolUsername = GetValue(nameof(XmlStructure.WebApplication.Attributes.AppPoolUsername), webappXml, nameof(ProcessModelIdentityType.ApplicationPoolIdentity)); 1065 Xml_PoolUsername = GetValue(nameof(XmlStructure.WebApplication.Attributes.AppPoolUsername), webappXml, nameof(ProcessModelIdentityType.ApplicationPoolIdentity));
882 Xml_PoolPassword = GetValue(nameof(XmlStructure.WebApplication.Attributes.AppPoolPassword), webappXml, ""); 1066 Xml_PoolPassword = GetValue(nameof(XmlStructure.WebApplication.Attributes.AppPoolPassword), webappXml, "");
@@ -884,6 +1068,11 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -884,6 +1068,11 @@ namespace Vrh.Log4Pro.MaintenanceConsole
884 catch { Xml_PoolIdentitytype = ProcessModelIdentityType.SpecificUser; } 1068 catch { Xml_PoolIdentitytype = ProcessModelIdentityType.SpecificUser; }
885 if (Xml_PoolIdentitytype != ProcessModelIdentityType.SpecificUser) { Xml_PoolPassword = ""; Xml_PoolUsername = ""; } 1069 if (Xml_PoolIdentitytype != ProcessModelIdentityType.SpecificUser) { Xml_PoolPassword = ""; Xml_PoolUsername = ""; }
886 1070
  1071 + Xml_ImpersonateIdentityConfigFile = webappXml.Attribute(XName.Get(nameof(XmlStructure.WebApplication.Attributes.ImpersonateIdentityConfigFile)))?.Value;
  1072 + Xml_ImpersonateIdentity = GetValue(nameof(XmlStructure.WebApplication.Attributes.ImpersonateIdentity), webappXml, XmlStructure.WebApplication.Attributes.ImpersonateIdentity.Values.DEFAULT);
  1073 + Xml_ImpersonateIdentityUsername = GetValue(nameof(XmlStructure.WebApplication.Attributes.ImpersonateIdentityUsername), webappXml, "");
  1074 + Xml_ImpersonateIdentityPassword= GetValue(nameof(XmlStructure.WebApplication.Attributes.ImpersonateIdentityPassword), webappXml, "");
  1075 +
887 Xml_RecreatePool = GetValue(nameof(XmlStructure.WebApplication.Attributes.RecreatePool), webappXml, false); 1076 Xml_RecreatePool = GetValue(nameof(XmlStructure.WebApplication.Attributes.RecreatePool), webappXml, false);
888 Xml_RecreateSite = GetValue(nameof(XmlStructure.WebApplication.Attributes.RecreateSite), webappXml, false); 1077 Xml_RecreateSite = GetValue(nameof(XmlStructure.WebApplication.Attributes.RecreateSite), webappXml, false);
889 Xml_RecreateApp = GetValue(nameof(XmlStructure.WebApplication.Attributes.RecreateApp), webappXml, true); 1078 Xml_RecreateApp = GetValue(nameof(XmlStructure.WebApplication.Attributes.RecreateApp), webappXml, true);
@@ -893,19 +1082,27 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -893,19 +1082,27 @@ namespace Vrh.Log4Pro.MaintenanceConsole
893 } 1082 }
894 public WebApplication(WebApplication wadef) 1083 public WebApplication(WebApplication wadef)
895 { 1084 {
  1085 + Xml_Key = wadef.Xml_Key;
896 Xml_AppName = wadef.Xml_AppName; 1086 Xml_AppName = wadef.Xml_AppName;
897 Xml_Description = wadef.Xml_Description; 1087 Xml_Description = wadef.Xml_Description;
898 Xml_PoolName = wadef.Xml_PoolName; 1088 Xml_PoolName = wadef.Xml_PoolName;
899 Xml_SiteName = wadef.Xml_SiteName; 1089 Xml_SiteName = wadef.Xml_SiteName;
900 Xml_AppPhysicalPath = wadef.Xml_AppPhysicalPath; 1090 Xml_AppPhysicalPath = wadef.Xml_AppPhysicalPath;
901 Xml_SitePhysicalPath = wadef.Xml_SitePhysicalPath; 1091 Xml_SitePhysicalPath = wadef.Xml_SitePhysicalPath;
902 - Xml_IdentityConfigFile = wadef.Xml_IdentityConfigFile; 1092 + Xml_PoolPipeLineMode = wadef.Xml_PoolPipeLineMode;
903 Xml_PoolIdentitytype = wadef.Xml_PoolIdentitytype; 1093 Xml_PoolIdentitytype = wadef.Xml_PoolIdentitytype;
  1094 + Xml_PoolUsername = wadef.Xml_PoolUsername;
  1095 + Xml_PoolPassword = wadef.Xml_PoolPassword;
904 Xml_RecreateSite = wadef.Xml_RecreateSite; 1096 Xml_RecreateSite = wadef.Xml_RecreateSite;
905 Xml_RecreatePool = wadef.Xml_RecreatePool; 1097 Xml_RecreatePool = wadef.Xml_RecreatePool;
906 Xml_RecreateApp = wadef.Xml_RecreateApp; 1098 Xml_RecreateApp = wadef.Xml_RecreateApp;
907 Xml_ForceRemovePool = wadef.Xml_ForceRemovePool; 1099 Xml_ForceRemovePool = wadef.Xml_ForceRemovePool;
908 Xml_ForceRemoveSite = wadef.Xml_ForceRemoveSite; 1100 Xml_ForceRemoveSite = wadef.Xml_ForceRemoveSite;
  1101 +
  1102 + Xml_ImpersonateIdentityConfigFile = wadef.Xml_ImpersonateIdentityConfigFile;
  1103 + Xml_ImpersonateIdentity = wadef.Xml_ImpersonateIdentity;
  1104 + Xml_ImpersonateIdentityUsername = wadef.Xml_ImpersonateIdentityUsername;
  1105 + Xml_ImpersonateIdentityPassword = wadef.Xml_ImpersonateIdentityPassword;
909 } 1106 }
910 #region XmlStructure 1107 #region XmlStructure
911 public static class XmlStructure 1108 public static class XmlStructure
@@ -914,15 +1111,19 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -914,15 +1111,19 @@ namespace Vrh.Log4Pro.MaintenanceConsole
914 { 1111 {
915 public static class Attributes 1112 public static class Attributes
916 { 1113 {
  1114 + public static class Key { public static class Values { public const string DEFAULT = ""; } }
917 public static class Name { } 1115 public static class Name { }
918 public static class Description { } 1116 public static class Description { }
919 public static class AppPool { public static class Values { public const string DEFAULT = "DefaultAppPool"; } } 1117 public static class AppPool { public static class Values { public const string DEFAULT = "DefaultAppPool"; } }
920 public static class WebSite { public static class Values { public const string DEFAULT = "Default Web Site"; } } 1118 public static class WebSite { public static class Values { public const string DEFAULT = "Default Web Site"; } }
921 public static class InstallDir { } 1119 public static class InstallDir { }
922 public static class SiteRootDir { } 1120 public static class SiteRootDir { }
923 - public static class IdentityConfigFile { } 1121 + public static class ImpersonateIdentityConfigFile { }
924 public static class AppPoolUsername { } 1122 public static class AppPoolUsername { }
925 public static class AppPoolPassword { } 1123 public static class AppPoolPassword { }
  1124 + public static class ImpersonateIdentityUsername { }
  1125 + public static class ImpersonateIdentityPassword { }
  1126 + public static class ImpersonateIdentity { public static class Values { public const bool DEFAULT = false; } }
926 public static class AppPoolPipeLineMode { } 1127 public static class AppPoolPipeLineMode { }
927 public static class RecreatePool { } 1128 public static class RecreatePool { }
928 public static class RecreateSite { } 1129 public static class RecreateSite { }
Vrh.Log4Pro.MaintenanceConsole/Manager - WindowsServiceManager.cs
@@ -12,232 +12,54 @@ using Microsoft.Web.Administration; @@ -12,232 +12,54 @@ using Microsoft.Web.Administration;
12 using System.Management; 12 using System.Management;
13 using System.Diagnostics; 13 using System.Diagnostics;
14 14
  15 +using Vrh.Log4Pro.MaintenanceConsole.MenuNS;
  16 +using Vrh.Log4Pro.MaintenanceConsole.ColorConsoleNS;
  17 +using Vrh.Log4Pro.MaintenanceConsole.ToolsNS;
  18 +using Vrh.Log4Pro.MaintenanceConsole.CommandLineParserNS;
  19 +
15 using Vrh.XmlProcessing; 20 using Vrh.XmlProcessing;
  21 +using VRH.Common;
16 using System.Xml.Linq; 22 using System.Xml.Linq;
17 using System.Text.RegularExpressions; 23 using System.Text.RegularExpressions;
18 24
19 -namespace Vrh.Log4Pro.MaintenanceConsole 25 +namespace Vrh.Log4Pro.MaintenanceConsole.WindowsServiceManagerNS
20 { 26 {
21 #region WindowsServiceManager class 27 #region WindowsServiceManager class
22 public static class WindowsServiceManager 28 public static class WindowsServiceManager
23 { 29 {
  30 + private const string XMLCONNECTIONSTRING = "config=MAINTENANCECONSOLE_WINDOWSSERVICEMANAGER;";
  31 + private const string XMLCONNECTIONSTRING_DEFAULT = "file=Config.Xml;element=WindowsServices;";
  32 +
24 #region Execute 33 #region Execute
25 public static object Execute(object o1 = null, object o2 = null) 34 public static object Execute(object o1 = null, object o2 = null)
26 { 35 {
27 - string xmlcs = "file=Config.Xml;element=WindowsServices;";  
28 - var config = new WindowsServiceManagerXmlProcessor(xmlcs, "", "hu-HU"); 36 + var args = (o1 as Menu.ExecutorParameter).Args;
  37 + var functionkey = CommandLine.GetCommandLineArgument(args, CLP.CMD_FUNCTION);
29 38
  39 + var config = new WindowsServiceManagerXmlProcessor(XMLCONNECTIONSTRING, "", "hu-HU");
  40 + var ep = new Menu.ExecutorParameter(config, args);
30 var menufunctions = new Menu("Manage Windows Services", "Select the management function!") 41 var menufunctions = new Menu("Manage Windows Services", "Select the management function!")
31 - .AddMenuItem(new Menu.Item("WSR", "Register", Register))  
32 - .AddMenuItem(new Menu.Item("WSU", "Unregister", Unregister))  
33 - .AddMenuItem(new Menu.Item("WSS", "Start", Start))  
34 - .AddMenuItem(new Menu.Item("WSX", "Stop", Stop))  
35 - .AddMenuItem(new Menu.Item("WSK", "Kill", Kill))  
36 - .AddMenuItem(new Menu.Item("WSP", "Purge", Purge))  
37 - .AddMenuItem(new Menu.Item("WSA", "Set user account", SetUserAccount))  
38 - .SetSelectionMode(Menu.SelectionMode.Single);  
39 -  
40 - while (true)  
41 - {  
42 - Menu.Selection sr;  
43 -  
44 - menufunctions.DisplayTitle();  
45 - var menuservices = DisplayServices(config);  
46 - menufunctions.DisplayItems(3, 35);  
47 - sr = menufunctions.Select();  
48 - if (sr.Result == Menu.SelectionResult.Exit) { break; }  
49 - else if (sr.Result == Menu.SelectionResult.None) { continue; }  
50 - else if (sr.Result == Menu.SelectionResult.Error) { continue; }  
51 - menufunctions.SetExecutorParameters(sr,config);  
52 - menufunctions.ExecuteSelection(sr.SelectedKeyList);  
53 - } 42 + .AddMenuItem(new Menu.Item(CLP.Module.WindowsServiceManager.Function.Register.KEY, "Register", Register,ep))
  43 + .AddMenuItem(new Menu.Item(CLP.Module.WindowsServiceManager.Function.Unregister.KEY, "Unregister", Unregister, ep))
  44 + .AddMenuItem(new Menu.Item(CLP.Module.WindowsServiceManager.Function.Start.KEY, "Start", Start, ep))
  45 + .AddMenuItem(new Menu.Item(CLP.Module.WindowsServiceManager.Function.Stop.KEY, "Stop", Stop, ep))
  46 + .AddMenuItem(new Menu.Item(CLP.Module.WindowsServiceManager.Function.Kill.KEY, "Kill", Kill, ep))
  47 + .AddMenuItem(new Menu.Item(CLP.Module.WindowsServiceManager.Function.Purge.KEY, "Purge", Purge, ep))
  48 + .AddMenuItem(new Menu.Item(CLP.Module.WindowsServiceManager.Function.SetUserAccount.KEY, "Set user account", SetUserAccount, ep))
  49 + .SetSelectionMode(Menu.SelectionMode.Single)
  50 + .SetMenuHeaderDisplayer(ServiceListDisplayer);
  51 + menufunctions.ExecuteMenu(functionkey);
54 return null; 52 return null;
55 } 53 }
56 #endregion Execute 54 #endregion Execute
57 55
58 - public static Menu DisplayServices(WindowsServiceManagerXmlProcessor config,string prompt = null,bool silent=false)  
59 - {  
60 - List<WindowsService> wsdefList = config.GetDefinitionList();  
61 - var menuservices = new Menu("Windows services",prompt)  
62 - .SetMenuItemDisplayer(DisplayServiceInfo)  
63 - .SetSelectionMode(Menu.SelectionMode.Multi)  
64 - .SetHeaderWidth(4);  
65 - menuservices.ClearMenuItemList();  
66 - foreach (var wsdef in wsdefList)  
67 - {  
68 - var w = CollectWindowsServiceInfo(wsdef);  
69 - menuservices.AddMenuItem(new Menu.Item(null, null, null, w));  
70 - }  
71 - if (!silent) { menuservices.DisplayItems(1); }  
72 - return menuservices;  
73 - }  
74 -  
75 - #region private method: DisplayServiceInfo  
76 - private static object DisplayServiceInfo(object wsobj, int lineix)  
77 - {  
78 - WindowsService ws = wsobj as WindowsService;  
79 - if (lineix == 0)  
80 - {  
81 - ColorConsole.Write($"{ws.Description}", ConsoleColor.Black, ConsoleColor.White);  
82 - ColorConsole.WriteLine($"{ws.DisplayName}", bracket: "()");  
83 - return ws.DisplayName+ws.Description;  
84 - }  
85 - else if (lineix == 1)  
86 - {  
87 - ColorConsole.Write($"Win service:");  
88 - ColorConsole.Write($"{ws.Name}", ConsoleColor.Cyan);  
89 - var fc2 =  
90 - ws.Status.Contains(nameof(WmiServiceStatus.OK)) ? ConsoleColor.Green  
91 - : ws.Status.Contains(nameof(WmiServiceStatus.Unknown)) ? ConsoleColor.Red  
92 - : ws.Status.Contains(nameof(WmiServiceStatus.Error)) ? ConsoleColor.Red  
93 - : ConsoleColor.Yellow;  
94 - ColorConsole.Write($"(");  
95 - ColorConsole.Write($"{ws.Status}", fc2);  
96 - var fc0 =  
97 - ws.State.Contains(nameof(WmiServiceState.Running)) ? ConsoleColor.Green  
98 - : ws.State.Contains(nameof(WmiServiceState.Unknown)) ? ConsoleColor.Red  
99 - : ws.State.Contains(nameof(WmiServiceState.Unregistered)) ? ConsoleColor.Red  
100 - : ConsoleColor.Yellow;  
101 - ColorConsole.Write($" / ");  
102 - ColorConsole.Write($"{ws.State}", fc0);  
103 - ColorConsole.Write($")");  
104 - ColorConsole.Write($", StartMode:");  
105 - ColorConsole.Write($"{ws.StartMode}", ConsoleColor.Cyan);  
106 - if(ws.Status==nameof(WmiServiceStatus.OK) && ws.State != nameof(WmiServiceState.Stopped) && ws.State != nameof(WmiServiceState.Unknown))  
107 - {  
108 - ColorConsole.Write($", Priority:");  
109 - ColorConsole.Write($"{ws.PriorityClass}", ConsoleColor.White);  
110 - ColorConsole.Write($", ProcessId:");  
111 - ColorConsole.Write($"{ws.ProcessId}", ConsoleColor.White);  
112 - }  
113 - ColorConsole.WriteLine();  
114 - return ws.Name;  
115 - }  
116 - else if (lineix == 2)  
117 - {  
118 - if (string.IsNullOrEmpty(ws.PathName)) { return ""; }  
119 - var cmdarray = CommandLineParser.SplitArgs(ws.PathName).ToArray();  
120 - ColorConsole.Write($"Start command:");  
121 - ColorConsole.WriteLine($"{cmdarray[0]}", ConsoleColor.White);  
122 - return ws.PathName;  
123 - }  
124 - else if (lineix == 3)  
125 - {  
126 - if (string.IsNullOrEmpty(ws.PathName)) { return ""; }  
127 - var cmdparams = CommandLineParser.SplitArgs(ws.PathName).Skip(1).ToArray();  
128 - if (cmdparams.Length==0) { return ""; }  
129 - var cmdparamsstr = string.Join("][", cmdparams);  
130 - ColorConsole.Write($"Start arguments:");  
131 - ColorConsole.WriteLine($"[{cmdparamsstr}]", ConsoleColor.White);  
132 - return cmdparamsstr;  
133 - }  
134 - else if (lineix == 4)  
135 - {  
136 - ColorConsole.Write($"User:");  
137 - ColorConsole.WriteLine($"{ws.StartName}", ConsoleColor.White);  
138 - return ws.StartName;  
139 - }  
140 - else if (lineix == 5)  
141 - {  
142 - ColorConsole.WriteLine();  
143 - return " ";  
144 - }  
145 - return null;  
146 - }  
147 - private enum WmiServiceState  
148 - {  
149 - StartPending,  
150 - Running,  
151 - Paused,  
152 - PausedPending,  
153 - Stopped,  
154 - StopPending,  
155 - Unknown,  
156 - Unregistered,  
157 - }  
158 - private enum WmiServiceStatus  
159 - {  
160 - OK,  
161 - Error,  
162 - Degraded,  
163 - Unknown,  
164 - Pred_Fail,  
165 - Starting,  
166 - Stopping,  
167 - Service,  
168 - Stressed,  
169 - NonRecover,  
170 - No_Contact,  
171 - Lost_Comm,  
172 - Unregistered,  
173 - }  
174 - #endregion private method: DisplayServiceInfo  
175 -  
176 - #region private CollectWindowsServiceInfo  
177 - private static WindowsService CollectWindowsServiceInfo(WindowsService ws)  
178 - {  
179 - using (var wmiService = WindowsServiceManagerCore.GetServiceObject(ws.Name))  
180 - {  
181 - using (var service = WindowsServiceManagerCore.GetServiceController(ws.Name))  
182 - {  
183 - var wmiserviceproblem = false;  
184 - try { wmiService.Get();}catch { wmiserviceproblem = true; }  
185 - if (wmiService == null || service == null || wmiserviceproblem)  
186 - {  
187 - ws.DisplayName = ws.Xml_DisplayName;  
188 - ws.Description = ws.Xml_Description;  
189 - ws.ThisDependsOn = ws.Xml_Dependon;  
190 - ws.ServicesDependOnThis = new string[] { "???" };  
191 - ws.PathName = $"\"{ws.Xml_Exe}\" {ws.Xml_Arguments}";  
192 - ws.StartMode = ws.Xml_StartMode;  
193 - ws.State = nameof(WmiServiceState.Unregistered);  
194 - ws.Status = nameof(WmiServiceStatus.Unregistered);  
195 - if (ws.Xml_IdentityType== ServiceAccount.User) { ws.StartName = ws.Xml_Username + $"({ws.Xml_Password})"; }  
196 - else { ws.StartName = ws.Xml_IdentityType.ToString(); }  
197 - ws.ProcessId = 0;  
198 - ws.PriorityClass = ws.Xml_Priority;  
199 - }  
200 - else  
201 - {  
202 - ws.DisplayName = (string)wmiService[nameof(WindowsService.DisplayName)];  
203 - ws.Description = (string)wmiService[nameof(WindowsService.Description)];  
204 - if (string.IsNullOrEmpty(ws.Description)) { ws.Description = ws.DisplayName; }  
205 - if (string.IsNullOrEmpty(ws.DisplayName)) { ws.DisplayName = ws.Description; }  
206 - ws.ServicesDependOnThis = service.DependentServices.Select(s => s.ServiceName).ToArray();  
207 - try { ws.ThisDependsOn = service.ServicesDependedOn.Select(s => s.ServiceName).ToArray(); } catch { ws.ThisDependsOn = new string[] { "???" }; }  
208 - ws.PathName = (string)wmiService[nameof(WindowsService.PathName)];if (ws.PathName == null) { ws.PathName = ""; }  
209 - var sm = (string)wmiService[nameof(WindowsService.StartMode)];  
210 - ws.StartMode =  
211 - sm == "Auto" ? ServiceStartMode.Automatic  
212 - : sm == "Auto" ? ServiceStartMode.Manual  
213 - : sm == "Auto" ? ServiceStartMode.Disabled  
214 - : sm == "Auto" ? ServiceStartMode.Boot  
215 - : sm == "Auto" ? ServiceStartMode.System  
216 - : ServiceStartMode.Manual;  
217 - ws.State = (string)wmiService[nameof(WindowsService.State)];  
218 - ws.Status = (string)wmiService[nameof(WindowsService.Status)];  
219 - ws.StartName = (string)wmiService[nameof(WindowsService.StartName)];  
220 - ws.ProcessId = 0;  
221 - ws.PriorityClass = "-";  
222 - if (ws.State != nameof(WmiServiceState.Stopped))  
223 - {  
224 - ws.ProcessId = Convert.ToInt32(wmiService[nameof(WindowsService.ProcessId)]);  
225 - ws.PriorityClass = Process.GetProcessById(ws.ProcessId).PriorityClass.ToString();  
226 - }  
227 - }  
228 - }  
229 - }  
230 - return ws;  
231 - }  
232 - #endregion private CollectWindowsServiceInfo  
233 -  
234 #region First level Executors with UI 56 #region First level Executors with UI
235 - private static object Purge(object parameter,object o) 57 + private static object Purge(object parameter, object o)
236 { 58 {
237 - var config = parameter as WindowsServiceManagerXmlProcessor; 59 + var config = (parameter as Menu.ExecutorParameter).GetConfig<WindowsServiceManagerXmlProcessor>();
238 while (true) 60 while (true)
239 { 61 {
240 - ColorConsole.Write($"Enter servicename mask (% and ? are wildchars)!",ConsoleColor.Yellow); 62 + ColorConsole.Write($"Enter servicename mask (% and ? are wildchars)!", ConsoleColor.Yellow);
241 var mask = ColorConsole.ReadLine($" ---> ", ConsoleColor.Yellow).ToUpper(); 63 var mask = ColorConsole.ReadLine($" ---> ", ConsoleColor.Yellow).ToUpper();
242 if (mask == "EX") { return o; } 64 if (mask == "EX") { return o; }
243 else if (mask == "") { continue; } 65 else if (mask == "") { continue; }
@@ -245,12 +67,11 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -245,12 +67,11 @@ namespace Vrh.Log4Pro.MaintenanceConsole
245 if (sl.Length > 10) { sl = sl.Take(10).ToArray(); } 67 if (sl.Length > 10) { sl = sl.Take(10).ToArray(); }
246 68
247 var menuservices = new Menu("Windows services", "Select the windows service(es) to delete (max 10 in one run)!") 69 var menuservices = new Menu("Windows services", "Select the windows service(es) to delete (max 10 in one run)!")
248 - .SetSelectionMode(Menu.SelectionMode.Multi)  
249 - .SetHeaderWidth(4); 70 + .SetSelectionMode(Menu.SelectionMode.Multi);
250 71
251 for (var i = 0; i < sl.Length; i++) 72 for (var i = 0; i < sl.Length; i++)
252 { 73 {
253 - menuservices.AddMenuItem(new Menu.Item(null, $"{sl[i].ServiceName} ({sl[i].DisplayName})", null, sl[i].ServiceName)); 74 + menuservices.AddMenuItem(new Menu.Item(null, $"{sl[i].ServiceName} ({sl[i].DisplayName})", null, new Menu.ExecutorParameter(pars:sl[i].ServiceName)));
254 } 75 }
255 menuservices.DisplayItems(1); 76 menuservices.DisplayItems(1);
256 var ms = menuservices.Select(); 77 var ms = menuservices.Select();
@@ -259,21 +80,21 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -259,21 +80,21 @@ namespace Vrh.Log4Pro.MaintenanceConsole
259 else if (ms.Result == Menu.SelectionResult.Exit) { break; } 80 else if (ms.Result == Menu.SelectionResult.Exit) { break; }
260 else 81 else
261 { 82 {
262 - foreach (var p in ms.SelectedParameterList) 83 + foreach (var p in ms.SelectedParameterList)
263 { 84 {
264 ColorConsole.Write($"Enter CONFIRM to delete service ", ConsoleColor.Yellow); 85 ColorConsole.Write($"Enter CONFIRM to delete service ", ConsoleColor.Yellow);
265 - ColorConsole.Write($"{p}", ConsoleColor.White,bracket:"''"); 86 + ColorConsole.Write($"{p}", ConsoleColor.White, bracket: "''");
266 ColorConsole.Write($"!", ConsoleColor.Yellow); 87 ColorConsole.Write($"!", ConsoleColor.Yellow);
267 var confirmation = ColorConsole.ReadLine(prefix: " ---> ").ToUpper(); 88 var confirmation = ColorConsole.ReadLine(prefix: " ---> ").ToUpper();
268 if (confirmation == "EX") { return o; } 89 if (confirmation == "EX") { return o; }
269 - else if (confirmation == "") 90 + else if (confirmation == "")
270 { 91 {
271 ColorConsole.WriteLine($"Service '{p}' skipped!", ConsoleColor.Green); 92 ColorConsole.WriteLine($"Service '{p}' skipped!", ConsoleColor.Green);
272 - continue; 93 + continue;
273 } 94 }
274 else if (confirmation == "CONFIRM") 95 else if (confirmation == "CONFIRM")
275 { 96 {
276 - WindowsServiceManagerCore.Unregister((string)p); 97 + WindowsServiceManagerCore.Unregister((string)(p.Parameters));
277 ColorConsole.WriteLine($"Service '{p}' deleted!", ConsoleColor.Green); 98 ColorConsole.WriteLine($"Service '{p}' deleted!", ConsoleColor.Green);
278 } 99 }
279 } 100 }
@@ -281,12 +102,16 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -281,12 +102,16 @@ namespace Vrh.Log4Pro.MaintenanceConsole
281 } 102 }
282 return o; 103 return o;
283 } 104 }
284 - private static object Kill(object parameter,object o) 105 + private static object Kill(object parameter, object o)
285 { 106 {
286 - var config = parameter as WindowsServiceManagerXmlProcessor;  
287 - var menuservices = DisplayServices(config, $"Select the windows service(es) to manage with function '{nameof(Kill)}'!", silent:true); 107 + var config = (parameter as Menu.ExecutorParameter).GetConfig<WindowsServiceManagerXmlProcessor>();
  108 + var args = (parameter as Menu.ExecutorParameter).Args;
288 109
289 - Menu.Selection sr = menuservices.Select(); 110 + var selectedserviceindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.WindowsServiceManager.Function.CMD_SERVICES);
  111 +
  112 + var menuservices = DisplayWindowsServiceMenu(config, $"Select the windows service(es) to manage with function '{nameof(Kill)}'!", silent: true);
  113 +
  114 + Menu.Selection sr = menuservices.Select(selectedserviceindexes);
290 if (sr.Result == Menu.SelectionResult.Exit) { return o; } 115 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
291 else if (sr.Result == Menu.SelectionResult.None) { return o; } 116 else if (sr.Result == Menu.SelectionResult.None) { return o; }
292 else if (sr.Result == Menu.SelectionResult.Error) { return o; } 117 else if (sr.Result == Menu.SelectionResult.Error) { return o; }
@@ -294,25 +119,26 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -294,25 +119,26 @@ namespace Vrh.Log4Pro.MaintenanceConsole
294 else { } 119 else { }
295 foreach (var p in sr.SelectedParameterList) 120 foreach (var p in sr.SelectedParameterList)
296 { 121 {
297 - WindowsService ws = p as WindowsService; 122 + WindowsService ws = p.Parameters as WindowsService;
298 try 123 try
299 { 124 {
300 var success = WindowsServiceManagerCore.Kill(ws.Name); 125 var success = WindowsServiceManagerCore.Kill(ws.Name);
301 ColorConsole.WriteLine($"Service killed. Name:{ws.Name}", ConsoleColor.Green); 126 ColorConsole.WriteLine($"Service killed. Name:{ws.Name}", ConsoleColor.Green);
302 } 127 }
303 - catch (Exception ex)  
304 - {  
305 - ColorConsole.WriteLine(ex.Message, ConsoleColor.Red);  
306 - } 128 + catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); }
307 } 129 }
308 return o; 130 return o;
309 } 131 }
310 - private static object Register(object parameter, object o) 132 + private static object Register(object parameter, object o)
311 { 133 {
312 - var config = parameter as WindowsServiceManagerXmlProcessor;  
313 - var menuservices = DisplayServices(config, $"Select the windows service(es) to manage with function '{nameof(Register)}'!", silent: true); 134 + var config = (parameter as Menu.ExecutorParameter).GetConfig<WindowsServiceManagerXmlProcessor>();
  135 + var args = (parameter as Menu.ExecutorParameter).Args;
314 136
315 - Menu.Selection sr = menuservices.Select(); 137 + var selectedserviceindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.WindowsServiceManager.Function.CMD_SERVICES);
  138 +
  139 + var menuservices = DisplayWindowsServiceMenu(config, $"Select the windows service(es) to manage with function '{nameof(Register)}'!", silent: true);
  140 +
  141 + Menu.Selection sr = menuservices.Select(selectedserviceindexes);
316 if (sr.Result == Menu.SelectionResult.Exit) { return o; } 142 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
317 else if (sr.Result == Menu.SelectionResult.None) { return o; } 143 else if (sr.Result == Menu.SelectionResult.None) { return o; }
318 else if (sr.Result == Menu.SelectionResult.Error) { return o; } 144 else if (sr.Result == Menu.SelectionResult.Error) { return o; }
@@ -320,25 +146,25 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -320,25 +146,25 @@ namespace Vrh.Log4Pro.MaintenanceConsole
320 else { } 146 else { }
321 foreach (var p in sr.SelectedParameterList) 147 foreach (var p in sr.SelectedParameterList)
322 { 148 {
323 - WindowsService ws = p as WindowsService; 149 + WindowsService ws = p.Parameters as WindowsService;
324 try 150 try
325 { 151 {
326 - var success = WindowsServiceManagerCore.Register(ws);  
327 - ColorConsole.WriteLine($"Service registered. Name:{ws.Name}", ConsoleColor.Green);  
328 - }  
329 - catch (Exception ex)  
330 - {  
331 - ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); 152 + var success = WindowsServiceManagerCore.Register(ws, sr.SelectedParameterList.Select(x => (x.Parameters as WindowsService).Name).ToList());
  153 + ColorConsole.WriteLine($"Service unregistered. Name:{ws.Name}", ConsoleColor.Green);
332 } 154 }
  155 + catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); }
333 } 156 }
334 return o; 157 return o;
335 } 158 }
336 - private static object Unregister(object parameter,object o) 159 + private static object Unregister(object parameter, object o)
337 { 160 {
338 - var config = parameter as WindowsServiceManagerXmlProcessor;  
339 - var menuservices = DisplayServices(config, $"Select the windows service(es) to manage with function '{nameof(Unregister)}'!", silent: true); 161 + var config = (parameter as Menu.ExecutorParameter).GetConfig<WindowsServiceManagerXmlProcessor>();
  162 + var args = (parameter as Menu.ExecutorParameter).Args;
  163 + var selectedserviceindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.WindowsServiceManager.Function.CMD_SERVICES);
  164 +
  165 + var menuservices = DisplayWindowsServiceMenu(config, $"Select the windows service(es) to manage with function '{nameof(Unregister)}'!", silent: true);
340 166
341 - Menu.Selection sr = menuservices.Select(); 167 + Menu.Selection sr = menuservices.Select(selectedserviceindexes);
342 if (sr.Result == Menu.SelectionResult.Exit) { return o; } 168 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
343 else if (sr.Result == Menu.SelectionResult.None) { return o; } 169 else if (sr.Result == Menu.SelectionResult.None) { return o; }
344 else if (sr.Result == Menu.SelectionResult.Error) { return o; } 170 else if (sr.Result == Menu.SelectionResult.Error) { return o; }
@@ -346,25 +172,25 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -346,25 +172,25 @@ namespace Vrh.Log4Pro.MaintenanceConsole
346 else { } 172 else { }
347 foreach (var p in sr.SelectedParameterList) 173 foreach (var p in sr.SelectedParameterList)
348 { 174 {
349 - WindowsService ws = p as WindowsService; 175 + WindowsService ws = p.Parameters as WindowsService;
350 try 176 try
351 { 177 {
352 var success = WindowsServiceManagerCore.Unregister(ws); 178 var success = WindowsServiceManagerCore.Unregister(ws);
353 ColorConsole.WriteLine($"Service unregistered. Name:{ws.Name}", ConsoleColor.Green); 179 ColorConsole.WriteLine($"Service unregistered. Name:{ws.Name}", ConsoleColor.Green);
354 } 180 }
355 - catch (Exception ex)  
356 - {  
357 - ColorConsole.WriteLine(ex.Message, ConsoleColor.Red);  
358 - } 181 + catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); }
359 } 182 }
360 return o; 183 return o;
361 } 184 }
362 - private static object Start(object parameter,object o) 185 + private static object Start(object parameter, object o)
363 { 186 {
364 - var config = parameter as WindowsServiceManagerXmlProcessor;  
365 - var menuservices = DisplayServices(config, $"Select the windows service(es) to manage with function '{nameof(Start)}'!", silent: true); 187 + var config = (parameter as Menu.ExecutorParameter).GetConfig<WindowsServiceManagerXmlProcessor>();
  188 + var args = (parameter as Menu.ExecutorParameter).Args;
  189 + var selectedserviceindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.WindowsServiceManager.Function.CMD_SERVICES);
366 190
367 - Menu.Selection sr = menuservices.Select(); 191 + var menuservices = DisplayWindowsServiceMenu(config, $"Select the windows service(es) to manage with function '{nameof(Start)}'!", silent: true);
  192 +
  193 + Menu.Selection sr = menuservices.Select(selectedserviceindexes);
368 if (sr.Result == Menu.SelectionResult.Exit) { return o; } 194 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
369 else if (sr.Result == Menu.SelectionResult.None) { return o; } 195 else if (sr.Result == Menu.SelectionResult.None) { return o; }
370 else if (sr.Result == Menu.SelectionResult.Error) { return o; } 196 else if (sr.Result == Menu.SelectionResult.Error) { return o; }
@@ -372,25 +198,25 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -372,25 +198,25 @@ namespace Vrh.Log4Pro.MaintenanceConsole
372 else { } 198 else { }
373 foreach (var p in sr.SelectedParameterList) 199 foreach (var p in sr.SelectedParameterList)
374 { 200 {
375 - WindowsService ws = p as WindowsService; 201 + WindowsService ws = p.Parameters as WindowsService;
376 try 202 try
377 { 203 {
378 var success = WindowsServiceManagerCore.Start(ws.Name, ws.Xml_StartTimeout); 204 var success = WindowsServiceManagerCore.Start(ws.Name, ws.Xml_StartTimeout);
379 ColorConsole.WriteLine($"Service started. Name:{ws.Name}", ConsoleColor.Green); 205 ColorConsole.WriteLine($"Service started. Name:{ws.Name}", ConsoleColor.Green);
380 } 206 }
381 - catch (Exception ex)  
382 - {  
383 - ColorConsole.WriteLine(ex.Message, ConsoleColor.Red);  
384 - } 207 + catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); }
385 } 208 }
386 return o; 209 return o;
387 } 210 }
388 - private static object Stop(object parameter,object o) 211 + private static object Stop(object parameter, object o)
389 { 212 {
390 - var config = parameter as WindowsServiceManagerXmlProcessor;  
391 - var menuservices = DisplayServices(config, $"Select the windows service(es) to manage with function '{nameof(Kill)}'!", silent: true); 213 + var config = (parameter as Menu.ExecutorParameter).GetConfig<WindowsServiceManagerXmlProcessor>();
  214 + var args = (parameter as Menu.ExecutorParameter).Args;
  215 + var selectedserviceindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.WindowsServiceManager.Function.CMD_SERVICES);
  216 +
  217 + var menuservices = DisplayWindowsServiceMenu(config, $"Select the windows service(es) to manage with function '{nameof(Kill)}'!", silent: true);
392 218
393 - Menu.Selection sr = menuservices.Select(); 219 + Menu.Selection sr = menuservices.Select(selectedserviceindexes);
394 if (sr.Result == Menu.SelectionResult.Exit) { return o; } 220 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
395 else if (sr.Result == Menu.SelectionResult.None) { return o; } 221 else if (sr.Result == Menu.SelectionResult.None) { return o; }
396 else if (sr.Result == Menu.SelectionResult.Error) { return o; } 222 else if (sr.Result == Menu.SelectionResult.Error) { return o; }
@@ -398,25 +224,25 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -398,25 +224,25 @@ namespace Vrh.Log4Pro.MaintenanceConsole
398 else { } 224 else { }
399 foreach (var p in sr.SelectedParameterList) 225 foreach (var p in sr.SelectedParameterList)
400 { 226 {
401 - WindowsService ws = p as WindowsService; 227 + WindowsService ws = p.Parameters as WindowsService;
402 try 228 try
403 { 229 {
404 var success = WindowsServiceManagerCore.Stop(ws.Name, ws.Xml_StopTimeout); 230 var success = WindowsServiceManagerCore.Stop(ws.Name, ws.Xml_StopTimeout);
405 ColorConsole.WriteLine($"Service stopped. Name:{ws.Name}", ConsoleColor.Green); 231 ColorConsole.WriteLine($"Service stopped. Name:{ws.Name}", ConsoleColor.Green);
406 } 232 }
407 - catch (Exception ex)  
408 - {  
409 - ColorConsole.WriteLine(ex.Message, ConsoleColor.Red);  
410 - } 233 + catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); }
411 } 234 }
412 return o; 235 return o;
413 } 236 }
414 - private static object SetUserAccount(object parameter,object o)  
415 - {  
416 - var config = parameter as WindowsServiceManagerXmlProcessor;  
417 - var menuservices = DisplayServices(config, $"Select the windows service(es) to manage with function '{nameof(SetUserAccount)}'!", silent: true); 237 + private static object SetUserAccount(object parameter, object o)
  238 + {
  239 + var config = (parameter as Menu.ExecutorParameter).GetConfig<WindowsServiceManagerXmlProcessor>();
  240 + var args = (parameter as Menu.ExecutorParameter).Args;
  241 + var selectedserviceindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.WindowsServiceManager.Function.CMD_SERVICES);
  242 +
  243 + var menuservices = DisplayWindowsServiceMenu(config, $"Select the windows service(es) to manage with function '{nameof(SetUserAccount)}'!", silent: true);
418 244
419 - Menu.Selection sr = menuservices.Select(); 245 + Menu.Selection sr = menuservices.Select(selectedserviceindexes);
420 if (sr.Result == Menu.SelectionResult.Exit) { return o; } 246 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
421 else if (sr.Result == Menu.SelectionResult.None) { return o; } 247 else if (sr.Result == Menu.SelectionResult.None) { return o; }
422 else if (sr.Result == Menu.SelectionResult.Error) { return o; } 248 else if (sr.Result == Menu.SelectionResult.Error) { return o; }
@@ -426,37 +252,15 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -426,37 +252,15 @@ namespace Vrh.Log4Pro.MaintenanceConsole
426 string username = null, password = null; 252 string username = null, password = null;
427 foreach (var p in sr.SelectedParameterList) 253 foreach (var p in sr.SelectedParameterList)
428 { 254 {
429 - WindowsService ws = p as WindowsService; 255 + WindowsService ws = p.Parameters as WindowsService;
430 try 256 try
431 { 257 {
432 using (var wmiService = WindowsServiceManagerCore.GetServiceObject(ws.Name)) 258 using (var wmiService = WindowsServiceManagerCore.GetServiceObject(ws.Name))
433 { 259 {
434 - if (username==null)  
435 - {  
436 - string olduserinfo = WindowsServiceManagerCore.GetUserInfo(wmiService);  
437 - ColorConsole.WriteLine($"Current user info: {olduserinfo}");  
438 - ColorConsole.WriteLine("Enter username then password. [Enter]=save.EX=exit");  
439 - ColorConsole.WriteLine("Username is in the form of 'domainname\\username'");  
440 - ColorConsole.WriteLine("Special usernames are: (Empty=API) ");  
441 -  
442 - ColorConsole.WriteLine($"LSE", ConsoleColor.Yellow, bracket: "()", prefix: " ", suffix: $" {nameof(ServiceAccount.LocalService)}");  
443 - ColorConsole.WriteLine($"LSY", ConsoleColor.Yellow, bracket: "()", prefix: " ", suffix: $" {nameof(ServiceAccount.LocalSystem)}");  
444 - ColorConsole.WriteLine($"NSE", ConsoleColor.Yellow, bracket: "()", prefix: " ", suffix: $" {nameof(ServiceAccount.NetworkService)}");  
445 -  
446 - ColorConsole.WriteLine();  
447 - ColorConsole.WriteLine($"EX", ConsoleColor.Red, bracket: "()", prefix: " ", suffix: " Exit");  
448 -  
449 - username = ColorConsole.ReadLine("username -->", ConsoleColor.Yellow, bracket: "[]");  
450 - if (username == "EX") { return null; }  
451 - else if (string.IsNullOrEmpty(username)) { username = nameof(ServiceAccount.LocalSystem); }  
452 - else if (username.ToUpper() == "LSE" || username == nameof(ServiceAccount.LocalService)) { username = nameof(ServiceAccount.LocalService); }  
453 - else if (username.ToUpper() == "LSY" || username == nameof(ServiceAccount.LocalSystem)) { username = nameof(ServiceAccount.LocalSystem); }  
454 - else if (username.ToUpper() == "NSE" || username == nameof(ServiceAccount.NetworkService)) { username = nameof(ServiceAccount.NetworkService); }  
455 - else  
456 - {  
457 - password = ColorConsole.ReadLine("password -->", ConsoleColor.Yellow, bracket: "[]");  
458 - if (password == "EX") { return null; }  
459 - } 260 + if (username == null)
  261 + {
  262 + GetUsernameAndPassword(wmiService,ws,out username, out password);
  263 + if (username == "EX" || password == "EX") { return null; }
460 } 264 }
461 if (WindowsServiceManagerCore.SetUserAccount(wmiService, username, password)) { ColorConsole.WriteLine($"Service user account changed. Name:{ws.Name}", ConsoleColor.Green); } 265 if (WindowsServiceManagerCore.SetUserAccount(wmiService, username, password)) { ColorConsole.WriteLine($"Service user account changed. Name:{ws.Name}", ConsoleColor.Green); }
462 else { ColorConsole.WriteLine($"Service user account change FAILED! Name:{ws.Name}", ConsoleColor.Red); } 266 else { ColorConsole.WriteLine($"Service user account change FAILED! Name:{ws.Name}", ConsoleColor.Red); }
@@ -467,6 +271,147 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -467,6 +271,147 @@ namespace Vrh.Log4Pro.MaintenanceConsole
467 return o; 271 return o;
468 } 272 }
469 #endregion First level Executors with UI 273 #endregion First level Executors with UI
  274 +
  275 + #region DisplayServices
  276 + private static void ServiceListDisplayer() { DisplayWindowsServiceMenu(); }
  277 + public static Menu DisplayWindowsServiceMenu(WindowsServiceManagerXmlProcessor config=null,string prompt = null,bool silent=false)
  278 + {
  279 + if (config==null) { config = new WindowsServiceManagerXmlProcessor(XMLCONNECTIONSTRING, "", "hu-HU"); }
  280 + var menuservices = new Menu("Windows services",prompt)
  281 + .SetMenuItemDisplayer(DisplayServiceInfo)
  282 + .SetSelectionMode(Menu.SelectionMode.Multi);
  283 + menuservices.ClearMenuItemList();
  284 +
  285 + List<WindowsServiceGroup> wsgdefList = config.GetWindowsServiceGroupDefinitionList();
  286 + foreach (var wsgdef in wsgdefList)
  287 + {
  288 + string menuitemtext = wsgdef.Xml_Description + "(" + string.Join(",", wsgdef.Xml_WindowsServiceKeyList) + ")";
  289 + menuservices.AddMenuItem(new Menu.ItemGroup(wsgdef.Xml_Key, menuitemtext, wsgdef.Xml_WindowsServiceKeyList));
  290 + }
  291 +
  292 + menuservices.AddMenuItem(new Menu.ItemSeparator());// separator
  293 +
  294 + List<WindowsService> wsdefList = config.GetWindowsServiceDefinitionList();
  295 + foreach (var wsdef in wsdefList)
  296 + {
  297 + menuservices.AddMenuItem(new Menu.Item(wsdef.Xml_Key, null, null, new Menu.ExecutorParameter(pars: wsdef.CollectWindowsServiceInfo())));
  298 + }
  299 +
  300 + if (!silent) { menuservices.DisplayItems(1); }
  301 + return menuservices;
  302 + }
  303 + #endregion DisplayServices
  304 +
  305 + #region private method: DisplayServiceInfo
  306 + private static object DisplayServiceInfo(object obj, int lineix)
  307 + {
  308 + if (obj == null) { return null; }
  309 + WindowsService ws = (obj as Menu.ExecutorParameter).Parameters as WindowsService;
  310 + if (ws == null) { return null; }
  311 + if (lineix == 0)
  312 + {
  313 + ColorConsole.Write($"{ws.Description}", ConsoleColor.Black, ConsoleColor.White);
  314 + ColorConsole.WriteLine($"{ws.DisplayName}", bracket: "()");
  315 + return ws.DisplayName+ws.Description;
  316 + }
  317 + else if (lineix == 1)
  318 + {
  319 + ColorConsole.Write($"Win service:");
  320 + ColorConsole.Write($"{ws.Name}", ConsoleColor.Cyan);
  321 + var fc2 =
  322 + ws.Status.Contains(nameof(WindowsService.WmiServiceStatus.OK)) ? ConsoleColor.Green
  323 + : ws.Status.Contains(nameof(WindowsService.WmiServiceStatus.Unknown)) ? ConsoleColor.Red
  324 + : ws.Status.Contains(nameof(WindowsService.WmiServiceStatus.Error)) ? ConsoleColor.Red
  325 + : ConsoleColor.Yellow;
  326 + ColorConsole.Write($"(");
  327 + ColorConsole.Write($"{ws.Status}", fc2);
  328 + var fc0 =
  329 + ws.State.Contains(nameof(WindowsService.WmiServiceState.Running)) ? ConsoleColor.Green
  330 + : ws.State.Contains(nameof(WindowsService.WmiServiceState.Unknown)) ? ConsoleColor.Red
  331 + : ws.State.Contains(nameof(WindowsService.WmiServiceState.Unregistered)) ? ConsoleColor.Red
  332 + : ConsoleColor.Yellow;
  333 + ColorConsole.Write($" / ");
  334 + ColorConsole.Write($"{ws.State}", fc0);
  335 + ColorConsole.Write($")");
  336 + ColorConsole.Write($", StartMode:");
  337 + ColorConsole.Write($"{ws.StartMode}", ConsoleColor.Cyan);
  338 + if(ws.Status==nameof(WindowsService.WmiServiceStatus.OK) && ws.State != nameof(WindowsService.WmiServiceState.Stopped) && ws.State != nameof(WindowsService.WmiServiceState.Unknown))
  339 + {
  340 + ColorConsole.Write($", Priority:");
  341 + ColorConsole.Write($"{ws.PriorityClass}", ConsoleColor.White);
  342 + ColorConsole.Write($", ProcessId:");
  343 + ColorConsole.Write($"{ws.ProcessId}", ConsoleColor.White);
  344 + }
  345 + ColorConsole.WriteLine();
  346 + return ws.Name;
  347 + }
  348 + else if (lineix == 2)
  349 + {
  350 + if (string.IsNullOrEmpty(ws.PathName)) { return ""; }
  351 + var cmdarray = CommandLineParser.SplitArgs(ws.PathName).ToArray();
  352 + ColorConsole.Write($"Start command:");
  353 + ColorConsole.WriteLine($"{cmdarray[0]}", ConsoleColor.White);
  354 + return ws.PathName;
  355 + }
  356 + else if (lineix == 3)
  357 + {
  358 + if (string.IsNullOrEmpty(ws.PathName)) { return ""; }
  359 + var cmdparams = CommandLineParser.SplitArgs(ws.PathName).Skip(1).ToArray();
  360 + if (cmdparams.Length==0) { return ""; }
  361 + var cmdparamsstr = string.Join("][", cmdparams);
  362 + ColorConsole.Write($"Start arguments:");
  363 + ColorConsole.WriteLine($"[{cmdparamsstr}]", ConsoleColor.White);
  364 + return cmdparamsstr;
  365 + }
  366 + else if (lineix == 4)
  367 + {
  368 + ColorConsole.Write($"User:");
  369 + ColorConsole.WriteLine($"{ws.StartName}", ConsoleColor.White);
  370 + return ws.StartName;
  371 + }
  372 + else if (lineix == 5)
  373 + {
  374 + ColorConsole.WriteLine();
  375 + return " ";
  376 + }
  377 + return null;
  378 + }
  379 + #endregion private method: DisplayServiceInfo
  380 +
  381 + #region private GetUsernameAndPassword
  382 + private static void GetUsernameAndPassword(ManagementObject wmiService, WindowsService ws, out string username, out string password)
  383 + {
  384 + username = null;
  385 + password = null;
  386 + if (Menu.IsCommandMode()) { username = ws.Xml_Username; password = ws.Xml_Password; return; }
  387 +
  388 + string olduserinfo = WindowsServiceManagerCore.GetUserInfo(wmiService);
  389 + ColorConsole.WriteLine($"Current user info: {olduserinfo}");
  390 + ColorConsole.WriteLine("Enter username then password. [Enter]=save.EX=exit");
  391 + ColorConsole.WriteLine("Username is in the form of 'domainname\\username'");
  392 + ColorConsole.WriteLine($"Empty={ws.Xml_Username} (default defined in XML)");
  393 + ColorConsole.WriteLine("Special usernames are:");
  394 +
  395 + ColorConsole.WriteLine($"LSE", ConsoleColor.Yellow, bracket: "()", prefix: " ", suffix: $" {nameof(ServiceAccount.LocalService)}");
  396 + ColorConsole.WriteLine($"LSY", ConsoleColor.Yellow, bracket: "()", prefix: " ", suffix: $" {nameof(ServiceAccount.LocalSystem)}");
  397 + ColorConsole.WriteLine($"NSE", ConsoleColor.Yellow, bracket: "()", prefix: " ", suffix: $" {nameof(ServiceAccount.NetworkService)}");
  398 +
  399 + ColorConsole.WriteLine();
  400 + ColorConsole.WriteLine($"EX", ConsoleColor.Red, bracket: "()", prefix: " ", suffix: " Exit");
  401 +
  402 + username = ColorConsole.ReadLine("username -->", ConsoleColor.Yellow, bracket: "[]");
  403 + if (username == "EX") { return; }
  404 + else if (string.IsNullOrEmpty(username)) { username = ws.Xml_Username; password = ws.Xml_Password; }
  405 + else if (username.ToUpper() == "LSE" || username == nameof(ServiceAccount.LocalService)) { username = nameof(ServiceAccount.LocalService); }
  406 + else if (username.ToUpper() == "LSY" || username == nameof(ServiceAccount.LocalSystem)) { username = nameof(ServiceAccount.LocalSystem); }
  407 + else if (username.ToUpper() == "NSE" || username == nameof(ServiceAccount.NetworkService)) { username = nameof(ServiceAccount.NetworkService); }
  408 + else
  409 + {
  410 + password = ColorConsole.ReadLine("password -->", ConsoleColor.Yellow, bracket: "[]");
  411 + if (password == "EX") { return; }
  412 + }
  413 + }
  414 + #endregion private GetUsernameAndPassword
470 } 415 }
471 #endregion WindowsServiceManager class 416 #endregion WindowsServiceManager class
472 417
@@ -533,7 +478,15 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -533,7 +478,15 @@ namespace Vrh.Log4Pro.MaintenanceConsole
533 try { Process proc = Process.GetProcessById(pid); proc.Kill(); } 478 try { Process proc = Process.GetProcessById(pid); proc.Kill(); }
534 catch (ArgumentException) { } // Process already exited. 479 catch (ArgumentException) { } // Process already exited.
535 } 480 }
536 - public static bool Register(WindowsService ws) 481 +
  482 + #region Register
  483 + /// <summary>
  484 + /// Szerviz regisztrálása
  485 + /// </summary>
  486 + /// <param name="ws">a szerviz adatait tartalmazó objektum</param>
  487 + /// <param name="dependencygroupservicenamelist">azon szervizek listája, amelyekkel egy függőségi csoportba tartozik</param>
  488 + /// <returns></returns>
  489 + public static bool Register(WindowsService ws,List<string> dependencygroupservicenamelist)
537 { 490 {
538 // sc.exe create "ServiceName" binpath= "c:\windows\system32\NewServ.exe" displayname= "Service display name" obj= "username" password="password" start= auto depend= "sname1/sname2/snmae3" 491 // sc.exe create "ServiceName" binpath= "c:\windows\system32\NewServ.exe" displayname= "Service display name" obj= "username" password="password" start= auto depend= "sname1/sname2/snmae3"
539 // sc.exe \\myserver create NewService binpath= c:\windows\system32\NewServ.exe 492 // sc.exe \\myserver create NewService binpath= c:\windows\system32\NewServ.exe
@@ -568,8 +521,15 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -568,8 +521,15 @@ namespace Vrh.Log4Pro.MaintenanceConsole
568 { 521 {
569 argumentlist.Add($"obj="); argumentlist.Add(ws.Xml_IdentityType.ToString().Quote()); 522 argumentlist.Add($"obj="); argumentlist.Add(ws.Xml_IdentityType.ToString().Quote());
570 } 523 }
571 - var dependonparametert = String.Join("/", ws.Xml_Dependon);  
572 - argumentlist.Add($"depend="); argumentlist.Add(dependonparametert.Quote()); 524 +
  525 + // dependency csoport feldolgozása
  526 + var effectivedependonlist = new List<string>();
  527 + foreach (var sn in ws.Xml_Dependon) { if (dependencygroupservicenamelist.Contains(sn)) { effectivedependonlist.Add(sn); } }
  528 + foreach (var sn in ws.Xml_Dependon) { if (dependencygroupservicenamelist==null || !dependencygroupservicenamelist.Any() || dependencygroupservicenamelist.Contains("*") || dependencygroupservicenamelist.Contains(sn)) { effectivedependonlist.Add(sn); } }
  529 + //---------------------------------------
  530 +
  531 + var dependonparameter = String.Join("/", effectivedependonlist);
  532 + argumentlist.Add($"depend="); argumentlist.Add(dependonparameter.Quote());
573 533
574 var startparameter = 534 var startparameter =
575 ws.Xml_StartMode == ServiceStartMode.Automatic ? "auto" 535 ws.Xml_StartMode == ServiceStartMode.Automatic ? "auto"
@@ -616,6 +576,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -616,6 +576,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
616 } 576 }
617 return true; 577 return true;
618 } 578 }
  579 + #endregion Register
619 580
620 public static bool Unregister(WindowsService ws) 581 public static bool Unregister(WindowsService ws)
621 { 582 {
@@ -734,6 +695,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -734,6 +695,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
734 List<WindowsService> _winservicelist; 695 List<WindowsService> _winservicelist;
735 List<WindowsService> _winservicelistinstartorder; 696 List<WindowsService> _winservicelistinstartorder;
736 List<WindowsService> _winservicelistinstoporder; 697 List<WindowsService> _winservicelistinstoporder;
  698 + List<WindowsServiceGroup> _winservicegrouplist;
737 #region constructor 699 #region constructor
738 public WindowsServiceManagerXmlProcessor(string xmlcs, string basefolder, string lcid) : base(xmlcs, basefolder, lcid, null) 700 public WindowsServiceManagerXmlProcessor(string xmlcs, string basefolder, string lcid) : base(xmlcs, basefolder, lcid, null)
739 { 701 {
@@ -743,15 +705,28 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -743,15 +705,28 @@ namespace Vrh.Log4Pro.MaintenanceConsole
743 { 705 {
744 foreach (var wsxml in wsxmllist) { var ws = new WindowsService(wsxml); if (ws.Valid) { _winservicelist.Add(ws); } } 706 foreach (var wsxml in wsxmllist) { var ws = new WindowsService(wsxml); if (ws.Valid) { _winservicelist.Add(ws); } }
745 } 707 }
746 - _winservicelistinstartorder = ProduceDefinitionListInStartOrder();  
747 - _winservicelistinstoporder = ProduceDefinitionListInStartOrder(); _winservicelistinstoporder.Reverse(); 708 + _winservicelistinstartorder = ProduceWindowsServiceDefinitionListInStartOrder();
  709 + _winservicelistinstoporder = ProduceWindowsServiceDefinitionListInStartOrder(); _winservicelistinstoporder.Reverse();
  710 +
  711 + _winservicegrouplist = new List<WindowsServiceGroup>();
  712 + var wsgxmllist = GetAllXElements(nameof(WindowsService.XmlStructure.WindowsServiceGroup));
  713 + if (wsgxmllist != null && wsgxmllist.Any())
  714 + {
  715 + foreach (var wsgxml in wsgxmllist) { var wsg = new WindowsServiceGroup(wsgxml); if (wsg.Valid) { _winservicegrouplist.Add(wsg); } }
  716 + }
748 } 717 }
749 #endregion constructor 718 #endregion constructor
750 - #region GetDefinitionList  
751 - public List<WindowsService> GetDefinitionList() { return _winservicelist; }  
752 - public List<WindowsService> GetDefinitionListInStartOrder() { return _winservicelistinstartorder; }  
753 - public List<WindowsService> GetDefinitionListInStopOrder() { return _winservicelistinstoporder; }  
754 - private List<WindowsService> ProduceDefinitionListInStartOrder() 719 + #region GetWindowsServiceGroupDefinitionList
  720 + public WindowsServiceGroup GetWindowsServiceGroup(string key) { return _winservicegrouplist.FirstOrDefault(x => x.Xml_Key == key); }
  721 + public List<WindowsServiceGroup> GetWindowsServiceGroupDefinitionList() { return _winservicegrouplist; }
  722 + #endregion GetWindowsServiceGroupDefinitionList
  723 +
  724 + #region GetWindowsServiceDefinitionList
  725 + public WindowsService GetWindowsService(string key) { return _winservicelist.FirstOrDefault(x => x.Xml_Key == key); }
  726 + public List<WindowsService> GetWindowsServiceDefinitionList() { return _winservicelist; }
  727 + public List<WindowsService> GetWindowsServiceDefinitionListInStartOrder() { return _winservicelistinstartorder; }
  728 + public List<WindowsService> GetWindowsServiceDefinitionListInStopOrder() { return _winservicelistinstoporder; }
  729 + private List<WindowsService> ProduceWindowsServiceDefinitionListInStartOrder()
755 { 730 {
756 List<WindowsService> listinstartorder = new List<WindowsService>(); 731 List<WindowsService> listinstartorder = new List<WindowsService>();
757 bool ready = false;//akkor lesz false, ha már minden 732 bool ready = false;//akkor lesz false, ha már minden
@@ -764,7 +739,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -764,7 +739,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
764 if (namelistinstartorder.Contains(s.Name)) { continue; }//ez a szerviz már bekerült a startorder listába 739 if (namelistinstartorder.Contains(s.Name)) { continue; }//ez a szerviz már bekerült a startorder listába
765 ready = false; 740 ready = false;
766 var dl = s.Xml_Dependon; 741 var dl = s.Xml_Dependon;
767 - if (dl.Length == 0) { listinstartorder.Add(s); continue; }//ha nem függ senkitől, betesszük a startorder listába 742 + if (!dl.Any()) { listinstartorder.Add(s); continue; }//ha nem függ senkitől, betesszük a startorder listába
768 foreach (var dli in dl) 743 foreach (var dli in dl)
769 { 744 {
770 if (string.IsNullOrWhiteSpace(dli)) { continue; } 745 if (string.IsNullOrWhiteSpace(dli)) { continue; }
@@ -775,7 +750,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -775,7 +750,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
775 } 750 }
776 return listinstartorder; 751 return listinstartorder;
777 } 752 }
778 - #endregion GetDefinitionList 753 + #endregion GetWindowsServiceDefinitionList
779 } 754 }
780 #endregion WindowsServiceManagerXmlProcessor class 755 #endregion WindowsServiceManagerXmlProcessor class
781 #region WindowsService class 756 #region WindowsService class
@@ -787,8 +762,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -787,8 +762,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole
787 public string DisplayName; 762 public string DisplayName;
788 public string Description; 763 public string Description;
789 public string PathName; 764 public string PathName;
790 - public string[] ThisDependsOn;  
791 - public string[] ServicesDependOnThis; 765 + public List<string> ThisDependsOn;
  766 + public List<string> ServicesDependOnThis;
792 public int ProcessId; 767 public int ProcessId;
793 public ServiceStartMode StartMode; 768 public ServiceStartMode StartMode;
794 public string State; 769 public string State;
@@ -796,6 +771,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -796,6 +771,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
796 public string StartName; 771 public string StartName;
797 public string PriorityClass; 772 public string PriorityClass;
798 773
  774 + public string Xml_Key;
799 public string Xml_DisplayName; 775 public string Xml_DisplayName;
800 public string Xml_Description; 776 public string Xml_Description;
801 public string Xml_Exe; 777 public string Xml_Exe;
@@ -803,7 +779,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -803,7 +779,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
803 public ServiceStartMode Xml_StartMode; 779 public ServiceStartMode Xml_StartMode;
804 public string Xml_Priority; 780 public string Xml_Priority;
805 public string Xml_Arguments; 781 public string Xml_Arguments;
806 - public string[] Xml_Dependon; 782 + public List<string> Xml_Dependon;
807 public string Xml_RegistrationMode; 783 public string Xml_RegistrationMode;
808 public ServiceAccount Xml_IdentityType; 784 public ServiceAccount Xml_IdentityType;
809 public string Xml_Username; 785 public string Xml_Username;
@@ -819,6 +795,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -819,6 +795,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole
819 public WindowsService(XElement winservicexml) 795 public WindowsService(XElement winservicexml)
820 { 796 {
821 string ATTRIBUTEMANDATORY = nameof(XmlStructure.WindowsService) + " attribute is mandatory! Name: {0}"; 797 string ATTRIBUTEMANDATORY = nameof(XmlStructure.WindowsService) + " attribute is mandatory! Name: {0}";
  798 + Xml_Key = GetValue(nameof(XmlStructure.WindowsService.Attributes.Key), winservicexml, "");
  799 + if (string.IsNullOrEmpty(Xml_Key)) { throw new ApplicationException(string.Format(ATTRIBUTEMANDATORY, nameof(XmlStructure.WindowsService.Attributes.Key))); }
822 Name = winservicexml.Attribute(XName.Get(nameof(XmlStructure.WindowsService.Attributes.Name)))?.Value; 800 Name = winservicexml.Attribute(XName.Get(nameof(XmlStructure.WindowsService.Attributes.Name)))?.Value;
823 if (!ValidServiceName(Name)) 801 if (!ValidServiceName(Name))
824 { 802 {
@@ -840,13 +818,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -840,13 +818,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole
840 Xml_Priority = GetValue(nameof(XmlStructure.WindowsService.Attributes.Priority), winservicexml, XmlStructure.WindowsService.Attributes.Priority.Values.DEFAULT); 818 Xml_Priority = GetValue(nameof(XmlStructure.WindowsService.Attributes.Priority), winservicexml, XmlStructure.WindowsService.Attributes.Priority.Values.DEFAULT);
841 Xml_Arguments = GetValue(nameof(XmlStructure.WindowsService.Attributes.Arguments), winservicexml, ""); 819 Xml_Arguments = GetValue(nameof(XmlStructure.WindowsService.Attributes.Arguments), winservicexml, "");
842 820
843 - var XmlDependon = new List<string>(); 821 + Xml_Dependon = new List<string>();
844 string[] dependonarray = GetValue(nameof(XmlStructure.WindowsService.Attributes.DependOn), winservicexml, "").Split(new char[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries); 822 string[] dependonarray = GetValue(nameof(XmlStructure.WindowsService.Attributes.DependOn), winservicexml, "").Split(new char[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries);
845 foreach (var ds in dependonarray) 823 foreach (var ds in dependonarray)
846 { 824 {
847 - if (ValidServiceName(ds)) { XmlDependon.Add(ds); } 825 + if (ValidServiceName(ds)) { Xml_Dependon.Add(ds); }
848 } 826 }
849 - Xml_Dependon = XmlDependon.ToArray();  
850 827
851 Xml_RegistrationMode = GetValue(nameof(XmlStructure.WindowsService.Attributes.RegistrationMode), winservicexml, XmlStructure.WindowsService.Attributes.RegistrationMode.Values.DEFAULT); 828 Xml_RegistrationMode = GetValue(nameof(XmlStructure.WindowsService.Attributes.RegistrationMode), winservicexml, XmlStructure.WindowsService.Attributes.RegistrationMode.Values.DEFAULT);
852 Xml_RegistrationMode = Xml_RegistrationMode.Replace('-', '_'); 829 Xml_RegistrationMode = Xml_RegistrationMode.Replace('-', '_');
@@ -866,12 +843,71 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -866,12 +843,71 @@ namespace Vrh.Log4Pro.MaintenanceConsole
866 Xml_StopTimeout = GetValue(nameof(XmlStructure.WindowsService.Attributes.StopTimeout), winservicexml, XmlStructure.WindowsService.Attributes.StopTimeout.Values.DEFAULT); 843 Xml_StopTimeout = GetValue(nameof(XmlStructure.WindowsService.Attributes.StopTimeout), winservicexml, XmlStructure.WindowsService.Attributes.StopTimeout.Values.DEFAULT);
867 } 844 }
868 private bool ValidServiceName(string sn) { return !string.IsNullOrWhiteSpace(Name) && sn[0] != '@'; } 845 private bool ValidServiceName(string sn) { return !string.IsNullOrWhiteSpace(Name) && sn[0] != '@'; }
  846 + #region public CollectWindowsServiceInfo
  847 + public WindowsService CollectWindowsServiceInfo()
  848 + {
  849 + using (var wmiService = WindowsServiceManagerCore.GetServiceObject(this.Name))
  850 + {
  851 + using (var service = WindowsServiceManagerCore.GetServiceController(this.Name))
  852 + {
  853 + var wmiserviceproblem = false;
  854 + try { wmiService.Get(); } catch { wmiserviceproblem = true; }
  855 + if (wmiService == null || service == null || wmiserviceproblem)
  856 + {
  857 + this.DisplayName = this.Xml_DisplayName;
  858 + this.Description = this.Xml_Description;
  859 + this.ThisDependsOn = this.Xml_Dependon;
  860 + this.ServicesDependOnThis = new List<string>() { "???" };
  861 + this.PathName = $"\"{this.Xml_Exe}\" {this.Xml_Arguments}";
  862 + this.StartMode = this.Xml_StartMode;
  863 + this.State = nameof(WmiServiceState.Unregistered);
  864 + this.Status = nameof(WindowsService.WmiServiceStatus.Unregistered);
  865 + if (this.Xml_IdentityType == ServiceAccount.User) { this.StartName = this.Xml_Username + $"({this.Xml_Password})"; }
  866 + else { this.StartName = this.Xml_IdentityType.ToString(); }
  867 + this.ProcessId = 0;
  868 + this.PriorityClass = this.Xml_Priority;
  869 + }
  870 + else
  871 + {
  872 + this.DisplayName = (string)wmiService[nameof(WindowsService.DisplayName)];
  873 + this.Description = (string)wmiService[nameof(WindowsService.Description)];
  874 + if (string.IsNullOrEmpty(this.Description)) { this.Description = this.DisplayName; }
  875 + if (string.IsNullOrEmpty(this.DisplayName)) { this.DisplayName = this.Description; }
  876 + this.ServicesDependOnThis = service.DependentServices.Select(s => s.ServiceName).ToList();
  877 + try { this.ThisDependsOn = service.ServicesDependedOn.Select(s => s.ServiceName).ToList(); } catch { this.ThisDependsOn = new List<string>() { "???" }; }
  878 + this.PathName = (string)wmiService[nameof(WindowsService.PathName)]; if (this.PathName == null) { this.PathName = ""; }
  879 + var sm = (string)wmiService[nameof(WindowsService.StartMode)];
  880 + this.StartMode =
  881 + sm == "Auto" ? ServiceStartMode.Automatic
  882 + : sm == "Auto" ? ServiceStartMode.Manual
  883 + : sm == "Auto" ? ServiceStartMode.Disabled
  884 + : sm == "Auto" ? ServiceStartMode.Boot
  885 + : sm == "Auto" ? ServiceStartMode.System
  886 + : ServiceStartMode.Manual;
  887 + this.State = (string)wmiService[nameof(WindowsService.State)];
  888 + this.Status = (string)wmiService[nameof(WindowsService.Status)];
  889 + this.StartName = (string)wmiService[nameof(WindowsService.StartName)];
  890 + this.ProcessId = 0;
  891 + this.PriorityClass = "-";
  892 + if (this.State != nameof(WmiServiceState.Stopped))
  893 + {
  894 + this.ProcessId = Convert.ToInt32(wmiService[nameof(WindowsService.ProcessId)]);
  895 + this.PriorityClass = Process.GetProcessById(this.ProcessId).PriorityClass.ToString();
  896 + }
  897 + }
  898 + }
  899 + }
  900 + return this;
  901 + }
  902 + #endregion public CollectWindowsServiceInfo
  903 +
869 #endregion xml constructor 904 #endregion xml constructor
870 #region cloner constructor 905 #region cloner constructor
871 public WindowsService(WindowsService ws) 906 public WindowsService(WindowsService ws)
872 { 907 {
873 Name = ws.Name; 908 Name = ws.Name;
874 Valid = ws.Valid; 909 Valid = ws.Valid;
  910 + Xml_Key= ws.Xml_Key;
875 Xml_DisplayName = ws.Xml_DisplayName; 911 Xml_DisplayName = ws.Xml_DisplayName;
876 Xml_Description = ws.Xml_Description; 912 Xml_Description = ws.Xml_Description;
877 Xml_Exe = ws.Xml_Exe; 913 Xml_Exe = ws.Xml_Exe;
@@ -891,10 +927,20 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -891,10 +927,20 @@ namespace Vrh.Log4Pro.MaintenanceConsole
891 #region XmlStructure 927 #region XmlStructure
892 public static class XmlStructure 928 public static class XmlStructure
893 { 929 {
  930 + public static class WindowsServiceGroup
  931 + {
  932 + public static class Attributes
  933 + {
  934 + public static class Key { public static class Values { public static string DEFAULT = ""; } }
  935 + public static class Description { public static class Values { public static string DEFAULT = ""; } }
  936 + public static class WindowsServiceKeyList { public static class Values { public static string DEFAULT = ""; } }
  937 + }
  938 + }
894 public static class WindowsService 939 public static class WindowsService
895 { 940 {
896 public static class Attributes 941 public static class Attributes
897 { 942 {
  943 + public static class Key { public static class Values { public static string DEFAULT = ""; } }
898 public static class Name { } 944 public static class Name { }
899 public static class DisplayName { } 945 public static class DisplayName { }
900 public static class Description { } 946 public static class Description { }
@@ -946,7 +992,65 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -946,7 +992,65 @@ namespace Vrh.Log4Pro.MaintenanceConsole
946 } 992 }
947 } 993 }
948 #endregion XmlStructure 994 #endregion XmlStructure
  995 + #region public classes,types
  996 + public enum WmiServiceStatus
  997 + {
  998 + OK,
  999 + Error,
  1000 + Degraded,
  1001 + Unknown,
  1002 + Pred_Fail,
  1003 + Starting,
  1004 + Stopping,
  1005 + Service,
  1006 + Stressed,
  1007 + NonRecover,
  1008 + No_Contact,
  1009 + Lost_Comm,
  1010 + Unregistered,
  1011 + }
  1012 + public enum WmiServiceState
  1013 + {
  1014 + StartPending,
  1015 + Running,
  1016 + Paused,
  1017 + PausedPending,
  1018 + Stopped,
  1019 + StopPending,
  1020 + Unknown,
  1021 + Unregistered,
  1022 + }
  1023 + #endregion public classes,types
949 } 1024 }
950 #endregion WindowsService class 1025 #endregion WindowsService class
951 - 1026 + #region WindowsServiceGroup class
  1027 + public class WindowsServiceGroup : XmlLinqBase
  1028 + {
  1029 + public bool Valid;
  1030 + public List<string> Xml_WindowsServiceKeyList;
  1031 + public string Xml_Key;
  1032 + public string Xml_Description;
  1033 + public WindowsServiceGroup() { }
  1034 + public WindowsServiceGroup(WindowsServiceGroup wsg)
  1035 + {
  1036 + Xml_Key = wsg.Xml_Key;
  1037 + Xml_WindowsServiceKeyList = wsg.Xml_WindowsServiceKeyList.Select(x => x).ToList();
  1038 + Xml_Description = wsg.Xml_Description;
  1039 + Valid = wsg.Valid;
  1040 + }
  1041 + public WindowsServiceGroup(XElement wsgxml)
  1042 + {
  1043 + Xml_Key = GetValue(nameof(WindowsService.XmlStructure.WindowsServiceGroup.Attributes.Key), wsgxml, WindowsService.XmlStructure.WindowsServiceGroup.Attributes.Key.Values.DEFAULT);
  1044 + Xml_Description = GetValue(nameof(WindowsService.XmlStructure.WindowsServiceGroup.Attributes.Description), wsgxml, WindowsService.XmlStructure.WindowsServiceGroup.Attributes.Description.Values.DEFAULT);
  1045 + var keycommaliststring = GetValue(nameof(WindowsService.XmlStructure.WindowsServiceGroup.Attributes.WindowsServiceKeyList), wsgxml, WindowsService.XmlStructure.WindowsServiceGroup.Attributes.WindowsServiceKeyList.Values.DEFAULT);
  1046 + Valid = false;
  1047 + if (!string.IsNullOrWhiteSpace(keycommaliststring))
  1048 + {
  1049 + Xml_WindowsServiceKeyList = new List<string>(keycommaliststring.Split(new char[] { ',' },StringSplitOptions.RemoveEmptyEntries));
  1050 + if (Xml_WindowsServiceKeyList.Contains("*")) { Xml_WindowsServiceKeyList = new List<string>() { "*" }; }
  1051 + Valid = Xml_WindowsServiceKeyList.Any();
  1052 + }
  1053 + }
  1054 + }
  1055 + #endregion WindowsServiceGroup class
952 } 1056 }
Vrh.Log4Pro.MaintenanceConsole/Program.cs
@@ -3,11 +3,27 @@ using System.Collections.Generic; @@ -3,11 +3,27 @@ using System.Collections.Generic;
3 using System.Linq; 3 using System.Linq;
4 using System.Text; 4 using System.Text;
5 using System.Threading.Tasks; 5 using System.Threading.Tasks;
  6 +using System.Threading;
6 7
7 using Microsoft.Web.Administration; 8 using Microsoft.Web.Administration;
8 using System.Management; 9 using System.Management;
9 using System.Diagnostics; 10 using System.Diagnostics;
10 11
  12 +using Vrh.Log4Pro.MaintenanceConsole.ColorConsoleNS;
  13 +using Vrh.Log4Pro.MaintenanceConsole.MenuNS;
  14 +using Vrh.Log4Pro.MaintenanceConsole.ToolsNS;
  15 +
  16 +using Vrh.Log4Pro.MaintenanceConsole.WebApplicationManagerNS;
  17 +using Vrh.Log4Pro.MaintenanceConsole.WindowsServiceManagerNS;
  18 +using Vrh.Log4Pro.MaintenanceConsole.BackupPackageManagerNS;
  19 +using Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS;
  20 +using Vrh.Log4Pro.MaintenanceConsole.ScheduledTaskManagerNS;
  21 +using Vrh.Log4Pro.MaintenanceConsole.FileCleanerManagerNS;
  22 +using Vrh.Log4Pro.MaintenanceConsole.MaintenanceToolManagerNS;
  23 +using Vrh.Log4Pro.MaintenanceConsole.UserManagerNS;
  24 +
  25 +using Vrh.Log4Pro.MaintenanceConsole.CommandLineParserNS;
  26 +
11 using Vrh.XmlProcessing; 27 using Vrh.XmlProcessing;
12 using VRH.Common; 28 using VRH.Common;
13 using System.Xml.Linq; 29 using System.Xml.Linq;
@@ -18,12 +34,18 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -18,12 +34,18 @@ namespace Vrh.Log4Pro.MaintenanceConsole
18 { 34 {
19 static void Main(string[] args) 35 static void Main(string[] args)
20 { 36 {
21 - ColorConsole.ReadLine("Press a key to start...");  
22 - var appconfigpath = CommandLine.GetCommandLineArgument(args, "-APPCONFIG"); 37 +
  38 + var forcedmodulekey = CommandLine.GetCommandLineArgument(args, CLP.CMD_MODULE);
  39 + var commandmode = !string.IsNullOrEmpty(forcedmodulekey);
  40 + var silentmode = commandmode && !string.IsNullOrEmpty(CommandLine.GetCommandLineArgument(args, CLP.CMD_SILENT, switchtype: true));
  41 + ColorConsole.SetSilentMode(silentmode);
  42 + Menu.SetCommandMode(commandmode);
  43 +
  44 + var appconfigpath = CommandLine.GetCommandLineArgument(args, CLP.CMD_APPCONFIG);
23 CommandLine.SetAppConfigFile(appconfigpath); 45 CommandLine.SetAppConfigFile(appconfigpath);
24 46
25 try { ColorConsole.SetWindowSize(120, 64); } 47 try { ColorConsole.SetWindowSize(120, 64); }
26 - catch (Exception ex) 48 + catch
27 { 49 {
28 ColorConsole.WriteLine("Change the size of the console fonts smaller!"); 50 ColorConsole.WriteLine("Change the size of the console fonts smaller!");
29 ColorConsole.ReadKey(); 51 ColorConsole.ReadKey();
@@ -37,27 +59,98 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -37,27 +59,98 @@ namespace Vrh.Log4Pro.MaintenanceConsole
37 } 59 }
38 60
39 var mm = new Menu("Log4ProIS Maintenance Console") 61 var mm = new Menu("Log4ProIS Maintenance Console")
40 - .AddMenuItem(new Menu.Item("WAM", "Web Application Manager", WebApplicationManager.Execute))  
41 - .AddMenuItem(new Menu.Item("WSM", "Windows Service Manager", WindowsServiceManager.Execute))  
42 - .AddMenuItem(new Menu.Item("FCL", "File Cleaner Manager", FileCleanerManager.Execute))  
43 - .AddMenuItem(new Menu.Item("SCH", "Scheduled Task Manager", ScheduledTaskmanagerManager.Execute)) 62 + .AddMenuItem(new Menu.Item(CLP.Module.WebApplicationManager.KEY, "Web Application Manager", WebApplicationManager.Execute, new Menu.ExecutorParameter(args: args)))
  63 + .AddMenuItem(new Menu.Item(CLP.Module.WindowsServiceManager.KEY, "Windows Service Manager", WindowsServiceManager.Execute, new Menu.ExecutorParameter(args: args)))
  64 + .AddMenuItem(new Menu.Item(CLP.Module.FileCleanerManager.KEY, "File Cleaner Manager", FileCleanerManager.Execute, new Menu.ExecutorParameter(args: args)))
  65 + .AddMenuItem(new Menu.Item(CLP.Module.ScheduledTaskManager.KEY, "Scheduled Task Manager", ScheduledTaskManager.Execute, new Menu.ExecutorParameter(args: args)))
  66 + .AddMenuItem(new Menu.Item(CLP.Module.BackupPackageManager.KEY, "Backup Package Manager", BackupPackageManager.Execute, new Menu.ExecutorParameter(args: args)))
  67 + .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.KEY, "SQL Database Manager", SQLDataBaseManager.Execute, new Menu.ExecutorParameter(args: args)))
  68 + .AddMenuItem(new Menu.Item(CLP.Module.Log4ProUserManager.KEY, "Log4Pro User Manager", UserManager.Execute, new Menu.ExecutorParameter(args: args)))
44 .AddMenuItem(new Menu.ItemSeparator('-')) 69 .AddMenuItem(new Menu.ItemSeparator('-'))
45 - .AddMenuItem(new Menu.Item("TOL", "Maintenance tools", MaintenanceToolManager.Execute)) 70 + .AddMenuItem(new Menu.Item(CLP.Module.MaintenanceToolManager.KEY, "Maintenance tools", MaintenanceToolManager.Execute, new Menu.ExecutorParameter(args: args)))
  71 + .SetMenuHeaderDisplayer(DisplayComputerInfo)
46 .SetSelectionMode(Menu.SelectionMode.Single); 72 .SetSelectionMode(Menu.SelectionMode.Single);
47 73
48 - var commandmode = !string.IsNullOrEmpty(CommandLine.GetCommandLineArgument(args, "-MODULE"));  
49 - if (commandmode) 74 + mm.ExecuteMenu(forcedmodulekey);
  75 +
  76 + ColorConsole.PressAnykeyToContinue();
  77 + }
  78 + static void DisplayComputerInfo()
  79 + {
  80 + const string XMLCONNECTIONSTRING = "config=MAINTENANCECONSOLE;";
  81 + const string XMLCONNECTIONSTRING_DEFAULT = "file=Config.Xml;";
  82 + var config = new MaintenanceConsoleXmlProcessor(XMLCONNECTIONSTRING, "", "hu-HU");
  83 +
  84 + ColorConsole.WriteLine(config.Xml_Header,ConsoleColor.Yellow,bracket:"[]");
  85 +
  86 + //computername
  87 + ColorConsole.WriteLine("");
  88 + ColorConsole.Write("Computer name: ");
  89 + ColorConsole.Write(System.Environment.MachineName, ConsoleColor.Yellow, bracket: "[]",prefix: "", suffix: ",");
  90 + var hostname = System.Net.Dns.GetHostName();
  91 + ColorConsole.Write(hostname, ConsoleColor.Yellow, bracket: "[]", prefix: "DNS hostname:");
  92 + ColorConsole.WriteLine("");
  93 +
  94 + //username
  95 + ColorConsole.Write("Username:");
  96 + ColorConsole.Write(Environment.UserName, ConsoleColor.Yellow, bracket: "[]", prefix: "RunAs:", suffix: ",");
  97 + ColorConsole.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name, ConsoleColor.Yellow, bracket: "[]", prefix: "LoggedIn:");
  98 + ColorConsole.WriteLine("");
  99 +
  100 + //ip address
  101 + ColorConsole.Write("IP addresses: ");
  102 + var host = System.Net.Dns.GetHostEntry(hostname);
  103 + foreach (var ip in host.AddressList)
50 { 104 {
51 - var silentmode = !string.IsNullOrEmpty(CommandLine.GetCommandLineArgument(args, "-SILENT", switchtype: true));  
52 - ColorConsole.SetSilentMode(silentmode);  
53 - Menu.SetCommandModeAllMenus();  
54 - mm.ExecuteCmd(args); 105 + if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
  106 + {
  107 + ColorConsole.Write(ip.ToString(), ConsoleColor.Yellow, bracket: "[]", prefix: $"{ip.AddressFamily}:",suffix: ",");
  108 + }
55 } 109 }
56 - else 110 + ColorConsole.WriteLine("");
  111 +
  112 + // processor architecture
  113 + ColorConsole.Write("Processors: ");
  114 + ColorConsole.Write(System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE"), ConsoleColor.Yellow, bracket: "[]", prefix: "Architecture: ",suffix:", ");
  115 + foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_ComputerSystem").Get())
  116 + {
  117 + ColorConsole.Write(item["NumberOfProcessors"].ToString(), ConsoleColor.Yellow, bracket: "[]", prefix: "Physical:",suffix:", ");
  118 + ColorConsole.Write(item["NumberOfLogicalProcessors"].ToString(), ConsoleColor.Yellow, bracket: "[]", prefix: "Logical:", suffix: ", ");
  119 + }
  120 +
  121 + int coreCount = 0;
  122 + foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_Processor").Get())
57 { 123 {
58 - mm.ExecuteMenu();  
59 - ColorConsole.PressAnykeyToContinue(); 124 + coreCount += int.Parse(item["NumberOfCores"].ToString());
60 } 125 }
  126 + ColorConsole.Write(coreCount.ToString(), ConsoleColor.Yellow, bracket: "[]", prefix: "Cores:");
  127 + ColorConsole.WriteLine("");
  128 +
  129 + // os version
  130 + ColorConsole.Write("Operating system: ");
  131 + ColorConsole.Write(System.Environment.OSVersion.Platform.ToString(), ConsoleColor.Yellow, bracket: "[]", prefix: "Platform:",suffix: ",");
  132 + ColorConsole.Write(System.Environment.OSVersion.ServicePack, ConsoleColor.Yellow, bracket: "[]", prefix: "Service pack:", suffix: ",");
  133 + ColorConsole.Write(System.Environment.OSVersion.VersionString, ConsoleColor.Yellow, bracket: "[]", prefix: "Version string:");
  134 + ColorConsole.WriteLine("");
  135 + ColorConsole.WriteLine("");
  136 + }
  137 + }
  138 + #region MaintenanceConsoleXmlProcessor class
  139 + public class MaintenanceConsoleXmlProcessor : XmlParser
  140 + {
  141 + public string Xml_Header;
  142 + #region constructor
  143 + public MaintenanceConsoleXmlProcessor(string xmlcs, string basefolder, string lcid) : base(xmlcs, basefolder, lcid, null)
  144 + {
  145 + Xml_Header = GetValue(GetXElement(nameof(XmlStructure.Header)),"");
  146 + }
  147 + #endregion constructor
  148 + #region XmlStructure
  149 + public static class XmlStructure
  150 + {
  151 + public static class Header { }
61 } 152 }
  153 + #endregion XmlStructure
62 } 154 }
  155 + #endregion MaintenanceConsoleXmlProcessor class
63 } 156 }
Vrh.Log4Pro.MaintenanceConsole/Vrh.Log4Pro.MaintenanceConsole.csproj
@@ -9,12 +9,13 @@ @@ -9,12 +9,13 @@
9 <OutputType>Exe</OutputType> 9 <OutputType>Exe</OutputType>
10 <RootNamespace>Vrh.Log4Pro.MaintenanceConsole</RootNamespace> 10 <RootNamespace>Vrh.Log4Pro.MaintenanceConsole</RootNamespace>
11 <AssemblyName>Vrh.Log4Pro.MaintenanceConsole</AssemblyName> 11 <AssemblyName>Vrh.Log4Pro.MaintenanceConsole</AssemblyName>
12 - <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion> 12 + <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
13 <FileAlignment>512</FileAlignment> 13 <FileAlignment>512</FileAlignment>
14 <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> 14 <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
15 <Deterministic>true</Deterministic> 15 <Deterministic>true</Deterministic>
16 <NuGetPackageImportStamp> 16 <NuGetPackageImportStamp>
17 </NuGetPackageImportStamp> 17 </NuGetPackageImportStamp>
  18 + <TargetFrameworkProfile />
18 </PropertyGroup> 19 </PropertyGroup>
19 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 20 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
20 <PlatformTarget>AnyCPU</PlatformTarget> 21 <PlatformTarget>AnyCPU</PlatformTarget>
@@ -35,6 +36,9 @@ @@ -35,6 +36,9 @@
35 <ErrorReport>prompt</ErrorReport> 36 <ErrorReport>prompt</ErrorReport>
36 <WarningLevel>4</WarningLevel> 37 <WarningLevel>4</WarningLevel>
37 </PropertyGroup> 38 </PropertyGroup>
  39 + <PropertyGroup>
  40 + <ApplicationIcon>servicelogo.ico</ApplicationIcon>
  41 + </PropertyGroup>
38 <ItemGroup> 42 <ItemGroup>
39 <Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"> 43 <Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
40 <HintPath>..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.dll</HintPath> 44 <HintPath>..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.dll</HintPath>
@@ -42,6 +46,117 @@ @@ -42,6 +46,117 @@
42 <Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"> 46 <Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
43 <HintPath>..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.SqlServer.dll</HintPath> 47 <HintPath>..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.SqlServer.dll</HintPath>
44 </Reference> 48 </Reference>
  49 + <Reference Include="Microsoft.Data.SqlClient, Version=2.0.20168.4, Culture=neutral, PublicKeyToken=23ec7fc2d6eaa4a5, processorArchitecture=MSIL">
  50 + <HintPath>..\packages\Microsoft.Data.SqlClient.2.0.0\lib\net46\Microsoft.Data.SqlClient.dll</HintPath>
  51 + </Reference>
  52 + <Reference Include="Microsoft.Data.Tools.Sql.BatchParser, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  53 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.Data.Tools.Sql.BatchParser.dll</HintPath>
  54 + </Reference>
  55 + <Reference Include="Microsoft.Identity.Client, Version=4.14.0.0, Culture=neutral, PublicKeyToken=0a613f4dd989e8ae, processorArchitecture=MSIL">
  56 + <HintPath>..\packages\Microsoft.Identity.Client.4.14.0\lib\net45\Microsoft.Identity.Client.dll</HintPath>
  57 + </Reference>
  58 + <Reference Include="Microsoft.IdentityModel.JsonWebTokens, Version=5.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  59 + <HintPath>..\packages\Microsoft.IdentityModel.JsonWebTokens.5.6.0\lib\net461\Microsoft.IdentityModel.JsonWebTokens.dll</HintPath>
  60 + </Reference>
  61 + <Reference Include="Microsoft.IdentityModel.Logging, Version=5.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  62 + <HintPath>..\packages\Microsoft.IdentityModel.Logging.5.6.0\lib\net461\Microsoft.IdentityModel.Logging.dll</HintPath>
  63 + </Reference>
  64 + <Reference Include="Microsoft.IdentityModel.Protocols, Version=5.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  65 + <HintPath>..\packages\Microsoft.IdentityModel.Protocols.5.6.0\lib\net461\Microsoft.IdentityModel.Protocols.dll</HintPath>
  66 + </Reference>
  67 + <Reference Include="Microsoft.IdentityModel.Protocols.OpenIdConnect, Version=5.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  68 + <HintPath>..\packages\Microsoft.IdentityModel.Protocols.OpenIdConnect.5.6.0\lib\net461\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll</HintPath>
  69 + </Reference>
  70 + <Reference Include="Microsoft.IdentityModel.Tokens, Version=5.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  71 + <HintPath>..\packages\Microsoft.IdentityModel.Tokens.5.6.0\lib\net461\Microsoft.IdentityModel.Tokens.dll</HintPath>
  72 + </Reference>
  73 + <Reference Include="Microsoft.SqlServer.Assessment, Version=1.100.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  74 + <HintPath>..\packages\Microsoft.SqlServer.Assessment.1.0.280\lib\net462\Microsoft.SqlServer.Assessment.dll</HintPath>
  75 + </Reference>
  76 + <Reference Include="Microsoft.SqlServer.Assessment.Types, Version=1.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  77 + <HintPath>..\packages\Microsoft.SqlServer.Assessment.Authoring.1.0.280\lib\net462\Microsoft.SqlServer.Assessment.Types.dll</HintPath>
  78 + </Reference>
  79 + <Reference Include="Microsoft.SqlServer.ConnectionInfo, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  80 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.ConnectionInfo.dll</HintPath>
  81 + </Reference>
  82 + <Reference Include="Microsoft.SqlServer.Dmf, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  83 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.Dmf.dll</HintPath>
  84 + </Reference>
  85 + <Reference Include="Microsoft.SqlServer.Dmf.Common, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  86 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.Dmf.Common.dll</HintPath>
  87 + </Reference>
  88 + <Reference Include="Microsoft.SqlServer.Management.Assessment, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  89 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.Management.Assessment.dll</HintPath>
  90 + </Reference>
  91 + <Reference Include="Microsoft.SqlServer.Management.Collector, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  92 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.Management.Collector.dll</HintPath>
  93 + </Reference>
  94 + <Reference Include="Microsoft.SqlServer.Management.CollectorEnum, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  95 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.Management.CollectorEnum.dll</HintPath>
  96 + </Reference>
  97 + <Reference Include="Microsoft.SqlServer.Management.HadrData, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  98 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.Management.HadrData.dll</HintPath>
  99 + </Reference>
  100 + <Reference Include="Microsoft.SqlServer.Management.HadrModel, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  101 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.Management.HadrModel.dll</HintPath>
  102 + </Reference>
  103 + <Reference Include="Microsoft.SqlServer.Management.RegisteredServers, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  104 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.Management.RegisteredServers.dll</HintPath>
  105 + </Reference>
  106 + <Reference Include="Microsoft.SqlServer.Management.Sdk.Sfc, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  107 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.Management.Sdk.Sfc.dll</HintPath>
  108 + </Reference>
  109 + <Reference Include="Microsoft.SqlServer.Management.SmoMetadataProvider, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  110 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.Management.SmoMetadataProvider.dll</HintPath>
  111 + </Reference>
  112 + <Reference Include="Microsoft.SqlServer.Management.SqlParser, Version=16.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  113 + <HintPath>..\packages\Microsoft.SqlServer.Management.SqlParser.160.20216.14\lib\net462\Microsoft.SqlServer.Management.SqlParser.dll</HintPath>
  114 + </Reference>
  115 + <Reference Include="Microsoft.SqlServer.Management.SqlScriptPublish, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  116 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.Management.SqlScriptPublish.dll</HintPath>
  117 + </Reference>
  118 + <Reference Include="Microsoft.SqlServer.Management.XEvent, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  119 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.Management.XEvent.dll</HintPath>
  120 + </Reference>
  121 + <Reference Include="Microsoft.SqlServer.Management.XEventDbScoped, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  122 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.Management.XEventDbScoped.dll</HintPath>
  123 + </Reference>
  124 + <Reference Include="Microsoft.SqlServer.Management.XEventDbScopedEnum, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  125 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.Management.XEventDbScopedEnum.dll</HintPath>
  126 + </Reference>
  127 + <Reference Include="Microsoft.SqlServer.Management.XEventEnum, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  128 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.Management.XEventEnum.dll</HintPath>
  129 + </Reference>
  130 + <Reference Include="Microsoft.SqlServer.PolicyEnum, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  131 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.PolicyEnum.dll</HintPath>
  132 + </Reference>
  133 + <Reference Include="Microsoft.SqlServer.RegSvrEnum, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  134 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.RegSvrEnum.dll</HintPath>
  135 + </Reference>
  136 + <Reference Include="Microsoft.SqlServer.ServiceBrokerEnum, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  137 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.ServiceBrokerEnum.dll</HintPath>
  138 + </Reference>
  139 + <Reference Include="Microsoft.SqlServer.Smo, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  140 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.Smo.dll</HintPath>
  141 + </Reference>
  142 + <Reference Include="Microsoft.SqlServer.Smo.Notebook, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  143 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.Smo.Notebook.dll</HintPath>
  144 + </Reference>
  145 + <Reference Include="Microsoft.SqlServer.SmoExtended, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  146 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.SmoExtended.dll</HintPath>
  147 + </Reference>
  148 + <Reference Include="Microsoft.SqlServer.SqlClrProvider, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  149 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.SqlClrProvider.dll</HintPath>
  150 + </Reference>
  151 + <Reference Include="Microsoft.SqlServer.SqlEnum, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  152 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.SqlEnum.dll</HintPath>
  153 + </Reference>
  154 + <Reference Include="Microsoft.SqlServer.SqlWmiManagement, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  155 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.SqlWmiManagement.dll</HintPath>
  156 + </Reference>
  157 + <Reference Include="Microsoft.SqlServer.WmiEnum, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
  158 + <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.WmiEnum.dll</HintPath>
  159 + </Reference>
45 <Reference Include="Microsoft.Web.Administration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> 160 <Reference Include="Microsoft.Web.Administration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
46 <HintPath>..\packages\Microsoft.Web.Administration.11.1.0\lib\netstandard1.5\Microsoft.Web.Administration.dll</HintPath> 161 <HintPath>..\packages\Microsoft.Web.Administration.11.1.0\lib\netstandard1.5\Microsoft.Web.Administration.dll</HintPath>
47 </Reference> 162 </Reference>
@@ -51,17 +166,22 @@ @@ -51,17 +166,22 @@
51 <Reference Include="Microsoft.Win32.Registry, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> 166 <Reference Include="Microsoft.Win32.Registry, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
52 <HintPath>..\packages\Microsoft.Win32.Registry.4.0.0\lib\net46\Microsoft.Win32.Registry.dll</HintPath> 167 <HintPath>..\packages\Microsoft.Win32.Registry.4.0.0\lib\net46\Microsoft.Win32.Registry.dll</HintPath>
53 </Reference> 168 </Reference>
  169 + <Reference Include="Newtonsoft.Json, Version=11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
  170 + <HintPath>..\packages\Newtonsoft.Json.11.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
  171 + </Reference>
54 <Reference Include="System" /> 172 <Reference Include="System" />
55 <Reference Include="System.AppContext, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> 173 <Reference Include="System.AppContext, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
56 <HintPath>..\packages\System.AppContext.4.1.0\lib\net46\System.AppContext.dll</HintPath> 174 <HintPath>..\packages\System.AppContext.4.1.0\lib\net46\System.AppContext.dll</HintPath>
57 </Reference> 175 </Reference>
58 <Reference Include="System.ComponentModel.Composition" /> 176 <Reference Include="System.ComponentModel.Composition" />
59 <Reference Include="System.ComponentModel.DataAnnotations" /> 177 <Reference Include="System.ComponentModel.DataAnnotations" />
  178 + <Reference Include="System.Configuration" />
60 <Reference Include="System.Configuration.Install" /> 179 <Reference Include="System.Configuration.Install" />
61 <Reference Include="System.Console, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> 180 <Reference Include="System.Console, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
62 <HintPath>..\packages\System.Console.4.0.0\lib\net46\System.Console.dll</HintPath> 181 <HintPath>..\packages\System.Console.4.0.0\lib\net46\System.Console.dll</HintPath>
63 </Reference> 182 </Reference>
64 <Reference Include="System.Core" /> 183 <Reference Include="System.Core" />
  184 + <Reference Include="System.Data.Linq" />
65 <Reference Include="System.Diagnostics.DiagnosticSource, Version=4.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"> 185 <Reference Include="System.Diagnostics.DiagnosticSource, Version=4.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
66 <HintPath>..\packages\System.Diagnostics.DiagnosticSource.4.0.0\lib\net46\System.Diagnostics.DiagnosticSource.dll</HintPath> 186 <HintPath>..\packages\System.Diagnostics.DiagnosticSource.4.0.0\lib\net46\System.Diagnostics.DiagnosticSource.dll</HintPath>
67 </Reference> 187 </Reference>
@@ -71,9 +191,14 @@ @@ -71,9 +191,14 @@
71 <Reference Include="System.Diagnostics.Tracing, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> 191 <Reference Include="System.Diagnostics.Tracing, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
72 <HintPath>..\packages\System.Diagnostics.Tracing.4.1.0\lib\net462\System.Diagnostics.Tracing.dll</HintPath> 192 <HintPath>..\packages\System.Diagnostics.Tracing.4.1.0\lib\net462\System.Diagnostics.Tracing.dll</HintPath>
73 </Reference> 193 </Reference>
  194 + <Reference Include="System.Drawing" />
74 <Reference Include="System.Globalization.Calendars, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> 195 <Reference Include="System.Globalization.Calendars, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
75 <HintPath>..\packages\System.Globalization.Calendars.4.0.1\lib\net46\System.Globalization.Calendars.dll</HintPath> 196 <HintPath>..\packages\System.Globalization.Calendars.4.0.1\lib\net46\System.Globalization.Calendars.dll</HintPath>
76 </Reference> 197 </Reference>
  198 + <Reference Include="System.IdentityModel" />
  199 + <Reference Include="System.IdentityModel.Tokens.Jwt, Version=5.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  200 + <HintPath>..\packages\System.IdentityModel.Tokens.Jwt.5.6.0\lib\net461\System.IdentityModel.Tokens.Jwt.dll</HintPath>
  201 + </Reference>
77 <Reference Include="System.IO, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> 202 <Reference Include="System.IO, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
78 <HintPath>..\packages\System.IO.4.1.0\lib\net462\System.IO.dll</HintPath> 203 <HintPath>..\packages\System.IO.4.1.0\lib\net462\System.IO.dll</HintPath>
79 </Reference> 204 </Reference>
@@ -140,23 +265,34 @@ @@ -140,23 +265,34 @@
140 </Reference> 265 </Reference>
141 <Reference Include="System.Web" /> 266 <Reference Include="System.Web" />
142 <Reference Include="System.Web.ApplicationServices" /> 267 <Reference Include="System.Web.ApplicationServices" />
  268 + <Reference Include="System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  269 + <HintPath>..\packages\Microsoft.AspNet.Providers.Core.2.0.0\lib\net40\System.Web.Providers.dll</HintPath>
  270 + </Reference>
  271 + <Reference Include="System.Windows.Forms" />
143 <Reference Include="System.Xml.Linq" /> 272 <Reference Include="System.Xml.Linq" />
144 <Reference Include="System.Data.DataSetExtensions" /> 273 <Reference Include="System.Data.DataSetExtensions" />
145 <Reference Include="Microsoft.CSharp" /> 274 <Reference Include="Microsoft.CSharp" />
146 <Reference Include="System.Data" /> 275 <Reference Include="System.Data" />
147 <Reference Include="System.Xml" /> 276 <Reference Include="System.Xml" />
148 - <Reference Include="VRH.Common, Version=2.19.1.0, Culture=neutral, processorArchitecture=MSIL">  
149 - <HintPath>..\packages\VRH.Common.2.19.1\lib\net45\VRH.Common.dll</HintPath> 277 + <Reference Include="VRH.Common, Version=2.20.1.0, Culture=neutral, processorArchitecture=MSIL">
  278 + <HintPath>..\packages\VRH.Common.2.20.1\lib\net45\VRH.Common.dll</HintPath>
  279 + </Reference>
  280 + <Reference Include="Vrh.Web.Providers, Version=2.0.2.0, Culture=neutral, processorArchitecture=MSIL">
  281 + <HintPath>..\packages\VRH.Web.Providers.2.0.2\lib\net452\Vrh.Web.Providers.dll</HintPath>
150 </Reference> 282 </Reference>
151 - <Reference Include="Vrh.XmlProcessing, Version=1.23.0.0, Culture=neutral, processorArchitecture=MSIL">  
152 - <HintPath>..\packages\Vrh.XmlProcessing.1.23.0\lib\net45\Vrh.XmlProcessing.dll</HintPath> 283 + <Reference Include="Vrh.XmlProcessing, Version=1.24.0.0, Culture=neutral, processorArchitecture=MSIL">
  284 + <HintPath>..\packages\Vrh.XmlProcessing.1.24.0\lib\net45\Vrh.XmlProcessing.dll</HintPath>
153 </Reference> 285 </Reference>
154 </ItemGroup> 286 </ItemGroup>
155 <ItemGroup> 287 <ItemGroup>
156 <Compile Include="ConsoleFunction - CommandLineParser.cs" /> 288 <Compile Include="ConsoleFunction - CommandLineParser.cs" />
157 <Compile Include="ConsoleFunction - ColorConsole.cs" /> 289 <Compile Include="ConsoleFunction - ColorConsole.cs" />
158 <Compile Include="ConsoleFunction - Menu.cs" /> 290 <Compile Include="ConsoleFunction - Menu.cs" />
  291 + <Compile Include="ConsoleFunction - Tools - Membership.cs" />
159 <Compile Include="ConsoleFunction - Tools.cs" /> 292 <Compile Include="ConsoleFunction - Tools.cs" />
  293 + <Compile Include="Manager - BackupPackageManager.cs" />
  294 + <Compile Include="Manager - UserManager.cs" />
  295 + <Compile Include="Manager - SQLDataBaseManager.cs" />
160 <Compile Include="Manager - ScheduledTaskManager.cs" /> 296 <Compile Include="Manager - ScheduledTaskManager.cs" />
161 <Compile Include="Manager - WindowsServiceManager.cs" /> 297 <Compile Include="Manager - WindowsServiceManager.cs" />
162 <Compile Include="Manager - FileCleanerManager.cs" /> 298 <Compile Include="Manager - FileCleanerManager.cs" />
@@ -170,6 +306,8 @@ @@ -170,6 +306,8 @@
170 <CopyToOutputDirectory>Always</CopyToOutputDirectory> 306 <CopyToOutputDirectory>Always</CopyToOutputDirectory>
171 </None> 307 </None>
172 <None Include="packages.config" /> 308 <None Include="packages.config" />
  309 + <None Include="system.web.membership.config" />
  310 + <None Include="system.web.rolemanager.config" />
173 <None Include="Vrh.NugetModuls.Documentations\VRH.Common\ReadMe.md" /> 311 <None Include="Vrh.NugetModuls.Documentations\VRH.Common\ReadMe.md" />
174 <None Include="Vrh.NugetModuls.Documentations\Vrh.XmlProcessing\ReadMe.md" /> 312 <None Include="Vrh.NugetModuls.Documentations\Vrh.XmlProcessing\ReadMe.md" />
175 </ItemGroup> 313 </ItemGroup>
@@ -177,11 +315,14 @@ @@ -177,11 +315,14 @@
177 <Content Include="Config.xml"> 315 <Content Include="Config.xml">
178 <CopyToOutputDirectory>Always</CopyToOutputDirectory> 316 <CopyToOutputDirectory>Always</CopyToOutputDirectory>
179 </Content> 317 </Content>
  318 + <Content Include="servicelogo.ico" />
180 <Content Include="XmlParser.xml"> 319 <Content Include="XmlParser.xml">
181 <CopyToOutputDirectory>Always</CopyToOutputDirectory> 320 <CopyToOutputDirectory>Always</CopyToOutputDirectory>
182 </Content> 321 </Content>
183 </ItemGroup> 322 </ItemGroup>
184 - <ItemGroup /> 323 + <ItemGroup>
  324 + <WCFMetadata Include="Connected Services\" />
  325 + </ItemGroup>
185 <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 326 <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
186 <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> 327 <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
187 <PropertyGroup> 328 <PropertyGroup>
@@ -189,6 +330,8 @@ @@ -189,6 +330,8 @@
189 </PropertyGroup> 330 </PropertyGroup>
190 <Error Condition="!Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.4.4\build\EntityFramework.props'))" /> 331 <Error Condition="!Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.4.4\build\EntityFramework.props'))" />
191 <Error Condition="!Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.4.4\build\EntityFramework.targets'))" /> 332 <Error Condition="!Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.4.4\build\EntityFramework.targets'))" />
  333 + <Error Condition="!Exists('..\packages\Microsoft.Data.SqlClient.SNI.2.0.0\build\net46\Microsoft.Data.SqlClient.SNI.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Data.SqlClient.SNI.2.0.0\build\net46\Microsoft.Data.SqlClient.SNI.targets'))" />
192 </Target> 334 </Target>
193 <Import Project="..\packages\EntityFramework.6.4.4\build\EntityFramework.targets" Condition="Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.targets')" /> 335 <Import Project="..\packages\EntityFramework.6.4.4\build\EntityFramework.targets" Condition="Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.targets')" />
  336 + <Import Project="..\packages\Microsoft.Data.SqlClient.SNI.2.0.0\build\net46\Microsoft.Data.SqlClient.SNI.targets" Condition="Exists('..\packages\Microsoft.Data.SqlClient.SNI.2.0.0\build\net46\Microsoft.Data.SqlClient.SNI.targets')" />
194 </Project> 337 </Project>
195 \ No newline at end of file 338 \ No newline at end of file
Vrh.Log4Pro.MaintenanceConsole/XmlParser.xml
1 <?xml version="1.0" encoding="utf-8" ?> 1 <?xml version="1.0" encoding="utf-8" ?>
2 -<XmlParserConfiguration LCID="en-US" NameSeparator="{}@@##||"> 2 +<XmlParserConfiguration LCID="en-US" NameSeparator="@@||">
3 <XmlParser> 3 <XmlParser>
4 - <XmlVar Name="SINGLESERVERIP">127.0.0.1</XmlVar>  
5 - <XmlVar Name="WEBALMHOST">@SINGLESERVERIP@</XmlVar>  
6 - <XmlVar Name="WEBALM">WebALM</XmlVar>  
7 -  
8 - <XmlVar Name="WEBCPHOST">@SINGLESERVERIP@</XmlVar>  
9 - <XmlVar Name="WEBCP">WebPack</XmlVar>  
10 -  
11 - <XmlVar Name="WEBANDONHOST">@SINGLESERVERIP@</XmlVar>  
12 - <XmlVar Name="WEBANDON">WebAndon</XmlVar>  
13 -  
14 - <!-- A komment be és ki módszert válaszd légyszi, ne írd át! -->  
15 - <!--<XmlVar Name="APPROOTPATH">d:\!Dev\VRH\LearALMNew</XmlVar>-->  
16 - <XmlVar Name="APPROOTPATH">c:\Log4ProIS</XmlVar>  
17 - <XmlVar Name="CENTRALCONFIGPATH">c:\Log4ProIS\CONFIG</XmlVar>  
18 - <XmlVar Name="ACROOTPATH">@APPROOTPATH@\VRH.Log4Pro.ACALM</XmlVar>  
19 -  
20 - <XmlVar Name="WEBAPPROOT">@APPROOTPATH@\wwwroot_Log4ProIS</XmlVar>  
21 - <XmlVar Name="APPDATA">@WEBAPPROOT@\App_Data</XmlVar>  
22 - <XmlVar Name="APPDATAALM">@WEBAPPROOT@\App_Data\ALM</XmlVar>  
23 - <XmlVar Name="APPDATACP">@WEBAPPROOT@\App_Data\CP</XmlVar>  
24 - <XmlVar Name="APPDATAANDON">@WEBAPPROOT@\App_Data\ANDON</XmlVar>  
25 - <XmlVar Name="APPDATAISTRM">@WEBAPPROOT@\App_Data\IS-TRM</XmlVar>  
26 -  
27 - <XmlVar Name="WEBAPPROOT_WEBPACK">@APPROOTPATH@\wwwroot_WebPack</XmlVar>  
28 - <XmlVar Name="APPDATA_WEBPACK">@WEBAPPROOT_WEBPACK@\App_Data</XmlVar>  
29 -  
30 - <XmlVar Name="WEBAPPROOT_ANDON">@APPROOTPATH@\wwwroot_WebAndon</XmlVar>  
31 - <XmlVar Name="APPDATA_ANDON">@WEBAPPROOT_ANDON@\App_Data</XmlVar>  
32 -  
33 - <XmlVar Name="WEBAPPROOT_ALM">@APPROOTPATH@\wwwroot_WebALM</XmlVar>  
34 - <XmlVar Name="APPDATA_ALM">@WEBAPPROOT_ALM@\App_Data</XmlVar>  
35 -  
36 - <XmlVar Name="DCWF_ALMROOT">@APPROOTPATH@\VRH.Log4Pro.ASEDC-DCWF_ALM\</XmlVar>  
37 - <XmlVar Name="DCWF_CPROOT">@APPROOTPATH@\VRH.Log4Pro.ASEDC-DCWF_CP\</XmlVar>  
38 - <XmlVar Name="ASEMON_ROOT">@APPROOTPATH@\VRH.Log4Pro.ASEDC-ASEMON\</XmlVar>  
39 -  
40 - <XmlVar Name="ALMSERVERIP">localhost</XmlVar>  
41 - <XmlVar Name="ALMBACKUPS">c:\Log4ProISBackups</XmlVar>  
42 -  
43 - <XmlVar Name="ALMDOCUMENTS">@ALMBACKUPS@\Documents</XmlVar>  
44 -  
45 -  
46 - <XmlVar Name="XMLPARSERBUTTONDEFXML">@APPDATA@\WebMonitor\XmlParserButtonDefinitions.xml</XmlVar>  
47 -  
48 - <XmlVar Name="ENABLEDISTRIBUTEWCFCONFIGFILES">false</XmlVar>  
49 - <XmlVar Name="COMMONSITENAME">SITE_SLNOTEBOOKDELL</XmlVar> 4 + <XmlVar Name="APPROOTPATH">c:\Log4ProIS</XmlVar>
  5 + <XmlVar Name="DIR_MAINTENANCECONSOLE">@APPROOTPATH@\MAINTENANCECONSOLE</XmlVar>
50 </XmlParser> 6 </XmlParser>
51 -  
52 - <XmlParser Description="Common menu parameters">  
53 - <XmlVar Name="MENUCREATEROLES">true</XmlVar>  
54 - <XmlVar Name="MENUROLEPREFIX"></XmlVar>  
55 - <XmlVar Name="MENUCREATEWORDCODES">true</XmlVar>  
56 - <XmlVar Name="MENUWORDCODEPREFIX">Menu.Xml</XmlVar>  
57 - <XmlVar Name="MENUGROUPBEHAVIOR">Accordion</XmlVar>  
58 - <XmlVar Name="STYLE_DIALOG_W40">max-width:40vmax;</XmlVar>  
59 - <XmlVar Name="STYLE_DIALOG_W80">max-width:80vmax;</XmlVar>  
60 - <XmlVar Name="STYLE_DIALOG_W120">max-width:120vmax;</XmlVar>  
61 - <XmlVar Name="STYLE_DIALOG_MENU">max-width:90vmax;margin 100; padding 10;</XmlVar>  
62 - <XmlVar Name="STYLE_DIALOG_RETURNINFO">max-width:50vmax;font-size:larger;color:white;</XmlVar>  
63 - <XmlVar Name="STYLE_DIALOG_ENTRYM">max-width:70vmax;font-size:larger;color:white;</XmlVar>  
64 - <XmlVar Name="STYLE_DIALOG_ENTRYXL">max-width:100vmax;font-size:larger;color:white;</XmlVar>  
65 - </XmlParser>  
66 -  
67 <Configurations> 7 <Configurations>
68 - <Configuration Name="Vrh.Log4Pro.MaintenanceConsole" File="C:\___VCSOLUTIONS\Vrh.Log4Pro.MaintenanceConsole\Vrh.Log4Pro.MaintenanceConsole\Xml.Parser" />  
69 -  
70 -  
71 - <Configuration Name="VRH.ConnectionStringStore" File="@CENTRALCONFIGPATH@\ConnectionStringStore.xml" />  
72 -  
73 -  
74 - <Configuration Name="Menu" File="@APPDATA@\Menu\Menu.xml" Element="MainMenu"/>  
75 - <Configuration Name="RedisScripter" File="@APPDATA@\RedisManager\RedisManagerScripts.xml" />  
76 - <Configuration Name="UserAuthentication" File="@APPDATA@\UserAdministration\UserAdministration.xml" />  
77 - <Configuration Name="WebForm" File="@APPDATA@\WebForm\WebForms.xml"/>  
78 -  
79 - <!--Ezt jelenleg az IdTranslator Web felület használja, mint alapértelmezett XmlConnectionString használja, mint alapértelmezett-->  
80 - <Configuration Name="IdTranslator" File="@APPDATA@\IdTranslator\IdTranslator.xml"/>  
81 -  
82 - <Configuration Name="IVConnector" File="@ACROOTPATH@\IVConnector2.0.0\IVConnector.Config.xml"/>  
83 -  
84 - <Configuration Name="DCWF_ALM" File="{DCWF_ALMROOT}DCWF_ALM-parameters.xml" Element="DCWF_ALMParameters"/>  
85 - <Configuration Name="DCWP_ALM" File="{DCWF_ALMROOT}DCWF_ALM-WP-parameters.xml" Element="DCWP"/>  
86 - <Configuration Name="DCWPWCF_ALM" File="{DCWF_ALMROOT}DCWF_ALM-WP-parameters.xml" Element="DCWPWCF"/>  
87 - <Configuration Name="DCWF_ALMMenuPage" File="@APPDATAALM@\DCWF_ALMMenuPage.xml" Element="MenuPageDCWF_ALM"/>  
88 - <Configuration Name="DCWF_ALMWebMonitorMenuPage" File="@APPDATAALM@\DCWF_ALMMenuPage.xml" Element="MenuPageWebMonitor"/>  
89 - <!--<Configuration Name="DCWF_ALMOneReportMenuPage" File="@APPDATAALM@\DCWF_ALMMenuPage.xml" Element="MenuPageOneReport"/>-->  
90 -  
91 - <Configuration Name="DCWF_ALMOneReportWebForms" File="@APPDATAALM@\OneReport\OneReports.xml" Element="WebFormXML"/>  
92 - <Configuration Name="DCWF_ALMOneReportMenuPage" File="@APPDATAALM@\OneReport\OneReports.xml" Element="MenuPageOneReport"/>  
93 - <Configuration Name="ALM_OneReport" File="@APPDATAALM@\OneReport\OneReports.xml" Element="ReportDefinitions"/>  
94 -  
95 - <Configuration Name="DCWF_ALMFileManagerMenuPage" File="@APPDATAALM@\DCWF_ALMMenuPage.xml" Element="MenuPageFileManager"/>  
96 - <Configuration Name="DCWF_ALMOneScripter" File="@APPDATAALM@\OneScripter\OneScripterMenuPage.xml" />  
97 - <Configuration Name="DCWF_ALMRedisManager" File="@APPDATAALM@\RedisManager\RedisManagerConfig.xml" />  
98 - <Configuration Name="DCWF_ALMServiceControl" File="@APPDATAALM@\ServiceControl\ServiceControlConfig.xml" />  
99 - <Configuration Name="DCWF_ALMASEMWManager" File="@APPDATAALM@\AseMwManager\AseMwManager.xml" />  
100 - <Configuration Name="DCWF_ALMConfigEditorMenuPage" File="@APPDATAALM@\ConfigEditor\ConfigEditorALMMenuPage.xml" />  
101 - <Configuration Name="InterventionDCWFWCF_ALMInterventionService" File="@APPDATAALM@\Interventions\DCWF_ALMInterventions.xml"/>  
102 - <Configuration Name="InterventionDTMInterventionService" File="@APPDATAALM@\Interventions\ALMInterventions.xml"/>  
103 - <Configuration Name="DCWF_ALMConfigEditor" File="@APPDATAALM@\ConfigEditor\ConfigEditorALM.xml" />  
104 - <Configuration Name="DCWF_ALMiSchedulerReportMenuPage" File="@APPDATAALM@\DCWF_ALMMenuPage.xml" Element="MenuPageiSchedulerReport" />  
105 - <Configuration Name="DCWF_ALMiScheduler" File="@APPDATAALM@\iScheduler\iScheduler.xml"/>  
106 - <Configuration Name="DCWF_ALMiSchedulerReport" File="@APPDATAALM@\iScheduler\iSchedulerReport.xml"/>  
107 - <Configuration Name="DCWF_ALMiSchedulerWebForms" File="@APPDATAALM@\iScheduler\iSchedulerWebforms.xml"/>  
108 - <Configuration Name="SelectListsALM" File="@APPDATAALM@\Intervention\DCWF_ALMSelectLists.xml"/>  
109 - <Configuration Name="ALM_WebMonitor" File="@APPDATAALM@\WebMonitor\WebMonitor.xml"/>  
110 - <Configuration Name="ALM_Matrix1D" File="@APPDATAALM@\WebMonitor\Matrix1D.xml"/>  
111 - <Configuration Name="ALM_Matrix2D" File="@APPDATAALM@\WebMonitor\Matrix2D.xml"/>  
112 - <Configuration Name="ALM_TrendDiagram" File="@APPDATAALM@\WebMonitor\TrendDiagram.xml"/>  
113 -  
114 - <Configuration Name="ISTRM_MenuPage" File="@APPDATAISTRM@\ISTRMMenuPage.xml" Element="MenuPageISTRM"/>  
115 - <Configuration Name="ISTRM_WebMonitor" File="@APPDATAISTRM@\WebMonitor\WebMonitor.xml"/>  
116 - <Configuration Name="ISTRM_Matrix2D" File="@APPDATAISTRM@\WebMonitor\Matrix2D.xml"/>  
117 -  
118 -  
119 - <Configuration Name="ANDONMenuPage" File="@APPDATAANDON@\ANDONMenuPage.xml" Element="MenuPageAndon"/>  
120 - <Configuration Name="ANDONConfig" File="@APPDATAANDON@\Andon.Config.XML"/>  
121 - <Configuration Name="ANDONRedisManager" File="@APPDATAANDON@\Andon.Config.XML" Element="RedisManager" />  
122 -  
123 - <Configuration Name="DCWF_CP" File="{DCWF_CPROOT}DCWF_CP-parameters.xml"/>  
124 - <Configuration Name="DCWP_CP" File="{DCWF_CPROOT}DCWF_CP-WP-parameters.xml" Element="DCWP"/>  
125 - <Configuration Name="DCWPWCF_CP" File="{DCWF_CPROOT}DCWF_CP-WP-parameters.xml" Element="DCWPWCF"/>  
126 - <Configuration Name="DCWF_CP_ivConnectorOut" File="{DCWF_CPROOT}DCWF_CP-IVCONNECTOR.xml"/>  
127 - <Configuration Name="DCWF_CPMenuPage" File="@APPDATACP@\DCWF_CPMenuPage.xml" Element="MenuPageDCWF_CP"/>  
128 - <Configuration Name="DCWF_CPASEMWManager" File="@APPDATACP@\AseMwManager\AseMwManager.xml" />  
129 - <Configuration Name="DCWF_CPServiceControl" File="@APPDATACP@\ServiceControl\ServiceControlConfig.xml" />  
130 - <Configuration Name="DCWF_CPRedisManager" File="@APPDATACP@\RedisManager\RedisManagerConfig.xml" />  
131 - <Configuration Name="CPConfig" File="@APPDATACP@\CPConfiguration.xml" />  
132 - <Configuration Name="InterventionDCWFWCF_CPInterventionService" File="@APPDATACP@\Interventions\DCWF_CPInterventions.xml"/>  
133 - <Configuration Name="SelectListsCP" File="@APPDATACP@\Interventions\DCWF_CPSelectLists.xml"/>  
134 - <Configuration Name="ConfigEditorCP" File="@APPDATACP@\ConfigEditor\ConfigEditorCP.xml" />  
135 - <Configuration Name="WebMonitorCP" File="@APPDATACP@\WebMonitor\WebMonitorCP.xml"/>  
136 - <Configuration Name="Matrix1DCP" File="@APPDATACP@\WebMonitor\Matrix1DCP.xml"/>  
137 - <Configuration Name="Matrix2DCP" File="@APPDATACP@\WebMonitor\Matrix2DCP.xml"/>  
138 - 8 + <Configuration></Configuration>
  9 + <Configurations Description="MAINTENANCECONSOLE">
  10 + <Configuration Name="MAINTENANCECONSOLE_BACKUPMANAGER" File="@DIR_MAINTENANCECONSOLE@\Config.xml" Element = "BackupPackages"/>
  11 + <Configuration Name="MAINTENANCECONSOLE_FILECLEANERMANAGER" File="@DIR_MAINTENANCECONSOLE@\Config.xml" Element = "FileCleaner"/>
  12 + <Configuration Name="MAINTENANCECONSOLE_MAINTENANCETOOLMANAGER" File="@DIR_MAINTENANCECONSOLE@\Config.xml" Element = "MaintenanceTools"/>
  13 + <Configuration Name="MAINTENANCECONSOLE_SCHEDULEDTASKMANAGER" File="@DIR_MAINTENANCECONSOLE@\Config.xml" Element = "ScheduledTasks"/>
  14 + <Configuration Name="MAINTENANCECONSOLE_WEBAPPLICATIONMANAGER" File="@DIR_MAINTENANCECONSOLE@\Config.xml" Element = "WebApplications"/>
  15 + <Configuration Name="MAINTENANCECONSOLE_WINDOWSSERVICEMANAGER" File="@DIR_MAINTENANCECONSOLE@\Config.xml" Element = "WindowsServices"/>
  16 + <Configuration Name="MAINTENANCECONSOLE_SQLDATABASEMANAGER" File="@DIR_MAINTENANCECONSOLE@\Config.xml" Element = "SQLDataBases"/>
  17 + <Configuration Name="MAINTENANCECONSOLE_LOG4PROUSERMANAGER" File="@DIR_MAINTENANCECONSOLE@\Config.xml" Element = "Log4ProUserManager"/>
  18 + </Configurations>
139 </Configurations> 19 </Configurations>
140 -</XmlParserConfiguration>  
141 \ No newline at end of file 20 \ No newline at end of file
  21 +</XmlParserConfiguration>
Vrh.Log4Pro.MaintenanceConsole/packages.config
1 <?xml version="1.0" encoding="utf-8"?> 1 <?xml version="1.0" encoding="utf-8"?>
2 <packages> 2 <packages>
3 <package id="EntityFramework" version="6.4.4" targetFramework="net462" /> 3 <package id="EntityFramework" version="6.4.4" targetFramework="net462" />
  4 + <package id="Microsoft.AspNet.Providers" version="2.0.0" targetFramework="net472" />
  5 + <package id="Microsoft.AspNet.Providers.Core" version="2.0.0" targetFramework="net472" />
  6 + <package id="Microsoft.Data.SqlClient" version="2.0.0" targetFramework="net462" />
  7 + <package id="Microsoft.Data.SqlClient.SNI" version="2.0.0" targetFramework="net462" />
  8 + <package id="Microsoft.Identity.Client" version="4.14.0" targetFramework="net462" />
  9 + <package id="Microsoft.IdentityModel.JsonWebTokens" version="5.6.0" targetFramework="net462" />
  10 + <package id="Microsoft.IdentityModel.Logging" version="5.6.0" targetFramework="net462" />
  11 + <package id="Microsoft.IdentityModel.Protocols" version="5.6.0" targetFramework="net462" />
  12 + <package id="Microsoft.IdentityModel.Protocols.OpenIdConnect" version="5.6.0" targetFramework="net462" />
  13 + <package id="Microsoft.IdentityModel.Tokens" version="5.6.0" targetFramework="net462" />
4 <package id="Microsoft.NETCore.Platforms" version="1.0.1" targetFramework="net462" /> 14 <package id="Microsoft.NETCore.Platforms" version="1.0.1" targetFramework="net462" />
  15 + <package id="Microsoft.SqlServer.Assessment" version="1.0.280" targetFramework="net462" />
  16 + <package id="Microsoft.SqlServer.Assessment.Authoring" version="1.0.280" targetFramework="net462" />
  17 + <package id="Microsoft.SqlServer.Management.SqlParser" version="160.20216.14" targetFramework="net462" />
  18 + <package id="Microsoft.SqlServer.SqlManagementObjects" version="161.46041.41" targetFramework="net462" />
5 <package id="Microsoft.Web.Administration" version="11.1.0" targetFramework="net462" /> 19 <package id="Microsoft.Web.Administration" version="11.1.0" targetFramework="net462" />
6 <package id="Microsoft.Win32.Primitives" version="4.0.1" targetFramework="net462" /> 20 <package id="Microsoft.Win32.Primitives" version="4.0.1" targetFramework="net462" />
7 <package id="Microsoft.Win32.Registry" version="4.0.0" targetFramework="net462" /> 21 <package id="Microsoft.Win32.Registry" version="4.0.0" targetFramework="net462" />
8 <package id="NETStandard.Library" version="1.6.0" targetFramework="net462" /> 22 <package id="NETStandard.Library" version="1.6.0" targetFramework="net462" />
9 - <package id="System.AppContext" version="4.1.0" targetFramework="net462" /> 23 + <package id="Newtonsoft.Json" version="11.0.1" targetFramework="net462" />
  24 + <package id="System.AppContext" version="4.1.0" targetFramework="net462" requireReinstallation="true" />
10 <package id="System.Collections" version="4.0.11" targetFramework="net462" /> 25 <package id="System.Collections" version="4.0.11" targetFramework="net462" />
11 <package id="System.Collections.Concurrent" version="4.0.12" targetFramework="net462" /> 26 <package id="System.Collections.Concurrent" version="4.0.12" targetFramework="net462" />
12 <package id="System.Console" version="4.0.0" targetFramework="net462" /> 27 <package id="System.Console" version="4.0.0" targetFramework="net462" />
@@ -17,13 +32,14 @@ @@ -17,13 +32,14 @@
17 <package id="System.Diagnostics.Tracing" version="4.1.0" targetFramework="net462" /> 32 <package id="System.Diagnostics.Tracing" version="4.1.0" targetFramework="net462" />
18 <package id="System.Globalization" version="4.0.11" targetFramework="net462" /> 33 <package id="System.Globalization" version="4.0.11" targetFramework="net462" />
19 <package id="System.Globalization.Calendars" version="4.0.1" targetFramework="net462" /> 34 <package id="System.Globalization.Calendars" version="4.0.1" targetFramework="net462" />
  35 + <package id="System.IdentityModel.Tokens.Jwt" version="5.6.0" targetFramework="net462" />
20 <package id="System.IO" version="4.1.0" targetFramework="net462" /> 36 <package id="System.IO" version="4.1.0" targetFramework="net462" />
21 <package id="System.IO.Compression" version="4.1.0" targetFramework="net462" /> 37 <package id="System.IO.Compression" version="4.1.0" targetFramework="net462" />
22 <package id="System.IO.Compression.ZipFile" version="4.0.1" targetFramework="net462" /> 38 <package id="System.IO.Compression.ZipFile" version="4.0.1" targetFramework="net462" />
23 <package id="System.IO.FileSystem" version="4.0.1" targetFramework="net462" /> 39 <package id="System.IO.FileSystem" version="4.0.1" targetFramework="net462" />
24 <package id="System.IO.FileSystem.Primitives" version="4.0.1" targetFramework="net462" /> 40 <package id="System.IO.FileSystem.Primitives" version="4.0.1" targetFramework="net462" />
25 - <package id="System.Linq" version="4.1.0" targetFramework="net462" />  
26 - <package id="System.Linq.Expressions" version="4.1.0" targetFramework="net462" /> 41 + <package id="System.Linq" version="4.1.0" targetFramework="net462" requireReinstallation="true" />
  42 + <package id="System.Linq.Expressions" version="4.1.0" targetFramework="net462" requireReinstallation="true" />
27 <package id="System.Management" version="5.0.0" targetFramework="net462" /> 43 <package id="System.Management" version="5.0.0" targetFramework="net462" />
28 <package id="System.Net.Http" version="4.1.0" targetFramework="net462" /> 44 <package id="System.Net.Http" version="4.1.0" targetFramework="net462" />
29 <package id="System.Net.Primitives" version="4.0.11" targetFramework="net462" /> 45 <package id="System.Net.Primitives" version="4.0.11" targetFramework="net462" />
@@ -41,7 +57,7 @@ @@ -41,7 +57,7 @@
41 <package id="System.Runtime.InteropServices.RuntimeInformation" version="4.0.0" targetFramework="net462" /> 57 <package id="System.Runtime.InteropServices.RuntimeInformation" version="4.0.0" targetFramework="net462" />
42 <package id="System.Runtime.Numerics" version="4.0.1" targetFramework="net462" /> 58 <package id="System.Runtime.Numerics" version="4.0.1" targetFramework="net462" />
43 <package id="System.Security.Claims" version="4.0.1" targetFramework="net462" /> 59 <package id="System.Security.Claims" version="4.0.1" targetFramework="net462" />
44 - <package id="System.Security.Cryptography.Algorithms" version="4.2.0" targetFramework="net462" /> 60 + <package id="System.Security.Cryptography.Algorithms" version="4.2.0" targetFramework="net462" requireReinstallation="true" />
45 <package id="System.Security.Cryptography.Encoding" version="4.0.0" targetFramework="net462" /> 61 <package id="System.Security.Cryptography.Encoding" version="4.0.0" targetFramework="net462" />
46 <package id="System.Security.Cryptography.Primitives" version="4.0.0" targetFramework="net462" /> 62 <package id="System.Security.Cryptography.Primitives" version="4.0.0" targetFramework="net462" />
47 <package id="System.Security.Cryptography.X509Certificates" version="4.1.0" targetFramework="net462" /> 63 <package id="System.Security.Cryptography.X509Certificates" version="4.1.0" targetFramework="net462" />
@@ -49,12 +65,13 @@ @@ -49,12 +65,13 @@
49 <package id="System.ServiceProcess.ServiceController" version="4.1.0" targetFramework="net462" /> 65 <package id="System.ServiceProcess.ServiceController" version="4.1.0" targetFramework="net462" />
50 <package id="System.Text.Encoding" version="4.0.11" targetFramework="net462" /> 66 <package id="System.Text.Encoding" version="4.0.11" targetFramework="net462" />
51 <package id="System.Text.Encoding.Extensions" version="4.0.11" targetFramework="net462" /> 67 <package id="System.Text.Encoding.Extensions" version="4.0.11" targetFramework="net462" />
52 - <package id="System.Text.RegularExpressions" version="4.1.0" targetFramework="net462" /> 68 + <package id="System.Text.RegularExpressions" version="4.1.0" targetFramework="net462" requireReinstallation="true" />
53 <package id="System.Threading" version="4.0.11" targetFramework="net462" /> 69 <package id="System.Threading" version="4.0.11" targetFramework="net462" />
54 <package id="System.Threading.Tasks" version="4.0.11" targetFramework="net462" /> 70 <package id="System.Threading.Tasks" version="4.0.11" targetFramework="net462" />
55 <package id="System.Threading.Timer" version="4.0.1" targetFramework="net462" /> 71 <package id="System.Threading.Timer" version="4.0.1" targetFramework="net462" />
56 <package id="System.Xml.ReaderWriter" version="4.0.11" targetFramework="net462" /> 72 <package id="System.Xml.ReaderWriter" version="4.0.11" targetFramework="net462" />
57 <package id="System.Xml.XDocument" version="4.0.11" targetFramework="net462" /> 73 <package id="System.Xml.XDocument" version="4.0.11" targetFramework="net462" />
58 - <package id="VRH.Common" version="2.19.1" targetFramework="net462" />  
59 - <package id="Vrh.XmlProcessing" version="1.23.0" targetFramework="net462" /> 74 + <package id="VRH.Common" version="2.20.1" targetFramework="net472" />
  75 + <package id="VRH.Web.Providers" version="2.0.2" targetFramework="net472" />
  76 + <package id="Vrh.XmlProcessing" version="1.24.0" targetFramework="net462" />
60 </packages> 77 </packages>
61 \ No newline at end of file 78 \ No newline at end of file
Vrh.Log4Pro.MaintenanceConsole/servicelogo.ico 0 → 100644
No preview for this file type
Vrh.Log4Pro.MaintenanceConsole/system.web.membership.config 0 → 100644
@@ -0,0 +1,12 @@ @@ -0,0 +1,12 @@
  1 +<membership defaultProvider="VrhMembershipProvider">
  2 + <providers>
  3 + <add name="VrhMembershipProvider" type="Vrh.Web.Providers.VrhMembershipProvider, Vrh.Web.Providers" connectionStringName="Vrh.Web.Providers:connectionstring" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" passwordCompatMode="Framework20" />
  4 + </providers>
  5 +</membership>
  6 +<!--
  7 +<membership defaultProvider="DefaultMembershipProvider">
  8 + <providers>
  9 + <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="VrhWebMembership" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordCompatMode="Framework20" applicationName="/" />
  10 + </providers>
  11 +</membership>
  12 +-->
0 \ No newline at end of file 13 \ No newline at end of file
Vrh.Log4Pro.MaintenanceConsole/system.web.rolemanager.config 0 → 100644
@@ -0,0 +1,12 @@ @@ -0,0 +1,12 @@
  1 +<roleManager enabled="true" defaultProvider="VrhRoleProvider">
  2 + <providers>
  3 + <add name="VrhRoleProvider" type="Vrh.Web.Providers.VrhRoleProvider, Vrh.Web.Providers" connectionStringName="Vrh.Web.Providers:connectionstring" applicationName="/" />
  4 + </providers>
  5 +</roleManager>
  6 +<!--
  7 +<roleManager enabled="true" defaultProvider="DefaultRoleProvider">
  8 + <providers>
  9 + <add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="Vrh.Web.Providers:connectionstring" applicationName="/" />
  10 + </providers>
  11 +</roleManager>
  12 +-->
0 \ No newline at end of file 13 \ No newline at end of file