From 92d0405a7082d1cabf366d22967f9943b152e9a5 Mon Sep 17 00:00:00 2001 From: snltty <1069410172@qq.com> Date: Wed, 17 Jul 2024 20:31:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=99=9A=E6=8B=9F=E7=BD=91?= =?UTF-8?q?=E5=8D=A1=E6=B7=BB=E5=8A=A0=E8=B7=AF=E7=94=B1=E9=94=99=E8=AF=AF?= =?UTF-8?q?=EF=BC=8C=E5=92=8C=E5=A2=9E=E5=8A=A0=E8=87=AA=E5=8A=A8=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/dotnet.yml | 14 +- .github/workflows/nuget.yml | 4 +- .workflow/branch-pipeline.yml | 53 --- .workflow/master-pipeline.yml | 51 --- .workflow/pr-pipeline.yml | 40 -- linker.doc.web/docs/6、发布.md | 13 + ...洞到你的项目.md => 7、集成打洞到你的项目.md} | 4 +- linker.libs/linker.libs.csproj | 6 +- linker.service/linker.service.csproj | 6 +- linker.sln | 14 - linker.tunnel/linker.tunnel.csproj | 6 +- linker.updater/Program.cs | 256 ------------- linker.updater/app.manifest | 79 ---- linker.updater/favicon.ico | Bin 28447 -> 0 bytes linker.updater/linker.updater.csproj | 50 --- linker.web/src/apis/updater.js | 6 + linker.web/src/components/install/Index.vue | 4 +- linker.web/src/components/status/Api.vue | 30 +- linker.web/src/components/status/Server.vue | 1 - linker.web/src/provide.js | 13 +- linker.web/src/views/devices/Device.vue | 136 +++++-- linker.web/src/views/devices/Forward.vue | 4 +- linker.web/src/views/devices/List.vue | 9 + linker.web/src/views/devices/connections.js | 4 +- linker.web/src/views/devices/devices.js | 8 +- linker.web/src/views/devices/forward.js | 8 +- linker.web/src/views/devices/sforward.js | 8 +- linker.web/src/views/devices/tunnel.js | 8 +- linker.web/src/views/devices/tuntap.js | 2 +- linker.web/src/views/devices/updater.js | 37 ++ linker.web/src/views/settings/Index.vue | 2 +- linker/linker.csproj | 6 +- linker/plugins/tuntap/vea/TuntapVeaWindows.cs | 23 +- .../updater/UpdaterClientApiController.cs | 25 +- linker/plugins/updater/UpdaterTransfer.cs | 341 +++++++++++++++--- linker/plugins/updater/config/config.cs | 34 -- .../updater/messenger/UpdaterMessenger.cs | 71 +++- .../updater/messenger/UpdaterMessengerIds.cs | 6 + publish.bat | 2 - 39 files changed, 635 insertions(+), 749 deletions(-) delete mode 100644 .workflow/branch-pipeline.yml delete mode 100644 .workflow/master-pipeline.yml delete mode 100644 .workflow/pr-pipeline.yml create mode 100644 linker.doc.web/docs/6、发布.md rename linker.doc.web/docs/{6、集成打洞到你的项目.md => 7、集成打洞到你的项目.md} (97%) delete mode 100644 linker.updater/Program.cs delete mode 100644 linker.updater/app.manifest delete mode 100644 linker.updater/favicon.ico delete mode 100644 linker.updater/linker.updater.csproj create mode 100644 linker.web/src/views/devices/updater.js diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index cbc0e9b5..3afc1288 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -48,16 +48,18 @@ jobs: env: GITHUB_TOKEN: '${{ secrets.ACTIONS_TOKEN }}' with: - tag_name: v1.1.1.3 - release_name: v1.1.1.3.${{ steps.date.outputs.today }} + tag_name: v1.1.2.1 + release_name: v1.1.2.1.${{ steps.date.outputs.today }} draft: false prerelease: false body: | 1. 更新配置同步方式,以版本同步 - 2. 增加设备列表搜索,按 设备名/设备IP/虚拟网卡IP/端口转发端口和IP 搜索 - 3. 新增端口转发配置复制,可以将A转发到B的配置复制给C转发到B - 4. 新增服务器代理穿透配置复制 - 5. 请更新服务端 + 2. 设备列表搜索,按 设备名/设备IP/虚拟网卡IP/端口转发端口和IP 搜索 + 3. 端口转发配置复制,可以将A转发到B的配置复制给C转发到B + 4. 服务器代理穿透配置复制 + 5. 修复虚拟网卡添加路由错误 + 6. 自动更新,管理所有客户端更新 + 7. 请更新服务端 - name: upload win x64 id: upload-win-x64 diff --git a/.github/workflows/nuget.yml b/.github/workflows/nuget.yml index 1e04becd..6d2444c1 100644 --- a/.github/workflows/nuget.yml +++ b/.github/workflows/nuget.yml @@ -36,5 +36,5 @@ jobs: - name: Push run: | - nuget push ./linker.tunnel/bin/release/linker.tunnel.1.1.1.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol - nuget push ./linker.libs/bin/release/linker.libs.1.1.1.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol + nuget push ./linker.tunnel/bin/release/linker.tunnel.1.1.2.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol + nuget push ./linker.libs/bin/release/linker.libs.1.1.2.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol diff --git a/.workflow/branch-pipeline.yml b/.workflow/branch-pipeline.yml deleted file mode 100644 index 9d2a2926..00000000 --- a/.workflow/branch-pipeline.yml +++ /dev/null @@ -1,53 +0,0 @@ -version: '1.0' -name: branch-pipeline -displayName: BranchPipeline -stages: - - stage: - name: compile - displayName: 编译 - steps: - - step: build@maven - name: build_maven - displayName: Maven 构建 - # 支持6、7、8、9、10、11六个版本 - jdkVersion: 8 - # 支持2.2.1、3.2.5、3.3.9、3.5.2、3.5.3、3.5.4、3.6.1、3.6.3八个版本 - mavenVersion: 3.3.9 - # 构建命令 - commands: - - mvn -B clean package -Dmaven.test.skip=true - # 非必填字段,开启后表示将构建产物暂存,但不会上传到制品库中,7天后自动清除 - artifacts: - # 构建产物名字,作为产物的唯一标识可向下传递,支持自定义,默认为BUILD_ARTIFACT。在下游可以通过${BUILD_ARTIFACT}方式引用来获取构建物地址 - - name: BUILD_ARTIFACT - # 构建产物获取路径,是指代码编译完毕之后构建物的所在路径,如通常jar包在target目录下。当前目录为代码库根目录 - path: - - ./target - - step: publish@general_artifacts - name: publish_general_artifacts - displayName: 上传制品 - # 上游构建任务定义的产物名,默认BUILD_ARTIFACT - dependArtifact: BUILD_ARTIFACT - # 上传到制品库时的制品命名,默认output - artifactName: output - dependsOn: build_maven - - stage: - name: release - displayName: 发布 - steps: - - step: publish@release_artifacts - name: publish_release_artifacts - displayName: '发布' - # 上游上传制品任务的产出 - dependArtifact: output - # 发布制品版本号 - version: '1.0.0.0' - # 是否开启版本号自增,默认开启 - autoIncrement: true -triggers: - push: - branches: - exclude: - - master - include: - - .* diff --git a/.workflow/master-pipeline.yml b/.workflow/master-pipeline.yml deleted file mode 100644 index 5d926c26..00000000 --- a/.workflow/master-pipeline.yml +++ /dev/null @@ -1,51 +0,0 @@ -version: '1.0' -name: master-pipeline -displayName: MasterPipeline -stages: - - stage: - name: compile - displayName: 编译 - steps: - - step: build@maven - name: build_maven - displayName: Maven 构建 - # 支持6、7、8、9、10、11六个版本 - jdkVersion: 8 - # 支持2.2.1、3.2.5、3.3.9、3.5.2、3.5.3、3.5.4、3.6.1、3.6.3八个版本 - mavenVersion: 3.3.9 - # 构建命令 - commands: - - mvn -B clean package -Dmaven.test.skip=true - # 非必填字段,开启后表示将构建产物暂存,但不会上传到制品库中,7天后自动清除 - artifacts: - # 构建产物名字,作为产物的唯一标识可向下传递,支持自定义,默认为BUILD_ARTIFACT。在下游可以通过${BUILD_ARTIFACT}方式引用来获取构建物地址 - - name: BUILD_ARTIFACT - # 构建产物获取路径,是指代码编译完毕之后构建物的所在路径,如通常jar包在target目录下。当前目录为代码库根目录 - path: - - ./target - - step: publish@general_artifacts - name: publish_general_artifacts - displayName: 上传制品 - # 上游构建任务定义的产物名,默认BUILD_ARTIFACT - dependArtifact: BUILD_ARTIFACT - # 上传到制品库时的制品命名,默认output - artifactName: output - dependsOn: build_maven - - stage: - name: release - displayName: 发布 - steps: - - step: publish@release_artifacts - name: publish_release_artifacts - displayName: '发布' - # 上游上传制品任务的产出 - dependArtifact: output - # 发布制品版本号 - version: '1.0.0.0' - # 是否开启版本号自增,默认开启 - autoIncrement: true -triggers: - push: - branches: - include: - - master diff --git a/.workflow/pr-pipeline.yml b/.workflow/pr-pipeline.yml deleted file mode 100644 index 3f7579dd..00000000 --- a/.workflow/pr-pipeline.yml +++ /dev/null @@ -1,40 +0,0 @@ -version: '1.0' -name: pr-pipeline -displayName: PRPipeline -stages: - - stage: - name: compile - displayName: 编译 - steps: - - step: build@maven - name: build_maven - displayName: Maven 构建 - # 支持6、7、8、9、10、11六个版本 - jdkVersion: 8 - # 支持2.2.1、3.2.5、3.3.9、3.5.2、3.5.3、3.5.4、3.6.1、3.6.3八个版本 - mavenVersion: 3.3.9 - # 构建命令 - commands: - - mvn -B clean package -Dmaven.test.skip=true - # 非必填字段,开启后表示将构建产物暂存,但不会上传到制品库中,7天后自动清除 - artifacts: - # 构建产物名字,作为产物的唯一标识可向下传递,支持自定义,默认为BUILD_ARTIFACT。在下游可以通过${BUILD_ARTIFACT}方式引用来获取构建物地址 - - name: BUILD_ARTIFACT - # 构建产物获取路径,是指代码编译完毕之后构建物的所在路径,如通常jar包在target目录下。当前目录为代码库根目录 - path: - - ./target - - step: publish@general_artifacts - name: publish_general_artifacts - displayName: 上传制品 - # 上游构建任务定义的产物名,默认BUILD_ARTIFACT - dependArtifact: BUILD_ARTIFACT - # 构建产物制品库,默认default,系统默认创建 - artifactRepository: default - # 上传到制品库时的制品命名,默认output - artifactName: output - dependsOn: build_maven -triggers: - pr: - branches: - include: - - master diff --git a/linker.doc.web/docs/6、发布.md b/linker.doc.web/docs/6、发布.md new file mode 100644 index 00000000..a69a88ce --- /dev/null +++ b/linker.doc.web/docs/6、发布.md @@ -0,0 +1,13 @@ +--- +sidebar_position: 6 +--- + +# 6、发布 + +你可以自己发布项目,因为涉及到很多内容,所以建议使用脚本发布 + +1. 安装 Nodejs https://nodejs.org/en/download/package-manager +2. 安装 .NET8.0 SDK https://dotnet.microsoft.com/zh-cn/download 或者安装 vs2022 https://visualstudio.microsoft.com/zh-hans/vs/ +3. 发布项目自动压缩,所以你需要安装 7zip https://www.7-zip.org/ +4. 在`cmd`或者`PowerShell`下运行根目录下`publish.bat`,等待发布完成 +5. 发布完成后,在根目录下,`public`>`publish` 和 `public`>`publish-zip` \ No newline at end of file diff --git a/linker.doc.web/docs/6、集成打洞到你的项目.md b/linker.doc.web/docs/7、集成打洞到你的项目.md similarity index 97% rename from linker.doc.web/docs/6、集成打洞到你的项目.md rename to linker.doc.web/docs/7、集成打洞到你的项目.md index 476d98d3..368f4e40 100644 --- a/linker.doc.web/docs/6、集成打洞到你的项目.md +++ b/linker.doc.web/docs/7、集成打洞到你的项目.md @@ -1,8 +1,8 @@ --- -sidebar_position: 6 +sidebar_position: 7 --- -# 6、集成打洞到你的项目 +# 7、集成打洞到你的项目 你需要自己实现信标服务器,用于交换打洞信息 diff --git a/linker.libs/linker.libs.csproj b/linker.libs/linker.libs.csproj index 5187cd3a..569cef09 100644 --- a/linker.libs/linker.libs.csproj +++ b/linker.libs/linker.libs.csproj @@ -14,9 +14,9 @@ snltty https://github.com/snltty/linker https://github.com/snltty/linker - 1.1.1 - 1.1.1.3 - 1.1.1.3 + 1.1.2 + 1.1.2.1 + 1.1.2.1 full diff --git a/linker.service/linker.service.csproj b/linker.service/linker.service.csproj index 4b3ef81b..8bd5771f 100644 --- a/linker.service/linker.service.csproj +++ b/linker.service/linker.service.csproj @@ -14,7 +14,7 @@ false true true - 1.1.1 + 1.1.2 snltty snltty snltty @@ -22,8 +22,8 @@ https://github.com/snltty/linker https://github.com/snltty/linker snltty service - 1.1.1.3 - 1.1.1.3 + 1.1.2.1 + 1.1.2.1 diff --git a/linker.sln b/linker.sln index 7926db8b..2d2273fc 100644 --- a/linker.sln +++ b/linker.sln @@ -13,8 +13,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.service", "linker.se EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "linker.tunnel", "linker.tunnel\linker.tunnel.csproj", "{AFADE8D6-AB00-456B-9F43-53BC95B7B608}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "linker.updater", "linker.updater\linker.updater.csproj", "{B7E2B873-C96E-4F3E-9411-D8D549F4D3A5}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -85,18 +83,6 @@ Global {AFADE8D6-AB00-456B-9F43-53BC95B7B608}.Release|x64.Build.0 = Release|Any CPU {AFADE8D6-AB00-456B-9F43-53BC95B7B608}.Release|x86.ActiveCfg = Release|Any CPU {AFADE8D6-AB00-456B-9F43-53BC95B7B608}.Release|x86.Build.0 = Release|Any CPU - {B7E2B873-C96E-4F3E-9411-D8D549F4D3A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B7E2B873-C96E-4F3E-9411-D8D549F4D3A5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B7E2B873-C96E-4F3E-9411-D8D549F4D3A5}.Debug|x64.ActiveCfg = Debug|Any CPU - {B7E2B873-C96E-4F3E-9411-D8D549F4D3A5}.Debug|x64.Build.0 = Debug|Any CPU - {B7E2B873-C96E-4F3E-9411-D8D549F4D3A5}.Debug|x86.ActiveCfg = Debug|Any CPU - {B7E2B873-C96E-4F3E-9411-D8D549F4D3A5}.Debug|x86.Build.0 = Debug|Any CPU - {B7E2B873-C96E-4F3E-9411-D8D549F4D3A5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B7E2B873-C96E-4F3E-9411-D8D549F4D3A5}.Release|Any CPU.Build.0 = Release|Any CPU - {B7E2B873-C96E-4F3E-9411-D8D549F4D3A5}.Release|x64.ActiveCfg = Release|Any CPU - {B7E2B873-C96E-4F3E-9411-D8D549F4D3A5}.Release|x64.Build.0 = Release|Any CPU - {B7E2B873-C96E-4F3E-9411-D8D549F4D3A5}.Release|x86.ActiveCfg = Release|Any CPU - {B7E2B873-C96E-4F3E-9411-D8D549F4D3A5}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/linker.tunnel/linker.tunnel.csproj b/linker.tunnel/linker.tunnel.csproj index f80f4a5d..40128bd1 100644 --- a/linker.tunnel/linker.tunnel.csproj +++ b/linker.tunnel/linker.tunnel.csproj @@ -9,7 +9,7 @@ true true linker tunnel - 1.1.1 + 1.1.2 snltty snltty linker tunnel @@ -17,8 +17,8 @@ https://github.com/snltty/linker https://github.com/snltty/linker linker tunnel - 1.1.1.3 - 1.1.1.3 + 1.1.2.1 + 1.1.2.1 diff --git a/linker.updater/Program.cs b/linker.updater/Program.cs deleted file mode 100644 index 5dd57cd4..00000000 --- a/linker.updater/Program.cs +++ /dev/null @@ -1,256 +0,0 @@ -using Fizzler.Systems.HtmlAgilityPack; -using HtmlAgilityPack; -using linker.libs; -using System.Diagnostics; -using System.IO.Compression; -using System.Runtime.InteropServices; -using System.Text; - -namespace linker.updater -{ - internal class Program - { - static async Task Main(string[] args) - { - if (args.Length > 0) - { - rootPath = args[0]; - } - Updater(); - await Helper.Await(); - } - - static string rootPath = "./updater"; - static void Updater() - { - Task.Factory.StartNew(async () => - { - while (true) - { - try - { - UpdateInfo updateInfo = GetUpdateInfo(); - if (updateInfo != null) - { - if (NeedDownload()) - { - await DownloadUpdate(updateInfo); - } - } - } - catch (Exception) - { - } - try - { - if (NeedExtract()) - { - ExtractUpdate(); - } - } - catch (Exception) - { - } - - await Task.Delay(15000); - } - - - }, TaskCreationOptions.LongRunning); - } - - static bool NeedExtract() - { - try - { - return File.Exists(Path.Join(rootPath, "updater.zip")) && File.Exists(Path.Join(rootPath, "extract.txt")); - } - catch (Exception) - { - } - return false; - } - static void ExtractUpdate() - { - try - { - string[] command = File.ReadAllText(Path.Join(rootPath, "extract.txt")).Split(Environment.NewLine); - CommandHelper.Execute(string.Empty, new string[] { command[0] }); - - ZipFile.ExtractToDirectory(Path.Join(rootPath, "updater.zip"), Path.Join(rootPath, "../"), Encoding.UTF8, true); - - File.Delete(Path.Join(rootPath, "extract.txt")); - File.Delete(Path.Join(rootPath, "updater.zip")); - - CommandHelper.Execute(string.Empty, new string[] { command[1] }); - } - catch (Exception) - { - } - } - - static bool NeedDownload() - { - try - { - return File.Exists(Path.Join(rootPath, "extract.txt")); - } - catch (Exception) - { - } - return false; - } - static async Task DownloadUpdate(UpdateInfo updateInfo) - { - try - { - if (Directory.Exists(rootPath) == false) - { - Directory.CreateDirectory(rootPath); - } - - using FileStream fileStream = new FileStream(Path.Join(rootPath, "updater.zip"), FileMode.OpenOrCreate, FileAccess.ReadWrite); - using HttpClient httpClient = new HttpClient(); - using Stream stream = await httpClient.GetStreamAsync(updateInfo.Url); - await stream.CopyToAsync(fileStream); - - fileStream.Flush(); - fileStream.Close(); - fileStream.Dispose(); - } - catch (Exception) - { - } - } - - static UpdateInfo GetUpdateInfo() - { - try - { - using HttpClient httpClient = new HttpClient(); - string str = httpClient.GetStringAsync("http://gh.snltty.com:1808/https://github.com/snltty/linker/releases/latest").Result; - HtmlDocument hdc = new HtmlDocument(); - hdc.LoadHtml(str); - string tag = hdc.DocumentNode.QuerySelector("span.css-truncate-target span").InnerText.Trim(); - - str = httpClient.GetStringAsync($"http://gh.snltty.com:1808/https://github.com/snltty/linker/releases/expanded_assets/{tag}").Result; - HtmlDocument hdc1 = new HtmlDocument(); - hdc1.LoadHtml(str); - string msg = hdc.DocumentNode.QuerySelector(".markdown-body").InnerText.Trim(); - - string system = OperatingSystem.IsWindows() ? "win" : OperatingSystem.IsLinux() ? "linux" : "osx"; - string arch = RuntimeInformation.ProcessArchitecture.ToString().ToLower(); - string zip = $"linker-{system}-{arch}.zip"; - var a = hdc1.DocumentNode.QuerySelectorAll("a").FirstOrDefault(c => c.InnerText.Trim() == zip); - - - File.WriteAllText(Path.Join(rootPath, "version.txt"), tag); - File.WriteAllText(Path.Join(rootPath, "msg.txt"), msg); - - return new UpdateInfo - { - Msg = msg, - Version = tag, - Url = $"http://gh.snltty.com:1808/https://github.com{a.GetAttributeValue("href", "").Trim()}" - }; - } - catch (Exception) - { - } - return null; - } - sealed class UpdateInfo - { - public string Version { get; set; } - public string Msg { get; set; } - public string Url { get; set; } - } - } - - - public sealed class CommandHelper - { - - public static string Execute(string arg, string[] commands, bool readResult = true) - { - if (OperatingSystem.IsWindows()) - { - return Windows(arg, commands, readResult); - } - else if (OperatingSystem.IsLinux()) - { - return Linux(arg, commands, readResult); - } - return Osx(arg, commands, readResult); - } - public static string Windows(string arg, string[] commands, bool readResult = true) - { - return Execute("cmd.exe", arg, commands, readResult); - } - public static string Linux(string arg, string[] commands, bool readResult = true) - { - return Execute("/bin/bash", arg, commands, readResult); - } - public static string Osx(string arg, string[] commands, bool readResult = true) - { - return Execute("/bin/bash", arg, commands, readResult); - } - - public static Process Execute(string fileName, string arg) - { - Process proc = new Process(); - proc.StartInfo.CreateNoWindow = true; - proc.StartInfo.FileName = fileName; - proc.StartInfo.UseShellExecute = false; - proc.StartInfo.RedirectStandardError = true; - proc.StartInfo.RedirectStandardInput = true; - proc.StartInfo.RedirectStandardOutput = true; - proc.StartInfo.Arguments = arg; - proc.StartInfo.Verb = "runas"; - proc.Start(); - - //Process proc = Process.Start(fileName, arg); - return proc; - } - - public static string Execute(string fileName, string arg, string[] commands, bool readResult = true) - { - using Process proc = new Process(); - proc.StartInfo.WorkingDirectory = Path.GetFullPath(Path.Join("./")); - proc.StartInfo.CreateNoWindow = true; - proc.StartInfo.FileName = fileName; - proc.StartInfo.UseShellExecute = false; - proc.StartInfo.RedirectStandardError = true; - proc.StartInfo.RedirectStandardInput = true; - proc.StartInfo.RedirectStandardOutput = true; - proc.StartInfo.Arguments = arg; - proc.StartInfo.Verb = "runas"; - proc.Start(); - - if (commands.Length > 0) - { - for (int i = 0; i < commands.Length; i++) - { - proc.StandardInput.WriteLine(commands[i]); - } - } - proc.StandardInput.AutoFlush = true; - if (readResult) - { - proc.StandardInput.WriteLine("exit"); - proc.StandardInput.Close(); - string output = proc.StandardOutput.ReadToEnd(); - string error = proc.StandardError.ReadToEnd(); - proc.WaitForExit(); - proc.Close(); - proc.Dispose(); - - return output; - } - proc.StandardOutput.Read(); - proc.Close(); - proc.Dispose(); - return string.Empty; - } - } -} diff --git a/linker.updater/app.manifest b/linker.updater/app.manifest deleted file mode 100644 index fd401142..00000000 --- a/linker.updater/app.manifest +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/linker.updater/favicon.ico b/linker.updater/favicon.ico deleted file mode 100644 index fce64be660b28ecbffd25d4cb03267f6a554ebe2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28447 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 S{R&)h2a%OhlB^Op3i>|@-&%G6 diff --git a/linker.updater/linker.updater.csproj b/linker.updater/linker.updater.csproj deleted file mode 100644 index 8851a610..00000000 --- a/linker.updater/linker.updater.csproj +++ /dev/null @@ -1,50 +0,0 @@ - - - - Exe - net8.0 - enable - disable - true - true - Debug;Release - Linux - false - true - true - 1.1.1 - snltty - snltty - snltty - snltty - https://github.com/snltty/linker - https://github.com/snltty/linker - snltty updater - 1.1.1.3 - 1.1.1.3 - favicon.ico - app.manifest - - - - - full - true - - - none - false - True - - - - - - - - - - - - - diff --git a/linker.web/src/apis/updater.js b/linker.web/src/apis/updater.js index 4e8e7088..55ceab68 100644 --- a/linker.web/src/apis/updater.js +++ b/linker.web/src/apis/updater.js @@ -3,4 +3,10 @@ import { sendWebsocketMsg } from './request' export const getUpdater = () => { return sendWebsocketMsg('updaterclient/get'); +} +export const confirm = (machineId) => { + return sendWebsocketMsg('updaterclient/confirm', machineId); +} +export const exit = (machineId) => { + return sendWebsocketMsg('updaterclient/exit', machineId); } \ No newline at end of file diff --git a/linker.web/src/components/install/Index.vue b/linker.web/src/components/install/Index.vue index 940496de..3ef7e4d2 100644 --- a/linker.web/src/components/install/Index.vue +++ b/linker.web/src/components/install/Index.vue @@ -50,9 +50,9 @@ export default { steps:['选择模式','服务端','客户端','完成'] }); - watch(() => globalData.value.configed, (val) => { + watch(() => globalData.value.config.configed, (val) => { if (val) { - state.show = globalData.value.connected && globalData.value.configed && globalData.value.config.Common.Install == false; + state.show = globalData.value.api.connected && globalData.value.config.configed && globalData.value.config.Common.Install == false; } }); diff --git a/linker.web/src/components/status/Api.vue b/linker.web/src/components/status/Api.vue index c994de5b..109e05ed 100644 --- a/linker.web/src/components/status/Api.vue +++ b/linker.web/src/components/status/Api.vue @@ -1,6 +1,6 @@