Commit 8e8a7bf0599696f5cfbbbefcc547a9a03a41edef

Authored by Schwirg László
1 parent 37bf94ab

jelentős fejleszetések

Vrh.Log4Pro.MaintenanceConsole/App.config
... ... @@ -5,7 +5,7 @@
5 5 <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
6 6 </configSections>
7 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 9 </startup>
10 10 <appSettings>
11 11 <add key="VRH.XmlParser:root" value="XmlParser.xml" />
... ... @@ -16,11 +16,19 @@
16 16 <assemblyIdentity name="System.Reflection.TypeExtensions" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
17 17 <bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
18 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 23 </assemblyBinding>
20 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 30 <providers>
23 31 <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
24 32 </providers>
25 33 </entityFramework>
26   -</configuration>
27 34 \ No newline at end of file
  35 +</configuration>
... ...
Vrh.Log4Pro.MaintenanceConsole/Config.xml
... ... @@ -152,10 +152,10 @@
152 152 </WindowsServices>
153 153  
154 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 159 </WebApplications>
160 160  
161 161 <FileCleaner CleanupDays="7">
... ... @@ -197,4 +197,18 @@
197 197 <ScheduledTask Name="CP_PurgeFiles_DAILY" Priority="7" Schedule="DAILY" StartTime="05:00" Enable="true" Run="false" Commandname="sc.exe" />
198 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 214 </Configuration>
201 215 \ No newline at end of file
... ...
Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - ColorConsole.cs
... ... @@ -11,7 +11,7 @@ using System.Diagnostics;
11 11 using Vrh.XmlProcessing;
12 12 using System.Xml.Linq;
13 13  
14   -namespace Vrh.Log4Pro.MaintenanceConsole
  14 +namespace Vrh.Log4Pro.MaintenanceConsole.ColorConsoleNS
15 15 {
16 16 #region ColorConsole
17 17 public static class ColorConsole
... ... @@ -101,7 +101,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
101 101 /// <param name="bracket"></param>
102 102 /// <param name="prefix"></param>
103 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 106 if (silentMode)
107 107 {
... ... @@ -115,7 +115,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
115 115 }
116 116 else
117 117 {
118   - Write(text, f, b, bracket, prefix);
  118 + Write(text, f, b, bracket, prefix,suffix);
119 119 return Console.ReadLine();
120 120 }
121 121 }
... ... @@ -133,6 +133,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole
133 133  
134 134 public static int CursorLeft { get { return Console.CursorLeft; } }
135 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 143 public static void Clear() { Console.Clear(); }
138 144  
... ...
Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - CommandLineParser.cs
... ... @@ -8,10 +8,12 @@ using Microsoft.Web.Administration;
8 8 using System.Management;
9 9 using System.Diagnostics;
10 10  
  11 +using Vrh.Log4Pro.MaintenanceConsole.ColorConsoleNS;
  12 +
11 13 using Vrh.XmlProcessing;
12 14 using System.Xml.Linq;
13 15  
14   -namespace Vrh.Log4Pro.MaintenanceConsole
  16 +namespace Vrh.Log4Pro.MaintenanceConsole.CommandLineParserNS
15 17 {
16 18 #region CommandLineParser
17 19 public static class CommandLineParser
... ... @@ -74,7 +76,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
74 76 }
75 77 else if (chr == ' ' && !quoted)
76 78 {
77   - if (started) yield return result.ToString();
  79 + if (started) { yield return result.ToString(); }
78 80 result.Clear();
79 81 started = false;
80 82 }
... ... @@ -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 92 public static void UnitTest()
91 93 {
... ... @@ -156,6 +158,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
156 158 return;
157 159 }
158 160 for (int i = 0; i < r.Length; i++)
  161 + {
159 162 if (r[i] != sr[i])
160 163 {
161 164 ColorConsole.WriteLine($"ERROR:{id}");
... ... @@ -164,8 +167,9 @@ namespace Vrh.Log4Pro.MaintenanceConsole
164 167 ColorConsole.WriteLine($" expected: {sexp}");
165 168 return;
166 169 }
  170 + }
167 171 }
168   - catch (Exception ex)
  172 + catch
169 173 {
170 174 ColorConsole.WriteLine($"EXCEP:{id}");
171 175 ColorConsole.WriteLine($" cmdline : {cmd}");
... ... @@ -176,4 +180,119 @@ namespace Vrh.Log4Pro.MaintenanceConsole
176 180 }
177 181 }
178 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 10 using System.Management;
11 11 using System.Diagnostics;
12 12  
  13 +using Vrh.Log4Pro.MaintenanceConsole.ColorConsoleNS;
  14 +
13 15 using Vrh.XmlProcessing;
14 16 using VRH.Common;
15 17 using System.Xml.Linq;
16 18  
17   -namespace Vrh.Log4Pro.MaintenanceConsole
  19 +namespace Vrh.Log4Pro.MaintenanceConsole.MenuNS
