Commit 37bf94ab2d820576a60b67904ab112779a12a4ec

Authored by Schwirg László
1 parent e76b5118

command mode kialakítása és beillesztése - egyenlőre csak - a ScheduledTaskManager modulba

Vrh.Log4Pro.MaintenanceConsole/App.config
1 <?xml version="1.0" encoding="utf-8"?> 1 <?xml version="1.0" encoding="utf-8"?>
2 <configuration> 2 <configuration>
3 <configSections> 3 <configSections>
4 - <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->  
5 - <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />  
6 - </configSections> 4 + <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  5 + <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  6 + </configSections>
7 <startup> 7 <startup>
8 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" /> 8 <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
9 </startup> 9 </startup>
Vrh.Log4Pro.MaintenanceConsole/Config.xml
@@ -187,4 +187,14 @@ @@ -187,4 +187,14 @@
187 <FolderToClean Directory="@DIR_BAKTMP@" Recurse="True" RemoveEmptyFolder="False" IncludeMask="*.*" /> 187 <FolderToClean Directory="@DIR_BAKTMP@" Recurse="True" RemoveEmptyFolder="False" IncludeMask="*.*" />
188 </FileCleaner> 188 </FileCleaner>
189 189
  190 + <ScheduledTasks>
  191 + <ScheduledTask Name="CP_Archive_WEEKLY" Priority="7" Schedule="WEEKLY" StartTime="04:00" Enable="true" Run="false" Commandname="sc.exe" />
  192 + <ScheduledTask Name="CP_Archive_MONTHLY" Priority="7" Schedule="MONTHLY" StartTime="04:00" Enable="true" Run="false" Commandname="sc.exe" />
  193 + <ScheduledTask Name="CP_Archive_DAILY" Priority="7" Schedule="DAILY" StartTime="04:00" Enable="true" Run="false" Commandname="sc.exe" />
  194 + <ScheduledTask Name="CP_Backup_DAILY" Priority="7" Schedule="DAILY" StartTime="04:20" Enable="true" Run="false" Commandname="sc.exe" />
  195 + <ScheduledTask Name="CP_Backup_HOURLY" Priority="7" Schedule="HOURLY" StartTime="04:00" Enable="false" Run="false" Commandname="sc.exe" />
  196 + <ScheduledTask Name="CP_BackupDBOnly_DAILY" Priority="7" Schedule="DAILY" StartTime="04:40" Enable="true" Run="false" Commandname="sc.exe" />
  197 + <ScheduledTask Name="CP_PurgeFiles_DAILY" Priority="7" Schedule="DAILY" StartTime="05:00" Enable="true" Run="false" Commandname="sc.exe" />
  198 + </ScheduledTasks>
  199 +
190 </Configuration> 200 </Configuration>
191 \ No newline at end of file 201 \ No newline at end of file
Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - ColorConsole.cs
@@ -16,6 +16,36 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -16,6 +16,36 @@ namespace Vrh.Log4Pro.MaintenanceConsole
16 #region ColorConsole 16 #region ColorConsole
17 public static class ColorConsole 17 public static class ColorConsole
18 { 18 {
  19 + private static bool silentMode = false;
  20 + private static string[] readlineList = null;
  21 +
  22 + /// Üzenet és utána Billentyűzet lenyomásra vár
  23 + /// </summary>
  24 + /// <param name="text"></param>
  25 + /// <returns></returns>
  26 + public static ConsoleKeyInfo PressAnykeyToContinue(string text = null)
  27 + {
  28 + ColorConsole.WriteLine(text ?? "Press any key to continue...", ConsoleColor.Yellow); return ColorConsole.ReadKey();
  29 + }
  30 +
  31 +
  32 + /// <summary>
  33 + /// Beállítja a command mode-ot, ami azt jelenti, hogy nem ír semmit a konzolra,
  34 + /// és a readline egy előre feltöltött bufferból olvassa az inputokat
  35 + /// </summary>
  36 + /// <param name="silentmode"></param>
  37 + public static void SetSilentMode(bool silentmode=true) { silentMode = silentmode; }
  38 + /// <summary>
  39 + /// Feltölti a command mode readline bufferét egy string tömbbel;
  40 + /// minden ColorConsole.ReadLine a tömb pillanatnyi első elemét adja vissza, amjd törli azt a tömbből
  41 + /// </summary>
  42 + /// <param name="readlinelist"></param>
  43 + public static void SetReadLineList(string[] readlinelist) { readlineList = readlinelist; }
  44 + /// <summary>
  45 + /// A megadott stringet szóközökkel ritkított formában adja vissza
  46 + /// </summary>
  47 + /// <param name="txt"></param>
  48 + /// <returns></returns>
19 public static string WideString(string txt) 49 public static string WideString(string txt)
20 { 50 {
21 if (txt == null) { return null; }; 51 if (txt == null) { return null; };
@@ -25,18 +55,116 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -25,18 +55,116 @@ namespace Vrh.Log4Pro.MaintenanceConsole
25 return widetxt.Substring(0, widetxt.Length - 1); 55 return widetxt.Substring(0, widetxt.Length - 1);
26 } 56 }
27 57
  58 + /// <summary>
  59 + /// true, ha van lenyomott billentyű, illetve command mode-ban mindig false
  60 + /// </summary>
  61 + public static bool KeyAvailable { get { if (silentMode) { return false; } else { return Console.KeyAvailable; } } }
  62 +
  63 +
  64 + /// <summary>
  65 + /// Beállítja a console ablak méretét
  66 + /// </summary>
  67 + /// <param name="w"></param>
  68 + /// <param name="h"></param>
  69 + public static void SetWindowSize(int w, int h) { if (!silentMode) { Console.SetWindowSize(w, h); } }
  70 +
  71 + /// <summary>
  72 + /// Visszaadja a lenyomott billentyűt, ha van, commandmode-ban pedig az enter-t
  73 + /// </summary>
  74 + /// <returns></returns>
  75 + public static ConsoleKeyInfo ReadKey()
  76 + {
  77 + if (silentMode) { return GetConsoleKey(ConsoleKey.Enter); }
  78 + else { return Console.ReadKey(); }
  79 + }
  80 +
  81 + /// <summary>
  82 + /// Visszaadja a lenyomott billentyűt, ha van, commandmode-ban pedig az enter-t
  83 + /// </summary>
  84 + /// <returns></returns>
  85 + public static ConsoleKeyInfo GetConsoleKey(ConsoleKey ck, bool shift = false, bool alt=false,bool control=false)
  86 + {
  87 + switch (ck)
  88 + {
  89 + case ConsoleKey.Enter:
  90 + default:
  91 + return new ConsoleKeyInfo(keyChar: '\r', key: ConsoleKey.Enter, shift: shift, alt: alt, control: control);
  92 + }
  93 + }
  94 +
  95 + /// <summary>
  96 + /// Beolvas egy sort a consolról, vagy commandmode-ban a bufferból
  97 + /// </summary>
  98 + /// <param name="text"></param>
  99 + /// <param name="f"></param>
  100 + /// <param name="b"></param>
  101 + /// <param name="bracket"></param>
  102 + /// <param name="prefix"></param>
  103 + /// <returns></returns>
28 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 = "")
29 { 105 {
30 - Write(text, f, b,bracket,prefix);  
31 - return Console.ReadLine(); 106 + if (silentMode)
  107 + {
  108 + if (readlineList == null || readlineList.Length == 0) { return null; }
  109 + else
  110 + {
  111 + var nextreadline = readlineList[0];
  112 + readlineList = readlineList.Skip(1).ToArray();
  113 + return nextreadline;
  114 + }
  115 + }
  116 + else
  117 + {
  118 + Write(text, f, b, bracket, prefix);
  119 + return Console.ReadLine();
  120 + }
  121 + }
  122 +
  123 + /// <summary>
  124 + /// beállítja a cursor pozíciót
  125 + /// </summary>
  126 + /// <param name="remembercursorleft"></param>
  127 + /// <param name="remembercursortop"></param>
  128 + public static void SetCursorPosition(int remembercursorleft, int remembercursortop)
  129 + {
  130 + if (silentMode) { return; }
  131 + Console.SetCursorPosition(remembercursorleft, remembercursortop);
32 } 132 }
  133 +
  134 + public static int CursorLeft { get { return Console.CursorLeft; } }
  135 + public static int CursorTop { get { return Console.CursorTop; } }
  136 +
  137 + public static void Clear() { Console.Clear(); }
  138 +
  139 + /// <summary>
  140 + /// Kiír egy karaktersorozatot színesben a konzolra soremeléssel;
  141 + /// command mode-ban nem csinál semmit
  142 + /// </summary>
  143 + /// <param name="text"></param>
  144 + /// <param name="f"></param>
  145 + /// <param name="b"></param>
  146 + /// <param name="bracket"></param>
  147 + /// <param name="prefix"></param>
  148 + /// <param name="suffix"></param>
33 public static void WriteLine(string text = null, ConsoleColor? f = null, ConsoleColor? b = null, string bracket = null,string prefix="", string suffix = "") 149 public static void WriteLine(string text = null, ConsoleColor? f = null, ConsoleColor? b = null, string bracket = null,string prefix="", string suffix = "")
34 { 150 {
  151 + if (silentMode) { return; }
35 Write(text, f, b, bracket,prefix,suffix); 152 Write(text, f, b, bracket,prefix,suffix);
36 Console.WriteLine(); 153 Console.WriteLine();
37 } 154 }
  155 + /// <summary>
  156 + /// Kiír egy karaktersorozatot színesben a konzolra soremelés nélkül;
  157 + /// command mode-ban nem csinál semmit
  158 + /// </summary>
  159 + /// <param name="text"></param>
  160 + /// <param name="f"></param>
  161 + /// <param name="b"></param>
  162 + /// <param name="bracket"></param>
  163 + /// <param name="prefix"></param>
  164 + /// <param name="suffix"></param>
38 public static void Write(string text = null, ConsoleColor? f = null, ConsoleColor? b = null, string bracket = null, string prefix = "",string suffix="") 165 public static void Write(string text = null, ConsoleColor? f = null, ConsoleColor? b = null, string bracket = null, string prefix = "",string suffix="")
39 { 166 {
  167 + if (silentMode) { return; }
40 if (!string.IsNullOrEmpty(prefix)) { Write(prefix); } 168 if (!string.IsNullOrEmpty(prefix)) { Write(prefix); }
41 if (!string.IsNullOrEmpty(bracket) && bracket.Length==1) { bracket = bracket + bracket; } 169 if (!string.IsNullOrEmpty(bracket) && bracket.Length==1) { bracket = bracket + bracket; }
42 if (!string.IsNullOrEmpty(bracket)) { Console.Write($"{bracket[0]}"); } 170 if (!string.IsNullOrEmpty(bracket)) { Console.Write($"{bracket[0]}"); }
Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - CommandLineParser.cs
@@ -135,8 +135,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -135,8 +135,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole
135 Test(44,"this \"is a\" test", new[] { "this", "is a", "test" }); 135 Test(44,"this \"is a\" test", new[] { "this", "is a", "test" });
136 Test(45,"\"C:\\Program Files\"", new[] { "C:\\Program Files" }); 136 Test(45,"\"C:\\Program Files\"", new[] { "C:\\Program Files" });
137 Test(46,"\"He whispered to her \\\"I love you\\\".\"", new[] { "He whispered to her \"I love you\"." }); 137 Test(46,"\"He whispered to her \\\"I love you\\\".\"", new[] { "He whispered to her \"I love you\"." });
138 - Console.WriteLine("Press a key to continue....");  
139 - Console.ReadKey(); 138 + ColorConsole.WriteLine("Press a key to continue....");
  139 + ColorConsole.ReadKey();
140 } 140 }
141 static void Test(int id,string cmd, string[] r) 141 static void Test(int id,string cmd, string[] r)
142 { 142 {
@@ -149,28 +149,28 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -149,28 +149,28 @@ namespace Vrh.Log4Pro.MaintenanceConsole
149 if (r.Length != sr.Length) 149 if (r.Length != sr.Length)
150 { 150 {
151 151
152 - Console.WriteLine($"ERROR:{id}");  
153 - Console.WriteLine($" cmdline : {cmd}");  
154 - Console.WriteLine($" splitted: {scmd}");  
155 - Console.WriteLine($" expected: {sexp}"); 152 + ColorConsole.WriteLine($"ERROR:{id}");
  153 + ColorConsole.WriteLine($" cmdline : {cmd}");
  154 + ColorConsole.WriteLine($" splitted: {scmd}");
  155 + ColorConsole.WriteLine($" expected: {sexp}");
156 return; 156 return;
157 } 157 }
158 for (int i = 0; i < r.Length; i++) 158 for (int i = 0; i < r.Length; i++)
159 if (r[i] != sr[i]) 159 if (r[i] != sr[i])
160 { 160 {
161 - Console.WriteLine($"ERROR:{id}");  
162 - Console.WriteLine($" cmdline : {cmd}");  
163 - Console.WriteLine($" splitted: {scmd}");  
164 - Console.WriteLine($" expected: {sexp}"); 161 + ColorConsole.WriteLine($"ERROR:{id}");
  162 + ColorConsole.WriteLine($" cmdline : {cmd}");
  163 + ColorConsole.WriteLine($" splitted: {scmd}");
  164 + ColorConsole.WriteLine($" expected: {sexp}");
165 return; 165 return;
166 } 166 }
167 } 167 }
168 catch (Exception ex) 168 catch (Exception ex)
169 { 169 {
170 - Console.WriteLine($"EXCEP:{id}");  
171 - Console.WriteLine($" cmdline : {cmd}");  
172 - Console.WriteLine($" splitted: {scmd}");  
173 - Console.WriteLine($" expected: {sexp}"); 170 + ColorConsole.WriteLine($"EXCEP:{id}");
  171 + ColorConsole.WriteLine($" cmdline : {cmd}");
  172 + ColorConsole.WriteLine($" splitted: {scmd}");
  173 + ColorConsole.WriteLine($" expected: {sexp}");
174 return; 174 return;
175 } 175 }
176 } 176 }
Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - Menu.cs
@@ -11,11 +11,12 @@ using System.Management; @@ -11,11 +11,12 @@ using System.Management;
11 using System.Diagnostics; 11 using System.Diagnostics;
12 12
13 using Vrh.XmlProcessing; 13 using Vrh.XmlProcessing;
  14 +using VRH.Common;
