Example #1
0
        string ProcessRestart(string command)
        {
            // 子参数
            string param = command.Substring("restart".Length).Trim().ToLower();

            if ( // string.IsNullOrEmpty(param)
                param == "computer")
            {
                // 重启电脑
                Task.Run(async() =>
                {
                    try
                    {
                        // 为 dp2ssl 开机后自动重启预先设定好 cmdlineparam.txt 文件
                        WriteParameterFile();

                        await Task.Delay(1000);
                        // https://stackoverflow.com/questions/4286354/restart-computer-from-winforms-app
                        ProcessStartInfo proc = new ProcessStartInfo();
                        proc.WindowStyle      = ProcessWindowStyle.Hidden;
                        proc.FileName         = "cmd";
                        proc.Arguments        = "/C shutdown -f -r";
                        Process.Start(proc);
                    }
                    catch
                    {
                    }
                });
                return("服务器将在一秒后重新启动");
            }
            if (param != null && param.StartsWith("dp2ssl"))
            {
                // 子参数。默认 silently
                bool silently = true;
                {
                    string arg = param.Substring("dp2ssl".Length).Trim();
                    if (arg != null && arg.StartsWith("interact"))
                    {
                        silently = false;
                    }
                }

                // 重启 dp2ssl
                ExitProcess("dp2SSL", false);
                Thread.Sleep(5000);
                if (HasModuleStarted(MutexName) == true)
                {
                    ExitProcess("dp2SSL", true);
                }

                try
                {
                    // 启动
                    // StartModule(ShortcutPath, "");
                    // Process.Start("c:\\dp2ssl\\dp2ssl.exe");
                    string exe_path1 = "c:\\dp2ssl\\greensetup.exe";
                    string exe_path2 = "c:\\dp2ssl\\dp2ssl.exe";
                    if (File.Exists(exe_path1))
                    {
                        // 注意命令行参数第一个字符应该是空格
                        ProcessExtensions.StartProcessAsCurrentUser(exe_path1,
                                                                    silently ? " silently" : "");
                    }
                    else if (File.Exists(exe_path2))
                    {
                        // 启动之前,检查 .zip 是否已经展开
                        {
                            string binDir = "c:\\dp2ssl";
                            // *** 检查状态文件
                            // result.Value
                            //      -1  出错
                            //      0   不存在状态文件
                            //      1   正在下载 .zip 过程中。.zip 不完整
                            //      2   当前 .zip 和 .exe 已经一样新
                            //      3   当前 .zip 比 .exe 要新。需要展开 .zip 进行更新安装
                            //      4   下载 .zip 失败。.zip 不完整
                            //      5   当前 .zip 比 .exe 要新,需要重启计算机以便展开的文件生效
                            var check_result = GreenInstaller.CheckStateFile(binDir);
                            // 展开
                            if (check_result.Value == 3)
                            {
                                var extract_result = GreenInstaller.ExtractFiles(binDir);
                                if (extract_result.Value == -1)
                                {
                                    // TODO: 写入错误日志
                                    WriteErrorLog($"展开压缩文件时出错: {extract_result.ErrorInfo}");
                                }
                            }
                        }

                        // 注意命令行参数第一个字符应该是空格
                        ProcessExtensions.StartProcessAsCurrentUser(exe_path2,
                                                                    silently ? " silently" : "");
                    }
                    else
                    {
                        return($"{exe_path1} 和 {exe_path2} 均未找到,无法启动");
                    }
                    return("dp2SSL 已经重新启动");
                }
                catch (Exception ex)
                {
                    return($"启动过程出现异常: {ExceptionUtil.GetDebugText(ex)}");
                }
            }

            return($"命令 '{command}' 未知的子参数 '{param}'");
        }