18 20 {
19 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 33 public delegate Object MenuItemDisplayerFunc(Object p, int i);
  34 + public delegate void MenuHeaderDisplayerFunc();
  35 +
23 36 public Menu(string title, string selectionprompt = null) { Title = title; if (!string.IsNullOrWhiteSpace(selectionprompt)) { SelectionPrompt = selectionprompt; } }
24 37 #region private fields
25 38 private string title;
26 39 private string Title { get { return ColorConsole.WideString(title); } set { title = value; } }
27 40 private MenuItemDisplayerFunc MenuItemDisplayer;
  41 + private MenuHeaderDisplayerFunc MenuHeaderDisplayer;
28 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 45 private string SelectionPrompt = "Make Your selection!";
33 46 #endregion private fields
34 47  
35 48 #region public properties
36 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 51 #endregion public properties
39 52  
40 53 #region public tools
... ... @@ -45,7 +58,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
45 58 /// <param name="partxt"></param>
46 59 public static void IncorrectSelection(string partxt = "")
47 60 {
48   - if (GetCommandModeAllMenus()) { return; }
  61 + if (IsCommandMode()) { return; }
49 62  
50 63 ColorConsole.WriteLine();
51 64 ColorConsole.WriteLine($"Incorrect selection! {partxt} Make a new selection!", ConsoleColor.Red);
... ... @@ -59,51 +72,90 @@ namespace Vrh.Log4Pro.MaintenanceConsole
59 72 /// <returns></returns>
60 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 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 98 public Menu SetMenuItemDisplayer(MenuItemDisplayerFunc displayer)
71 99 {
72 100 MenuItemDisplayer = displayer;
73 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 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 128 public Menu AddMenuItem(Item mi)
81 129 {
82 130 MenuItemList.Add(mi);
83 131 if (string.IsNullOrWhiteSpace(mi.Key)) { mi.Key = $"#$KEY{MenuItemList.IndexOf(mi)}"; }
84 132 return this;
85 133 }
  134 +
  135 + /// <summary>
  136 + /// Törli a menüpontok listáját
  137 + /// </summary>
86 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 146 try
97 147 {
98 148 while (true)
99 149 {
100 150 DisplayTitle();
  151 + MenuHeaderDisplayer?.Invoke();
101 152 DisplayItems();
102   - var sr = Select();
  153 + var sr = Select(forcedselectionkeylist);
103 154 if (sr.Result == Menu.SelectionResult.Exit) { return; }
104 155 else if (sr.Result == Menu.SelectionResult.None) { continue; }
105 156 else if (sr.Result == Menu.SelectionResult.Error) { continue; }
106 157 ExecuteSelection(sr.SelectedKeyList);
  158 + if (Menu.IsCommandMode()) { return; }
107 159 }
108 160 }
109 161 catch (Exception ex)
... ... @@ -113,33 +165,70 @@ namespace Vrh.Log4Pro.MaintenanceConsole
113 165 Menu.PressAnykeyToContinue();
114 166 }
115 167 }
  168 +
  169 +
  170 + /// <summary>
  171 + /// Megjeleníti a menő fejlécét
  172 + /// </summary>
116 173 public void DisplayTitle()
117 174 {
118   - if (GetCommandMode()) { return; }
  175 + if (Menu.IsCommandMode()) { return; }
119 176  
120 177 ColorConsole.Clear();
121 178 ColorConsole.WriteLine(Title, ConsoleColor.White);
122 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 212 public void DisplayItems(int columns = 1, int columnlength = 0)
125 213 {
126   - if (GetCommandMode()) { return; }
  214 + if (Menu.IsCommandMode()) { return; }
127 215  
128 216 int columncounter = 0;
129 217 ColorConsole.WriteLine();
130 218 var i = 1;
131 219 ColorConsole.SetCursorPosition(0, ColorConsole.CursorTop);
  220 + MenuItemIndentWidth = SetMenuItemHeaderWidth(MenuItemList, columns);
132 221 foreach (var menuitem in MenuItemList)
133 222 {
134 223 if (menuitem.Separator && columns == 1)
135 224 {
136   - ColorConsole.SetCursorPosition(columnlength * columncounter + HeaderWidth, ColorConsole.CursorTop);
  225 + ColorConsole.SetCursorPosition(MenuItemIndentWidth, ColorConsole.CursorTop);
137 226 var seplen = menuitem.SeparatorLength;
138 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 232 continue;
144 233 }
145 234 ColorConsole.Write($"[");
... ... @@ -150,21 +239,18 @@ namespace Vrh.Log4Pro.MaintenanceConsole
150 239 ColorConsole.Write(menuitem.Key, ConsoleColor.Yellow);
151 240 }
152 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 247 if (!string.IsNullOrEmpty(menuitem.Text)) { ColorConsole.WriteLine(); }
162 248 if (MenuItemDisplayer != null)
163 249 {
164 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 254 if (string.IsNullOrEmpty(str)) { ColorConsole.SetCursorPosition(0, ColorConsole.CursorTop); }
169 255 if (str == null) { break; }
170 256 }
... ... @@ -172,6 +258,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole
172 258 }
173 259 else
174 260 {
  261 + ColorConsole.SetCursorPosition(columnlength * columncounter, ColorConsole.CursorTop);
  262 + if (!string.IsNullOrEmpty(menuitem.Text)) { ColorConsole.Write(menuitem.Text); }
175 263 columncounter++;
176 264 if (columncounter == columns) { ColorConsole.WriteLine(); columncounter = 0; }
177 265 else
... ... @@ -189,28 +277,61 @@ namespace Vrh.Log4Pro.MaintenanceConsole
189 277 }
190 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 309 public class Selection
193 310 {
194 311 public Selection() { }
195   - public Selection(string selectedkey,object parameter)
  312 + public Selection(string selectedkey, Menu.ExecutorParameter parameter)
196 313 {
197 314 Result = SelectionResult.Ok;
198 315 SelectedKeyList = new List<string>() { { selectedkey } };
199   - SelectedParameterList = new List<object>() { { parameter } };
  316 + SelectedParameterList = new List<Menu.ExecutorParameter>() { { parameter } };
200 317 }
201 318 public List<string> SelectedKeyList = null;
202 319 public SelectionResult Result;
203   - public List<object> SelectedParameterList;
  320 + public List<Menu.ExecutorParameter> SelectedParameterList;
204 321 }
205 322 public enum SelectionResult { Exit, None, Error, Ok, }
206 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 330 public Selection Select(string forcedselectionkeylist=null)
208 331 {
209   - List<string> selectionKeyList;
210   - List<object> selectionParList;
211 332 string selectionliststr;
212 333 var result = new Selection();
213   - if (GetCommandMode())
  334 + if (Menu.IsCommandMode())
214 335 {
215 336 selectionliststr = forcedselectionkeylist??"EX";
216 337 }
... ... @@ -246,47 +367,81 @@ namespace Vrh.Log4Pro.MaintenanceConsole
246 367 result.SelectedKeyList = null;
247 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 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 395 result.Result = SelectionResult.Error;
276 396 result.SelectedKeyList = null;
277 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 404 result.Result = SelectionResult.Ok;
286   - result.SelectedKeyList = selectionKeyList;
287   - result.SelectedParameterList = selectionParList;
  405 + result.SelectedKeyList = return_selectionKeyList;
  406 + result.SelectedParameterList = return_selectionParList;
288 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 445 public void ExecuteSelection(List<string> selectedkeylist)
291 446 {
292 447 object o = null;
... ... @@ -300,18 +455,11 @@ namespace Vrh.Log4Pro.MaintenanceConsole
300 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 463 public MenuItemExecutorFunc GetExecutor(string key)
316 464 {
317 465 return MenuItemList.ElementAt(GetItemIx(key)).Executor;
... ... @@ -319,31 +467,57 @@ namespace Vrh.Log4Pro.MaintenanceConsole
319 467 #endregion public tools
320 468  
321 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 475 private Menu.Item GetItem(string itemkey)
323 476 {
324 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 484 private Menu.Item GetItem(int ix)
327 485 {
328 486 var i = 0;
329 487 foreach (var mi in MenuItemList)
330 488 {
331 489 if (mi.Separator) { continue; }
332   - if (i == ix) return mi;
  490 + if (i == ix) { return mi; }
333 491 i++;
334 492 }
335 493 return null;
336 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 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 522 foreach (var mi in this.MenuItemList)
349 523 {
... ... @@ -355,6 +529,33 @@ namespace Vrh.Log4Pro.MaintenanceConsole
355 529 }
356 530 }
357 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 559 public class ItemSeparator : Item
359 560 {
360 561 public ItemSeparator(char c = '-', int length = 0) : base()
... ... @@ -367,7 +568,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
367 568 public class Item
368 569 {
369 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 573 Key = key;
373 574 Text = text;
... ... @@ -377,7 +578,10 @@ namespace Vrh.Log4Pro.MaintenanceConsole
377 578 public string Key;
378 579 public string Text;
379 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 586 public bool Separator = false;
383 587 public char SeparatorChar = '-';
... ...
Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - Tools - Membership.cs 0 → 100644
... ... @@ -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 1082 \ No newline at end of file
... ...
Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - Tools.cs
1 1 using System;
2 2 using System.IO;
  3 +using System.IO.Compression;
3 4 using System.Collections.Generic;
4 5 using System.Linq;
5 6 using System.Security.Principal;
6 7 using System.Text;
  8 +using System.Text.RegularExpressions;
7 9 using System.Threading.Tasks;
8 10 using System.Threading;
9 11  
... ... @@ -13,11 +15,101 @@ using System.Diagnostics;
13 15  
14 16 using Vrh.XmlProcessing;
15 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 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 113 public static bool IsElevated
22 114 {
23 115 get
... ... @@ -72,5 +164,15 @@ namespace Vrh.Log4Pro.MaintenanceConsole
72 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 @@
  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 1 using System;
2 2 using System.IO;
  3 +using System.IO.Compression;
3 4 using System.Configuration.Install;
4 5 using System.Collections.Generic;
5 6 using System.Linq;
... ... @@ -12,97 +13,95 @@ using Microsoft.Web.Administration;
12 13 using System.Management;
13 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 20 using Vrh.XmlProcessing;
  21 +using VRH.Common;
16 22 using System.Xml.Linq;
17 23 using System.Text.RegularExpressions;
18 24  
19   -namespace Vrh.Log4Pro.MaintenanceConsole
  25 +namespace Vrh.Log4Pro.MaintenanceConsole.FileCleanerManagerNS
20 26 {
21 27 #region FileCleanerManager class
22 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 33 #region Execute
25 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 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 48 #endregion Execute
51 49  
52 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 61 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
61 62 else if (sr.Result == Menu.SelectionResult.None) { return o; }
62 63 else if (sr.Result == Menu.SelectionResult.Error) { return o; }
63 64 else if (sr.Result == Menu.SelectionResult.Ok) { }
64 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 79 #endregion First level Executors with UI
82 80  
83 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 87 List<FolderToClean> fctdefList = config.GetDefinitionList();
88 88 var menufct = new Menu("Folder to clean",prompt)
89 89 .SetMenuItemDisplayer(DisplayFolderInfo)
90   - .SetSelectionMode(Menu.SelectionMode.Multi)
91   - .SetHeaderWidth(4);
  90 + .SetSelectionMode(Menu.SelectionMode.Multi);
92 91 menufct.ClearMenuItemList();
93 92 foreach (var fctdef in fctdefList)
94 93 {
95 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 97 if (!silent) { menufct.DisplayItems(1); }
99 98 return menufct;
100 99 }
101   - #endregion private DisplayFolders
  100 + #endregion private DisplayFolderMenu
102 101 #region private method: DisplayFolderInfo
103 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 105 if (lineix == 0)
107 106 {
108 107 ColorConsole.Write($"{ws.Xml_DirectoryPath}", ConsoleColor.Black, ConsoleColor.White);
... ... @@ -214,7 +213,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole
214 213 bool conditionresult = false;
215 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 218 try { var fileTS = DateTime.Parse(fileTSstr); conditionresult = DateTime.Now.Subtract(fileTS).TotalDays > c.Limit; }
219 219 catch
220 220 {
... ... @@ -288,12 +288,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole
288 288 #endregion class FileCleanerManagerCore
289 289  
290 290 #region FileCleanerManagerCoreXmlProcessor class
291   - public class FileCleanerManagerCoreXmlProcessor : XmlParser
  291 + public class FileCleanerManagerXmlProcessor : XmlParser
292 292 {
293 293 private List<FolderToClean> _foldertocleanlist;
294 294 private int commoncleanupdays;
295 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 298 _foldertocleanlist = new List<FolderToClean>();
299 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 315 {
316 316 #region fields
317 317 public bool Valid = true;
  318 + public string Xml_Key;
318 319 public string Xml_DirectoryPath;
319 320 public bool Xml_Recurse;
320 321 public bool Xml_RemoveEmptyFolder;
... ... @@ -339,6 +340,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
339 340 {
340 341 Valid = true;
341 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 344 Xml_DirectoryPath = foldertocleanxml.Attribute(XName.Get(nameof(XmlStructure.FolderToClean.Attributes.Directory)))?.Value;
343 345 if (string.IsNullOrWhiteSpace(Xml_DirectoryPath)) { throw new ApplicationException(string.Format(ATTRIBUTEMANDATORY, nameof(XmlStructure.FolderToClean.Attributes.Directory))); }
344 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 363 public FolderToClean(FolderToClean ftc)
362 364 {
363 365 Valid = ftc.Valid;
  366 + Xml_Key= ftc.Xml_Key;
364 367 Xml_DirectoryPath = ftc.Xml_DirectoryPath;
365 368 Xml_Recurse = ftc.Xml_Recurse;
366 369 Xml_RemoveEmptyFolder = ftc.Xml_RemoveEmptyFolder;
... ... @@ -414,6 +417,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
414 417 {
415 418 public static class Attributes
416 419 {
  420 + public static class Key { public static class Values { public const string DEFAULT = ""; } }
417 421 public static class Directory { }
418 422 public static class CleanupDays
419 423 {
... ...
Vrh.Log4Pro.MaintenanceConsole/Manager - MaintenanceToolManager.cs
... ... @@ -12,40 +12,35 @@ using Microsoft.Web.Administration;
12 12 using System.Management;
13 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 19 using Vrh.XmlProcessing;
16 20 using System.Xml.Linq;
17 21 using System.Text.RegularExpressions;
18 22  
19   -namespace Vrh.Log4Pro.MaintenanceConsole
  23 +namespace Vrh.Log4Pro.MaintenanceConsole.MaintenanceToolManagerNS
20 24 {
21 25 #region MaintenanceTools class
22 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 31 #region Execute
25 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 36 var config = new MaintenanceToolsXmlProcessor(xmlcs, "", "hu-HU");
29 37  
30 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 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 44 return null;
50 45 }
51 46 #endregion Execute
... ... @@ -54,7 +49,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
54 49 #region RegexTester
55 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 53 var regexptesterconfig = config.RegexpTesterConfig;
59 54 while(true)
60 55 {
... ...
Vrh.Log4Pro.MaintenanceConsole/Manager - SQLDataBaseManager.cs 0 → 100644
... ... @@ -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 12 using System.Management;
13 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 20 using Vrh.XmlProcessing;
16 21 using VRH.Common;
17 22 using System.Xml.Linq;
18 23 using System.Text.RegularExpressions;
19 24  
20   -namespace Vrh.Log4Pro.MaintenanceConsole
  25 +namespace Vrh.Log4Pro.MaintenanceConsole.ScheduledTaskManagerNS
21 26 {
22 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 33 #region Execute
28 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 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 52 return o2;
62 53 }
63 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 56 #region First level Executors with UI
73 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 66 Menu.Selection sr = menufolders.Select(selectedtaskindexes);
83 67 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
... ... @@ -87,7 +71,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
87 71 else { }
88 72 foreach (var p in sr.SelectedParameterList)
89 73 {
90   - ScheduledTask st = p as ScheduledTask;
  74 + ScheduledTask st = p.Parameters as ScheduledTask;
91 75 try
92 76 {
93 77 ScheduledTaskManagerCore.SetPriority(st.Xml_Name,st.Xml_Priority);
... ... @@ -99,12 +83,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole
99 83 }
100 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 93 Menu.Selection sr = menufolders.Select(selectedtaskindexes);
110 94 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
... ... @@ -114,7 +98,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
114 98 else { }
115 99 foreach (var p in sr.SelectedParameterList)
116 100 {
117   - ScheduledTask st = p as ScheduledTask;
  101 + ScheduledTask st = p.Parameters as ScheduledTask;
118 102 try
119 103 {
120 104 ScheduledTaskManagerCore.DisableTask(st.Xml_Name);
... ... @@ -126,12 +110,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole
126 110 }
127 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 120 Menu.Selection sr = menufolders.Select(selectedtaskindexes);
137 121 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
... ... @@ -141,7 +125,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
141 125 else { }
142 126 foreach (var p in sr.SelectedParameterList)
143 127 {
144   - ScheduledTask st = p as ScheduledTask;
  128 + ScheduledTask st = p.Parameters as ScheduledTask;
145 129 try
146 130 {
147 131 ScheduledTaskManagerCore.EnableTask(st.Xml_Name);
... ... @@ -153,12 +137,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole
153 137 }
154 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 147 Menu.Selection sr = menufolders.Select(selectedtaskindexes);
164 148 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
... ... @@ -168,7 +152,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
168 152 else { }
169 153 foreach (var p in sr.SelectedParameterList)
170 154 {
171   - ScheduledTask st = p as ScheduledTask;
  155 + ScheduledTask st = p.Parameters as ScheduledTask;
172 156 try
173 157 {
174 158 ScheduledTaskManagerCore.EndTask(st.Xml_Name);
... ... @@ -180,12 +164,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole
180 164 }
181 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 174 Menu.Selection sr = menufolders.Select(selectedtaskindexes);
191 175 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
... ... @@ -195,7 +179,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
195 179 else { }
196 180 foreach (var p in sr.SelectedParameterList)
197 181 {
198   - ScheduledTask st = p as ScheduledTask;
  182 + ScheduledTask st = p.Parameters as ScheduledTask;
199 183 try
200 184 {
201 185 ScheduledTaskManagerCore.RunTask(st.Xml_Name);
... ... @@ -210,12 +194,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole
210 194 }
211 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 204 Menu.Selection sr = menufolders.Select(selectedtaskindexes);
221 205 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
... ... @@ -225,7 +209,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
225 209 else { }
226 210 foreach (var p in sr.SelectedParameterList)
227 211 {
228   - ScheduledTask st = p as ScheduledTask;
  212 + ScheduledTask st = p.Parameters as ScheduledTask;
229 213 try
230 214 {
231 215 ScheduledTaskManagerCore.EndTask(st.Xml_Name);
... ... @@ -238,12 +222,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole
238 222 }
239 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 232 Menu.Selection sr = menufolders.Select(selectedtaskindexes);
249 233 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
... ... @@ -253,7 +237,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
253 237 else { }
254 238 foreach (var p in sr.SelectedParameterList)
255 239 {
256   - ScheduledTask st = p as ScheduledTask;
  240 + ScheduledTask st = p.Parameters as ScheduledTask;
257 241 try
258 242 {
259 243 ScheduledTaskManagerCore.EndTask(st.Xml_Name);
... ... @@ -269,27 +253,28 @@ namespace Vrh.Log4Pro.MaintenanceConsole
269 253  
270 254 #region private methods
271 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 260 List<ScheduledTask> schtskdefList = config.GetDefinitionList();
275   - var menufct = new Menu("Scheduled tasks",prompt)
  261 + var menufct = new Menu("Scheduled tasks", prompt)
276 262 .SetMenuItemDisplayer(DisplayTaskInfo)
277   - .SetSelectionMode(Menu.SelectionMode.Multi)
278   - .SetHeaderWidth(4);
  263 + .SetSelectionMode(Menu.SelectionMode.Multi);
279 264 menufct.ClearMenuItemList();
280 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 271 return menufct;
287 272 }
288 273 #endregion private DisplayTasks
289 274 #region private method: DisplayTaskInfo
290 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 278 if (lineix == 0)
294 279 {
295 280 ColorConsole.Write($"{st.Xml_Name}", ConsoleColor.Black, ConsoleColor.White);
... ... @@ -316,8 +301,15 @@ namespace Vrh.Log4Pro.MaintenanceConsole
316 301 return null;
317 302 }
318 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 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 318 var statuslines = status.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
327 319 var statussplitted = statuslines[3]
328 320 .Split(new string[] { " ", "+" }, StringSplitOptions.RemoveEmptyEntries);
329   - if (statussplitted[1]=="N/A")
  321 + if (statussplitted[1] == "N/A")
330 322 {
331 323 schtsk.NextRun = "";
332 324 schtsk.Priority = -1;
... ... @@ -354,14 +346,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole
354 346 }
355 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 351 public static int GetPriority(string taskname)
366 352 {
367 353 try
... ... @@ -409,7 +395,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
409 395 public static void CreateTask(ScheduledTask st)
410 396 {
411 397 string taskname = st.Xml_Name;
412   - string tasktorunpars = st.Xml_Commandname;
  398 + string tasktorunpars = st.Xml_Commandname.Quote();
413 399  
414 400 string schedulepars = "";
415 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 410 string prioritypars = "/RL HIGHEST";
425 411  
426 412 var args = $"/Create /TR {tasktorunpars} {schedulepars} {starttimepars} {passwordpars} {forcecreatepars} {prioritypars} /TN {taskname}";
  413 +
427 414 var result = Tools.ExecuteAndGetStdIo("schtasks.exe", args);
428 415  
429 416 if (st.Xml_Enable) { EnableTask(taskname); } else { DisableTask(taskname); }
... ... @@ -433,11 +420,11 @@ namespace Vrh.Log4Pro.MaintenanceConsole
433 420 #endregion class ScheduledTaskManagerCore
434 421  
435 422 #region ScheduledTaskManagerCoreXmlProcessor class
436   - public class ScheduledTaskManagerCoreXmlProcessor : XmlParser
  423 + public class ScheduledTaskManagerXmlProcessor : XmlParser
437 424 {
438 425 private List<ScheduledTask> _scheduledtasklist;
439 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 429 _scheduledtasklist = new List<ScheduledTask>();
443 430 var schtskxmllist = GetAllXElements(nameof(ScheduledTask.XmlStructure.ScheduledTask));
... ... @@ -458,6 +445,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
458 445 {
459 446 #region fields
460 447 public bool Valid = true;
  448 + public string Xml_Key;
461 449 public string Xml_Name;
462 450 public int Xml_Priority;
463 451 public string Xml_Schedule;
... ... @@ -495,6 +483,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
495 483 {
496 484 Valid = true;
497 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 487 Xml_Name = scheduledtaskxml.Attribute(XName.Get(nameof(XmlStructure.ScheduledTask.Attributes.Name)))?.Value;
499 488 if (string.IsNullOrWhiteSpace(Xml_Name)) { throw new ApplicationException(string.Format(ATTRIBUTEMANDATORY, nameof(XmlStructure.ScheduledTask.Attributes.Name))); }
500 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 491 Xml_StartTime = DateTime.Parse(GetValue(nameof(XmlStructure.ScheduledTask.Attributes.StartTime), scheduledtaskxml, XmlStructure.ScheduledTask.Attributes.StartTime.Values.DEFAULT));
503 492 Xml_Enable = GetValue(nameof(XmlStructure.ScheduledTask.Attributes.Enable), scheduledtaskxml, XmlStructure.ScheduledTask.Attributes.Enable.Values.DEFAULT);
504 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 495 //var conditionxmlList = GetAllXElements(foldertocleanxml, nameof(XmlStructure.FolderToClean.Conditions), nameof(XmlStructure.FolderToClean.Conditions.Condition));
507 496 }
508 497 #endregion xml constructor
... ... @@ -510,6 +499,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
510 499 public ScheduledTask(ScheduledTask ftc)
511 500 {
512 501 Valid = ftc.Valid;
  502 + Xml_Key= ftc.Xml_Key;
513 503 Xml_Name = ftc.Xml_Name;
514 504 Xml_Priority = ftc.Xml_Priority;
515 505 Xml_Schedule = ftc.Xml_Schedule;
... ... @@ -526,14 +516,9 @@ namespace Vrh.Log4Pro.MaintenanceConsole
526 516 {
527 517 public static class Attributes
528 518 {
  519 + public static class Key { public static class Values { public const string DEFAULT = ""; } }
529 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 522 public static class Priority
538 523 {
539 524 public static class Values
... ... @@ -567,7 +552,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
567 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 @@
  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 10 using System.Management;
11 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 17 using Vrh.XmlProcessing;
  18 +using VRH.Common;
14 19 using System.Xml.Linq;
15 20  
16   -namespace Vrh.Log4Pro.MaintenanceConsole
  21 +namespace Vrh.Log4Pro.MaintenanceConsole.WebApplicationManagerNS
17 22 {
18 23 #region WebApplicationManager
19 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 29 #region public method: Execute
22 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 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 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 125 using (ServerManager sm = new ServerManager())
168 126 {
169 127 bool success = false;
... ... @@ -181,12 +139,26 @@ namespace Vrh.Log4Pro.MaintenanceConsole
181 139 }
182 140 var successstr = success ? "started" : "NOT started";
183 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 162 using (ServerManager sm = new ServerManager())
191 163 {
192 164 bool success = false;
... ... @@ -203,58 +175,100 @@ namespace Vrh.Log4Pro.MaintenanceConsole
203 175 }
204 176 var successstr = success ? "recycled" : "NOT recycled";
205 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 198 using (ServerManager sm = new ServerManager())
212 199 {
213   - WebApplication d = dobj as WebApplication;
214 200 bool success = false;
215 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 204 if (p != null && p.State == ObjectState.Started) { p.Stop(); success = true; break; }
219 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 208 if (ColorConsole.KeyAvailable) { if (ColorConsole.ReadKey().KeyChar.ToString().ToUpper() == "X") { break; } }
223 209  
224 210 Thread.Sleep(1000);
225 211 }
226 212 }
227 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 237 bool success = false;
238 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 241 if (s != null && s.State == ObjectState.Stopped) { s.Start(); success = true; break; }
242 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 245 if (ColorConsole.KeyAvailable) { if (ColorConsole.ReadKey().KeyChar.ToString().ToUpper() == "X") { break; } }
246 246 Thread.Sleep(1000);
247 247 }
248 248 }
249 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 273 bool success = false;
260 274 for (var i = 1; i < 4; i++)
... ... @@ -270,57 +284,120 @@ namespace Vrh.Log4Pro.MaintenanceConsole
270 284 }
271 285 var successstr = success ? "stopped" : "NOT stopped";
272 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 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 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 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 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 399 password = ColorConsole.ReadLine().ToUpper();
323   - if (impersonate == "EX") { return null; }
  400 + if (password == "EX") { return; }
324 401 break;
325 402 //bool valid = System.Web.ApplicationSerices.AuthenticationService.ValidateUser(username, password, mull);
326 403 }
... ... @@ -330,126 +407,209 @@ namespace Vrh.Log4Pro.MaintenanceConsole
330 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 445 else
353 446 {
  447 + var defaultinxml = WebApplicationManagerCore.GetDefaultPoolIdentityInfo(wa);
  448 + username=""; password = "";
  449 + string olduserinfo = WebApplicationManagerCore.GetCurrentPoolIdentityInfo(wa);
354 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 454 ColorConsole.WriteLine($" (API) {nameof(ProcessModelIdentityType.ApplicationPoolIdentity)}");
358 455 ColorConsole.WriteLine($" (LSE) {nameof(ProcessModelIdentityType.LocalService)}");
359 456 ColorConsole.WriteLine($" (LSY) {nameof(ProcessModelIdentityType.LocalSystem)}");
360 457 ColorConsole.WriteLine($" (NSE) {nameof(ProcessModelIdentityType.NetworkService)}");
361   - ColorConsole.WriteLine();
362   - ColorConsole.Write(" (EX) ", ConsoleColor.Red); ColorConsole.WriteLine("Exit");
363 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 462 else if (username == "LSE" || username == nameof(ProcessModelIdentityType.LocalService)) { username = nameof(ProcessModelIdentityType.LocalService); }
368 463 else if (username == "LSY" || username == nameof(ProcessModelIdentityType.LocalSystem)) { username = nameof(ProcessModelIdentityType.LocalSystem); }
369 464 else if (username == "NSE" || username == nameof(ProcessModelIdentityType.NetworkService)) { username = nameof(ProcessModelIdentityType.NetworkService); }
370 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 468 password = ColorConsole.ReadLine().ToUpper();
374 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 539 public static class WebApplicationManagerCore
386 540 {
387 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 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 614 #endregion private method: CollectWebAppInfo
455 615  
... ... @@ -541,8 +701,9 @@ namespace Vrh.Log4Pro.MaintenanceConsole
541 701 #endregion private method:CommitChanges
542 702  
543 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 707 try
547 708 {
548 709 var xml = XElement.Load(filepath);
... ... @@ -553,6 +714,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
553 714 var impersonate = identityXml.Attribute(XName.Get("impersonate"))?.Value;
554 715 var username = identityXml.Attribute(XName.Get("userName"))?.Value;
555 716 var password = identityXml.Attribute(XName.Get("password"))?.Value;
  717 +
556 718 string unpswinfo = $", username[password]: {username}[{password}]";
557 719 var userinfo = impersonate.ToLower() == "true" && !string.IsNullOrWhiteSpace(username) ? unpswinfo : "";
558 720 var retinfo = $"Impersonate={impersonate}{userinfo}";
... ... @@ -561,22 +723,40 @@ namespace Vrh.Log4Pro.MaintenanceConsole
561 723 }
562 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 749 using (var sm2 = new ServerManager())
567 750 {
568   - var pool = sm2.ApplicationPools[poolname];
569 751 string userinfo = "";
  752 + var pool = sm2.ApplicationPools[poolname];
570 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 761 return userinfo;
582 762 }
... ... @@ -824,6 +1004,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
824 1004 public class WebApplication : XmlLinqBase
825 1005 {
826 1006 #region properties from Xml definition
  1007 + public string Xml_Key;
827 1008 public string Xml_AppName;
828 1009 public string Xml_Description;
829 1010 public string Xml_PoolName;
... ... @@ -831,10 +1012,13 @@ namespace Vrh.Log4Pro.MaintenanceConsole
831 1012 public string Xml_AppPhysicalPath;
832 1013 public ManagedPipelineMode Xml_PoolPipeLineMode;
833 1014 public string Xml_SitePhysicalPath;
834   - public string Xml_IdentityConfigFile;
  1015 + public string Xml_ImpersonateIdentityConfigFile;
835 1016 public ProcessModelIdentityType Xml_PoolIdentitytype;
836 1017 public string Xml_PoolUsername;
837 1018 public string Xml_PoolPassword;
  1019 + public string Xml_ImpersonateIdentityUsername;
  1020 + public string Xml_ImpersonateIdentityPassword;
  1021 + public bool Xml_ImpersonateIdentity;
838 1022 public bool Xml_RecreatePool;
839 1023 public bool Xml_RecreateSite;
840 1024 public bool Xml_RecreateApp;
... ... @@ -859,6 +1043,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
859 1043 {
860 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 1047 Xml_AppName = webappXml.Attribute(XName.Get(nameof(XmlStructure.WebApplication.Attributes.Name)))?.Value;
863 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 1061 Xml_PoolPipeLineMode = GetValue(nameof(XmlStructure.WebApplication.Attributes.AppPoolPipeLineMode), webappXml, ManagedPipelineMode.Integrated);
877 1062 }
878 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 1065 Xml_PoolUsername = GetValue(nameof(XmlStructure.WebApplication.Attributes.AppPoolUsername), webappXml, nameof(ProcessModelIdentityType.ApplicationPoolIdentity));
882 1066 Xml_PoolPassword = GetValue(nameof(XmlStructure.WebApplication.Attributes.AppPoolPassword), webappXml, "");
... ... @@ -884,6 +1068,11 @@ namespace Vrh.Log4Pro.MaintenanceConsole
884 1068 catch { Xml_PoolIdentitytype = ProcessModelIdentityType.SpecificUser; }
885 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 1076 Xml_RecreatePool = GetValue(nameof(XmlStructure.WebApplication.Attributes.RecreatePool), webappXml, false);
888 1077 Xml_RecreateSite = GetValue(nameof(XmlStructure.WebApplication.Attributes.RecreateSite), webappXml, false);
889 1078 Xml_RecreateApp = GetValue(nameof(XmlStructure.WebApplication.Attributes.RecreateApp), webappXml, true);
... ... @@ -893,19 +1082,27 @@ namespace Vrh.Log4Pro.MaintenanceConsole
893 1082 }
894 1083 public WebApplication(WebApplication wadef)
895 1084 {
  1085 + Xml_Key = wadef.Xml_Key;
896 1086 Xml_AppName = wadef.Xml_AppName;
897 1087 Xml_Description = wadef.Xml_Description;
898 1088 Xml_PoolName = wadef.Xml_PoolName;
899 1089 Xml_SiteName = wadef.Xml_SiteName;
900 1090 Xml_AppPhysicalPath = wadef.Xml_AppPhysicalPath;
901 1091 Xml_SitePhysicalPath = wadef.Xml_SitePhysicalPath;
902   - Xml_IdentityConfigFile = wadef.Xml_IdentityConfigFile;
  1092 + Xml_PoolPipeLineMode = wadef.Xml_PoolPipeLineMode;
903 1093 Xml_PoolIdentitytype = wadef.Xml_PoolIdentitytype;
  1094 + Xml_PoolUsername = wadef.Xml_PoolUsername;
  1095 + Xml_PoolPassword = wadef.Xml_PoolPassword;
904 1096 Xml_RecreateSite = wadef.Xml_RecreateSite;
905 1097 Xml_RecreatePool = wadef.Xml_RecreatePool;
906 1098 Xml_RecreateApp = wadef.Xml_RecreateApp;
907 1099 Xml_ForceRemovePool = wadef.Xml_ForceRemovePool;
908 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 1107 #region XmlStructure
911 1108 public static class XmlStructure
... ... @@ -914,15 +1111,19 @@ namespace Vrh.Log4Pro.MaintenanceConsole
914 1111 {
915 1112 public static class Attributes
916 1113 {
  1114 + public static class Key { public static class Values { public const string DEFAULT = ""; } }
917 1115 public static class Name { }
918 1116 public static class Description { }
919 1117 public static class AppPool { public static class Values { public const string DEFAULT = "DefaultAppPool"; } }
920 1118 public static class WebSite { public static class Values { public const string DEFAULT = "Default Web Site"; } }
921 1119 public static class InstallDir { }
922 1120 public static class SiteRootDir { }
923   - public static class IdentityConfigFile { }
  1121 + public static class ImpersonateIdentityConfigFile { }
924 1122 public static class AppPoolUsername { }
925 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 1127 public static class AppPoolPipeLineMode { }
927 1128 public static class RecreatePool { }
928 1129 public static class RecreateSite { }
... ...
Vrh.Log4Pro.MaintenanceConsole/Manager - WindowsServiceManager.cs
... ... @@ -12,232 +12,54 @@ using Microsoft.Web.Administration;
12 12 using System.Management;
13 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 20 using Vrh.XmlProcessing;
  21 +using VRH.Common;
16 22 using System.Xml.Linq;
17 23 using System.Text.RegularExpressions;
18 24  
19   -namespace Vrh.Log4Pro.MaintenanceConsole
  25 +namespace Vrh.Log4Pro.MaintenanceConsole.WindowsServiceManagerNS
20 26 {
21 27 #region WindowsServiceManager class
22 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 33 #region Execute
25 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 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 52 return null;
55 53 }
56 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 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 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 63 var mask = ColorConsole.ReadLine($" ---> ", ConsoleColor.Yellow).ToUpper();
242 64 if (mask == "EX") { return o; }
243 65 else if (mask == "") { continue; }
... ... @@ -245,12 +67,11 @@ namespace Vrh.Log4Pro.MaintenanceConsole
245 67 if (sl.Length > 10) { sl = sl.Take(10).ToArray(); }
246 68  
247 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 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 76 menuservices.DisplayItems(1);
256 77 var ms = menuservices.Select();
... ... @@ -259,21 +80,21 @@ namespace Vrh.Log4Pro.MaintenanceConsole
259 80 else if (ms.Result == Menu.SelectionResult.Exit) { break; }
260 81 else
261 82 {
262   - foreach (var p in ms.SelectedParameterList)
  83 + foreach (var p in ms.SelectedParameterList)
263 84 {
264 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 87 ColorConsole.Write($"!", ConsoleColor.Yellow);
267 88 var confirmation = ColorConsole.ReadLine(prefix: " ---> ").ToUpper();
268 89 if (confirmation == "EX") { return o; }
269   - else if (confirmation == "")
  90 + else if (confirmation == "")
270 91 {
271 92 ColorConsole.WriteLine($"Service '{p}' skipped!", ConsoleColor.Green);
272   - continue;
  93 + continue;
273 94 }
274 95 else if (confirmation == "CONFIRM")
275 96 {
276   - WindowsServiceManagerCore.Unregister((string)p);
  97 + WindowsServiceManagerCore.Unregister((string)(p.Parameters));
277 98 ColorConsole.WriteLine($"Service '{p}' deleted!", ConsoleColor.Green);
278 99 }
279 100 }
... ... @@ -281,12 +102,16 @@ namespace Vrh.Log4Pro.MaintenanceConsole
281 102 }
282 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 115 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
291 116 else if (sr.Result == Menu.SelectionResult.None) { return o; }
292 117 else if (sr.Result == Menu.SelectionResult.Error) { return o; }
... ... @@ -294,25 +119,26 @@ namespace Vrh.Log4Pro.MaintenanceConsole
294 119 else { }
295 120 foreach (var p in sr.SelectedParameterList)
296 121 {
297   - WindowsService ws = p as WindowsService;
  122 + WindowsService ws = p.Parameters as WindowsService;
298 123 try
299 124 {
300 125 var success = WindowsServiceManagerCore.Kill(ws.Name);
301 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 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 142 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
317 143 else if (sr.Result == Menu.SelectionResult.None) { return o; }
318 144 else if (sr.Result == Menu.SelectionResult.Error) { return o; }
... ... @@ -320,25 +146,25 @@ namespace Vrh.Log4Pro.MaintenanceConsole
320 146 else { }
321 147 foreach (var p in sr.SelectedParameterList)
322 148 {
323   - WindowsService ws = p as WindowsService;
  149 + WindowsService ws = p.Parameters as WindowsService;
324 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 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 168 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
343 169 else if (sr.Result == Menu.SelectionResult.None) { return o; }
344 170 else if (sr.Result == Menu.SelectionResult.Error) { return o; }
... ... @@ -346,25 +172,25 @@ namespace Vrh.Log4Pro.MaintenanceConsole
346 172 else { }
347 173 foreach (var p in sr.SelectedParameterList)
348 174 {
349   - WindowsService ws = p as WindowsService;
  175 + WindowsService ws = p.Parameters as WindowsService;
350 176 try
351 177 {
352 178 var success = WindowsServiceManagerCore.Unregister(ws);
353 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 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 194 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
369 195 else if (sr.Result == Menu.SelectionResult.None) { return o; }
370 196 else if (sr.Result == Menu.SelectionResult.Error) { return o; }
... ... @@ -372,25 +198,25 @@ namespace Vrh.Log4Pro.MaintenanceConsole
372 198 else { }
373 199 foreach (var p in sr.SelectedParameterList)
374 200 {
375   - WindowsService ws = p as WindowsService;
  201 + WindowsService ws = p.Parameters as WindowsService;
376 202 try
377 203 {
378 204 var success = WindowsServiceManagerCore.Start(ws.Name, ws.Xml_StartTimeout);
379 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 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 220 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
395 221 else if (sr.Result == Menu.SelectionResult.None) { return o; }
396 222 else if (sr.Result == Menu.SelectionResult.Error) { return o; }
... ... @@ -398,25 +224,25 @@ namespace Vrh.Log4Pro.MaintenanceConsole
398 224 else { }
399 225 foreach (var p in sr.SelectedParameterList)
400 226 {
401   - WindowsService ws = p as WindowsService;
  227 + WindowsService ws = p.Parameters as WindowsService;
402 228 try
403 229 {
404 230 var success = WindowsServiceManagerCore.Stop(ws.Name, ws.Xml_StopTimeout);
405 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 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 246 if (sr.Result == Menu.SelectionResult.Exit) { return o; }
421 247 else if (sr.Result == Menu.SelectionResult.None) { return o; }
422 248 else if (sr.Result == Menu.SelectionResult.Error) { return o; }
... ... @@ -426,37 +252,15 @@ namespace Vrh.Log4Pro.MaintenanceConsole
426 252 string username = null, password = null;
427 253 foreach (var p in sr.SelectedParameterList)
428 254 {
429   - WindowsService ws = p as WindowsService;
  255 + WindowsService ws = p.Parameters as WindowsService;
430 256 try
431 257 {
432 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 265 if (WindowsServiceManagerCore.SetUserAccount(wmiService, username, password)) { ColorConsole.WriteLine($"Service user account changed. Name:{ws.Name}", ConsoleColor.Green); }
462 266 else { ColorConsole.WriteLine($"Service user account change FAILED! Name:{ws.Name}", ConsoleColor.Red); }
... ... @@ -467,6 +271,147 @@ namespace Vrh.Log4Pro.MaintenanceConsole
467 271 return o;
468 272 }
469 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 416 #endregion WindowsServiceManager class
472 417  
... ... @@ -533,7 +478,15 @@ namespace Vrh.Log4Pro.MaintenanceConsole
533 478 try { Process proc = Process.GetProcessById(pid); proc.Kill(); }
534 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 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 492 // sc.exe \\myserver create NewService binpath= c:\windows\system32\NewServ.exe
... ... @@ -568,8 +521,15 @@ namespace Vrh.Log4Pro.MaintenanceConsole
568 521 {
569 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 534 var startparameter =
575 535 ws.Xml_StartMode == ServiceStartMode.Automatic ? "auto"
... ... @@ -616,6 +576,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
616 576 }
617 577 return true;
618 578 }
  579 + #endregion Register
619 580  
620 581 public static bool Unregister(WindowsService ws)
621 582 {
... ... @@ -734,6 +695,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
734 695 List<WindowsService> _winservicelist;
735 696 List<WindowsService> _winservicelistinstartorder;
736 697 List<WindowsService> _winservicelistinstoporder;
  698 + List<WindowsServiceGroup> _winservicegrouplist;
737 699 #region constructor
738 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 705 {
744 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 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 731 List<WindowsService> listinstartorder = new List<WindowsService>();
757 732 bool ready = false;//akkor lesz false, ha már minden
... ... @@ -764,7 +739,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
764 739 if (namelistinstartorder.Contains(s.Name)) { continue; }//ez a szerviz már bekerült a startorder listába
765 740 ready = false;
766 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 743 foreach (var dli in dl)
769 744 {
770 745 if (string.IsNullOrWhiteSpace(dli)) { continue; }
... ... @@ -775,7 +750,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
775 750 }
776 751 return listinstartorder;
777 752 }
778   - #endregion GetDefinitionList
  753 + #endregion GetWindowsServiceDefinitionList
779 754 }
780 755 #endregion WindowsServiceManagerXmlProcessor class
781 756 #region WindowsService class
... ... @@ -787,8 +762,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole
787 762 public string DisplayName;
788 763 public string Description;
789 764 public string PathName;
790   - public string[] ThisDependsOn;
791   - public string[] ServicesDependOnThis;
  765 + public List<string> ThisDependsOn;
  766 + public List<string> ServicesDependOnThis;
792 767 public int ProcessId;
793 768 public ServiceStartMode StartMode;
794 769 public string State;
... ... @@ -796,6 +771,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
796 771 public string StartName;
797 772 public string PriorityClass;
798 773  
  774 + public string Xml_Key;
799 775 public string Xml_DisplayName;
800 776 public string Xml_Description;
801 777 public string Xml_Exe;
... ... @@ -803,7 +779,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
803 779 public ServiceStartMode Xml_StartMode;
804 780 public string Xml_Priority;
805 781 public string Xml_Arguments;
806   - public string[] Xml_Dependon;
  782 + public List<string> Xml_Dependon;
807 783 public string Xml_RegistrationMode;
808 784 public ServiceAccount Xml_IdentityType;
809 785 public string Xml_Username;
... ... @@ -819,6 +795,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole
819 795 public WindowsService(XElement winservicexml)
820 796 {
821 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 800 Name = winservicexml.Attribute(XName.Get(nameof(XmlStructure.WindowsService.Attributes.Name)))?.Value;
823 801 if (!ValidServiceName(Name))
824 802 {
... ... @@ -840,13 +818,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole
840 818 Xml_Priority = GetValue(nameof(XmlStructure.WindowsService.Attributes.Priority), winservicexml, XmlStructure.WindowsService.Attributes.Priority.Values.DEFAULT);
841 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 822 string[] dependonarray = GetValue(nameof(XmlStructure.WindowsService.Attributes.DependOn), winservicexml, "").Split(new char[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries);
845 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 828 Xml_RegistrationMode = GetValue(nameof(XmlStructure.WindowsService.Attributes.RegistrationMode), winservicexml, XmlStructure.WindowsService.Attributes.RegistrationMode.Values.DEFAULT);
852 829 Xml_RegistrationMode = Xml_RegistrationMode.Replace('-', '_');
... ... @@ -866,12 +843,71 @@ namespace Vrh.Log4Pro.MaintenanceConsole
866 843 Xml_StopTimeout = GetValue(nameof(XmlStructure.WindowsService.Attributes.StopTimeout), winservicexml, XmlStructure.WindowsService.Attributes.StopTimeout.Values.DEFAULT);
867 844 }
868 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 904 #endregion xml constructor
870 905 #region cloner constructor
871 906 public WindowsService(WindowsService ws)
872 907 {
873 908 Name = ws.Name;
874 909 Valid = ws.Valid;
  910 + Xml_Key= ws.Xml_Key;
875 911 Xml_DisplayName = ws.Xml_DisplayName;
876 912 Xml_Description = ws.Xml_Description;
877 913 Xml_Exe = ws.Xml_Exe;
... ... @@ -891,10 +927,20 @@ namespace Vrh.Log4Pro.MaintenanceConsole
891 927 #region XmlStructure
892 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 939 public static class WindowsService
895 940 {
896 941 public static class Attributes
897 942 {
  943 + public static class Key { public static class Values { public static string DEFAULT = ""; } }
898 944 public static class Name { }
899 945 public static class DisplayName { }
900 946 public static class Description { }
... ... @@ -946,7 +992,65 @@ namespace Vrh.Log4Pro.MaintenanceConsole
946 992 }
947 993 }
948 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 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 3 using System.Linq;
4 4 using System.Text;
5 5 using System.Threading.Tasks;
  6 +using System.Threading;
6 7  
7 8 using Microsoft.Web.Administration;
8 9 using System.Management;
9 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 27 using Vrh.XmlProcessing;
12 28 using VRH.Common;
13 29 using System.Xml.Linq;
... ... @@ -18,12 +34,18 @@ namespace Vrh.Log4Pro.MaintenanceConsole
18 34 {
19 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 45 CommandLine.SetAppConfigFile(appconfigpath);
24 46  
25 47 try { ColorConsole.SetWindowSize(120, 64); }
26   - catch (Exception ex)
  48 + catch
27 49 {
28 50 ColorConsole.WriteLine("Change the size of the console fonts smaller!");
29 51 ColorConsole.ReadKey();
... ... @@ -37,27 +59,98 @@ namespace Vrh.Log4Pro.MaintenanceConsole
37 59 }
38 60  
39 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 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 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 9 <OutputType>Exe</OutputType>
10 10 <RootNamespace>Vrh.Log4Pro.MaintenanceConsole</RootNamespace>
11 11 <AssemblyName>Vrh.Log4Pro.MaintenanceConsole</AssemblyName>
12   - <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
  12 + <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
13 13 <FileAlignment>512</FileAlignment>
14 14 <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
15 15 <Deterministic>true</Deterministic>
16 16 <NuGetPackageImportStamp>
17 17 </NuGetPackageImportStamp>
  18 + <TargetFrameworkProfile />
18 19 </PropertyGroup>
19 20 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
20 21 <PlatformTarget>AnyCPU</PlatformTarget>
... ... @@ -35,6 +36,9 @@
35 36 <ErrorReport>prompt</ErrorReport>
36 37 <WarningLevel>4</WarningLevel>
37 38 </PropertyGroup>
  39 + <PropertyGroup>
  40 + <ApplicationIcon>servicelogo.ico</ApplicationIcon>
  41 + </PropertyGroup>
38 42 <ItemGroup>
39 43 <Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
40 44 <HintPath>..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.dll</HintPath>
... ... @@ -42,6 +46,117 @@
42 46 <Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
43 47 <HintPath>..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.SqlServer.dll</HintPath>
44 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 160 <Reference Include="Microsoft.Web.Administration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
46 161 <HintPath>..\packages\Microsoft.Web.Administration.11.1.0\lib\netstandard1.5\Microsoft.Web.Administration.dll</HintPath>
47 162 </Reference>
... ... @@ -51,17 +166,22 @@
51 166 <Reference Include="Microsoft.Win32.Registry, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
52 167 <HintPath>..\packages\Microsoft.Win32.Registry.4.0.0\lib\net46\Microsoft.Win32.Registry.dll</HintPath>
53 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 172 <Reference Include="System" />
55 173 <Reference Include="System.AppContext, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
56 174 <HintPath>..\packages\System.AppContext.4.1.0\lib\net46\System.AppContext.dll</HintPath>
57 175 </Reference>
58 176 <Reference Include="System.ComponentModel.Composition" />
59 177 <Reference Include="System.ComponentModel.DataAnnotations" />
  178 + <Reference Include="System.Configuration" />
60 179 <Reference Include="System.Configuration.Install" />
61 180 <Reference Include="System.Console, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
62 181 <HintPath>..\packages\System.Console.4.0.0\lib\net46\System.Console.dll</HintPath>
63 182 </Reference>
64 183 <Reference Include="System.Core" />
  184 + <Reference Include="System.Data.Linq" />
65 185 <Reference Include="System.Diagnostics.DiagnosticSource, Version=4.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
66 186 <HintPath>..\packages\System.Diagnostics.DiagnosticSource.4.0.0\lib\net46\System.Diagnostics.DiagnosticSource.dll</HintPath>
67 187 </Reference>
... ... @@ -71,9 +191,14 @@
71 191 <Reference Include="System.Diagnostics.Tracing, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
72 192 <HintPath>..\packages\System.Diagnostics.Tracing.4.1.0\lib\net462\System.Diagnostics.Tracing.dll</HintPath>
73 193 </Reference>
  194 + <Reference Include="System.Drawing" />
74 195 <Reference Include="System.Globalization.Calendars, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
75 196 <HintPath>..\packages\System.Globalization.Calendars.4.0.1\lib\net46\System.Globalization.Calendars.dll</HintPath>
76 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 202 <Reference Include="System.IO, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
78 203 <HintPath>..\packages\System.IO.4.1.0\lib\net462\System.IO.dll</HintPath>
79 204 </Reference>
... ... @@ -140,23 +265,34 @@
140 265 </Reference>
141 266 <Reference Include="System.Web" />
142 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 272 <Reference Include="System.Xml.Linq" />
144 273 <Reference Include="System.Data.DataSetExtensions" />
145 274 <Reference Include="Microsoft.CSharp" />
146 275 <Reference Include="System.Data" />
147 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 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 285 </Reference>
154 286 </ItemGroup>
155 287 <ItemGroup>
156 288 <Compile Include="ConsoleFunction - CommandLineParser.cs" />
157 289 <Compile Include="ConsoleFunction - ColorConsole.cs" />
158 290 <Compile Include="ConsoleFunction - Menu.cs" />
  291 + <Compile Include="ConsoleFunction - Tools - Membership.cs" />
159 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 296 <Compile Include="Manager - ScheduledTaskManager.cs" />
161 297 <Compile Include="Manager - WindowsServiceManager.cs" />
162 298 <Compile Include="Manager - FileCleanerManager.cs" />
... ... @@ -170,6 +306,8 @@
170 306 <CopyToOutputDirectory>Always</CopyToOutputDirectory>
171 307 </None>
172 308 <None Include="packages.config" />
  309 + <None Include="system.web.membership.config" />
  310 + <None Include="system.web.rolemanager.config" />
173 311 <None Include="Vrh.NugetModuls.Documentations\VRH.Common\ReadMe.md" />
174 312 <None Include="Vrh.NugetModuls.Documentations\Vrh.XmlProcessing\ReadMe.md" />
175 313 </ItemGroup>
... ... @@ -177,11 +315,14 @@
177 315 <Content Include="Config.xml">
178 316 <CopyToOutputDirectory>Always</CopyToOutputDirectory>
179 317 </Content>
  318 + <Content Include="servicelogo.ico" />
180 319 <Content Include="XmlParser.xml">
181 320 <CopyToOutputDirectory>Always</CopyToOutputDirectory>
182 321 </Content>
183 322 </ItemGroup>
184   - <ItemGroup />
  323 + <ItemGroup>
  324 + <WCFMetadata Include="Connected Services\" />
  325 + </ItemGroup>
185 326 <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
186 327 <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
187 328 <PropertyGroup>
... ... @@ -189,6 +330,8 @@
189 330 </PropertyGroup>
190 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 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 334 </Target>
193 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 337 </Project>
195 338 \ No newline at end of file
... ...
Vrh.Log4Pro.MaintenanceConsole/XmlParser.xml
1 1 <?xml version="1.0" encoding="utf-8" ?>
2   -<XmlParserConfiguration LCID="en-US" NameSeparator="{}@@##||">
  2 +<XmlParserConfiguration LCID="en-US" NameSeparator="@@||">
3 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 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 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 19 </Configurations>
140   -</XmlParserConfiguration>
141 20 \ No newline at end of file
  21 +</XmlParserConfiguration>
... ...
Vrh.Log4Pro.MaintenanceConsole/packages.config
1 1 <?xml version="1.0" encoding="utf-8"?>
2 2 <packages>
3 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 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 19 <package id="Microsoft.Web.Administration" version="11.1.0" targetFramework="net462" />
6 20 <package id="Microsoft.Win32.Primitives" version="4.0.1" targetFramework="net462" />
7 21 <package id="Microsoft.Win32.Registry" version="4.0.0" targetFramework="net462" />
8 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 25 <package id="System.Collections" version="4.0.11" targetFramework="net462" />
11 26 <package id="System.Collections.Concurrent" version="4.0.12" targetFramework="net462" />
12 27 <package id="System.Console" version="4.0.0" targetFramework="net462" />
... ... @@ -17,13 +32,14 @@
17 32 <package id="System.Diagnostics.Tracing" version="4.1.0" targetFramework="net462" />
18 33 <package id="System.Globalization" version="4.0.11" targetFramework="net462" />
19 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 36 <package id="System.IO" version="4.1.0" targetFramework="net462" />
21 37 <package id="System.IO.Compression" version="4.1.0" targetFramework="net462" />
22 38 <package id="System.IO.Compression.ZipFile" version="4.0.1" targetFramework="net462" />
23 39 <package id="System.IO.FileSystem" version="4.0.1" targetFramework="net462" />
24 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 43 <package id="System.Management" version="5.0.0" targetFramework="net462" />
28 44 <package id="System.Net.Http" version="4.1.0" targetFramework="net462" />
29 45 <package id="System.Net.Primitives" version="4.0.11" targetFramework="net462" />
... ... @@ -41,7 +57,7 @@
41 57 <package id="System.Runtime.InteropServices.RuntimeInformation" version="4.0.0" targetFramework="net462" />
42 58 <package id="System.Runtime.Numerics" version="4.0.1" targetFramework="net462" />
43 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 61 <package id="System.Security.Cryptography.Encoding" version="4.0.0" targetFramework="net462" />
46 62 <package id="System.Security.Cryptography.Primitives" version="4.0.0" targetFramework="net462" />
47 63 <package id="System.Security.Cryptography.X509Certificates" version="4.1.0" targetFramework="net462" />
... ... @@ -49,12 +65,13 @@
49 65 <package id="System.ServiceProcess.ServiceController" version="4.1.0" targetFramework="net462" />
50 66 <package id="System.Text.Encoding" version="4.0.11" targetFramework="net462" />
51 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 69 <package id="System.Threading" version="4.0.11" targetFramework="net462" />
54 70 <package id="System.Threading.Tasks" version="4.0.11" targetFramework="net462" />
55 71 <package id="System.Threading.Timer" version="4.0.1" targetFramework="net462" />
56 72 <package id="System.Xml.ReaderWriter" version="4.0.11" targetFramework="net462" />
57 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 77 </packages>
61 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 @@
  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 13 \ No newline at end of file
... ...
Vrh.Log4Pro.MaintenanceConsole/system.web.rolemanager.config 0 → 100644
... ... @@ -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 13 \ No newline at end of file
... ...