14 using System.Xml.Linq; 15 using System.Xml.Linq;
15 16
16 namespace Vrh.Log4Pro.MaintenanceConsole 17 namespace Vrh.Log4Pro.MaintenanceConsole
17 { 18 {
18 - public class Menu 19 + public class Menu
19 { 20 {
20 public delegate Object MenuItemExecutorFunc(Object p, Object o); 21 public delegate Object MenuItemExecutorFunc(Object p, Object o);
21 public delegate Object MenuItemDisplayerFunc(Object p, int i); 22 public delegate Object MenuItemDisplayerFunc(Object p, int i);
@@ -25,30 +26,71 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -25,30 +26,71 @@ namespace Vrh.Log4Pro.MaintenanceConsole
25 private string Title { get { return ColorConsole.WideString(title); } set { title = value; } } 26 private string Title { get { return ColorConsole.WideString(title); } set { title = value; } }
26 private MenuItemDisplayerFunc MenuItemDisplayer; 27 private MenuItemDisplayerFunc MenuItemDisplayer;
27 private SelectionMode selectionMode = Menu.SelectionMode.Multi; 28 private SelectionMode selectionMode = Menu.SelectionMode.Multi;
  29 + private static bool commandModeAllMenus = false;
  30 + private bool commandMode = false;
28 private int HeaderWidth = 9; 31 private int HeaderWidth = 9;
29 private string SelectionPrompt = "Make Your selection!"; 32 private string SelectionPrompt = "Make Your selection!";
30 #endregion private fields 33 #endregion private fields
31 34
32 #region public properties 35 #region public properties
33 public List<Item> MenuItemList { get; private set; } = new List<Item>(); 36 public List<Item> MenuItemList { get; private set; } = new List<Item>();
34 - List<string> MenuKeyList { get { return MenuItemList.Where(x=> !x.Separator).Select(x => x.Key).ToList(); } } 37 + List<string> MenuKeyList { get { return MenuItemList.Where(x => !x.Separator).Select(x => x.Key).ToList(); } }
35 #endregion public properties 38 #endregion public properties
36 39
37 #region public tools 40 #region public tools
  41 +
  42 + /// <summary>
  43 + /// Incorrect selection console üzenet megjelenítése
  44 + /// </summary>
  45 + /// <param name="partxt"></param>
  46 + public static void IncorrectSelection(string partxt = "")
  47 + {
  48 + if (GetCommandModeAllMenus()) { return; }
  49 +
  50 + ColorConsole.WriteLine();
  51 + ColorConsole.WriteLine($"Incorrect selection! {partxt} Make a new selection!", ConsoleColor.Red);
  52 + Menu.PressAnykeyToContinue();
  53 + }
  54 +
  55 + /// <summary>
  56 + /// Üzenet és utána Billentyűzet lenyomásra vár
  57 + /// </summary>
  58 + /// <param name="text"></param>
  59 + /// <returns></returns>
  60 + public static ConsoleKeyInfo PressAnykeyToContinue(string text = null)
  61 + {
  62 + if (GetCommandModeAllMenus()) { return ColorConsole.GetConsoleKey(ConsoleKey.Enter); }
  63 +
  64 + ColorConsole.WriteLine(text ?? "Press any key to continue...", ConsoleColor.Yellow); return ColorConsole.ReadKey();
  65 + }
  66 +
  67 +
  68 + public static void SetCommandModeAllMenus() { commandModeAllMenus = true; }
  69 +
38 public Menu SetMenuItemDisplayer(MenuItemDisplayerFunc displayer) 70 public Menu SetMenuItemDisplayer(MenuItemDisplayerFunc displayer)
39 { 71 {
40 MenuItemDisplayer = displayer; 72 MenuItemDisplayer = displayer;
41 return this; 73 return this;
42 } 74 }
43 public Menu SetSelectionMode(SelectionMode sm) { selectionMode = sm; return this; } 75 public Menu SetSelectionMode(SelectionMode sm) { selectionMode = sm; return this; }
44 - public Menu SetHeaderWidth(int hw) { HeaderWidth= hw; return this; }  
45 - public Menu AddMenuItem(Item mi)  
46 - { 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; }
  80 + public Menu AddMenuItem(Item mi)
  81 + {
47 MenuItemList.Add(mi); 82 MenuItemList.Add(mi);
48 if (string.IsNullOrWhiteSpace(mi.Key)) { mi.Key = $"#$KEY{MenuItemList.IndexOf(mi)}"; } 83 if (string.IsNullOrWhiteSpace(mi.Key)) { mi.Key = $"#$KEY{MenuItemList.IndexOf(mi)}"; }
49 return this; 84 return this;
50 } 85 }
51 public void ClearMenuItemList() { MenuItemList.Clear(); } 86 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 +
52 public void ExecuteMenu() 94 public void ExecuteMenu()
53 { 95 {
54 try 96 try
@@ -61,65 +103,69 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -61,65 +103,69 @@ namespace Vrh.Log4Pro.MaintenanceConsole
61 if (sr.Result == Menu.SelectionResult.Exit) { return; } 103 if (sr.Result == Menu.SelectionResult.Exit) { return; }
62 else if (sr.Result == Menu.SelectionResult.None) { continue; } 104 else if (sr.Result == Menu.SelectionResult.None) { continue; }
63 else if (sr.Result == Menu.SelectionResult.Error) { continue; } 105 else if (sr.Result == Menu.SelectionResult.Error) { continue; }
64 - Execute(sr.SelectedKeyList); 106 + ExecuteSelection(sr.SelectedKeyList);
65 } 107 }
66 } 108 }
67 - catch (Exception ex)  
68 - {  
69 - ColorConsole.WriteLine(ex.Message,ConsoleColor.Red); 109 + catch (Exception ex)
  110 + {
  111 + ColorConsole.WriteLine(ex.Message, ConsoleColor.Red);
70 if (ex.InnerException != null) { ColorConsole.WriteLine(ex.InnerException.Message, ConsoleColor.Red); } 112 if (ex.InnerException != null) { ColorConsole.WriteLine(ex.InnerException.Message, ConsoleColor.Red); }
71 - ColorConsole.WriteLine("Press any key to continue..."); 113 + Menu.PressAnykeyToContinue();
72 } 114 }
73 } 115 }
74 public void DisplayTitle() 116 public void DisplayTitle()
75 { 117 {
76 - Console.Clear(); 118 + if (GetCommandMode()) { return; }
  119 +
  120 + ColorConsole.Clear();
77 ColorConsole.WriteLine(Title, ConsoleColor.White); 121 ColorConsole.WriteLine(Title, ConsoleColor.White);
78 ColorConsole.WriteLine(new string('-', Title.Length)); 122 ColorConsole.WriteLine(new string('-', Title.Length));
79 } 123 }
80 public void DisplayItems(int columns = 1, int columnlength = 0) 124 public void DisplayItems(int columns = 1, int columnlength = 0)
81 { 125 {
  126 + if (GetCommandMode()) { return; }
  127 +
82 int columncounter = 0; 128 int columncounter = 0;
83 ColorConsole.WriteLine(); 129 ColorConsole.WriteLine();
84 var i = 1; 130 var i = 1;
85 - Console.SetCursorPosition(0, Console.CursorTop);  
86 - foreach (var menuitem in MenuItemList) 131 + ColorConsole.SetCursorPosition(0, ColorConsole.CursorTop);
  132 + foreach (var menuitem in MenuItemList)
87 { 133 {
88 if (menuitem.Separator && columns == 1) 134 if (menuitem.Separator && columns == 1)
89 { 135 {
90 - Console.SetCursorPosition(columnlength * columncounter + HeaderWidth, Console.CursorTop); 136 + ColorConsole.SetCursorPosition(columnlength * columncounter + HeaderWidth, ColorConsole.CursorTop);
91 var seplen = menuitem.SeparatorLength; 137 var seplen = menuitem.SeparatorLength;
92 - if (menuitem.SeparatorLength==0) 138 + if (menuitem.SeparatorLength == 0)
93 { 139 {
94 - foreach (var mi in MenuItemList.Where(x=>!x.Separator)) { if (mi.Text.Length > seplen) { seplen = mi.Text.Length; } } 140 + foreach (var mi in MenuItemList.Where(x => !x.Separator)) { if (mi.Text.Length > seplen) { seplen = mi.Text.Length; } }
95 } 141 }
96 ColorConsole.WriteLine(new string(menuitem.SeparatorChar, seplen)); 142 ColorConsole.WriteLine(new string(menuitem.SeparatorChar, seplen));
97 continue; 143 continue;
98 } 144 }
99 ColorConsole.Write($"["); 145 ColorConsole.Write($"[");
100 ColorConsole.Write($"{i}"); 146 ColorConsole.Write($"{i}");
101 - if (!string.IsNullOrEmpty(menuitem.Key) && !menuitem.Key.StartsWith("#$KEY")) 147 + if (!string.IsNullOrEmpty(menuitem.Key) && !menuitem.Key.StartsWith("#$KEY"))
102 { 148 {
103 ColorConsole.Write($":"); 149 ColorConsole.Write($":");
104 ColorConsole.Write(menuitem.Key, ConsoleColor.Yellow); 150 ColorConsole.Write(menuitem.Key, ConsoleColor.Yellow);
105 } 151 }
106 ColorConsole.Write($"]"); 152 ColorConsole.Write($"]");
107 - Console.SetCursorPosition(columnlength * columncounter+HeaderWidth, Console.CursorTop); 153 + ColorConsole.SetCursorPosition(columnlength * columncounter + HeaderWidth, ColorConsole.CursorTop);
108 154
109 if (!string.IsNullOrEmpty(menuitem.Text)) 155 if (!string.IsNullOrEmpty(menuitem.Text))
110 { 156 {
111 - ColorConsole.Write(menuitem.Text); 157 + ColorConsole.Write(menuitem.Text);
112 } 158 }
113 if (columns == 1) 159 if (columns == 1)
114 { 160 {
115 if (!string.IsNullOrEmpty(menuitem.Text)) { ColorConsole.WriteLine(); } 161 if (!string.IsNullOrEmpty(menuitem.Text)) { ColorConsole.WriteLine(); }
116 - if (MenuItemDisplayer != null) 162 + if (MenuItemDisplayer != null)
117 { 163 {
118 - for (var li = 0; li < 100; li++)  
119 - {  
120 - if (li>0) { ColorConsole.Write(new string(' ',HeaderWidth)); } 164 + for (var li = 0; li < 100; li++)
  165 + {
  166 + if (li > 0) { ColorConsole.Write(new string(' ', HeaderWidth)); }
121 var str = (string)MenuItemDisplayer(menuitem.Parameters, li); 167 var str = (string)MenuItemDisplayer(menuitem.Parameters, li);
122 - if (string.IsNullOrEmpty(str)) { Console.SetCursorPosition(0, Console.CursorTop); } 168 + if (string.IsNullOrEmpty(str)) { ColorConsole.SetCursorPosition(0, ColorConsole.CursorTop); }
123 if (str == null) { break; } 169 if (str == null) { break; }
124 } 170 }
125 } 171 }
@@ -130,49 +176,63 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -130,49 +176,63 @@ namespace Vrh.Log4Pro.MaintenanceConsole
130 if (columncounter == columns) { ColorConsole.WriteLine(); columncounter = 0; } 176 if (columncounter == columns) { ColorConsole.WriteLine(); columncounter = 0; }
131 else 177 else
132 { 178 {
133 - Console.SetCursorPosition(columnlength * columncounter - 2, Console.CursorTop); 179 + ColorConsole.SetCursorPosition(columnlength * columncounter - 2, ColorConsole.CursorTop);
134 ColorConsole.Write(" "); 180 ColorConsole.Write(" ");
135 } 181 }
136 } 182 }
137 i++; 183 i++;
138 } 184 }
139 if (columns != 1) { ColorConsole.WriteLine(); } 185 if (columns != 1) { ColorConsole.WriteLine(); }
140 - if (selectionMode==SelectionMode.Multi) 186 + if (selectionMode == SelectionMode.Multi)
141 { 187 {
142 - ColorConsole.Write("*", ConsoleColor.Red,bracket:"()");ColorConsole.WriteLine(" All"); 188 + ColorConsole.Write("*", ConsoleColor.Red, bracket: "()"); ColorConsole.WriteLine(" All");
143 } 189 }
144 - ColorConsole.Write("EX", ConsoleColor.Red,bracket:"()");ColorConsole.WriteLine(" Exit"); 190 + ColorConsole.Write("EX", ConsoleColor.Red, bracket: "()"); ColorConsole.WriteLine(" Exit");
145 } 191 }
146 public class Selection 192 public class Selection
147 { 193 {
  194 + public Selection() { }
  195 + public Selection(string selectedkey,object parameter)
  196 + {
  197 + Result = SelectionResult.Ok;
  198 + SelectedKeyList = new List<string>() { { selectedkey } };
  199 + SelectedParameterList = new List<object>() { { parameter } };
  200 + }
148 public List<string> SelectedKeyList = null; 201 public List<string> SelectedKeyList = null;
149 public SelectionResult Result; 202 public SelectionResult Result;
150 public List<object> SelectedParameterList; 203 public List<object> SelectedParameterList;
151 } 204 }
152 public enum SelectionResult { Exit, None, Error, Ok, } 205 public enum SelectionResult { Exit, None, Error, Ok, }
153 public enum SelectionMode { Single, Multi, } 206 public enum SelectionMode { Single, Multi, }
154 - public Selection Select() 207 + public Selection Select(string forcedselectionkeylist=null)
155 { 208 {
156 - List<string> selectionKeyList=null;  
157 - List<object> selectionParList = null;  
158 - var result = new Selection(); 209 + List<string> selectionKeyList;
  210 + List<object> selectionParList;
159 string selectionliststr; 211 string selectionliststr;
160 - ColorConsole.Write(SelectionPrompt,ConsoleColor.Yellow);  
161 - ColorConsole.Write(" --> ", ConsoleColor.White);  
162 - var remembercursorleft = Console.CursorLeft;  
163 - var remembercursortop = Console.CursorTop;  
164 - if (selectionMode == SelectionMode.Multi) 212 + var result = new Selection();
  213 + if (GetCommandMode())
165 { 214 {
166 - ColorConsole.WriteLine();  
167 - ColorConsole.WriteLine("Multiple selections are separated with comma(,), enter asterisk(*) to select all)!"); 215 + selectionliststr = forcedselectionkeylist??"EX";
168 } 216 }
169 - var remembercursorleft2 = Console.CursorLeft;  
170 - var remembercursortop2 = Console.CursorTop;  
171 - Console.SetCursorPosition(remembercursorleft, remembercursortop);  
172 - selectionliststr = Console.ReadLine().ToUpper();  
173 - if (selectionMode == SelectionMode.Multi) 217 + else
174 { 218 {
175 - Console.SetCursorPosition(remembercursorleft2, remembercursortop2); 219 + ColorConsole.Write(SelectionPrompt, ConsoleColor.Yellow);
  220 + ColorConsole.Write(" --> ", ConsoleColor.White);
  221 + var remembercursorleft = ColorConsole.CursorLeft;
  222 + var remembercursortop = ColorConsole.CursorTop;
  223 + if (selectionMode == SelectionMode.Multi)
  224 + {
  225 + ColorConsole.WriteLine();
  226 + ColorConsole.WriteLine("Multiple selections are separated with comma(,), enter asterisk(*) to select all!");
  227 + }
  228 + var remembercursorleft2 = ColorConsole.CursorLeft;
  229 + var remembercursortop2 = ColorConsole.CursorTop;
  230 + ColorConsole.SetCursorPosition(remembercursorleft, remembercursortop);
  231 + selectionliststr = ColorConsole.ReadLine().ToUpper();
  232 + if (selectionMode == SelectionMode.Multi)
  233 + {
  234 + ColorConsole.SetCursorPosition(remembercursorleft2, remembercursortop2);
  235 + }
176 } 236 }
177 if (selectionliststr == "EX") 237 if (selectionliststr == "EX")
178 { 238 {
@@ -186,37 +246,37 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -186,37 +246,37 @@ namespace Vrh.Log4Pro.MaintenanceConsole
186 result.SelectedKeyList = null; 246 result.SelectedKeyList = null;
187 return result; 247 return result;
188 } 248 }
189 - else if (selectionMode == SelectionMode.Multi && selectionliststr == "*") 249 + else if (selectionMode == SelectionMode.Multi && selectionliststr == "*")
190 { 250 {
191 selectionKeyList = new List<string>(); 251 selectionKeyList = new List<string>();
192 selectionParList = new List<object>(); 252 selectionParList = new List<object>();
193 var i = 1; 253 var i = 1;
194 - foreach (var mi in MenuItemList)  
195 - { 254 + foreach (var mi in MenuItemList)
  255 + {
196 selectionKeyList.Add(mi.Key); 256 selectionKeyList.Add(mi.Key);
197 selectionParList.Add(mi.Parameters); 257 selectionParList.Add(mi.Parameters);
198 } 258 }
199 result.Result = SelectionResult.Ok; 259 result.Result = SelectionResult.Ok;
200 result.SelectedKeyList = selectionKeyList; 260 result.SelectedKeyList = selectionKeyList;
201 - result.SelectedParameterList= selectionParList;  
202 - return result; 261 + result.SelectedParameterList = selectionParList;
  262 + return result;
203 } 263 }
204 selectionKeyList = new List<string>(); 264 selectionKeyList = new List<string>();
205 selectionParList = new List<object>(); 265 selectionParList = new List<object>();
206 foreach (var selection in selectionliststr.Split(',').ToList()) 266 foreach (var selection in selectionliststr.Split(',').ToList())
207 { 267 {
208 string _selection = selection; 268 string _selection = selection;
209 - object _parameters=null; 269 + object _parameters = null;
210 if (!MenuKeyList.Contains(_selection)) 270 if (!MenuKeyList.Contains(_selection))
211 { 271 {
212 if (!int.TryParse(_selection, out int indexselection) || indexselection < 1 || indexselection > MenuItemList.Count()) 272 if (!int.TryParse(_selection, out int indexselection) || indexselection < 1 || indexselection > MenuItemList.Count())
213 { 273 {
214 - IncorrectSelection($"Selected item {_selection} is not valid!"); 274 + Menu.IncorrectSelection($"Selected item {_selection} is not valid!");
215 result.Result = SelectionResult.Error; 275 result.Result = SelectionResult.Error;
216 result.SelectedKeyList = null; 276 result.SelectedKeyList = null;
217 return result; 277 return result;
218 } 278 }
219 - _selection = GetItemKey(indexselection-1); 279 + _selection = GetItemKey(indexselection - 1);
220 _parameters = GetItem(indexselection - 1).Parameters; 280 _parameters = GetItem(indexselection - 1).Parameters;
221 } 281 }
222 selectionKeyList.Add(_selection); 282 selectionKeyList.Add(_selection);
@@ -227,15 +287,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -227,15 +287,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
227 result.SelectedParameterList = selectionParList; 287 result.SelectedParameterList = selectionParList;
228 return result; 288 return result;
229 } 289 }
230 - public static void IncorrectSelection(string partxt="")  
231 - {  
232 - ColorConsole.WriteLine();  
233 - ColorConsole.WriteLine($"Incorrect selection! {partxt} Make a new selection!",ConsoleColor.Red);  
234 - Console.WriteLine("Press a key to continue...");  
235 - Console.ReadKey();  
236 - }  
237 -  
238 - public void Execute(List<string> selectedkeylist) 290 + public void ExecuteSelection(List<string> selectedkeylist)
239 { 291 {
240 object o = null; 292 object o = null;
241 foreach (var mi in MenuItemList) 293 foreach (var mi in MenuItemList)
@@ -245,7 +297,20 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -245,7 +297,20 @@ namespace Vrh.Log4Pro.MaintenanceConsole
245 o = mi.Executor(mi.Parameters, o); 297 o = mi.Executor(mi.Parameters, o);
246 } 298 }
247 } 299 }
248 - ColorConsole.WriteLine("Press any key to continue...", ConsoleColor.Yellow); Console.ReadKey(); 300 + Menu.PressAnykeyToContinue();
  301 + }
  302 +
  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();
