From 9748fbb076aafda5f4d02c1c27fb5a204817884b Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 1 Mar 2025 14:23:43 +0800 Subject: [PATCH] If the update fails during the upgrade, the update will be retried. --- v2rayN/AmazTool/Program.cs | 28 ++++-- v2rayN/AmazTool/UpgradeApp.cs | 159 +++++++++++++++++++--------------- v2rayN/AmazTool/Utils.cs | 16 ++-- 3 files changed, 119 insertions(+), 84 deletions(-) diff --git a/v2rayN/AmazTool/Program.cs b/v2rayN/AmazTool/Program.cs index cbfc1332..389fb627 100644 --- a/v2rayN/AmazTool/Program.cs +++ b/v2rayN/AmazTool/Program.cs @@ -1,29 +1,39 @@ -namespace AmazTool +namespace AmazTool { internal static class Program { - /// - /// 应用程序的主入口点。 - /// [STAThread] private static void Main(string[] args) { if (args.Length == 0) { - Console.WriteLine(Resx.Resource.Guidelines); - Thread.Sleep(5000); + Utils.WriteLine(Resx.Resource.Guidelines); + Utils.Waiting(5); return; } var argData = Uri.UnescapeDataString(string.Join(" ", args)); if (argData.Equals("rebootas")) { - Thread.Sleep(1000); + Utils.Waiting(1); Utils.StartV2RayN(); return; } + + var tryTimes = 0; + UpgradeApp.Init(); + while (tryTimes++ < 3) + { + if (!UpgradeApp.Upgrade(argData)) + { + continue; + } - UpgradeApp.Upgrade(argData); + Utils.WriteLine(Resx.Resource.Restartv2rayN); + Utils.Waiting(3); + Utils.StartV2RayN(); + break; + } } } -} \ No newline at end of file +} diff --git a/v2rayN/AmazTool/UpgradeApp.cs b/v2rayN/AmazTool/UpgradeApp.cs index ead7e57e..38fd5631 100644 --- a/v2rayN/AmazTool/UpgradeApp.cs +++ b/v2rayN/AmazTool/UpgradeApp.cs @@ -6,19 +6,99 @@ namespace AmazTool { internal class UpgradeApp { - public static void Upgrade(string fileName) + public static bool Upgrade(string fileName) { - Console.WriteLine($"{Resx.Resource.StartUnzipping}\n{fileName}"); - - Utils.Waiting(5); + Utils.WriteLine($"{Resx.Resource.StartUnzipping}\n{fileName}"); if (!File.Exists(fileName)) { - Console.WriteLine(Resx.Resource.UpgradeFileNotFound); - return; + Utils.WriteLine(Resx.Resource.UpgradeFileNotFound); + return false; } - Console.WriteLine(Resx.Resource.TryTerminateProcess); + Utils.Waiting(5); + + KillV2rayN(); + + Utils.WriteLine(Resx.Resource.StartUnzipping); + StringBuilder sb = new(); + try + { + var splitKey = "/"; + + using var archive = ZipFile.OpenRead(fileName); + foreach (var entry in archive.Entries) + { + try + { + if (entry.Length == 0) + { + continue; + } + + Utils.WriteLine(entry.FullName); + + var lst = entry.FullName.Split(splitKey); + if (lst.Length == 1) + { + continue; + } + + var fullName = string.Join(splitKey, lst[1..lst.Length]); + var entryOutputPath = Utils.GetPath(fullName); + Directory.CreateDirectory(Path.GetDirectoryName(entryOutputPath)!); + //In the bin folder, if the file already exists, it will be skipped + if (fullName.StartsWith("bin") && File.Exists(entryOutputPath)) + { + continue; + } + entry.ExtractToFile(entryOutputPath, true); + + Utils.WriteLine(entryOutputPath); + } + catch (Exception ex) + { + sb.Append(ex.Message); + sb.Append(ex.StackTrace); + } + } + } + catch (Exception ex) + { + sb.Append(Resx.Resource.FailedUpgrade + ex.StackTrace); + } + + if (sb.Length <= 0) + { + return true; + } + + Utils.WriteLine(sb.ToString()); + Utils.WriteLine(Resx.Resource.FailedUpgrade); + return false; + } + + public static bool Init() + { + //Process temporary files generated by the last update + var files = Directory.GetFiles(Utils.GetPath(""), "*.tmp"); + foreach (var file in files) + { + if (file.Contains(Utils.AmazTool)) + { + File.Delete(file); + } + } + + var destFileName = $"{Utils.GetExePath()}{Guid.NewGuid().ToString("N")[..8]}.tmp"; + File.Move(Utils.GetExePath(), destFileName); + + return true; + } + + private static bool KillV2rayN() + { + Utils.WriteLine(Resx.Resource.TryTerminateProcess); try { var existing = Process.GetProcessesByName(Utils.V2rayN); @@ -35,71 +115,10 @@ namespace AmazTool catch (Exception ex) { // Access may be denied without admin right. The user may not be an administrator. - Console.WriteLine(Resx.Resource.FailedTerminateProcess + ex.StackTrace); + Utils.WriteLine(Resx.Resource.FailedTerminateProcess + ex.StackTrace); } - Console.WriteLine(Resx.Resource.StartUnzipping); - StringBuilder sb = new(); - try - { - var thisAppOldFile = $"{Utils.GetExePath()}.tmp"; - File.Delete(thisAppOldFile); - var splitKey = "/"; - - using var archive = ZipFile.OpenRead(fileName); - foreach (var entry in archive.Entries) - { - try - { - if (entry.Length == 0) - { - continue; - } - - Console.WriteLine(entry.FullName); - - var lst = entry.FullName.Split(splitKey); - if (lst.Length == 1) - continue; - var fullName = string.Join(splitKey, lst[1..lst.Length]); - - if (string.Equals(Utils.GetExePath(), Utils.GetPath(fullName), StringComparison.OrdinalIgnoreCase)) - { - File.Move(Utils.GetExePath(), thisAppOldFile); - } - - var entryOutputPath = Utils.GetPath(fullName); - Directory.CreateDirectory(Path.GetDirectoryName(entryOutputPath)!); - //In the bin folder, if the file already exists, it will be skipped - if (fullName.StartsWith("bin") && File.Exists(entryOutputPath)) - { - continue; - } - entry.ExtractToFile(entryOutputPath, true); - - Console.WriteLine(entryOutputPath); - } - catch (Exception ex) - { - sb.Append(ex.StackTrace); - } - } - } - catch (Exception ex) - { - Console.WriteLine(Resx.Resource.FailedUpgrade + ex.StackTrace); - //return; - } - if (sb.Length > 0) - { - Console.WriteLine(Resx.Resource.FailedUpgrade + sb.ToString()); - //return; - } - - Console.WriteLine(Resx.Resource.Restartv2rayN); - Utils.Waiting(2); - - Utils.StartV2RayN(); + return true; } } } diff --git a/v2rayN/AmazTool/Utils.cs b/v2rayN/AmazTool/Utils.cs index d4189644..a447ff79 100644 --- a/v2rayN/AmazTool/Utils.cs +++ b/v2rayN/AmazTool/Utils.cs @@ -1,4 +1,4 @@ -using System.Diagnostics; +using System.Diagnostics; namespace AmazTool { @@ -14,9 +14,9 @@ namespace AmazTool return AppDomain.CurrentDomain.BaseDirectory; } - public static string GetPath(string fileName) + public static string GetPath(string? fileName) { - string startupPath = StartupPath(); + var startupPath = StartupPath(); if (string.IsNullOrEmpty(fileName)) { return startupPath; @@ -25,6 +25,7 @@ namespace AmazTool } public static string V2rayN => "v2rayN"; + public static string AmazTool => "AmazTool"; public static void StartV2RayN() { @@ -44,9 +45,14 @@ namespace AmazTool { for (var i = second; i > 0; i--) { - Console.WriteLine(i); + Utils.WriteLine(i); Thread.Sleep(1000); } } + + public static void WriteLine(object obj) + { + Console.WriteLine(obj); + } } -} \ No newline at end of file +}