private static void Main(string[] args) { Assembly thisAssem = typeof(Program).Assembly; AssemblyName thisAssemName = thisAssem.GetName(); Version ver = thisAssemName.Version; Console.WriteLine(thisAssemName.Name); Console.WriteLine("ver: " + ver.ToString()); // start diagnostics for logevent and heatbeats.... Common.MessageQueue.Diagnostics.Initialize(GlobalValues.ServiceName(), ver.ToString()); // start the request server (for handling incomming requests) var server = new Common.MessageQueue.RequestServer(new System.Collections.Generic.List <MessageQueueConfiguration>() { ClusterConfig, OrganisationConfig, Monosoft.Common.TokenHandler.TokenEventHandler.InvalidateConfig(GlobalValues.ServiceName()) }); }
private static void Main(string[] args) { Assembly thisAssem = typeof(Program).Assembly; AssemblyName thisAssemName = thisAssem.GetName(); Version ver = thisAssemName.Version; Console.WriteLine(thisAssemName.Name); Console.WriteLine("ver: " + ver.ToString()); // start diagnostics for logevent and heatbeats.... Common.MessageQueue.Diagnostics.Initialize(GlobalValues.ServiceName(), ver.ToString()); var settings = ZooKeeperDefinition.LoadFromDisk(); try { while (true) { var server = new Common.MessageQueue.RequestServer( new System.Collections.Generic.List <MessageQueueConfiguration>() { ZookeeperConfig, Monosoft.Common.TokenHandler.TokenEventHandler.InvalidateConfig(GlobalValues.ServiceName()) }, 10); foreach (var s in settings.Services) { string directory = Path.Combine(Environment.CurrentDirectory, $"services/{s.ServiceInfo.Id}"); ProgamVersion version = new ProgamVersion("0.0.0.0"); var versions = ServiceProgramVersion.FindLocalVersions(s.ServiceInfo.Id); if (versions.Any()) { version = versions.FirstOrDefault(); } ServiceProgramVersion program = DownloadNewVersion(s, version); bool restartNeeded = InstallNewVersion(directory, program); if (program != null) {// New version installed! use the new version version = program.Version; } string executeableDir = string.Format($"./services/{s.ServiceInfo.Id}/{version.Version}/"); string executeableName = string.Empty; if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { executeableName = string.Format($"{s.ServiceInfo.Name}"); } else { executeableName = string.Format($"{s.ServiceInfo.Name}.exe"); } if (restartNeeded && RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { // give access to the executable on linux... Console.WriteLine("Execute: sudo chmod 777 on " + executeableDir + executeableName); System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo("sudo", $"chmod 777 {executeableDir+executeableName}") { UseShellExecute = false }); } // start if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { var runningProcess = manager.Where(p => p.Service.Id == s.ServiceInfo.Id).FirstOrDefault(); if (runningProcess == null) { Console.WriteLine($"{s.ServiceInfo.Name} isnt running, starting"); Console.WriteLine("Execute: " + executeableDir + executeableName); var process = System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(executeableDir + executeableName) { WorkingDirectory = executeableDir, UseShellExecute = false }); manager.Add(new ProcessManager() { Process = process, Service = s.ServiceInfo }); } else if (runningProcess.Process.HasExited == true) { Console.WriteLine($"{s.ServiceInfo.Name} has exited, restarting"); // TODO: report exitcode!!! Console.WriteLine("Execute: " + executeableDir + executeableName); // RESTART runningProcess.Process = System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(executeableDir + executeableName) { WorkingDirectory = executeableDir, UseShellExecute = false }); } else if (restartNeeded) { Console.WriteLine("RESTART NEEDED"); Console.WriteLine("Execute: " + executeableDir + executeableName); runningProcess.Process.Kill(); // TODO: AUCH: close er nok bedre - men så skal vi sikre at alle services faktisk tillader dette... runningProcess.Process = System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(executeableDir + executeableName) { WorkingDirectory = executeableDir, UseShellExecute = false }); } } } int seconds = 1000; int minutes = 60 * seconds; int hours = 60 * minutes; Console.WriteLine("Sleep for 1 hour - before recheck"); System.Threading.Thread.Sleep(1 * hours); } } finally { foreach (var s in settings.Services) { var runningProcess = manager.Where(p => p.Service.Id == s.ServiceInfo.Id).FirstOrDefault(); Console.WriteLine("Killing: " + s.ServiceInfo.Name); runningProcess.Process.Kill(); } } }