249 } 314 }
250 public MenuItemExecutorFunc GetExecutor(string key) 315 public MenuItemExecutorFunc GetExecutor(string key)
251 { 316 {
@@ -278,7 +343,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -278,7 +343,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
278 { 343 {
279 return MenuKeyList.ElementAt(ix); 344 return MenuKeyList.ElementAt(ix);
280 } 345 }
281 - public void SetParameters(Menu.Selection r, object p=null) 346 + public void SetExecutorParameters(Menu.Selection r, object p=null)
282 { 347 {
283 foreach (var mi in this.MenuItemList) 348 foreach (var mi in this.MenuItemList)
284 { 349 {
Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - Tools.cs 0 → 100644
@@ -0,0 +1,76 @@ @@ -0,0 +1,76 @@
  1 +using System;
  2 +using System.IO;
  3 +using System.Collections.Generic;
  4 +using System.Linq;
  5 +using System.Security.Principal;
  6 +using System.Text;
  7 +using System.Threading.Tasks;
  8 +using System.Threading;
  9 +
  10 +using Microsoft.Web.Administration;
  11 +using System.Management;
  12 +using System.Diagnostics;
  13 +
  14 +using Vrh.XmlProcessing;
  15 +using System.Xml.Linq;
  16 +
  17 +namespace Vrh.Log4Pro.MaintenanceConsole
  18 +{
  19 + public static class Tools
  20 + {
  21 + public static bool IsElevated
  22 + {
  23 + get
  24 + {
  25 + return new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);
  26 + }
  27 + }
  28 + public static string ExecuteAndGetStdIo(string exepath, string args)
  29 + {
  30 + StringBuilder outputBuilder = new StringBuilder();
  31 + StringBuilder erroroutputBuilder = new StringBuilder();
  32 + ProcessStartInfo startInfo = new ProcessStartInfo() { };
  33 + using (Process exeProcess = new Process())
  34 + {
  35 + startInfo.CreateNoWindow = true;
  36 + startInfo.WindowStyle = ProcessWindowStyle.Hidden;
  37 + startInfo.RedirectStandardOutput = true;
  38 + startInfo.RedirectStandardError= true;
  39 + startInfo.RedirectStandardInput = true;
  40 + startInfo.UseShellExecute = false;
  41 + startInfo.FileName = exepath;
  42 + startInfo.Verb= "runas";
  43 + startInfo.Arguments = args;
  44 +
  45 + exeProcess.StartInfo = startInfo;
  46 + // enable raising events because Process does not raise events by default
  47 + exeProcess.EnableRaisingEvents = true;
  48 + exeProcess.OutputDataReceived += new DataReceivedEventHandler
  49 + (
  50 + delegate (object sender, DataReceivedEventArgs e)
  51 + {
  52 + // append the new data to the data already read-in
  53 + outputBuilder.Append(e.Data + "\r\n");
  54 + }
  55 + );
  56 + exeProcess.ErrorDataReceived += new DataReceivedEventHandler
  57 + (
  58 + delegate (object sender, DataReceivedEventArgs e)
  59 + {
  60 + // append the new data to the data already read-in
  61 + erroroutputBuilder.Append(e.Data + "\r\n");
  62 + }
  63 + );
  64 + // start the process
  65 + // then begin asynchronously reading the output
  66 + // then wait for the process to exit
  67 + // then cancel asynchronously reading the output
  68 + exeProcess.Start();
  69 + exeProcess.BeginOutputReadLine();
  70 + exeProcess.WaitForExit();
  71 + exeProcess.CancelOutputRead();
  72 + return outputBuilder.ToString();
  73 + }
  74 + }
  75 + }
  76 +}
Vrh.Log4Pro.MaintenanceConsole/Manager - FileCleanerManager.cs
@@ -42,8 +42,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -42,8 +42,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole
42 if (sr.Result == Menu.SelectionResult.Exit) { break; } 42 if (sr.Result == Menu.SelectionResult.Exit) { break; }
43 else if (sr.Result == Menu.SelectionResult.None) { continue; } 43 else if (sr.Result == Menu.SelectionResult.None) { continue; }
44 else if (sr.Result == Menu.SelectionResult.Error) { continue; } 44 else if (sr.Result == Menu.SelectionResult.Error) { continue; }
45 - menufunctions.SetParameters(sr,config);  
46 - menufunctions.Execute(sr.SelectedKeyList); 45 + menufunctions.SetExecutorParameters(sr,config);
  46 + menufunctions.ExecuteSelection(sr.SelectedKeyList);
47 } 47 }
48 return null; 48 return null;
49 } 49 }
@@ -309,7 +309,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -309,7 +309,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole
309 #endregion GetDefinitionList 309 #endregion GetDefinitionList
310 } 310 }
311 #endregion FileCleanerManagerCoreXmlProcessor class 311 #endregion FileCleanerManagerCoreXmlProcessor class
312 - #region WindowsService class 312 +
  313 + #region FolderToClean class
