diff --git a/Vrh.Log4Pro.MaintenanceConsole/Manager - WindowsServiceManager.cs b/Vrh.Log4Pro.MaintenanceConsole/Manager - WindowsServiceManager.cs index 43d866f..8b0bf33 100644 --- a/Vrh.Log4Pro.MaintenanceConsole/Manager - WindowsServiceManager.cs +++ b/Vrh.Log4Pro.MaintenanceConsole/Manager - WindowsServiceManager.cs @@ -305,13 +305,13 @@ namespace Vrh.Log4Pro.MaintenanceConsole.WindowsServiceManagerNS ColorConsole.Write($", User:"); ColorConsole.Write($"{ws.StartName}", ConsoleColor.White); ColorConsole.WriteLine(); - return ws.DisplayName+ws.Description; + return ws.DisplayName + ws.Description; } else if (lineix == 1) { ColorConsole.Write($"Win service:"); ColorConsole.Write($"{ws.Name}", ConsoleColor.Cyan); - var fc2 = + var fc2 = ws.Status.Contains(nameof(WindowsService.WmiServiceStatus.OK)) ? ConsoleColor.Green : ws.Status.Contains(nameof(WindowsService.WmiServiceStatus.Unknown)) ? ConsoleColor.Red : ws.Status.Contains(nameof(WindowsService.WmiServiceStatus.Error)) ? ConsoleColor.Red @@ -323,12 +323,15 @@ namespace Vrh.Log4Pro.MaintenanceConsole.WindowsServiceManagerNS : ws.State.Contains(nameof(WindowsService.WmiServiceState.Unknown)) ? ConsoleColor.Red : ws.State.Contains(nameof(WindowsService.WmiServiceState.Unregistered)) ? ConsoleColor.Red : ConsoleColor.Yellow; + var wsstatetext = + ws.State.Contains(nameof(WindowsService.WmiServiceState.Running)) ? ws.State + : ws.State.Contains(nameof(WindowsService.WmiServiceState.Unknown)) ? ws.State + : ws.State.Contains(nameof(WindowsService.WmiServiceState.Unregistered)) ? ws.State + : ws.State; ColorConsole.Write($" / "); - ColorConsole.Write($"{ws.State}", fc0); + ColorConsole.Write($"{wsstatetext}", fc0); ColorConsole.Write($")"); - ColorConsole.Write($", StartMode:"); - ColorConsole.Write($"{ws.StartMode}", ConsoleColor.Cyan); - if(ws.Status==nameof(WindowsService.WmiServiceStatus.OK) && ws.State != nameof(WindowsService.WmiServiceState.Stopped) && ws.State != nameof(WindowsService.WmiServiceState.Unknown)) + if (ws.Status == nameof(WindowsService.WmiServiceStatus.OK) && ws.State != nameof(WindowsService.WmiServiceState.Stopped) && ws.State != nameof(WindowsService.WmiServiceState.Unknown)) { ColorConsole.Write($", Priority:"); ColorConsole.Write($"{ws.PriorityClass}", ConsoleColor.White); @@ -340,23 +343,55 @@ namespace Vrh.Log4Pro.MaintenanceConsole.WindowsServiceManagerNS } else if (lineix == 2) { + ColorConsole.Write($"Service StartMode:"); + ColorConsole.Write($"{ws.StartMode}", ConsoleColor.Cyan); + if (ws.State.Contains(nameof(WindowsService.WmiServiceState.Running))) + { + var uptime = (DateTime.Now - ws.ProcessLastStartTime); + var uptimetext = "" + + (Math.Truncate(uptime.TotalDays) == 0 ? "" : (string.Format("{0:%d}", uptime) + " days ")) + + (Math.Truncate(uptime.TotalHours) == 0 ? "" : (string.Format("{0:%h}", uptime) + " hours ")) + + (Math.Truncate(uptime.TotalMinutes) == 0 ? "" : (string.Format("{0:%m}", uptime) + " minutes")); + var uptimecolor = uptime.TotalHours > 72 ? ConsoleColor.Green : uptime.TotalHours > 24 ? ConsoleColor.White : uptime.TotalHours > 12 ? ConsoleColor.Yellow : ConsoleColor.Red; + ColorConsole.Write($", last started at:"); + ColorConsole.Write($"{ws.ProcessLastStartTime}", uptimecolor); + ColorConsole.Write($", up time since then:"); + ColorConsole.Write(uptimetext, uptimecolor); + } + else if (ws.ProcessLastExitTime.HasValue) + { + var downtime = (DateTime.Now - ws.ProcessLastExitTime.Value); + var downtimetext = "" + + (Math.Truncate(downtime.TotalDays) == 0 ? "" : (string.Format("{0:%d}", downtime) + " days ")) + + (Math.Truncate(downtime.TotalHours) == 0 ? "" : (string.Format("{0:%h}", downtime) + " hours ")) + + (Math.Truncate(downtime.TotalMinutes) == 0 ? "" : (string.Format("{0:%m}", downtime) + " minutes")); + ColorConsole.Write($", last exited at:"); + ColorConsole.Write($"{ws.ProcessLastExitTime}", ConsoleColor.Red); + ColorConsole.Write($", down time since then:"); + ColorConsole.Write(downtimetext, ConsoleColor.Red); + } + ColorConsole.WriteLine(); + return " "; + } + else if (lineix == 3) + { if (string.IsNullOrEmpty(ws.PathName)) { return ""; } var cmdarray = CommandLineParser.SplitArgs(ws.PathName).ToArray(); ColorConsole.Write($"Start command:"); ColorConsole.WriteLine($"{cmdarray[0]}", ConsoleColor.White); return ws.PathName; } - else if (lineix == 3) + else if (lineix == 4) { if (string.IsNullOrEmpty(ws.PathName)) { return ""; } var cmdparams = CommandLineParser.SplitArgs(ws.PathName).Skip(1).ToArray(); - if (cmdparams.Length==0) { return ""; } - var cmdparamsstr = string.Join("][", cmdparams); + if (cmdparams.Length == 0) { return ""; } + var cmdparamsstr = "["+string.Join("][", cmdparams)+"]"; ColorConsole.Write($"Start arguments:"); - ColorConsole.WriteLine($"[{cmdparamsstr}]", ConsoleColor.White); + ColorConsole.WriteLine(cmdparamsstr, ConsoleColor.White); return cmdparamsstr; } - else if (lineix == 4) + else if (lineix == 5) { ColorConsole.WriteLine(); return " "; @@ -711,6 +746,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.WindowsServiceManagerNS } #endregion WindowsServiceManagerCore class + #region WindowsServiceManagerXmlProcessor class public class WindowsServiceManagerXmlProcessor : XmlParser { @@ -786,6 +822,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole.WindowsServiceManagerNS public List ThisDependsOn; public List ServicesDependOnThis; public int ProcessId; + public DateTime ProcessLastStartTime; + public DateTime? ProcessLastExitTime; public ServiceStartMode StartMode; public string State; public string Status; @@ -907,7 +945,10 @@ namespace Vrh.Log4Pro.MaintenanceConsole.WindowsServiceManagerNS if (this.State != nameof(WmiServiceState.Stopped)) { this.ProcessId = Convert.ToInt32(wmiService[nameof(WindowsService.ProcessId)]); - this.PriorityClass = Process.GetProcessById(this.ProcessId).PriorityClass.ToString(); + var thisprocess = Process.GetProcessById(this.ProcessId); + this.ProcessLastStartTime = thisprocess.StartTime; + this.ProcessLastExitTime = thisprocess.HasExited?thisprocess.ExitTime:(DateTime?)null; + this.PriorityClass = thisprocess.PriorityClass.ToString(); } } } diff --git a/Vrh.Log4Pro.MaintenanceConsole/Program.cs b/Vrh.Log4Pro.MaintenanceConsole/Program.cs index d9efbfa..e1bc149 100644 --- a/Vrh.Log4Pro.MaintenanceConsole/Program.cs +++ b/Vrh.Log4Pro.MaintenanceConsole/Program.cs @@ -39,6 +39,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole { static void Main(string[] args) { + //TESTS.TimeSpanFormatTest(); //TESTS.MSMQTest(); //return; var forcedmodulekey = CommandLine.GetCommandLineArgument(args, CLP.CMD_MODULE); @@ -94,6 +95,16 @@ namespace Vrh.Log4Pro.MaintenanceConsole } public static class TESTS { + public static void TimeSpanFormatTest() + { + var uptime = new TimeSpan(3, 4, 15, 33); + var uptimetext0 = uptime.ToString("%d") + " days "; + var uptimetext1 = string.Format("{0:%d}", uptime) + " days "; + var uptimetext2 = string.Format("{0:%h}", uptime) + " hours"; + var uptimetext3 = string.Format("{0:%m}", uptime) + " minutes"; + Console.WriteLine(uptimetext1+uptimetext2+ uptimetext3); + Console.ReadKey(); + } public static void GetWorkingProcesses() { using (ServerManager manager = new ServerManager()) diff --git a/Vrh.Log4Pro.MaintenanceConsole/Properties/AssemblyInfo.cs b/Vrh.Log4Pro.MaintenanceConsole/Properties/AssemblyInfo.cs index ff10cdb..7f35074 100644 --- a/Vrh.Log4Pro.MaintenanceConsole/Properties/AssemblyInfo.cs +++ b/Vrh.Log4Pro.MaintenanceConsole/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.22.2.0")] -[assembly: AssemblyFileVersion("1.22.2.0")] +[assembly: AssemblyVersion("1.22.3.0")] +[assembly: AssemblyFileVersion("1.22.3.0")] -- libgit2 0.21.2