コード例 #1
0
        static void Main(string[] args)
        {
            string configDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "AutoDarkMode");

            // Targets where to log to: File and Console
            NLog.Targets.FileTarget logfile = new("logfile")
            {
                FileName = Path.Combine(configDir, "updater.log"),
                Layout   = @"${date:format=yyyy-MM-dd HH\:mm\:ss} | ${level} | " +
                           "${callsite:includeNamespace=False:" +
                           "cleanNamesOfAnonymousDelegates=true:" +
                           "cleanNamesOfAsyncContinuations=true}: ${message} ${exception:format=ShortType,Message,Method:separator= > }"
            };
            NLog.Targets.ColoredConsoleTarget logconsole = new("logconsole")
            {
                Layout = @"${date:format=yyyy-MM-dd HH\:mm\:ss} | ${level} | " +
                         "${callsite:includeNamespace=False:" +
                         "cleanNamesOfAnonymousDelegates=true:" +
                         "cleanNamesOfAsyncContinuations=true}: ${message} ${exception:format=ShortType,Message,Method:separator= > }"
            };

            NLog.Config.LoggingConfiguration logConfig = new();
            logConfig.AddRule(LogLevel.Debug, LogLevel.Fatal, logconsole);
            logConfig.AddRule(LogLevel.Debug, LogLevel.Fatal, logfile);
            LogManager.Configuration = logConfig;

            Logger.Info($"Auto Dark Mode Updater {Version.Major}.{Version.Minor}.{Version.Build}");

            bool serviceClosed = false;

            try
            {
                Logger.Info("shutting down service");
                string      result   = client.SendMessageAndGetReply(Command.Shutdown);
                ApiResponse response = ApiResponse.FromString(result);
                if (response.StatusCode == StatusCode.Timeout)
                {
                    serviceClosed = true;
                }
            }
            catch (Exception ex)
            {
                Logger.Warn(ex, "could not cleanly shut down service");
            }

            if (!serviceClosed)
            {
                Logger.Info($"waiting for service to stop");
                try
                {
                    for (int i = 0; i < 5; i++)
                    {
                        string      result   = client.SendMessageAndGetReply(Command.Alive, 1);
                        ApiResponse response = ApiResponse.FromString(result);
                        if (response.StatusCode != StatusCode.Timeout)
                        {
                            Thread.Sleep(500);
                        }
                        else
                        {
                            break;
                        }
                    }
                }
                catch (Exception ex)
                {
                    Logger.Error(ex, "error while waiting for service process to end:");
                }
            }

            try
            {
                Process[] pSvc = Process.GetProcessesByName("AutoDarkModeSvc");
                if (pSvc.Length != 0)
                {
                    Logger.Warn("service still running, force stopping");
                    pSvc[0].Kill();
                }
                Logger.Info("service stop confirmed");

                Process[] pShell = Process.GetProcessesByName("AutoDarkModeShell");
                Process[] pApp   = Process.GetProcessesByName("AutoDarkModeApp");
                if (pShell.Length != 0)
                {
                    Logger.Info("stopping shell");
                    pShell[0].Kill();
                    restoreShell = true;
                }
                if (pApp.Length != 0)
                {
                    Logger.Info("stopping app");
                    pApp[0].Kill();
                    restoreApp = true;
                }
            }
            catch (Exception ex)
            {
                Logger.Warn(ex, "other auto dark mode components still running, skipping update");
                Relaunch(restoreShell, restoreApp, true);
                Environment.Exit(-2);
            }

            if (args.Length > 2)
            {
                if (args[0].Contains("--notify"))
                {
                    restoreShell = args[1].Equals(true.ToString(), StringComparison.Ordinal);
                    restoreApp   = args[2].Equals(true.ToString(), StringComparison.Ordinal);
                }
            }

            MoveToTemp();
            CopyNewFiles();
            UpdateInnoInstallerString();
            Cleanup();
            Relaunch(restoreShell, restoreApp, false);

            try
            {
                FileVersionInfo currentVersion = FileVersionInfo.GetVersionInfo(Extensions.ExecutionPathSvc);
                if (currentVersion != null)
                {
                    Logger.Info($"patch complete, installed version: {currentVersion.FileVersion}");
                }
            }
            catch (Exception ex)
            {
                Logger.Warn(ex, "could not read installed version:");
                Logger.Info("patch complete, starting service");
            }
        }
コード例 #2
0
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            if (!Mutex.WaitOne(TimeSpan.FromMilliseconds(100)))
            {
                Shutdown();
            }

            List <string> args = new List <string>();

            if (e.Args.Length > 0)
            {
                args = new List <string>(e.Args);
            }
            if (args.Count > 0 && args.Contains("/debug"))
            {
                debug = true;
                args.Remove("/debug");
            }

            StartService();
            int  maxTries    = 5;
            int  tries       = 0;
            bool heartBeatOK = false;

            while (tries < maxTries && !heartBeatOK)
            {
                tries++;
                heartBeatOK = commandClient.SendMessage(Command.Alive);
            }
            if (maxTries == tries && !heartBeatOK)
            {
                string error = "could not get a heartbeat from the backend. Check if AutoDarkModeSvc.exe is running and try again";
                MsgBox msg   = new MsgBox(error, AutoDarkModeApp.Properties.Resources.errorOcurredTitle, "error", "close")
                {
                };
                msg.ShowDialog();
                return;
            }
            //handle command line arguments
            if (args.Count > 0)
            {
                Thread.Sleep(1000);
                Mutex.Dispose();
                Mutex = new Mutex(true, "7f326fe1-181c-414f-b7f1-0df4baa578a7");
                Mutex.WaitOne(TimeSpan.FromMilliseconds(100));
                foreach (var value in args)
                {
                    if (value == "/switch")
                    {
                        commandClient.SendMessage(value);
                    }
                    else if (value == "/swap")
                    {
                        commandClient.SendMessage(value);
                    }
                    else if (value == "/dark")
                    {
                        commandClient.SendMessage(value);
                    }
                    else if (value == "/light")
                    {
                        commandClient.SendMessage(value);
                    }
                    else if (value == "/noForce")
                    {
                        commandClient.SendMessage(value);
                    }
                    else if (value == "/update")
                    {
                        var result = commandClient.SendMessageAndGetReply(value);

                        if (result != Response.Err)
                        {
                            Updater updater = new Updater(true);
                            updater.ParseResponse(result);
                        }
                    }
                    else if (value == "/location")
                    {
                        commandClient.SendMessage(Command.Location);
                    }
                    else if (value == "/removeAutostart")
                    {
                        RegeditHandler regEditHandler = new RegeditHandler();
                        regEditHandler.RemoveAutoStart();
                    }
                    else if (value == "/shutdownService")
                    {
                        commandClient.SendMessage(Command.Shutdown);
                    }
                    else if (value == "/pipeclienttest")
                    {
                        //ICommandClient pc = new PipeClient(Tools.DefaultPipeName);
                        bool result = commandClient.SendMessage(Command.Location);
                        Console.Out.WriteLine(result);
                    }
                    NetMQConfig.Cleanup();
                    Mutex.Dispose();
                    Shutdown();
                }
            }
            else
            {
                MainWindow mainWin = new MainWindow();
                mainWin.Show();
            }
        }