313 public class FolderToClean : XmlLinqBase 314 public class FolderToClean : XmlLinqBase
314 { 315 {
315 #region fields 316 #region fields
@@ -499,6 +500,5 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -499,6 +500,5 @@ namespace Vrh.Log4Pro.MaintenanceConsole
499 } 500 }
500 #endregion XmlStructure 501 #endregion XmlStructure
501 } 502 }
502 - #endregion WindowsService class  
503 - 503 + #endregion FolderToClean class
504 } 504 }
Vrh.Log4Pro.MaintenanceConsole/Manager - MaintenanceToolManager.cs
@@ -43,8 +43,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -43,8 +43,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole
43 if (sr.Result == Menu.SelectionResult.Exit) { break; } 43 if (sr.Result == Menu.SelectionResult.Exit) { break; }
44 else if (sr.Result == Menu.SelectionResult.None) { continue; } 44 else if (sr.Result == Menu.SelectionResult.None) { continue; }
45 else if (sr.Result == Menu.SelectionResult.Error) { continue; } 45 else if (sr.Result == Menu.SelectionResult.Error) { continue; }
46 - menufunctions.SetParameters(sr,config);  
47 - menufunctions.Execute(sr.SelectedKeyList); 46 + menufunctions.SetExecutorParameters(sr,config);
  47 + menufunctions.ExecuteSelection(sr.SelectedKeyList);