Example #2
0
        // 启动 dp2ssl.exe;或首次安装;或升级并启动 dp2ssl.exe
        // parameters:
        //      delayUpdate 是否让 dp2ssl.exe 启动起来再探测升级?
        //                  意思就是,== true,让 dp2ssl.exe 去负责升级,而 greensetup.exe 这里不负责下载升级(只负责展开下载好的 .zip)。这样的特点是启动速度快
        //                  == false,让 greensetup.exe 直接探测下载升级,缺点是 dp2ssl.exe 启动就晚一点
        //                  但首次安装的时候,则是 greensetup.exe 负责下载 .zip 文件并安装。因为此时 dp2ssl.exe 还并不存在
        async Task Start(bool delayUpdate)
        {
            // *** 检查 dp2ssl.exe 是否已经在运行
            if (GreenInstaller.HasModuleStarted("{75BAF3F0-FF7F-46BB-9ACD-8FE7429BF291}") == true)
            {
                ErrorBox("dp2SSL 已经启动了,无法重复启动");
                Application.Exit();
                return;
            }

            // testing
            // await Task.Delay(5000);

            // 延时 30 秒,避免上一个 dp2ssl.exe 尚未彻底退出。如果没有彻底退出,会导致本次展开 .zip 文件时候覆盖失败
            if (IsDelay())
            {
                // TODO: 出现 Splash 窗口或者文字提示请等待
                var old_style = this.progressBar1.Style;
                this.Invoke(new Action(() =>
                {
                    this.progressBar1.Style = ProgressBarStyle.Marquee;
                    this.label_message.Text = "请等待 ...";
                }));

                try
                {
                    // TODO: 可以改进为不断观察,等到另一个 dp2ssl.exe 如果退出则结束等待
                    await Task.Delay(TimeSpan.FromSeconds(30));
                }
                finally
                {
                    this.Invoke(new Action(() =>
                    {
                        this.progressBar1.Style = old_style;
                    }));
                }
            }

            string strExePath   = Path.Combine(_binDir, "dp2ssl.exe");
            bool   firstInstall = File.Exists(strExePath) == false;

            // *** 检查状态文件
            // result.Value
            //      -1  出错
            //      0   不存在状态文件
            //      1   正在下载 .zip 过程中。.zip 不完整
            //      2   当前 .zip 和 .exe 已经一样新
            //      3   当前 .zip 比 .exe 要新。需要展开 .zip 进行更新安装
            //      4   下载 .zip 失败。.zip 不完整
            //      5   当前 .zip 比 .exe 要新,需要重启计算机以便展开的文件生效
            var check_result = GreenInstaller.CheckStateFile(_binDir);

            GreenInstaller.WriteInfoLog($"检查状态文件。check_result:{check_result.ToString()}");

            // 展开,并启动 dp2ssl.exe
            if (check_result.Value == 3 ||
                check_result.Value == 0)    // 2020/9/11 增加
            {
                GreenInstaller.WriteInfoLog($"将此前已经下载的 .zip 文件,展开,并立即启动 dp2ssl.exe");

                // return:
                //      -1  出错
                //      0   成功。不需要 reboot
                //      2   成功,但需要立即重新启动计算机才能让复制的文件生效
                var extract_result = GreenInstaller.ExtractFiles(_binDir);

                GreenInstaller.WriteInfoLog($"展开文件。extract_result:{extract_result.ToString()}");

                if (extract_result.Value == -1)
                {
                    if (extract_result.ErrorCode == "sourceFileNotFound")
                    {
                        GreenInstaller.WriteInfoLog($"{extract_result.ErrorInfo}, 所以改为进行首次安装");
                        goto FIRST_INSTALL;
                    }
                    ErrorBox(extract_result.ErrorInfo);
                    return;
                }
                else if (extract_result.Value == 2)
                {
                    // 2020/9/11
                    GreenInstaller.WriteInfoLog($"展开过程中发现部分文件被锁定了无法覆盖,已经被写入特殊文件,需要等下次 Windows 重启以后才能生效。本次依然用当前可执行文件启动 dp2ssl.exe");
                    // ErrorBox("部分文件更新受阻,请立即重新启动 Windows");

                    // TODO: 需要有个命令行参数,让 dp2ssl.exe 启动起来后明显提示用户看到信息和状态,需要重启 Windows
                }
                await ProcessStart(strExePath);

                return;
            }

            /*
             * if (check_result.Value == 1
             || check_result.Value == 5)
             ||{
             || ErrorBox(check_result.ErrorInfo);
             || Application.Exit();
             || return;
             ||}
             */

            /*
             * Debugger.Launch();
             *
             * // 拷贝 greensetup.exe
             * string exePath = Assembly.GetExecutingAssembly().Location.ToLower();
             * string targetExePath = Path.Combine(_binDir, "greensetup.exe");
             * if (exePath.EndsWith("greensetup.exe")
             *  && File.Exists(targetExePath) == false
             *  && exePath.ToLower() != targetExePath.ToLower())
             * {
             *  MessageBox.Show(this, "copy greensetup.exe");
             *  Library.TryCreateDir(_binDir);
             *  File.Copy(exePath, targetExePath, true);
             * }
             * else
             *  MessageBox.Show(this, "not copy greensetup.exe");
             */

            if (firstInstall == false && delayUpdate)
            {
                GreenInstaller.WriteInfoLog($"非首次安装情形。立即启动 dp2ssl.exe");

                await ProcessStart(strExePath);

                return;
            }

FIRST_INSTALL:          // 第一次安装

            string style = "updateGreenSetupExe,debugInfo";

            if (delayUpdate == false)
            {
                style += ",clearStateFile";
            }
            if (firstInstall)
            {
                style += ",mustExpandZip";  // 无论是否有更新,都要展开两个 .zip 文件。因为 dp2ssl.exe 不存在,必须要展开 .zip 才能得到
            }
            GreenInstaller.WriteInfoLog($"style={style}");

            // *** 从 Web 升级
            double ratio = 1;
            // 从 Web 服务器安装或者升级绿色版
            // result.Value:
            //      -1  出错
            //      0   经过检查发现没有必要升级
            //      1   成功
            //      2   成功,但需要立即重新启动计算机才能让复制的文件生效
            var result = await GreenInstaller.InstallFromWeb(GreenInstaller.dp2ssl_weburl,
                                                             _binDir,
                                                             style,
                                                             //false,
                                                             //true,
                                                             _cancel.Token,
                                                             (double min, double max, double value, string text) =>
            {
                try
                {
                    this.Invoke(new Action(() =>
                    {
                        if (text != null)
                        {
                            label_message.Text = text;
                        }
                        if (min != -1)
                        {
                            progressBar1.Minimum = (Int32)min;
                        }
                        if (max != -1)
                        {
                            if (max <= Int32.MaxValue)
                            {
                                ratio = 1;
                                progressBar1.Maximum = (Int32)max;
                            }
                            else
                            {
                                ratio = Int32.MaxValue / max;
                                progressBar1.Maximum = Int32.MaxValue;
                            }
                        }
                        if (value != -1)
                        {
                            progressBar1.Value = (int)((double)value * ratio);
                        }
                    }));
                }
                catch
                {
                }
            });

            GreenInstaller.WriteInfoLog($"InstallFromWeb() 返回: \r\n{result.ToString()}");

            if (result.Value == -1)
            {
                if (result.ErrorCode == "System.Net.WebException")
                {
                    if (File.Exists(strExePath))
                    {
                        await ProcessStart(strExePath);

                        return;
                    }
                }
                ErrorBox(result.ErrorInfo);
                Application.Exit();
                return;
            }

            // result.Value == 2 要提醒重启 Windows 以完成安装
            if (result.Value == 2)
            {
                ErrorBox(result.ErrorInfo);
            }

            // TODO: 从 dp2ssl.exe 中取信息?

            // 首次安装成功
            if (firstInstall)
            {
                GreenInstaller.WriteInfoLog($"首次安装成功");

                // 创建桌面快捷方式
                GreenInstaller.CreateShortcut(
                    "desktop",
                    "dp2SSL 自助借还(绿色)",
                    "dp2SSL 自助借还(绿色)",
                    Path.Combine(_binDir, "greensetup.exe"));   // "dp2ssl.exe"

                GreenInstaller.CreateShortcut(
                    "startup",
                    "dp2SSL 自助借还(绿色)",
                    "dp2SSL 自助借还(绿色)",
                    Path.Combine(_binDir, "greensetup.exe")); // "dp2ssl.exe"

                // 迁移用户文件夹
                string sourceDirectory = Path.Combine(
                    Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
                    "dp2ssl");

                /*
                 * if (Directory.Exists(sourceDirectory))
                 * {
                 *  string targetDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "dp2\\dp2ssl");
                 *  if (Directory.Exists(targetDirectory) == false)
                 *  {
                 *      var move_result = GreenInstaller.MoveUserDirectory(sourceDirectory,
                 *          targetDirectory,
                 *          _binDir,
                 *          "maskSource");
                 *      GreenInstaller.WriteInfoLog($"迁移用户文件夹 sourceDirectory={sourceDirectory}, targetDirectory={targetDirectory}, move_result={move_result.ToString()}");
                 *  }
                 *  else
                 *  {
                 *      GreenInstaller.WriteInfoLog($"绿色版用户文件夹 targetDirectory={targetDirectory} 已经存在,不再重复进行迁移");
                 *  }
                 * }
                 */
                string targetDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "dp2\\dp2ssl");
                {
                    var move_result = GreenInstaller.MoveUserDirectory(sourceDirectory,
                                                                       targetDirectory,
                                                                       _binDir,
                                                                       "maskSource");
                    GreenInstaller.WriteInfoLog($"迁移用户文件夹 sourceDirectory={sourceDirectory}, targetDirectory={targetDirectory}, move_result={move_result.ToString()}");
                }
            }

            await ProcessStart(strExePath);

            return;
        }
