Commit 61c9a762c8f55b7ce73a0c876617d50e7054d7cb
1 parent
2c000e17
v1.19.0
AseConfig utility beépítése
Showing
4 changed files
with
262 additions
and
10 deletions
Show diff stats
Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - ColorConsole.cs
... | ... | @@ -157,7 +157,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ColorConsoleNS |
157 | 157 | if (defaultvalue != null) { prompt += $" Default value is '{defaultvalue}'."; } |
158 | 158 | if (exitvalue != null) { prompt += $" Enter '{exitvalue}' to exit."; } |
159 | 159 | |
160 | - WriteLine(text, f, b, bracket, prefix, suffix); | |
160 | + Write(text, f, b, bracket, prefix, suffix); | |
161 | + if (!string.IsNullOrWhiteSpace(text+bracket+prefix+suffix)) WriteLine(); | |
161 | 162 | if (prompt != null) { WriteLine(prompt); } |
162 | 163 | Write("-->"); input = Console.ReadLine(); |
163 | 164 | if (defaultvalue!=null && (input == null || input == "")) { input = defaultvalue; } | ... | ... |
Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - CommandLineParser.cs
... | ... | @@ -328,6 +328,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.CommandLineParserNS |
328 | 328 | public static class StartAsSystem { public const string KEY = "SAS"; } |
329 | 329 | public static class RegexTester { public const string KEY = "RGX"; } |
330 | 330 | public static class TCPIPTester { public const string KEY = "TCP"; } |
331 | + public static class ASEConfig { public const string KEY = "ACF"; } | |
331 | 332 | public static class Tool { public const string KEY = "TOL"; } |
332 | 333 | } |
333 | 334 | } | ... | ... |
Vrh.Log4Pro.MaintenanceConsole/Manager - MaintenanceToolManager.cs
... | ... | @@ -42,7 +42,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MaintenanceToolManagerNS |
42 | 42 | .AddMenuItem(new Menu.Item(CLP.Module.MaintenanceToolManager.Functions.StartAsSystem.KEY, "Start As NT AUTHORITY/SYSTEM", StartAsSystem, new Menu.ExecutorParameter(cfg: config))) |
43 | 43 | .AddMenuItem(new Menu.Item(CLP.Module.MaintenanceToolManager.Functions.RegexTester.KEY, "Regex tester", RegexTester,new Menu.ExecutorParameter(cfg:config))) |
44 | 44 | .AddMenuItem(new Menu.Item(CLP.Module.MaintenanceToolManager.Functions.TCPIPTester.KEY, "TcpIp Tester", TcpIpTester, new Menu.ExecutorParameter(cfg: config, null))) |
45 | - .AddMenuItem(new Menu.Item(CLP.Module.MaintenanceToolManager.Functions.Tool.KEY, "Tool sample", Tool2, new Menu.ExecutorParameter(cfg: config, null))) | |
45 | + .AddMenuItem(new Menu.Item(CLP.Module.MaintenanceToolManager.Functions.ASEConfig.KEY, "ASEConfig Utility", AseConfig, new Menu.ExecutorParameter(cfg: config, null))) | |
46 | + //.AddMenuItem(new Menu.Item(CLP.Module.MaintenanceToolManager.Functions.Tool.KEY, "Tool sample", Tool, new Menu.ExecutorParameter(cfg: config, null))) | |
46 | 47 | |
47 | 48 | .SetSelectionMode(Menu.SelectionMode.Single); |
48 | 49 | foreach (var x in config.ExternalUtilityConfigList) |
... | ... | @@ -81,7 +82,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MaintenanceToolManagerNS |
81 | 82 | private static object RegexTester(object parameter, object o) |
82 | 83 | { |
83 | 84 | var config = (parameter as Menu.ExecutorParameter).GetConfig<MaintenanceToolsXmlProcessor>(); |
84 | - var regexptesterconfig = config.RegexpTesterConfig; | |
85 | + var regexptesterconfig = config.RegexpTesterConfigXml; | |
85 | 86 | while(true) |
86 | 87 | { |
87 | 88 | var regexstr = ColorConsole.ReadLine($"Enter REGEX to test with:", ConsoleColor.Yellow); |
... | ... | @@ -364,12 +365,255 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MaintenanceToolManagerNS |
364 | 365 | #endregion TcpIpTester |
365 | 366 | |
366 | 367 | |
368 | + #region ASEConfig | |
369 | + private static object AseConfig(object parameter, object o) | |
370 | + { | |
371 | + var config = (parameter as Menu.ExecutorParameter).GetConfig<MaintenanceToolsXmlProcessor>(); | |
372 | + var CommandXmlList = config.ASEConfigXml.Elements(XName.Get("Command")); | |
373 | + if (CommandXmlList == null) return o; | |
374 | + List<ASEConfigCommand> aseconfigcommandList = new List<ASEConfigCommand>(); | |
375 | + foreach (var commandXml in CommandXmlList) { aseconfigcommandList.Add(new ASEConfigCommand(commandXml)); } | |
376 | + var selectedkey = SelectAseConfigCommand(aseconfigcommandList); | |
377 | + if (selectedkey == null) return o; | |
378 | + var selectedcommand = aseconfigcommandList.FirstOrDefault(c=>c.EqualsTo(selectedkey)); | |
379 | + if (selectedcommand == null) return o; | |
380 | + selectedcommand.Ini(); | |
381 | + if (!selectedcommand.SetArgumentParameters()) return o;//a paraméterek interaktív értékeit kéri be | |
382 | + if (!selectedcommand.DisplayArgumentParameters()) return o; | |
383 | + foreach (string currentip in selectedcommand.GetIpList()) | |
384 | + { | |
385 | + ColorConsole.WriteLine($"Processing IP:{currentip}", ConsoleColor.Yellow); | |
386 | + var success = selectedcommand.Resolve(currentip);//feloldja az argument listát | |
387 | + if (success) { selectedcommand.Execute(); }//végrehajtja a parancsot } | |
388 | + string successmsg = success ? "succeeded" : "failed"; | |
389 | + string answer = ColorConsole.ReadLine($"{nameof(AseConfig)} command execution {successmsg} on {currentip}!\nEnter EX to exit from execution loop, anything else to continue!", success?ConsoleColor.Yellow: ConsoleColor.Red); | |
390 | + if (answer.ToLower() == "ex") break; | |
391 | + } | |
392 | + return o; | |
393 | + } | |
394 | + private static string SelectAseConfigCommand(List<ASEConfigCommand> aseconfigcommandList) | |
395 | + { | |
396 | + ColorConsole.WriteLine("ASEConfig Utility",ConsoleColor.Green); | |
397 | + int maxkeylength = aseconfigcommandList.Select(c => c.Key.Length).Concat(new List<int> { 0}).Max(); | |
398 | + int maxdesclength = aseconfigcommandList.Select(c => c.Description.Length).Concat(new List<int> { 0 }).Max(); | |
399 | + | |
400 | + foreach (var c in aseconfigcommandList) | |
401 | + { | |
402 | + var onelineinfo = c.GetOneLineInfo(maxkeylength, maxdesclength); | |
403 | + ColorConsole.Write(onelineinfo.Item1, ConsoleColor.Yellow,suffix:" "); | |
404 | + ColorConsole.Write(onelineinfo.Item2, ConsoleColor.White, suffix: " "); | |
405 | + ColorConsole.WriteLine(onelineinfo.Item3, ConsoleColor.Gray); | |
406 | + } | |
407 | + var answer = ColorConsole.ReadLine($"Select command key", ConsoleColor.Gray, bracket: "[]",validitylist: aseconfigcommandList.Select(c => c.Key).ToList()); | |
408 | + if (answer.ToLower() == "ex") return null; | |
409 | + return answer; | |
410 | + } | |
411 | + private class ASEConfigCommand | |
412 | + { | |
413 | + private enum CommandType { export,import,importnoanswer, exportpartial,} | |
414 | + public ASEConfigCommand(XElement commandXml) | |
415 | + { | |
416 | + const string DEFAULTIMPORTARGUMENTS = "-u {ASEUSERNAME}:{ASEPASSWORD} -X POST --form configrecord=\"@{CONFIGFILE}\" http://{ASEIP}/import/config"; | |
417 | + const string DEFAULTIMPORTNOANSWERARGUMENTS = "-u {ASEUSERNAME}:{ASEPASSWORD} -X POST --form configrecord=\"@{CONFIGFILE}\" http://{ASEIP}/import/config -m 5"; | |
418 | + const string DEFAULTEXPORTARGUMENTS = "-u {ASEUSERNAME}:{ASEPASSWORD} -X POST http://{ASEIP}/export/config -o ASECONFIG-{ASEIP}.xml"; | |
419 | + const string DEFAULTEXPORTPARTIALARGUMENTS = "-u {ASEUSERNAME}:{ASEPASSWORD} -X POST -d \"optionalGroupList = {CONFIGGROUPNAME}:{CONFIGGROUPINSTANCE}\" http://{ASEIP}/export/config -o ASECONFIG-{ASEIP}.xml"; | |
420 | + var typestr = (commandXml.Attribute(XName.Get(nameof(Type)))?.Value)??nameof(CommandType.import); | |
421 | + Type = CommandType.import; try { Type = (CommandType)Enum.Parse(typeof(CommandType),typestr); } catch { } | |
422 | + | |
423 | + ConfigGroupName = commandXml.Attribute(XName.Get(nameof(ConfigGroupName)))?.Value; | |
424 | + ConfigGroupInstance = commandXml.Attribute(XName.Get(nameof(ConfigGroupInstance)))?.Value; | |
425 | + AseUsername = (commandXml.Attribute(XName.Get(nameof(AseUsername)))?.Value) ?? "admin"; | |
426 | + AsePassword = (commandXml.Attribute(XName.Get(nameof(AsePassword)))?.Value) ?? "PASSWORD"; | |
427 | + Key = (commandXml.Attribute(XName.Get(nameof(Key)))?.Value) ?? ""; | |
428 | + Exe = (commandXml.Attribute(XName.Get(nameof(Exe)))?.Value)??"CURL\\curl.exe"; | |
429 | + ExeDir = Path.GetDirectoryName(Exe); | |
430 | + AseIp = commandXml.Attribute(XName.Get(nameof(AseIp)))?.Value; | |
431 | + ConfigFile = commandXml.Attribute(XName.Get(nameof(ConfigFile)))?.Value; | |
432 | + if (!Path.IsPathRooted(ConfigFile)) ConfigFile = Path.Combine(ExeDir, ConfigFile); | |
433 | + Description = (commandXml.Attribute(XName.Get(nameof(Description)))?.Value)??""; | |
434 | + Arguments = (commandXml.Attribute(XName.Get(nameof(Arguments)))?.Value)?? | |
435 | + ( | |
436 | + Type== CommandType.export? DEFAULTEXPORTARGUMENTS | |
437 | + : Type== CommandType.exportpartial ? DEFAULTEXPORTPARTIALARGUMENTS | |
438 | + : Type == CommandType.importnoanswer ? DEFAULTIMPORTNOANSWERARGUMENTS | |
439 | + : /*Type == CommandType.import ?*/DEFAULTIMPORTARGUMENTS | |
440 | + ); | |
441 | + ArgumentParameters = (commandXml.Attribute(XName.Get(nameof(ArgumentParameters)))?.Value)??""; | |
442 | + var plist = ArgumentParameters.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); | |
443 | + foreach (var p in plist) | |
444 | + { | |
445 | + var aname = p.Split('=')[0]; | |
446 | + string pvalue=""; try { pvalue = p.Split('=')[1]; } catch { } | |
447 | + var po = new ASEConfigCommandParameter(); | |
448 | + po.Name = aname; | |
449 | + if (pvalue.StartsWith("?")) { po.Interactive = true; po.Prompt = pvalue.Substring(1); } | |
450 | + else { po.Value = pvalue; } | |
451 | + ArgumentParameterList.Add(po); | |
452 | + } | |
453 | + } | |
454 | + public bool EqualsTo(string selection) | |
455 | + { | |
456 | + return Key.ToLower()==selection.ToLower(); | |
457 | + } | |
458 | + public List<string> GetIpList() | |
459 | + { | |
460 | + return AseIpResolved.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList(); | |
461 | + } | |
462 | + public Tuple<string, string, string> GetOneLineInfo(int keylength,int desclength) | |
463 | + { | |
464 | + if (keylength == 0) keylength = 6; | |
465 | + if (desclength == 0) desclength = 20; | |
466 | + string keystring = (Key + new string(' ', keylength)).Substring(0, keylength); | |
467 | + string descstring = (Description + new string(' ', desclength)).Substring(0, desclength); | |
468 | + return Tuple.Create(keystring, descstring, $"(Type={Type},CfgFile={ConfigFile},Ase:Ip={AseIp},UN={AseUsername},PSW={AsePassword})"); | |
469 | + } | |
470 | + public void Ini() | |
471 | + { | |
472 | + AseIpResolved = AseIp; | |
473 | + AseUsernameResolved=AseUsername; | |
474 | + AsePasswordResolved = AsePassword; | |
475 | + ConfigFileResolved = ConfigFile; | |
476 | + ArgumentsResolved = Arguments; | |
477 | + } | |
478 | + public bool SetArgumentParameters() | |
479 | + { | |
480 | + AseUsernameResolved = ASEConfigCommandParameter.SetCurrentValue(AseUsername, nameof(AseUsername)); | |
481 | + AsePasswordResolved = ASEConfigCommandParameter.SetCurrentValue(AsePassword, nameof(AsePassword)); | |
482 | + ConfigFileResolved = ASEConfigCommandParameter.SetCurrentValue(ConfigFile, nameof(ConfigFile)); | |
483 | + foreach (var p in ArgumentParameterList) { p.SetCurrentValue(); if (p.Value == null) return false; } | |
484 | + AseIpResolved = ASEConfigCommandParameter.SetCurrentValue(AseIp, nameof(AseIp)); | |
485 | + return true; | |
486 | + } | |
487 | + public bool DisplayArgumentParameters() | |
488 | + { | |
489 | + ColorConsole.WriteLine("Command parameters:"); | |
490 | + ColorConsole.WriteLine(AseIpResolved,prefix:$"{nameof(AseIp)}="); | |
491 | + ColorConsole.WriteLine(AseUsernameResolved, prefix: $"{nameof(AseUsername)}="); | |
492 | + ColorConsole.WriteLine(AsePasswordResolved, prefix: $"{nameof(AsePassword)}="); | |
493 | + ColorConsole.WriteLine(ConfigFileResolved, prefix: $"{nameof(ConfigFile)}="); | |
494 | + foreach (var p in ArgumentParameterList) { ColorConsole.WriteLine($"{p.Name}={p.Value}"); } | |
495 | + var answer = ColorConsole.ReadLine("Execute command with these parameters?", defaultvalue: "no", validitylist: new List<string>() { "yes", "no", }, bracket: "[]"); | |
496 | + return answer.ToLower() == "yes"; | |
497 | + } | |
498 | + public bool Resolve(string currentip) | |
499 | + { | |
500 | + //resolve arguments | |
501 | + foreach (var a in ArgumentParameterList) | |
502 | + { | |
503 | + ArgumentsResolved = ArgumentsResolved.Replace($"{{{a.Name}}}", a.Value); | |
504 | + ConfigFileResolved = ConfigFileResolved.Replace($"{{{a.Name}}}", a.Value); | |
505 | + currentip = currentip.Replace($"{{{a.Name}}}", a.Value); | |
506 | + AseUsernameResolved = AseUsernameResolved.Replace($"{{{a.Name}}}", a.Value); | |
507 | + AsePasswordResolved = AsePasswordResolved.Replace($"{{{a.Name}}}", a.Value); | |
508 | + } | |
509 | + ConfigFileResolved = ConfigFileResolved.Replace($"{{{nameof(AseIp).ToUpper()}}}", currentip); | |
510 | + ArgumentsResolved = ArgumentsResolved.Replace($"{{{nameof(AseIp).ToUpper()}}}", currentip); | |
511 | + ArgumentsResolved = ArgumentsResolved.Replace($"{{{nameof(AseUsername).ToUpper()}}}", AseUsernameResolved); | |
512 | + ArgumentsResolved = ArgumentsResolved.Replace($"{{{nameof(AsePassword).ToUpper()}}}", AsePasswordResolved); | |
513 | + if (Type== CommandType.exportpartial) ArgumentsResolved = ArgumentsResolved.Replace($"{{{nameof(ConfigGroupName).ToUpper()}}}", ConfigGroupName); | |
514 | + if (Type == CommandType.exportpartial) ArgumentsResolved = ArgumentsResolved.Replace($"{{{nameof(ConfigGroupInstance).ToUpper()}}}", ConfigGroupInstance); | |
515 | + | |
516 | + //resolve config files | |
517 | + if (Type == CommandType.import || Type == CommandType.importnoanswer) | |
518 | + { | |
519 | + try | |
520 | + { | |
521 | + var cfgfilecontent = System.IO.File.ReadAllText(ConfigFileResolved); | |
522 | + foreach (var a in ArgumentParameterList) | |
523 | + { | |
524 | + cfgfilecontent = cfgfilecontent.Replace($"{{{a.Name}}}", a.Value); | |
525 | + } | |
526 | + cfgfilecontent = cfgfilecontent.Replace($"{{{nameof(AseIp).ToUpper()}}}", currentip); | |
527 | + cfgfilecontent = cfgfilecontent.Replace($"{{{nameof(ConfigFile).ToUpper()}}}", ConfigFileResolved); | |
528 | + var tempfilename = Path.GetTempFileName(); | |
529 | + System.IO.File.WriteAllText(tempfilename, cfgfilecontent); | |
530 | + ArgumentsResolved = ArgumentsResolved.Replace($"{{{nameof(ConfigFile).ToUpper()}}}", tempfilename); | |
531 | + return true; | |
532 | + } | |
533 | + catch (Exception ex) | |
534 | + { | |
535 | + ColorConsole.WriteLine(ex.Message, f: ConsoleColor.Red); | |
536 | + return false; | |
537 | + } | |
538 | + } | |
539 | + return true; | |
540 | + } | |
541 | + public void Execute() | |
542 | + { | |
543 | + Console.WriteLine($"Executing:{Exe} {ArgumentsResolved}"); | |
544 | + using (System.Diagnostics.Process pProcess = new System.Diagnostics.Process()) | |
545 | + { | |
546 | + Process ExternalProcess = new Process(); | |
547 | + ExternalProcess.StartInfo.FileName = Exe; | |
548 | + ExternalProcess.StartInfo.UseShellExecute = false; | |
549 | + ExternalProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; | |
550 | + | |
551 | + ExternalProcess.StartInfo.RedirectStandardOutput = true; | |
552 | + ExternalProcess.OutputDataReceived += (sender, args) => Console.WriteLine("received output: {0}", args.Data); | |
553 | + | |
554 | + ExternalProcess.StartInfo.Arguments = ArgumentsResolved; | |
555 | + ExternalProcess.Start(); | |
556 | + ExternalProcess.BeginOutputReadLine(); | |
557 | + ExternalProcess.WaitForExit(-1); | |
558 | + } | |
559 | + } | |
560 | + public string Key; | |
561 | + private CommandType Type; | |
562 | + private string ConfigGroupName; | |
563 | + private string ConfigGroupInstance; | |
564 | + private string AseUsername; | |
565 | + private string AseUsernameResolved; | |
566 | + private string AsePassword; | |
567 | + private string AsePasswordResolved; | |
568 | + public string Description; | |
569 | + private string Exe; | |
570 | + private string ExeDir; | |
571 | + private string ConfigFile; | |
572 | + private string ConfigFileResolved; | |
573 | + private string AseIp; | |
574 | + private string AseIpResolved; | |
575 | + private string Arguments; | |
576 | + private string ArgumentsResolved; | |
577 | + private string ArgumentParameters; | |
578 | + private List<ASEConfigCommandParameter> ArgumentParameterList = new List<ASEConfigCommandParameter>(); | |
579 | + } | |
580 | + private class ASEConfigCommandParameter | |
581 | + { | |
582 | + public string Name; | |
583 | + public string Value=""; | |
584 | + public bool Interactive=false; | |
585 | + public string Prompt=""; | |
586 | + public string SetCurrentValue() { return SetCurrentValue(Interactive,Value,Prompt,Name); } | |
587 | + public static string SetCurrentValue(string valueorinteractive, string name) | |
588 | + { | |
589 | + string prompt = null; | |
590 | + string value = null; | |
591 | + bool interactive = valueorinteractive.StartsWith("?"); | |
592 | + if (interactive) { prompt = valueorinteractive == "?" ? "" : valueorinteractive.Substring(1); } else { value = valueorinteractive; } | |
593 | + return SetCurrentValue(interactive,value,prompt,name); | |
594 | + } | |
595 | + private static string SetCurrentValue(bool interactive, string value,string prompt, string name) | |
596 | + { | |
597 | + if (!interactive) return value; | |
598 | + string prompttext = string.IsNullOrWhiteSpace(prompt) ? $"Enter {name}" : $"{prompt} ({name})"; | |
599 | + ColorConsole.WriteLine(prompttext,ConsoleColor.Yellow); | |
600 | + ColorConsole.WriteLine($"Enter NONE (or nothing) for no value!", ConsoleColor.Gray); | |
601 | + value = ColorConsole.ReadLine(); | |
602 | + value = value.ToLower() == "ex" ? null | |
603 | + : value.ToLower() == "none" ? "<None>" | |
604 | + : value == "" ? "<None>" | |
605 | + : value; | |
606 | + return value; | |
607 | + } | |
608 | + } | |
609 | + #endregion ASEConfig | |
610 | + | |
367 | 611 | #region Tool templates |
368 | - private static object Tool2(object parameter, object o) | |
612 | + private static object Tool(object parameter, object o) | |
369 | 613 | { |
370 | 614 | var config = (parameter as Menu.ExecutorParameter).GetConfig<MaintenanceToolsXmlProcessor>(); |
371 | - var regexptesterconfig = config.RegexpTesterConfig; | |
372 | - ColorConsole.ReadLine($"{nameof(Tool2)} is not ready yet...", ConsoleColor.Yellow); | |
615 | + var regexptesterconfig = config.ToolConfigXml; | |
616 | + ColorConsole.ReadLine($"{nameof(Tool)} is not ready yet...", ConsoleColor.Yellow); | |
373 | 617 | return o; |
374 | 618 | } |
375 | 619 | #endregion Tool templates |
... | ... | @@ -406,8 +650,10 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MaintenanceToolManagerNS |
406 | 650 | public bool WaitForExit=XmlStructure.ExternalUtility.Attributes.WaitForExit.Values.DEFAULT; |
407 | 651 | public bool Valid; |
408 | 652 | } |
409 | - public XElement RegexpTesterConfig; | |
653 | + public XElement RegexpTesterConfigXml; | |
410 | 654 | public XElement PingerConfigXml; |
655 | + public XElement ASEConfigXml; | |
656 | + public XElement ToolConfigXml; | |
411 | 657 | public class IPAddressParsingResult |
412 | 658 | { |
413 | 659 | public IPAddress IP; |
... | ... | @@ -421,7 +667,9 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MaintenanceToolManagerNS |
421 | 667 | #region constructor |
422 | 668 | public MaintenanceToolsXmlProcessor(string xmlcs, string basefolder, string lcid) : base(xmlcs, basefolder, lcid, null) |
423 | 669 | { |
424 | - RegexpTesterConfig = GetXElement(nameof(XmlStructure.RegexpTester)); | |
670 | + RegexpTesterConfigXml = GetXElement(nameof(XmlStructure.RegexpTester)); | |
671 | + ASEConfigXml = GetXElement(nameof(XmlStructure.ASEConfig)); | |
672 | + ToolConfigXml = GetXElement(nameof(XmlStructure.ToolConfig)); | |
425 | 673 | |
426 | 674 | var TcpIpTesterXml = GetXElement(nameof(XmlStructure.TcpIpTester)); |
427 | 675 | if (TcpIpTesterXml != null) |
... | ... | @@ -451,6 +699,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.MaintenanceToolManagerNS |
451 | 699 | public static class XmlStructure |
452 | 700 | { |
453 | 701 | public static class RegexpTester { } |
702 | + public static class ASEConfig { } | |
703 | + public static class ToolConfig { } | |
454 | 704 | public static class ExternalUtility |
455 | 705 | { |
456 | 706 | public static class Attributes | ... | ... |
Vrh.Log4Pro.MaintenanceConsole/Properties/AssemblyInfo.cs
... | ... | @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; |
32 | 32 | // You can specify all the values or you can default the Build and Revision Numbers |
33 | 33 | // by using the '*' as shown below: |
34 | 34 | // [assembly: AssemblyVersion("1.0.*")] |
35 | -[assembly: AssemblyVersion("1.18.1.0")] | |
36 | -[assembly: AssemblyFileVersion("1.18.1.0")] | |
35 | +[assembly: AssemblyVersion("1.19.0.0")] | |
36 | +[assembly: AssemblyFileVersion("1.19.0.0")] | ... | ... |