48 } 48 }
49 return null; 49 return null;
50 } 50 }
@@ -80,7 +80,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -80,7 +80,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
80 ColorConsole.WriteLine(regexmatch.Groups[groupname].Value, ConsoleColor.Yellow); 80 ColorConsole.WriteLine(regexmatch.Groups[groupname].Value, ConsoleColor.Yellow);
81 } 81 }
82 } 82 }
83 - ColorConsole.ReadLine($"Press any key to continue..."); 83 + ColorConsole.PressAnykeyToContinue();
84 } 84 }
85 return o; 85 return o;
86 } 86 }
Vrh.Log4Pro.MaintenanceConsole/Manager - ScheduledTaskManager.cs 0 → 100644
@@ -0,0 +1,577 @@ @@ -0,0 +1,577 @@
  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.XmlProcessing;
  16 +using VRH.Common;
  17 +using System.Xml.Linq;
  18 +using System.Text.RegularExpressions;
  19 +
  20 +namespace Vrh.Log4Pro.MaintenanceConsole
  21 +{
  22 + #region ScheduledTaskManager class
  23 + public static class ScheduledTaskmanagerManager
  24 + {
  25 + private const string XMLCONNECTIONSTRING = "file=Config.Xml;element=ScheduledTasks;";
  26 +
  27 + #region Execute
  28 + public static object Execute(object o1 = null, object o2 = null)
  29 + {
  30 + var args = o1 as string[];
  31 + var module = CommandLine.GetCommandLineArgument(args, "-MODULE");
  32 + var functionkey = CommandLine.GetCommandLineArgument(args, "-FUNCTION");
  33 +
  34 + string xmlcs = XMLCONNECTIONSTRING;
  35 + var config = new ScheduledTaskManagerCoreXmlProcessor(xmlcs, "", "hu-HU");
  36 + 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 + }
  61 + return o2;
  62 + }
  63 + #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
  72 + #region First level Executors with UI
  73 + private static object ChangePriority(object parameter, object o)
  74 + {
  75 + var config = (parameter as ScheduledTaskExecutorParameter).Config;
  76 + var args = (parameter as ScheduledTaskExecutorParameter).Args;
  77 +
  78 + var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, "-TASKS");
  79 +
  80 + var menufolders = DisplayTasks(config, $"Select the scheduled task(s) to manage with function '{nameof(ChangePriority)}'!");
  81 +
  82 + Menu.Selection sr = menufolders.Select(selectedtaskindexes);
  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 + foreach (var p in sr.SelectedParameterList)
  89 + {
  90 + ScheduledTask st = p as ScheduledTask;
  91 + try
  92 + {
  93 + ScheduledTaskManagerCore.SetPriority(st.Xml_Name,st.Xml_Priority);
  94 + ColorConsole.WriteLine($"Priority changed for scheduled task. Name:{st.Xml_Name}", ConsoleColor.Green);
  95 + }
  96 + catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); }
  97 + }
  98 + return o;
  99 + }
  100 + private static object Disable(object parameter, object o)
  101 + {
  102 + var config = (parameter as ScheduledTaskExecutorParameter).Config;
  103 + var args = (parameter as ScheduledTaskExecutorParameter).Args;
  104 +
  105 + var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, "-TASKS");
  106 +
  107 + var menufolders = DisplayTasks(config, $"Select the scheduled task(s) to manage with function '{nameof(Disable)}'!");
  108 +
  109 + Menu.Selection sr = menufolders.Select(selectedtaskindexes);
  110 + if (sr.Result == Menu.SelectionResult.Exit) { return o; }
  111 + else if (sr.Result == Menu.SelectionResult.None) { return o; }
  112 + else if (sr.Result == Menu.SelectionResult.Error) { return o; }
  113 + else if (sr.Result == Menu.SelectionResult.Ok) { }
  114 + else { }
  115 + foreach (var p in sr.SelectedParameterList)
  116 + {
  117 + ScheduledTask st = p as ScheduledTask;
  118 + try
  119 + {
  120 + ScheduledTaskManagerCore.DisableTask(st.Xml_Name);
  121 + ColorConsole.WriteLine($"Scheduled task disabled. Name:{st.Xml_Name}", ConsoleColor.Green);
  122 + }
  123 + catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); }
  124 + }
  125 + return o;
  126 + }
  127 + private static object Enable(object parameter, object o)
  128 + {
  129 + var config = (parameter as ScheduledTaskExecutorParameter).Config;
  130 + var args = (parameter as ScheduledTaskExecutorParameter).Args;
  131 +
  132 + var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, "-TASKS");
  133 +
  134 + var menufolders = DisplayTasks(config, $"Select the scheduled task(s) to manage with function '{nameof(Enable)}'!");
  135 +
  136 + Menu.Selection sr = menufolders.Select(selectedtaskindexes);
  137 + if (sr.Result == Menu.SelectionResult.Exit) { return o; }
  138 + else if (sr.Result == Menu.SelectionResult.None) { return o; }
  139 + else if (sr.Result == Menu.SelectionResult.Error) { return o; }
  140 + else if (sr.Result == Menu.SelectionResult.Ok) { }
  141 + else { }
  142 + foreach (var p in sr.SelectedParameterList)
  143 + {
  144 + ScheduledTask st = p as ScheduledTask;
  145 + try
  146 + {
  147 + ScheduledTaskManagerCore.EnableTask(st.Xml_Name);
  148 + ColorConsole.WriteLine($"Scheduled task enabled. Name:{st.Xml_Name}", ConsoleColor.Green);
  149 + }
  150 + catch (Exception ex){ ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); }
  151 + }
  152 + return o;
  153 + }
  154 + private static object End(object parameter, object o)
  155 + {
  156 + var config = (parameter as ScheduledTaskExecutorParameter).Config;
  157 + var args = (parameter as ScheduledTaskExecutorParameter).Args;
  158 +
  159 + var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, "-TASKS");
  160 +
  161 + var menufolders = DisplayTasks(config, $"Select the scheduled task(s) to manage with function '{nameof(End)}'!");
  162 +
  163 + Menu.Selection sr = menufolders.Select(selectedtaskindexes);
  164 + if (sr.Result == Menu.SelectionResult.Exit) { return o; }
  165 + else if (sr.Result == Menu.SelectionResult.None) { return o; }
  166 + else if (sr.Result == Menu.SelectionResult.Error) { return o; }
  167 + else if (sr.Result == Menu.SelectionResult.Ok) { }
  168 + else { }
  169 + foreach (var p in sr.SelectedParameterList)
  170 + {
  171 + ScheduledTask st = p as ScheduledTask;
  172 + try
  173 + {
  174 + ScheduledTaskManagerCore.EndTask(st.Xml_Name);
  175 + ColorConsole.WriteLine($"Scheduled task stopped. Name:{st.Xml_Name}", ConsoleColor.Green);
  176 + }
  177 + catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); }
  178 + }
  179 + return o;
  180 + }
  181 + private static object Run(object parameter, object o)
  182 + {
  183 + var config = (parameter as ScheduledTaskExecutorParameter).Config;
  184 + var args = (parameter as ScheduledTaskExecutorParameter).Args;
  185 +
  186 + var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, "-TASKS");
  187 +
  188 + var menufolders = DisplayTasks(config, $"Select the scheduled task(s) to manage with function '{nameof(Run)}'!");
  189 +
  190 + Menu.Selection sr = menufolders.Select(selectedtaskindexes);
  191 + if (sr.Result == Menu.SelectionResult.Exit) { return o; }
  192 + else if (sr.Result == Menu.SelectionResult.None) { return o; }
  193 + else if (sr.Result == Menu.SelectionResult.Error) { return o; }
  194 + else if (sr.Result == Menu.SelectionResult.Ok) { }
  195 + else { }
  196 + foreach (var p in sr.SelectedParameterList)
  197 + {
  198 + ScheduledTask st = p as ScheduledTask;
  199 + try
  200 + {
  201 + ScheduledTaskManagerCore.RunTask(st.Xml_Name);
  202 + ColorConsole.WriteLine($"Scheduled task started. Name:{st.Xml_Name}", ConsoleColor.Green);
  203 + }
  204 + catch (Exception ex)
  205 + {
  206 + ColorConsole.WriteLine(ex.Message, ConsoleColor.Red);
  207 + }
  208 + }
  209 + return o;
  210 + }
  211 + private static object Uninstall(object parameter, object o)
  212 + {
  213 + var config = (parameter as ScheduledTaskExecutorParameter).Config;
  214 + var args = (parameter as ScheduledTaskExecutorParameter).Args;
  215 +
  216 + var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, "-TASKS");
  217 +
  218 + var menufolders = DisplayTasks(config, $"Select the scheduled task(s) to manage with function '{nameof(Uninstall)}'!");
  219 +
  220 + Menu.Selection sr = menufolders.Select(selectedtaskindexes);
  221 + if (sr.Result == Menu.SelectionResult.Exit) { return o; }
  222 + else if (sr.Result == Menu.SelectionResult.None) { return o; }
  223 + else if (sr.Result == Menu.SelectionResult.Error) { return o; }
  224 + else if (sr.Result == Menu.SelectionResult.Ok) { }
  225 + else { }
  226 + foreach (var p in sr.SelectedParameterList)
  227 + {
  228 + ScheduledTask st = p as ScheduledTask;
  229 + try
  230 + {
  231 + ScheduledTaskManagerCore.EndTask(st.Xml_Name);
  232 + ScheduledTaskManagerCore.DeleteTask(st.Xml_Name);
  233 + ColorConsole.WriteLine($"Scheduled task uninstalled. Name:{st.Xml_Name}", ConsoleColor.Green);
  234 + }
  235 + catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); }
  236 + }
  237 + return o;
  238 + }
  239 + private static object Install(object parameter, object o)
  240 + {
  241 + var config = (parameter as ScheduledTaskExecutorParameter).Config;
  242 + var args = (parameter as ScheduledTaskExecutorParameter).Args;
  243 +
  244 + var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, "-TASKS");
  245 +
  246 + var menufolders = DisplayTasks(config, $"Select the scheduled task(s) to manage with function '{nameof(Install)}'!");
  247 +
  248 + Menu.Selection sr = menufolders.Select(selectedtaskindexes);
  249 + if (sr.Result == Menu.SelectionResult.Exit) { return o; }
  250 + else if (sr.Result == Menu.SelectionResult.None) { return o; }
  251 + else if (sr.Result == Menu.SelectionResult.Error) { return o; }
  252 + else if (sr.Result == Menu.SelectionResult.Ok) { }
  253 + else { }
  254 + foreach (var p in sr.SelectedParameterList)
  255 + {
  256 + ScheduledTask st = p as ScheduledTask;
  257 + try
  258 + {
  259 + ScheduledTaskManagerCore.EndTask(st.Xml_Name);
  260 + ScheduledTaskManagerCore.DeleteTask(st.Xml_Name);
  261 + ScheduledTaskManagerCore.CreateTask(st);
  262 + ColorConsole.WriteLine($"Scheduled task installed. Name:{st.Xml_Name}", ConsoleColor.Green);
  263 + }
  264 + catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); }
  265 + }
  266 + return o;
  267 + }
  268 + #endregion First level Executors with UI
  269 +
  270 + #region private methods
  271 + #region private DisplayTasks
  272 + private static Menu DisplayTasks(ScheduledTaskManagerCoreXmlProcessor config,string prompt = null)
  273 + {
  274 + List<ScheduledTask> schtskdefList = config.GetDefinitionList();
  275 + var menufct = new Menu("Scheduled tasks",prompt)
  276 + .SetMenuItemDisplayer(DisplayTaskInfo)
  277 + .SetSelectionMode(Menu.SelectionMode.Multi)
  278 + .SetHeaderWidth(4);
  279 + menufct.ClearMenuItemList();
  280 + foreach (var schtskdef in schtskdefList)
  281 + {
  282 + var st = CollectTaskInfo(schtskdef);
  283 + menufct.AddMenuItem(new Menu.Item(null, null, null, st));
  284 + }
  285 + menufct.DisplayItems(1);
  286 + return menufct;
  287 + }
  288 + #endregion private DisplayTasks
  289 + #region private method: DisplayTaskInfo
  290 + private static object DisplayTaskInfo(object obj, int lineix)
  291 + {
  292 + ScheduledTask st = obj as ScheduledTask;
  293 + if (lineix == 0)
  294 + {
  295 + ColorConsole.Write($"{st.Xml_Name}", ConsoleColor.Black, ConsoleColor.White);
  296 + var statuscolor = st.Status == "Uninstalled" ? ConsoleColor.Red : ConsoleColor.Green;
  297 + ColorConsole.Write(st.Status, statuscolor, bracket: "[]", prefix: " ", suffix: ". ");
  298 + if (st.Status != "Uninstalled" && st.Status != "Disabled")
  299 + {
  300 + ColorConsole.Write(st.PriorityText(st.Priority), statuscolor, prefix: "Effective priority ", suffix: ". ");
  301 + ColorConsole.Write($"{st.Xml_Commandname}", ConsoleColor.Yellow, prefix: "Command: ");
  302 + }
  303 + ColorConsole.WriteLine();
  304 + return " ";
  305 + }
  306 + else if (lineix == 1)
  307 + {
  308 + ColorConsole.Write($"{st.Xml_Schedule}",ConsoleColor.Yellow,prefix:"Scheduled ",suffix:" ");
  309 + ColorConsole.Write($"{st.Xml_StartTime}", ConsoleColor.Yellow, prefix: "at ", suffix: ", ");
  310 + ColorConsole.Write(st.PriorityText(st.Xml_Priority), ConsoleColor.Yellow, prefix: "with priority ", suffix: ". ");
  311 + ColorConsole.Write($"{st.Xml_Enable}", ConsoleColor.Yellow, prefix: "After install ", suffix: " ");
  312 + ColorConsole.Write($"{st.Xml_Run}", ConsoleColor.Yellow, prefix: "and run ", suffix: ". ");
  313 + ColorConsole.WriteLine(" ");
  314 + return " ";
  315 + }
  316 + return null;
  317 + }
  318 + #endregion private method: DisplayTaskInfo
  319 + #region private CollectTaskInfo
  320 + private static ScheduledTask CollectTaskInfo(ScheduledTask schtsk)
  321 + {
  322 + string status = Tools.ExecuteAndGetStdIo("schtasks.exe", $"/Query /FO TABLE /TN {schtsk.Xml_Name}");
  323 +
  324 + try
  325 + {
  326 + var statuslines = status.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
  327 + var statussplitted = statuslines[3]
  328 + .Split(new string[] { " ", "+" }, StringSplitOptions.RemoveEmptyEntries);
  329 + if (statussplitted[1]=="N/A")
  330 + {
  331 + schtsk.NextRun = "";
  332 + schtsk.Priority = -1;
  333 + schtsk.Status = statussplitted[2];
  334 + }
  335 + else
  336 + {
  337 + var nextrunTS = statussplitted[1] + " " + statussplitted[2];
  338 + var statusinfo = statussplitted[3];
  339 + if (statusinfo == "AM" || statusinfo == "PM")
  340 + {
  341 + statusinfo = statussplitted[4];
  342 + nextrunTS += statusinfo;
  343 + }
  344 + schtsk.Status = statusinfo;
  345 + schtsk.NextRun += nextrunTS;
  346 + schtsk.Priority = ScheduledTaskManagerCore.GetPriority(schtsk.Xml_Name);
  347 + }
  348 + }
  349 + catch
  350 + {
  351 + schtsk.Status = "Uninstalled";
  352 + schtsk.NextRun = "";
  353 + schtsk.Priority = -1;
  354 + }
  355 + return schtsk;
  356 + }
  357 + #endregion private CollectTaskInfo
  358 + #endregion private methods
  359 + }
  360 + #endregion ScheduledTaskManager class
  361 +
  362 + #region class ScheduledTaskManagerCore
  363 + public static class ScheduledTaskManagerCore
  364 + {
  365 + public static int GetPriority(string taskname)
  366 + {
  367 + try
  368 + {
  369 + return int.Parse(ScheduledTaskManagerCore.GetXml(taskname).Element(XName.Get("Settings")).Element(XName.Get("Priority")).Value);
  370 + }
  371 + catch
  372 + {
  373 + return ScheduledTask.XmlStructure.ScheduledTask.Attributes.Priority.Values.DEFAULT;
  374 + }
  375 + }
  376 + public static void SetPriority(string taskname,int priority)
  377 + {
  378 + var schtskXml = ScheduledTaskManagerCore.GetXml(taskname);
  379 + schtskXml.Element(XName.Get("Settings")).Element(XName.Get("Priority")).Value= priority.ToString();
  380 + ScheduledTaskManagerCore.SetXml(taskname, schtskXml);
  381 + }
  382 + public static XElement GetXml(string taskname) { return XElement.Parse(Tools.ExecuteAndGetStdIo("schtasks.exe", $"/Query /XML /TN {taskname}")); }
  383 + public static void SetXml(string taskname,XElement schtskXml)
  384 + {
  385 + EndTask(taskname);
  386 + DeleteTask(taskname);
  387 + CreateTask(taskname, schtskXml);
  388 + }
  389 + public static void EndTask(string taskname) { Tools.ExecuteAndGetStdIo("schtasks.exe", $"/End /TN {taskname}"); }
  390 + public static void RunTask(string taskname) { Tools.ExecuteAndGetStdIo("schtasks.exe", $"/Run /TN {taskname}"); }
  391 + public static void EnableTask(string taskname)
  392 + {
  393 + Tools.ExecuteAndGetStdIo("schtasks.exe", $"/Change /ENABLE /TN {taskname}");
  394 + }
  395 + public static void DisableTask(string taskname)
  396 + {
  397 + EndTask(taskname);
  398 + Tools.ExecuteAndGetStdIo("schtasks.exe", $"/Change /DISABLE /TN {taskname}");
  399 + }
  400 + public static void DeleteTask(string taskname) { Tools.ExecuteAndGetStdIo("schtasks.exe", $"/Delete /TN {taskname} /F"); }
  401 + public static void CreateTask(string taskname, XElement schtskXml)
  402 + {
  403 + var tmpfilename = $"TMP_{taskname}_{DateTime.Now.ToString("yyyyMMddHHmmss")}.xml";
  404 + if (File.Exists(tmpfilename)) { File.Delete(tmpfilename); }
  405 + schtskXml.Save(tmpfilename);
  406 + Tools.ExecuteAndGetStdIo("schtasks.exe", $"/Create /XML {tmpfilename} /TN {taskname}");
  407 + if (File.Exists(tmpfilename)) { File.Delete(tmpfilename); }
  408 + }
  409 + public static void CreateTask(ScheduledTask st)
  410 + {
  411 + string taskname = st.Xml_Name;
  412 + string tasktorunpars = st.Xml_Commandname;
  413 +
  414 + string schedulepars = "";
  415 + if (st.Xml_Schedule==nameof(ScheduledTask.XmlStructure.ScheduledTask.Attributes.Schedule.Values.MONTHLY)) { schedulepars += "/SC MONTHLY /D 1"; }
  416 + else if (st.Xml_Schedule == nameof(ScheduledTask.XmlStructure.ScheduledTask.Attributes.Schedule.Values.WEEKLY)) { schedulepars += "/SC WEEKLY /D MON"; }
  417 + else if (st.Xml_Schedule == nameof(ScheduledTask.XmlStructure.ScheduledTask.Attributes.Schedule.Values.DAILY)) { schedulepars += "/SC DAILY"; }
  418 + else if (st.Xml_Schedule == nameof(ScheduledTask.XmlStructure.ScheduledTask.Attributes.Schedule.Values.HOURLY)) { schedulepars += "/SC DAILY /RI 60 /DU 24:00 /K"; }
  419 + else if (st.Xml_Schedule == nameof(ScheduledTask.XmlStructure.ScheduledTask.Attributes.Schedule.Values.CONTINOUS)) { schedulepars += "/SC DAILY /RI 5 /DU 24:00 /K"; }
  420 + var sst = st.Xml_StartTime.ToString("HH:mm:ss");
  421 + string starttimepars = $"/ST {sst}";
  422 + string passwordpars = "/NP";
  423 + string forcecreatepars = "/F";
  424 + string prioritypars = "/RL HIGHEST";
  425 +
  426 + var args = $"/Create /TR {tasktorunpars} {schedulepars} {starttimepars} {passwordpars} {forcecreatepars} {prioritypars} /TN {taskname}";
  427 + var result = Tools.ExecuteAndGetStdIo("schtasks.exe", args);
  428 +
  429 + if (st.Xml_Enable) { EnableTask(taskname); } else { DisableTask(taskname); }
  430 + if (st.Xml_Run) { RunTask(taskname); } else { EndTask(taskname); }
  431 + }
  432 + }
  433 + #endregion class ScheduledTaskManagerCore
  434 +
  435 + #region ScheduledTaskManagerCoreXmlProcessor class
  436 + public class ScheduledTaskManagerCoreXmlProcessor : XmlParser
  437 + {
  438 + private List<ScheduledTask> _scheduledtasklist;
  439 + #region constructor
  440 + public ScheduledTaskManagerCoreXmlProcessor(string xmlcs, string basefolder, string lcid) : base(xmlcs, basefolder, lcid, null)
  441 + {
  442 + _scheduledtasklist = new List<ScheduledTask>();
  443 + var schtskxmllist = GetAllXElements(nameof(ScheduledTask.XmlStructure.ScheduledTask));
  444 + if (schtskxmllist != null && schtskxmllist.Any())
  445 + {
  446 + foreach (var schtskxml in schtskxmllist) { var st = new ScheduledTask(schtskxml); if (st.Valid) { _scheduledtasklist.Add(st); } }
  447 + }
  448 + }
  449 + #endregion constructor
  450 + #region GetDefinitionList
  451 + public List<ScheduledTask> GetDefinitionList() { return _scheduledtasklist; }
  452 + #endregion GetDefinitionList
  453 + }
  454 + #endregion ScheduledTaskManagerCoreXmlProcessor class
  455 +
  456 + #region ScheduledTask class
  457 + public class ScheduledTask : XmlLinqBase
  458 + {
  459 + #region fields
  460 + public bool Valid = true;
  461 + public string Xml_Name;
  462 + public int Xml_Priority;
  463 + public string Xml_Schedule;
  464 + public DateTime Xml_StartTime;
  465 + public bool Xml_Enable = XmlStructure.ScheduledTask.Attributes.Enable.Values.DEFAULT;
  466 + public bool Xml_Run=XmlStructure.ScheduledTask.Attributes.Run.Values.DEFAULT;
  467 + public string Xml_Commandname;
  468 +
  469 + public string Status;
  470 + public string NextRun;
  471 + public int Priority;
  472 + #endregion fields
  473 +
  474 + #region basic constructor
  475 + public ScheduledTask() { }
  476 + #endregion basic constructor
  477 + #region xml constructor
  478 + public string PriorityText(int pri)
  479 + {
  480 + return
  481 + (pri == 0 ? "Realtime"
  482 + : pri == 1 ? "High"
  483 + : pri == 2 ? "High"
  484 + : pri == 3 ? "Normal"
  485 + : pri == 4 ? "Normal"
  486 + : pri == 5 ? "Normal"
  487 + : pri == 6 ? "Normal"
  488 + : pri == 7 ? "Low"
  489 + : pri == 8 ? "Low"
  490 + : pri == 9 ? "Idle"
  491 + : pri == 10 ? "Idle"
  492 + : "Idle")+$"({pri})";
  493 + }
  494 + public ScheduledTask(XElement scheduledtaskxml)
  495 + {
  496 + Valid = true;
  497 + string ATTRIBUTEMANDATORY = nameof(XmlStructure.ScheduledTask) + " attribute is mandatory! Name: {0}";
  498 + Xml_Name = scheduledtaskxml.Attribute(XName.Get(nameof(XmlStructure.ScheduledTask.Attributes.Name)))?.Value;
  499 + if (string.IsNullOrWhiteSpace(Xml_Name)) { throw new ApplicationException(string.Format(ATTRIBUTEMANDATORY, nameof(XmlStructure.ScheduledTask.Attributes.Name))); }
  500 + Xml_Priority = GetValue(nameof(XmlStructure.ScheduledTask.Attributes.Priority), scheduledtaskxml, XmlStructure.ScheduledTask.Attributes.Priority.Values.DEFAULT);
  501 + Xml_Schedule = GetValue(nameof(XmlStructure.ScheduledTask.Attributes.Schedule), scheduledtaskxml, XmlStructure.ScheduledTask.Attributes.Schedule.Values.DEFAULT);
  502 + Xml_StartTime = DateTime.Parse(GetValue(nameof(XmlStructure.ScheduledTask.Attributes.StartTime), scheduledtaskxml, XmlStructure.ScheduledTask.Attributes.StartTime.Values.DEFAULT));
  503 + Xml_Enable = GetValue(nameof(XmlStructure.ScheduledTask.Attributes.Enable), scheduledtaskxml, XmlStructure.ScheduledTask.Attributes.Enable.Values.DEFAULT);
  504 + 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, "");
  506 + //var conditionxmlList = GetAllXElements(foldertocleanxml, nameof(XmlStructure.FolderToClean.Conditions), nameof(XmlStructure.FolderToClean.Conditions.Condition));
  507 + }
  508 + #endregion xml constructor
  509 + #region cloner constructor
  510 + public ScheduledTask(ScheduledTask ftc)
  511 + {
  512 + Valid = ftc.Valid;
  513 + Xml_Name = ftc.Xml_Name;
  514 + Xml_Priority = ftc.Xml_Priority;
  515 + Xml_Schedule = ftc.Xml_Schedule;
  516 + Xml_StartTime = ftc.Xml_StartTime;
  517 + Xml_Enable = ftc.Xml_Enable;
  518 + Xml_Run = ftc.Xml_Run;
  519 + Xml_Commandname = ftc.Xml_Commandname;
  520 + }
  521 + #endregion cloner constructor
  522 + #region XmlStructure
  523 + public static class XmlStructure
  524 + {
  525 + public static class ScheduledTask
  526 + {
  527 + public static class Attributes
  528 + {
  529 + 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 + }
  537 + public static class Priority
  538 + {
  539 + public static class Values
  540 + {
  541 + public const int DEFAULT = 7;
  542 + }
  543 + }
  544 + public static class Schedule
  545 + {
  546 + public static class Values
  547 + {
  548 + public static class WEEKLY { }
  549 + public static class MONTHLY { }
  550 + public static class DAILY { }
  551 + public static class HOURLY { }
  552 + public static class CONTINOUS { }
  553 + public const string DEFAULT = nameof(DAILY);
  554 + }
  555 + }
  556 + public static class Enable
  557 + {
  558 + public static class Values
  559 + {
  560 + public const bool DEFAULT = true;
  561 + }
  562 + }
  563 + public static class Run
  564 + {
  565 + public static class Values
  566 + {
  567 + public const bool DEFAULT = false;
  568 + }
  569 + }
  570 + public static class Commandname { }
  571 + }
  572 + }
  573 + }
  574 + #endregion XmlStructure
  575 + }
  576 + #endregion ScheduledTask class
  577 +}