Example #3
0
        // 启动 dp2ssl.exe;或首次安装;或升级并启动 dp2ssl.exe
        // parameters:
        //      delayUpdate 是否让 dp2ssl.exe 启动起来再探测升级?
        //                  意思就是,== true,让 dp2ssl.exe 去负责升级,而 greensetup.exe 这里不负责下载升级(只负责展开下载好的 .zip)。这样的特点是启动速度快
        //                  == false,让 greensetup.exe 直接探测下载升级,缺点是 dp2ssl.exe 启动就晚一点
        //                  但首次安装的时候,则是 greensetup.exe 负责下载 .zip 文件并安装。因为此时 dp2ssl.exe 还并不存在
        async Task Start(bool delayUpdate)
        {
            // *** 检查 dp2ssl.exe 是否已经在运行
            if (GreenInstaller.HasModuleStarted("{75BAF3F0-FF7F-46BB-9ACD-8FE7429BF291}") == true)
            {
                ErrorBox("dp2SSL 已经启动了,无法重复启动");
                Application.Exit();
                return;
            }

            string strExePath   = Path.Combine(_binDir, "dp2ssl.exe");
            bool   firstInstall = File.Exists(strExePath) == false;

            // *** 检查状态文件
            // result.Value
            //      -1  出错
            //      0   不存在状态文件
            //      1   正在下载 .zip 过程中。.zip 不完整
            //      2   当前 .zip 和 .exe 已经一样新
            //      3   当前 .zip 比 .exe 要新。需要展开 .zip 进行更新安装
            //      4   下载 .zip 失败。.zip 不完整
            //      5   当前 .zip 比 .exe 要新,需要重启计算机以便展开的文件生效
            var check_result = GreenInstaller.CheckStateFile(_binDir);

            GreenInstaller.WriteInfoLog($"检查状态文件。check_result:{check_result.ToString()}");

            // 展开,并启动 dp2ssl.exe
            if (check_result.Value == 3)
            {
                GreenInstaller.WriteInfoLog($"以前遗留的 .zip 文件,展开,并立即启动 dp2ssl.exe");

                var extract_result = GreenInstaller.ExtractFiles(_binDir);
                if (extract_result.Value == -1)
                {
                    ErrorBox(extract_result.ErrorInfo);
                    return;
                }
                ProcessStart(strExePath);
                return;
            }

            /*
             * if (check_result.Value == 1
             || check_result.Value == 5)
             ||{
             || ErrorBox(check_result.ErrorInfo);
             || Application.Exit();
             || return;
             ||}
             */

            /*
             * Debugger.Launch();
             *
             * // 拷贝 greensetup.exe
             * string exePath = Assembly.GetExecutingAssembly().Location.ToLower();
             * string targetExePath = Path.Combine(_binDir, "greensetup.exe");
             * if (exePath.EndsWith("greensetup.exe")
             *  && File.Exists(targetExePath) == false
             *  && exePath.ToLower() != targetExePath.ToLower())
             * {
             *  MessageBox.Show(this, "copy greensetup.exe");
             *  Library.TryCreateDir(_binDir);
             *  File.Copy(exePath, targetExePath, true);
             * }
             * else
             *  MessageBox.Show(this, "not copy greensetup.exe");
             */

            if (firstInstall == false && delayUpdate)
            {
                GreenInstaller.WriteInfoLog($"非首次安装情形。立即启动 dp2ssl.exe");

                ProcessStart(strExePath);
                return;
            }

            string style = "updateGreenSetupExe";

            if (delayUpdate == false)
            {
                style += ",clearStateFile";
            }

            GreenInstaller.WriteInfoLog($"style={style}");

            // *** 从 Web 升级
            double ratio = 1;
            // 从 Web 服务器安装或者升级绿色版
            // result.Value:
            //      -1  出错
            //      0   经过检查发现没有必要升级
            //      1   成功
            //      2   成功,但需要立即重新启动计算机才能让复制的文件生效
            var result = await GreenInstaller.InstallFromWeb("http://dp2003.com/dp2ssl/v1_dev",
                                                             _binDir,
                                                             style,
                                                             //false,
                                                             //true,
                                                             _cancel.Token,
                                                             (double min, double max, double value, string text) =>
            {
                this.Invoke(new Action(() =>
                {
                    if (text != null)
                    {
                        label_message.Text = text;
                    }
                    if (min != -1)
                    {
                        progressBar1.Minimum = (Int32)min;
                    }
                    if (max != -1)
                    {
                        if (max <= Int32.MaxValue)
                        {
                            ratio = 1;
                            progressBar1.Maximum = (Int32)max;
                        }
                        else
                        {
                            ratio = Int32.MaxValue / max;
                            progressBar1.Maximum = Int32.MaxValue;
                        }
                    }
                    if (value != -1)
                    {
                        progressBar1.Value = (int)((double)value * ratio);
                    }
                }));
            });

            if (result.Value == -1)
            {
                if (result.ErrorCode == "System.Net.WebException")
                {
                    if (File.Exists(strExePath))
                    {
                        ProcessStart(strExePath);
                        return;
                    }
                }
                ErrorBox(result.ErrorInfo);
                Application.Exit();
                return;
            }

            // TODO: 从 dp2ssl.exe 中取信息?

            // 首次安装成功
            if (firstInstall)
            {
                GreenInstaller.WriteInfoLog($"首次安装成功");

                // 创建桌面快捷方式
                GreenInstaller.CreateShortcut(
                    "desktop",
                    "dp2SSL 自助借还(绿色)",
                    "dp2SSL 自助借还(绿色)",
                    Path.Combine(_binDir, "greensetup.exe"));   // "dp2ssl.exe"

                GreenInstaller.CreateShortcut(
                    "startup",
                    "dp2SSL 自助借还(绿色)",
                    "dp2SSL 自助借还(绿色)",
                    Path.Combine(_binDir, "greensetup.exe")); // "dp2ssl.exe"

                // 迁移用户文件夹
                string sourceDirectory = Path.Combine(
                    Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
                    "dp2ssl");
                if (Directory.Exists(sourceDirectory))
                {
                    string targetDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "dp2\\dp2ssl");
                    var    move_result     = GreenInstaller.MoveUserDirectory(sourceDirectory,
                                                                              targetDirectory,
                                                                              _binDir,
                                                                              "maskSource");
                    GreenInstaller.WriteInfoLog($"迁移用户文件夹 sourceDirectory={sourceDirectory}, targetDirectory={targetDirectory}, move_result={move_result.ToString()}");
                }
            }

            ProcessStart(strExePath);
            return;
        }