예제 #1
0
        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())
            });
        }
예제 #2
0
        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();
                }
            }
        }