Vrh.Log4Pro.MaintenanceConsole/Manager - WebApplicationManager.cs
@@ -76,7 +76,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -76,7 +76,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole
76 else if (sr.Result == Menu.SelectionResult.Error) { continue; } 76 else if (sr.Result == Menu.SelectionResult.Error) { continue; }
77 else if (sr.Result == Menu.SelectionResult.Ok) { } 77 else if (sr.Result == Menu.SelectionResult.Ok) { }
78 else { } 78 else { }
79 - menuapplications.Execute(sr.SelectedKeyList); 79 + menuapplications.ExecuteSelection(sr.SelectedKeyList);
80 } 80 }
81 return null; 81 return null;
82 } 82 }
@@ -149,14 +149,14 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -149,14 +149,14 @@ namespace Vrh.Log4Pro.MaintenanceConsole
149 WebApplication d = dobj as WebApplication; 149 WebApplication d = dobj as WebApplication;
150 using (ServerManager sm = new ServerManager()) 150 using (ServerManager sm = new ServerManager())
151 { 151 {
152 - try { WebApplicationManagerCore.GetPool(sm, d.Xml_PoolName)?.Stop(); } catch { Console.WriteLine($"Pool {d.Xml_PoolName} already stopped."); }  
153 - try { WebApplicationManagerCore.GetSite(sm, d.Xml_SiteName)?.Stop(); } catch { Console.WriteLine($"Site {d.Xml_SiteName} already stopped."); } 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."); }
154 154
155 SiteStart(d, parameters); 155 SiteStart(d, parameters);
156 PoolStart(d, parameters); 156 PoolStart(d, parameters);
157 PoolRecycle(d, parameters); 157 PoolRecycle(d, parameters);
158 158
159 - Console.WriteLine($"Pool {d.Xml_PoolName} and site {d.Xml_SiteName} restarted."); 159 + ColorConsole.WriteLine($"Pool {d.Xml_PoolName} and site {d.Xml_SiteName} restarted.");
160 return parameters; 160 return parameters;
161 } 161 }
162 } 162 }
@@ -173,14 +173,14 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -173,14 +173,14 @@ namespace Vrh.Log4Pro.MaintenanceConsole
173 if (p != null && p.State == ObjectState.Stopped) { p.Start(); success = true; break; } 173 if (p != null && p.State == ObjectState.Stopped) { p.Start(); success = true; break; }
174 else 174 else
175 { 175 {
176 - Console.WriteLine($"Trying to start pool {d.Xml_PoolName} ... Press key 'X' to exit...");  
177 - if (Console.KeyAvailable) { if (Console.ReadKey().KeyChar.ToString().ToUpper() == "X") { break; } } 176 + ColorConsole.WriteLine($"Trying to start pool {d.Xml_PoolName} ... Press key 'X' to exit...");
  177 + if (ColorConsole.KeyAvailable) { if (ColorConsole.ReadKey().KeyChar.ToString().ToUpper() == "X") { break; } }
178 178
179 Thread.Sleep(1000); 179 Thread.Sleep(1000);
180 } 180 }
181 } 181 }
182 var successstr = success ? "started" : "NOT started"; 182 var successstr = success ? "started" : "NOT started";
183 - Console.WriteLine($"{d.Xml_PoolName} {successstr}."); 183 + ColorConsole.WriteLine($"{d.Xml_PoolName} {successstr}.");
184 return parameters; 184 return parameters;
185 } 185 }
186 } 186 }
@@ -196,13 +196,13 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -196,13 +196,13 @@ namespace Vrh.Log4Pro.MaintenanceConsole
196 if (p != null && p.State == ObjectState.Started) { p.Recycle(); success = true; break; } 196 if (p != null && p.State == ObjectState.Started) { p.Recycle(); success = true; break; }
197 else 197 else
198 { 198 {
199 - Console.WriteLine($"Trying to recycle pool {d.Xml_PoolName} ... Press key 'X' to exit...");  
200 - if (Console.KeyAvailable) { if (Console.ReadKey().KeyChar.ToString().ToUpper() == "X") { break; } } 199 + ColorConsole.WriteLine($"Trying to recycle pool {d.Xml_PoolName} ... Press key 'X' to exit...");
  200 + if (ColorConsole.KeyAvailable) { if (ColorConsole.ReadKey().KeyChar.ToString().ToUpper() == "X") { break; } }
201 Thread.Sleep(1000); 201 Thread.Sleep(1000);
202 } 202 }
203 } 203 }
204 var successstr = success ? "recycled" : "NOT recycled"; 204 var successstr = success ? "recycled" : "NOT recycled";
205 - Console.WriteLine($"{d.Xml_PoolName} {successstr}."); 205 + ColorConsole.WriteLine($"{d.Xml_PoolName} {successstr}.");
206 return parameters; 206 return parameters;
207 } 207 }
208 } 208 }
@@ -218,14 +218,14 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -218,14 +218,14 @@ namespace Vrh.Log4Pro.MaintenanceConsole
218 if (p != null && p.State == ObjectState.Started) { p.Stop(); success = true; break; } 218 if (p != null && p.State == ObjectState.Started) { p.Stop(); success = true; break; }
219 else 219 else
220 { 220 {
221 - Console.WriteLine($"Trying to stop pool {d.Xml_PoolName} ... Press key 'X' to exit...");  
222 - if (Console.KeyAvailable) { if (Console.ReadKey().KeyChar.ToString().ToUpper() == "X") { break; } } 221 + ColorConsole.WriteLine($"Trying to stop pool {d.Xml_PoolName} ... Press key 'X' to exit...");
  222 + if (ColorConsole.KeyAvailable) { if (ColorConsole.ReadKey().KeyChar.ToString().ToUpper() == "X") { break; } }
223 223
224 Thread.Sleep(1000); 224 Thread.Sleep(1000);
225 } 225 }
226 } 226 }
227 var successstr = success ? "stopped" : "NOT stopped"; 227 var successstr = success ? "stopped" : "NOT stopped";
228 - Console.WriteLine($"{d.Xml_PoolName} {successstr}."); 228 + ColorConsole.WriteLine($"{d.Xml_PoolName} {successstr}.");
229 return parameters; 229 return parameters;
230 } 230 }
231 } 231 }
@@ -241,13 +241,13 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -241,13 +241,13 @@ namespace Vrh.Log4Pro.MaintenanceConsole
241 if (s != null && s.State == ObjectState.Stopped) { s.Start(); success = true; break; } 241 if (s != null && s.State == ObjectState.Stopped) { s.Start(); success = true; break; }
242 else 242 else
243 { 243 {
244 - Console.WriteLine($"Trying to start site {d.Xml_SiteName} ... Press key 'X' to exit...");  
245 - if (Console.KeyAvailable) { if (Console.ReadKey().KeyChar.ToString().ToUpper() == "X") { break; } } 244 + ColorConsole.WriteLine($"Trying to start site {d.Xml_SiteName} ... Press key 'X' to exit...");
  245 + if (ColorConsole.KeyAvailable) { if (ColorConsole.ReadKey().KeyChar.ToString().ToUpper() == "X") { break; } }
246 Thread.Sleep(1000); 246 Thread.Sleep(1000);
247 } 247 }
248 } 248 }
249 var successstr = success ? "started" : "NOT started"; 249 var successstr = success ? "started" : "NOT started";
250 - Console.WriteLine($"{d.Xml_SiteName} {successstr}."); 250 + ColorConsole.WriteLine($"{d.Xml_SiteName} {successstr}.");
251 return parameters; 251 return parameters;
252 } 252 }
253 } 253 }
@@ -263,13 +263,13 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -263,13 +263,13 @@ namespace Vrh.Log4Pro.MaintenanceConsole
263 if (s != null && s.State == ObjectState.Started) { s.Stop(); success = true; break; } 263 if (s != null && s.State == ObjectState.Started) { s.Stop(); success = true; break; }
264 else 264 else
265 { 265 {
266 - Console.WriteLine($"Trying to stop site {d.Xml_SiteName} ... Press key 'X' to exit...");  
267 - if (Console.KeyAvailable) { if (Console.ReadKey().KeyChar.ToString().ToUpper() == "X") { break; } } 266 + ColorConsole.WriteLine($"Trying to stop site {d.Xml_SiteName} ... Press key 'X' to exit...");
  267 + if (ColorConsole.KeyAvailable) { if (ColorConsole.ReadKey().KeyChar.ToString().ToUpper() == "X") { break; } }
268 Thread.Sleep(1000); 268 Thread.Sleep(1000);
269 } 269 }
270 } 270 }
271 var successstr = success ? "stopped" : "NOT stopped"; 271 var successstr = success ? "stopped" : "NOT stopped";
272 - Console.WriteLine($"{d.Xml_SiteName} {successstr}."); 272 + ColorConsole.WriteLine($"{d.Xml_SiteName} {successstr}.");
273 return parameters; 273 return parameters;
274 } 274 }
275 } 275 }
@@ -277,14 +277,14 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -277,14 +277,14 @@ namespace Vrh.Log4Pro.MaintenanceConsole
277 { 277 {
278 WebApplication d = dobj as WebApplication; 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); 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 - Console.WriteLine($"{d.Xml_AppName} is registered in site {d.Xml_SiteName} using pool {d.Xml_PoolName}."); 280 + ColorConsole.WriteLine($"{d.Xml_AppName} is registered in site {d.Xml_SiteName} using pool {d.Xml_PoolName}.");
281 return parameters; 281 return parameters;
282 } 282 }
283 private static object Unregister(object dobj, object parameters) 283 private static object Unregister(object dobj, object parameters)
284 { 284 {
285 WebApplication d = dobj as WebApplication; 285 WebApplication d = dobj as WebApplication;
286 WebApplicationManagerCore.UnRegisterWebApplication(d.Xml_AppName, d.Xml_PoolName, d.Xml_SiteName, d.Xml_ForceRemovePool, d.Xml_ForceRemoveSite); 286 WebApplicationManagerCore.UnRegisterWebApplication(d.Xml_AppName, d.Xml_PoolName, d.Xml_SiteName, d.Xml_ForceRemovePool, d.Xml_ForceRemoveSite);
287 - Console.WriteLine($"{d.Xml_AppName} is unregistered from site {d.Xml_SiteName} and from pool {d.Xml_PoolName}."); 287 + ColorConsole.WriteLine($"{d.Xml_AppName} is unregistered from site {d.Xml_SiteName} and from pool {d.Xml_PoolName}.");
288 return parameters; 288 return parameters;
289 } 289 }
290 private static object SetImpersonateIdentity(object dobj, object parameters) 290 private static object SetImpersonateIdentity(object dobj, object parameters)
@@ -304,22 +304,22 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -304,22 +304,22 @@ namespace Vrh.Log4Pro.MaintenanceConsole
304 while(true) 304 while(true)
305 { 305 {
306 306
307 - Console.WriteLine($"Current user info: {olduserinfo}");  
308 - Console.WriteLine("Set impersonate-on status (true/false), then [Enter], EX=exit.");  
309 - impersonate = Console.ReadLine().ToUpper(); 307 + ColorConsole.WriteLine($"Current user info: {olduserinfo}");
  308 + ColorConsole.WriteLine("Set impersonate-on status (true/false), then [Enter], EX=exit.");
  309 + impersonate = ColorConsole.ReadLine().ToUpper();
310 if (impersonate == "EX") { return null; } 310 if (impersonate == "EX") { return null; }
311 else if (impersonate == "FALSE") { break; } 311 else if (impersonate == "FALSE") { break; }
312 else if (impersonate == "TRUE") 312 else if (impersonate == "TRUE")
313 { 313 {
314 - Console.WriteLine("Enter username, then [Enter]."); 314 + ColorConsole.WriteLine("Enter username, then [Enter].");
315 var un = !string.IsNullOrWhiteSpace(d.Xml_PoolUsername) ? $"empty={d.Xml_PoolUsername }," : ""; 315 var un = !string.IsNullOrWhiteSpace(d.Xml_PoolUsername) ? $"empty={d.Xml_PoolUsername }," : "";
316 - Console.WriteLine($"{un}EX=exit");  
317 - username = Console.ReadLine().ToUpper(); 316 + ColorConsole.WriteLine($"{un}EX=exit");
  317 + username = ColorConsole.ReadLine().ToUpper();
318 if (impersonate == "EX") { return null; } 318 if (impersonate == "EX") { return null; }
319 - Console.WriteLine("Enter password, then [Enter]"); 319 + ColorConsole.WriteLine("Enter password, then [Enter]");
320 var pw = !string.IsNullOrWhiteSpace(d.Xml_PoolPassword) ? $"empty={d.Xml_PoolPassword}," : ""; 320 var pw = !string.IsNullOrWhiteSpace(d.Xml_PoolPassword) ? $"empty={d.Xml_PoolPassword}," : "";
321 - Console.WriteLine($"{pw}EX=exit");  
322 - password = Console.ReadLine().ToUpper(); 321 + ColorConsole.WriteLine($"{pw}EX=exit");
  322 + password = ColorConsole.ReadLine().ToUpper();
323 if (impersonate == "EX") { return null; } 323 if (impersonate == "EX") { return null; }
324 break; 324 break;
325 //bool valid = System.Web.ApplicationSerices.AuthenticationService.ValidateUser(username, password, mull); 325 //bool valid = System.Web.ApplicationSerices.AuthenticationService.ValidateUser(username, password, mull);
@@ -333,8 +333,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -333,8 +333,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole
333 parameters = new Dictionary<string, string> { { "impersonate", impersonate }, { "username", username }, { "password", password }, }; 333 parameters = new Dictionary<string, string> { { "impersonate", impersonate }, { "username", username }, { "password", password }, };
334 } 334 }
335 WebApplicationManagerCore.SetImpersonateIdentity(d.Xml_IdentityConfigFile, impersonate, username, password); 335 WebApplicationManagerCore.SetImpersonateIdentity(d.Xml_IdentityConfigFile, impersonate, username, password);
336 - Console.WriteLine($"Impersonate identity changed for webapp {d.Xml_AppName}.");  
337 - Console.WriteLine($"From '{olduserinfo}' to '{WebApplicationManagerCore.GetImpersonateIdentityInfo(d.Xml_IdentityConfigFile)}'"); 336 + ColorConsole.WriteLine($"Impersonate identity changed for webapp {d.Xml_AppName}.");
  337 + ColorConsole.WriteLine($"From '{olduserinfo}' to '{WebApplicationManagerCore.GetImpersonateIdentityInfo(d.Xml_IdentityConfigFile)}'");
338 338
339 return parameters; 339 return parameters;
340 } 340 }
@@ -351,16 +351,16 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -351,16 +351,16 @@ namespace Vrh.Log4Pro.MaintenanceConsole
351 } 351 }
352 else 352 else
353 { 353 {
354 - Console.WriteLine($"Current user info: {olduserinfo}");  
355 - Console.WriteLine("Enter username, then [Enter].");  
356 - Console.WriteLine("Special usernames are: (Empty=API) ");  
357 - Console.WriteLine($" (API) {nameof(ProcessModelIdentityType.ApplicationPoolIdentity)}");  
358 - Console.WriteLine($" (LSE) {nameof(ProcessModelIdentityType.LocalService)}");  
359 - Console.WriteLine($" (LSY) {nameof(ProcessModelIdentityType.LocalSystem)}");  
360 - Console.WriteLine($" (NSE) {nameof(ProcessModelIdentityType.NetworkService)}"); 354 + ColorConsole.WriteLine($"Current user info: {olduserinfo}");
  355 + ColorConsole.WriteLine("Enter username, then [Enter].");
  356 + ColorConsole.WriteLine("Special usernames are: (Empty=API) ");
  357 + ColorConsole.WriteLine($" (API) {nameof(ProcessModelIdentityType.ApplicationPoolIdentity)}");
  358 + ColorConsole.WriteLine($" (LSE) {nameof(ProcessModelIdentityType.LocalService)}");
  359 + ColorConsole.WriteLine($" (LSY) {nameof(ProcessModelIdentityType.LocalSystem)}");
  360 + ColorConsole.WriteLine($" (NSE) {nameof(ProcessModelIdentityType.NetworkService)}");
361 ColorConsole.WriteLine(); 361 ColorConsole.WriteLine();
362 ColorConsole.Write(" (EX) ", ConsoleColor.Red); ColorConsole.WriteLine("Exit"); 362 ColorConsole.Write(" (EX) ", ConsoleColor.Red); ColorConsole.WriteLine("Exit");
363 - username = Console.ReadLine().ToUpper(); 363 + username = ColorConsole.ReadLine().ToUpper();
364 if (username == "EX") { return null; } 364 if (username == "EX") { return null; }
365 if (string.IsNullOrEmpty(username)) { username = nameof(ProcessModelIdentityType.ApplicationPoolIdentity); }; 365 if (string.IsNullOrEmpty(username)) { username = nameof(ProcessModelIdentityType.ApplicationPoolIdentity); };
366 if (username == "API" || username == nameof(ProcessModelIdentityType.ApplicationPoolIdentity)) { username = nameof(ProcessModelIdentityType.ApplicationPoolIdentity); } 366 if (username == "API" || username == nameof(ProcessModelIdentityType.ApplicationPoolIdentity)) { username = nameof(ProcessModelIdentityType.ApplicationPoolIdentity); }
@@ -369,14 +369,14 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -369,14 +369,14 @@ namespace Vrh.Log4Pro.MaintenanceConsole
369 else if (username == "NSE" || username == nameof(ProcessModelIdentityType.NetworkService)) { username = nameof(ProcessModelIdentityType.NetworkService); } 369 else if (username == "NSE" || username == nameof(ProcessModelIdentityType.NetworkService)) { username = nameof(ProcessModelIdentityType.NetworkService); }
370 else 370 else
371 { 371 {
372 - Console.WriteLine("Enter password, then [Enter]");  
373 - password = Console.ReadLine().ToUpper(); 372 + ColorConsole.WriteLine("Enter password, then [Enter]");
  373 + password = ColorConsole.ReadLine().ToUpper();
374 //bool valid = System.Web.ApplicationSerices.AuthenticationService.ValidateUser(username, password, mull); 374 //bool valid = System.Web.ApplicationSerices.AuthenticationService.ValidateUser(username, password, mull);
375 } 375 }
376 parameters = new Dictionary<string, string> { { "username", username }, { "password", password }, }; 376 parameters = new Dictionary<string, string> { { "username", username }, { "password", password }, };
377 } 377 }
378 WebApplicationManagerCore.SetPoolUserAccount(d.Xml_AppName, d.Xml_SiteName, username, password); 378 WebApplicationManagerCore.SetPoolUserAccount(d.Xml_AppName, d.Xml_SiteName, username, password);
379 - Console.WriteLine($"Pool user changed from {olduserinfo} to {WebApplicationManagerCore.GetUserInfo(d.Xml_PoolName)} for pool {d.Xml_PoolName}."); 379 + ColorConsole.WriteLine($"Pool user changed from {olduserinfo} to {WebApplicationManagerCore.GetUserInfo(d.Xml_PoolName)} for pool {d.Xml_PoolName}.");
380 return parameters; 380 return parameters;
381 } 381 }
382 #endregion 382 #endregion
Vrh.Log4Pro.MaintenanceConsole/Manager - WindowsServiceManager.cs
@@ -48,8 +48,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -48,8 +48,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole
48 if (sr.Result == Menu.SelectionResult.Exit) { break; } 48 if (sr.Result == Menu.SelectionResult.Exit) { break; }
49 else if (sr.Result == Menu.SelectionResult.None) { continue; } 49 else if (sr.Result == Menu.SelectionResult.None) { continue; }
50 else if (sr.Result == Menu.SelectionResult.Error) { continue; } 50 else if (sr.Result == Menu.SelectionResult.Error) { continue; }
51 - menufunctions.SetParameters(sr,config);  
52 - menufunctions.Execute(sr.SelectedKeyList); 51 + menufunctions.SetExecutorParameters(sr,config);
  52 + menufunctions.ExecuteSelection(sr.SelectedKeyList);
53 } 53 }
54 return null; 54 return null;
55 } 55 }
Vrh.Log4Pro.MaintenanceConsole/Program.cs
@@ -9,6 +9,7 @@ using System.Management; @@ -9,6 +9,7 @@ using System.Management;
9 using System.Diagnostics; 9 using System.Diagnostics;
10 10
11 using Vrh.XmlProcessing; 11 using Vrh.XmlProcessing;
  12 +using VRH.Common;
12 using System.Xml.Linq; 13 using System.Xml.Linq;
13 14
14 namespace Vrh.Log4Pro.MaintenanceConsole 15 namespace Vrh.Log4Pro.MaintenanceConsole
@@ -17,11 +18,21 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -17,11 +18,21 @@ namespace Vrh.Log4Pro.MaintenanceConsole
17 { 18 {
18 static void Main(string[] args) 19 static void Main(string[] args)
19 { 20 {
20 - try { Console.SetWindowSize(120, 64); } 21 + ColorConsole.ReadLine("Press a key to start...");
  22 + var appconfigpath = CommandLine.GetCommandLineArgument(args, "-APPCONFIG");
  23 + CommandLine.SetAppConfigFile(appconfigpath);
  24 +
  25 + try { ColorConsole.SetWindowSize(120, 64); }
21 catch (Exception ex) 26 catch (Exception ex)
22 { 27 {
23 - ColorConsole.WriteLine("Change the size of the console fonts smaller!");  
24 - Console.ReadKey(); 28 + ColorConsole.WriteLine("Change the size of the console fonts smaller!");
  29 + ColorConsole.ReadKey();
  30 + return;
  31 + }
  32 + if (!Tools.IsElevated)
  33 + {
  34 + ColorConsole.WriteLine("Run as administartor!");
  35 + ColorConsole.ReadKey();
25 return; 36 return;
26 } 37 }
27 38
@@ -29,12 +40,24 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -29,12 +40,24 @@ namespace Vrh.Log4Pro.MaintenanceConsole
29 .AddMenuItem(new Menu.Item("WAM", "Web Application Manager", WebApplicationManager.Execute)) 40 .AddMenuItem(new Menu.Item("WAM", "Web Application Manager", WebApplicationManager.Execute))
30 .AddMenuItem(new Menu.Item("WSM", "Windows Service Manager", WindowsServiceManager.Execute)) 41 .AddMenuItem(new Menu.Item("WSM", "Windows Service Manager", WindowsServiceManager.Execute))
31 .AddMenuItem(new Menu.Item("FCL", "File Cleaner Manager", FileCleanerManager.Execute)) 42 .AddMenuItem(new Menu.Item("FCL", "File Cleaner Manager", FileCleanerManager.Execute))
  43 + .AddMenuItem(new Menu.Item("SCH", "Scheduled Task Manager", ScheduledTaskmanagerManager.Execute))
32 .AddMenuItem(new Menu.ItemSeparator('-')) 44 .AddMenuItem(new Menu.ItemSeparator('-'))
33 .AddMenuItem(new Menu.Item("TOL", "Maintenance tools", MaintenanceToolManager.Execute)) 45 .AddMenuItem(new Menu.Item("TOL", "Maintenance tools", MaintenanceToolManager.Execute))
34 .SetSelectionMode(Menu.SelectionMode.Single); 46 .SetSelectionMode(Menu.SelectionMode.Single);
35 47
36 - mm.ExecuteMenu();  
37 - ColorConsole.WriteLine("Press any key to exit..."); Console.ReadKey(); 48 + var commandmode = !string.IsNullOrEmpty(CommandLine.GetCommandLineArgument(args, "-MODULE"));
  49 + if (commandmode)
  50 + {
  51 + var silentmode = !string.IsNullOrEmpty(CommandLine.GetCommandLineArgument(args, "-SILENT", switchtype: true));
  52 + ColorConsole.SetSilentMode(silentmode);
  53 + Menu.SetCommandModeAllMenus();
  54 + mm.ExecuteCmd(args);
  55 + }
  56 + else
  57 + {
  58 + mm.ExecuteMenu();
  59 + ColorConsole.PressAnykeyToContinue();
  60 + }
38 } 61 }
39 } 62 }
40 } 63 }
Vrh.Log4Pro.MaintenanceConsole/Vrh.Log4Pro.MaintenanceConsole.csproj
1 <?xml version="1.0" encoding="utf-8"?> 1 <?xml version="1.0" encoding="utf-8"?>
2 <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 2 <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3 - <Import Project="..\packages\EntityFramework.6.4.0\build\EntityFramework.props" Condition="Exists('..\packages\EntityFramework.6.4.0\build\EntityFramework.props')" /> 3 + <Import Project="..\packages\EntityFramework.6.4.4\build\EntityFramework.props" Condition="Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.props')" />
4 <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> 4 <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
5 <PropertyGroup> 5 <PropertyGroup>
6 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> 6 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -37,10 +37,10 @@ @@ -37,10 +37,10 @@
37 </PropertyGroup> 37 </PropertyGroup>
38 <ItemGroup> 38 <ItemGroup>
39 <Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"> 39 <Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
40 - <HintPath>..\packages\EntityFramework.6.4.0\lib\net45\EntityFramework.dll</HintPath> 40 + <HintPath>..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.dll</HintPath>
41 </Reference> 41 </Reference>
42 <Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"> 42 <Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
43 - <HintPath>..\packages\EntityFramework.6.4.0\lib\net45\EntityFramework.SqlServer.dll</HintPath> 43 + <HintPath>..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.SqlServer.dll</HintPath>
44 </Reference> 44 </Reference>
45 <Reference Include="Microsoft.Web.Administration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> 45 <Reference Include="Microsoft.Web.Administration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
46 <HintPath>..\packages\Microsoft.Web.Administration.11.1.0\lib\netstandard1.5\Microsoft.Web.Administration.dll</HintPath> 46 <HintPath>..\packages\Microsoft.Web.Administration.11.1.0\lib\netstandard1.5\Microsoft.Web.Administration.dll</HintPath>
@@ -145,8 +145,8 @@ @@ -145,8 +145,8 @@
145 <Reference Include="Microsoft.CSharp" /> 145 <Reference Include="Microsoft.CSharp" />
146 <Reference Include="System.Data" /> 146 <Reference Include="System.Data" />
147 <Reference Include="System.Xml" /> 147 <Reference Include="System.Xml" />
148 - <Reference Include="VRH.Common, Version=2.19.0.0, Culture=neutral, processorArchitecture=MSIL">  
149 - <HintPath>..\packages\VRH.Common.2.19.0\lib\net45\VRH.Common.dll</HintPath> 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>
150 </Reference> 150 </Reference>
151 <Reference Include="Vrh.XmlProcessing, Version=1.23.0.0, Culture=neutral, processorArchitecture=MSIL"> 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> 152 <HintPath>..\packages\Vrh.XmlProcessing.1.23.0\lib\net45\Vrh.XmlProcessing.dll</HintPath>
@@ -156,6 +156,8 @@ @@ -156,6 +156,8 @@
156 <Compile Include="ConsoleFunction - CommandLineParser.cs" /> 156 <Compile Include="ConsoleFunction - CommandLineParser.cs" />
157 <Compile Include="ConsoleFunction - ColorConsole.cs" /> 157 <Compile Include="ConsoleFunction - ColorConsole.cs" />
158 <Compile Include="ConsoleFunction - Menu.cs" /> 158 <Compile Include="ConsoleFunction - Menu.cs" />
  159 + <Compile Include="ConsoleFunction - Tools.cs" />
  160 + <Compile Include="Manager - ScheduledTaskManager.cs" />
159 <Compile Include="Manager - WindowsServiceManager.cs" /> 161 <Compile Include="Manager - WindowsServiceManager.cs" />
160 <Compile Include="Manager - FileCleanerManager.cs" /> 162 <Compile Include="Manager - FileCleanerManager.cs" />
161 <Compile Include="Manager - MaintenanceToolManager.cs" /> 163 <Compile Include="Manager - MaintenanceToolManager.cs" />
@@ -179,13 +181,14 @@ @@ -179,13 +181,14 @@
179 <CopyToOutputDirectory>Always</CopyToOutputDirectory> 181 <CopyToOutputDirectory>Always</CopyToOutputDirectory>
180 </Content> 182 </Content>
181 </ItemGroup> 183 </ItemGroup>
  184 + <ItemGroup />
182 <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 185 <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
183 <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> 186 <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
184 <PropertyGroup> 187 <PropertyGroup>
185 <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> 188 <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
186 </PropertyGroup> 189 </PropertyGroup>
187 - <Error Condition="!Exists('..\packages\EntityFramework.6.4.0\build\EntityFramework.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.4.0\build\EntityFramework.props'))" />  
188 - <Error Condition="!Exists('..\packages\EntityFramework.6.4.0\build\EntityFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.4.0\build\EntityFramework.targets'))" /> 190 + <Error Condition="!Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.4.4\build\EntityFramework.props'))" />
  191 + <Error Condition="!Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.4.4\build\EntityFramework.targets'))" />
189 </Target> 192 </Target>
190 - <Import Project="..\packages\EntityFramework.6.4.0\build\EntityFramework.targets" Condition="Exists('..\packages\EntityFramework.6.4.0\build\EntityFramework.targets')" /> 193 + <Import Project="..\packages\EntityFramework.6.4.4\build\EntityFramework.targets" Condition="Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.targets')" />
191 </Project> 194 </Project>
192 \ No newline at end of file 195 \ No newline at end of file
Vrh.Log4Pro.MaintenanceConsole/packages.config
1 <?xml version="1.0" encoding="utf-8"?> 1 <?xml version="1.0" encoding="utf-8"?>
2 <packages> 2 <packages>
3 - <package id="EntityFramework" version="6.4.0" targetFramework="net462" /> 3 + <package id="EntityFramework" version="6.4.4" targetFramework="net462" />
4 <package id="Microsoft.NETCore.Platforms" version="1.0.1" targetFramework="net462" /> 4 <package id="Microsoft.NETCore.Platforms" version="1.0.1" targetFramework="net462" />
5 <package id="Microsoft.Web.Administration" version="11.1.0" targetFramework="net462" /> 5 <package id="Microsoft.Web.Administration" version="11.1.0" targetFramework="net462" />
6 <package id="Microsoft.Win32.Primitives" version="4.0.1" targetFramework="net462" /> 6 <package id="Microsoft.Win32.Primitives" version="4.0.1" targetFramework="net462" />
@@ -55,6 +55,6 @@ @@ -55,6 +55,6 @@
55 <package id="System.Threading.Timer" version="4.0.1" targetFramework="net462" /> 55 <package id="System.Threading.Timer" version="4.0.1" targetFramework="net462" />
56 <package id="System.Xml.ReaderWriter" version="4.0.11" targetFramework="net462" /> 56 <package id="System.Xml.ReaderWriter" version="4.0.11" targetFramework="net462" />
57 <package id="System.Xml.XDocument" version="4.0.11" targetFramework="net462" /> 57 <package id="System.Xml.XDocument" version="4.0.11" targetFramework="net462" />
58 - <package id="VRH.Common" version="2.19.0" targetFramework="net462" /> 58 + <package id="VRH.Common" version="2.19.1" targetFramework="net462" />
59 <package id="Vrh.XmlProcessing" version="1.23.0" targetFramework="net462" /> 59 <package id="Vrh.XmlProcessing" version="1.23.0" targetFramework="net462" />
60 </packages> 60 </packages>
61 \ No newline at end of file 61 \ No newline at end of file