mirror of
https://github.com/snltty/linker.git
synced 2025-12-19 01:46:46 +08:00
优化更新
This commit is contained in:
30
.github/workflows/dotnet.yml
vendored
30
.github/workflows/dotnet.yml
vendored
@@ -33,11 +33,11 @@ jobs:
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.ACTIONS_TOKEN }}
|
||||
with:
|
||||
tag_name: v1.3.8
|
||||
release_name: v1.3.8.${{ steps.date.outputs.today }}
|
||||
tag_name: v1.3.9
|
||||
release_name: v1.3.9.${{ steps.date.outputs.today }}
|
||||
draft: false
|
||||
prerelease: false
|
||||
body: "1. 优化隧道连接逻辑,降低首帧时间,先中继,成功则后台打洞,后台打洞成功则切换隧道,中继失败则立即打洞\r\n2. 虚拟网卡,可能会丢失一两个包,TCP不会断开连接\r\n3. 端口转发,在发送数据包失败后,会尝试切换隧道再次发送,无缝切换隧道\r\n4. 优化服务端消息处理器"
|
||||
body: "1. 优化虚拟网卡中继逻辑\r\n2. 信标服务器可设置静态Json参数\r\n3. 优化UDP打洞\r\n4. 数据库加密,保护你的隐私"
|
||||
- name: upload-win-x86-oss
|
||||
id: upload-win-x86-oss
|
||||
uses: tvrcgo/oss-action@v0.1.1
|
||||
@@ -47,7 +47,7 @@ jobs:
|
||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||
bucket: ide-qbcode
|
||||
asset-path: ./public/publish-zip/linker-win-x86.zip
|
||||
target-path: /downloads/linker/v1.3.8/linker-win-x86.zip
|
||||
target-path: /downloads/linker/v1.3.9/linker-win-x86.zip
|
||||
- name: upload-win-x86
|
||||
id: upload-win-x86
|
||||
uses: actions/upload-release-asset@master
|
||||
@@ -67,7 +67,7 @@ jobs:
|
||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||
bucket: ide-qbcode
|
||||
asset-path: ./public/publish-zip/linker-win-x64.zip
|
||||
target-path: /downloads/linker/v1.3.8/linker-win-x64.zip
|
||||
target-path: /downloads/linker/v1.3.9/linker-win-x64.zip
|
||||
- name: upload-win-x64
|
||||
id: upload-win-x64
|
||||
uses: actions/upload-release-asset@master
|
||||
@@ -87,7 +87,7 @@ jobs:
|
||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||
bucket: ide-qbcode
|
||||
asset-path: ./public/publish-zip/linker-win-arm64.zip
|
||||
target-path: /downloads/linker/v1.3.8/linker-win-arm64.zip
|
||||
target-path: /downloads/linker/v1.3.9/linker-win-arm64.zip
|
||||
- name: upload-win-arm64
|
||||
id: upload-win-arm64
|
||||
uses: actions/upload-release-asset@master
|
||||
@@ -107,7 +107,7 @@ jobs:
|
||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||
bucket: ide-qbcode
|
||||
asset-path: ./public/publish-zip/linker-linux-x64.zip
|
||||
target-path: /downloads/linker/v1.3.8/linker-linux-x64.zip
|
||||
target-path: /downloads/linker/v1.3.9/linker-linux-x64.zip
|
||||
- name: upload-linux-x64
|
||||
id: upload-linux-x64
|
||||
uses: actions/upload-release-asset@master
|
||||
@@ -127,7 +127,7 @@ jobs:
|
||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||
bucket: ide-qbcode
|
||||
asset-path: ./public/publish-zip/linker-linux-arm.zip
|
||||
target-path: /downloads/linker/v1.3.8/linker-linux-arm.zip
|
||||
target-path: /downloads/linker/v1.3.9/linker-linux-arm.zip
|
||||
- name: upload-linux-arm
|
||||
id: upload-linux-arm
|
||||
uses: actions/upload-release-asset@master
|
||||
@@ -147,7 +147,7 @@ jobs:
|
||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||
bucket: ide-qbcode
|
||||
asset-path: ./public/publish-zip/linker-linux-arm64.zip
|
||||
target-path: /downloads/linker/v1.3.8/linker-linux-arm64.zip
|
||||
target-path: /downloads/linker/v1.3.9/linker-linux-arm64.zip
|
||||
- name: upload-linux-arm64
|
||||
id: upload-linux-arm64
|
||||
uses: actions/upload-release-asset@master
|
||||
@@ -167,7 +167,7 @@ jobs:
|
||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||
bucket: ide-qbcode
|
||||
asset-path: ./public/publish-zip/linker-linux-musl-x64.zip
|
||||
target-path: /downloads/linker/v1.3.8/linker-linux-musl-x64.zip
|
||||
target-path: /downloads/linker/v1.3.9/linker-linux-musl-x64.zip
|
||||
- name: upload-linux-musl-x64
|
||||
id: upload-linux-musl-x64
|
||||
uses: actions/upload-release-asset@master
|
||||
@@ -187,7 +187,7 @@ jobs:
|
||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||
bucket: ide-qbcode
|
||||
asset-path: ./public/publish-zip/linker-linux-musl-arm.zip
|
||||
target-path: /downloads/linker/v1.3.8/linker-linux-musl-arm.zip
|
||||
target-path: /downloads/linker/v1.3.9/linker-linux-musl-arm.zip
|
||||
- name: upload-linux-musl-arm
|
||||
id: upload-linux-musl-arm
|
||||
uses: actions/upload-release-asset@master
|
||||
@@ -207,7 +207,7 @@ jobs:
|
||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||
bucket: ide-qbcode
|
||||
asset-path: ./public/publish-zip/linker-linux-musl-arm64.zip
|
||||
target-path: /downloads/linker/v1.3.8/linker-linux-musl-arm64.zip
|
||||
target-path: /downloads/linker/v1.3.9/linker-linux-musl-arm64.zip
|
||||
- name: upload-linux-musl-arm64
|
||||
id: upload-linux-musl-arm64
|
||||
uses: actions/upload-release-asset@master
|
||||
@@ -227,7 +227,7 @@ jobs:
|
||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||
bucket: ide-qbcode
|
||||
asset-path: ./public/publish-zip/linker-osx-x64.zip
|
||||
target-path: /downloads/linker/v1.3.8/linker-osx-x64.zip
|
||||
target-path: /downloads/linker/v1.3.9/linker-osx-x64.zip
|
||||
- name: upload-osx-x64
|
||||
id: upload-osx-x64
|
||||
uses: actions/upload-release-asset@master
|
||||
@@ -247,7 +247,7 @@ jobs:
|
||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||
bucket: ide-qbcode
|
||||
asset-path: ./public/publish-zip/linker-osx-arm64.zip
|
||||
target-path: /downloads/linker/v1.3.8/linker-osx-arm64.zip
|
||||
target-path: /downloads/linker/v1.3.9/linker-osx-arm64.zip
|
||||
- name: upload-osx-arm64
|
||||
id: upload-osx-arm64
|
||||
uses: actions/upload-release-asset@master
|
||||
@@ -277,7 +277,7 @@ jobs:
|
||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||
bucket: ide-qbcode
|
||||
asset-path: ./public/publish-zip/linker-windows-route.zip
|
||||
target-path: /downloads/linker/v1.3.8/linker-windows-route.zip
|
||||
target-path: /downloads/linker/v1.3.9/linker-windows-route.zip
|
||||
- name: upload-windows-route
|
||||
id: upload-windows-route
|
||||
uses: actions/upload-release-asset@master
|
||||
|
||||
6
.github/workflows/nuget.yml
vendored
6
.github/workflows/nuget.yml
vendored
@@ -38,6 +38,6 @@ jobs:
|
||||
|
||||
- name: Push
|
||||
run: |
|
||||
nuget push ./linker.tunnel/bin/release/linker.tunnel.1.3.8.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||
nuget push ./linker.libs/bin/release/linker.libs.1.3.8.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||
nuget push ./linker.tun/bin/release/linker.tun.1.3.8.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||
nuget push ./linker.tunnel/bin/release/linker.tunnel.1.3.9.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||
nuget push ./linker.libs/bin/release/linker.libs.1.3.9.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||
nuget push ./linker.tun/bin/release/linker.tun.1.3.9.nupkg -Source https://api.nuget.org/v3/index.json -SkipDuplicate -ApiKey ${{ secrets.NUGET_KEY }} -NoSymbol
|
||||
|
||||
@@ -14,9 +14,9 @@
|
||||
<Copyright>snltty</Copyright>
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<Version>1.3.8</Version>
|
||||
<AssemblyVersion>1.3.8</AssemblyVersion>
|
||||
<FileVersion>1.3.8</FileVersion>
|
||||
<Version>1.3.9</Version>
|
||||
<AssemblyVersion>1.3.9</AssemblyVersion>
|
||||
<FileVersion>1.3.9</FileVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
<DebugType>full</DebugType>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<project ver="10" name="linker.tray.win" libEmbed="true" icon="..\linker\favicon.ico" ui="win" output="linker.tray.win.exe" CompanyName="snltty" FileDescription="linker.tray.win" LegalCopyright="Copyright (C) snltty 2024" ProductName="linker.tray.win" InternalName="linker.install.win" FileVersion="0.0.0.105" ProductVersion="0.0.0.105" publishDir="/dist/" dstrip="false" local="false" ignored="false">
|
||||
<project ver="10" name="linker.tray.win" libEmbed="true" icon="..\linker\favicon.ico" ui="win" output="linker.tray.win.exe" CompanyName="snltty" FileDescription="linker.tray.win" LegalCopyright="Copyright (C) snltty 2024" ProductName="linker.tray.win" InternalName="linker.install.win" FileVersion="0.0.0.107" ProductVersion="0.0.0.107" publishDir="/dist/" dstrip="false" local="false" ignored="false">
|
||||
<file name="main.aardio" path="main.aardio" comment="main.aardio"/>
|
||||
<folder name="资源文件" path="res" embed="true" local="false" ignored="false">
|
||||
<file name="favicon.ico" path="res\favicon.ico" comment="res\favicon.ico"/>
|
||||
|
||||
BIN
linker.tray.win/dist/linker.tray.win.exe
vendored
BIN
linker.tray.win/dist/linker.tray.win.exe
vendored
Binary file not shown.
@@ -1 +1 @@
|
||||
#file-input[data-v-4892cd3c]{opacity:0;position:absolute;z-index:-1}.el-icon[data-v-4892cd3c]{font-size:1.6rem;vertical-align:middle;color:#555}body.sunny{background-image:url(../img/bg.a2158f12.jpg);background-repeat:no-repeat;background-size:cover;background-position:bottom;position:absolute;left:0;top:0;right:0;bottom:0}body.sunny .status-wrap{background-color:hsla(0,0%,100%,.5)}body.sunny .head-wrap{background-color:hsla(0,0%,100%,.7)}body.sunny .net-list-wrap ul li,body.sunny .net-wrap{background-color:hsla(0,0%,98%,.5)}.head-wrap[data-v-6bee0a84]{background-color:#fafafa;padding:1rem;border-bottom:1px solid #ddd;box-shadow:1px 2px 3px rgba(0,0,0,.05);font-size:1.4rem}.head-wrap span.label[data-v-6bee0a84]{line-height:2.4rem;margin-right:.6rem;color:#555}a[data-v-56d38c60]{color:#666;text-decoration:underline}a.green[data-v-56d38c60]{color:green;font-weight:700}a.download[data-v-56d38c60]{margin-left:.6rem}a.download .el-icon[data-v-56d38c60]{vertical-align:middle;font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-56d38c60]{animation:loading-56d38c60 1s linear infinite}@keyframes loading-56d38c60{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}a[data-v-a998806a]{color:#666;text-decoration:underline}a.green[data-v-a998806a]{color:green;font-weight:700}img.system[data-v-a998806a]{height:1.6rem;vertical-align:middle;margin-right:.4rem}.el-icon.loading[data-v-8a7ccef2],a.loading[data-v-8a7ccef2]{vertical-align:middle;font-weight:700;animation:loading-8a7ccef2 1s linear infinite}.el-switch.is-disabled[data-v-8a7ccef2]{opacity:1}.el-input[data-v-8a7ccef2]{width:8rem}.gateway[data-v-8a7ccef2]{background:linear-gradient(90deg,#c5b260,#858585,#c5b260,#858585);-webkit-background-clip:text;-webkit-text-fill-color:hsla(0,0%,100%,0)}.gateway.green[data-v-8a7ccef2]{background:linear-gradient(90deg,#e4bb10,green,#e4bb10,green);-webkit-background-clip:text;-webkit-text-fill-color:hsla(0,0%,100%,0)}.delay[data-v-8a7ccef2]{position:absolute;right:0;bottom:0;line-height:normal}.switch-btn[data-v-8a7ccef2]{font-size:1.5rem}@keyframes loading-8a7ccef2{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.net-list-wrap ul[data-v-5052ddc7]{padding:2rem 2rem 1rem 2rem}.net-list-wrap ul li[data-v-5052ddc7]{margin-bottom:1rem;border:1px solid #ddd;background-color:#fff;font-size:1.3rem;border-radius:.4rem}.net-list-wrap ul li dt[data-v-5052ddc7]{padding:.6rem;border-bottom:1px solid #ddd}.net-list-wrap ul li dd.tuntap[data-v-5052ddc7]{padding:1rem;position:relative}.net-list-wrap .page[data-v-5052ddc7]{padding:.6rem 0;border-top:1px solid #ddd;background-color:hsla(0,0%,98%,.5);box-shadow:-1px -2px 3px rgba(0,0,0,.05)}.net-list-wrap .page-wrap[data-v-5052ddc7]{display:inline-block}.status-api-wrap[data-v-4470fcde]{padding-right:2rem}.status-api-wrap a[data-v-4470fcde]{color:#333}.status-api-wrap span[data-v-4470fcde]{border-radius:1rem;background-color:rgba(0,0,0,.1);padding:0 .6rem;margin-left:.2rem}.status-api-wrap.connected a[data-v-4470fcde]{color:green;font-weight:700}.status-api-wrap.connected span[data-v-4470fcde]{background-color:green;color:#fff}.status-api-wrap .el-icon[data-v-4470fcde]{vertical-align:text-top}.status-server-wrap[data-v-360b8353]{padding-right:.5rem}.status-server-wrap a[data-v-360b8353]{color:#333}.status-server-wrap a+a[data-v-360b8353]{margin-left:.6rem}.status-server-wrap.connected a[data-v-360b8353]{color:green;font-weight:700}.status-server-wrap .el-icon[data-v-360b8353]{vertical-align:text-bottom}.status-server-wrap a.download .el-icon[data-v-360b8353]{font-weight:700;margin-left:.3rem}.status-server-wrap a.download .el-icon.loading[data-v-360b8353]{animation:loading-360b8353 1s linear infinite}@keyframes loading-360b8353{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.el-col[data-v-5b9d3bc4]{text-align:left}.status-export-wrap[data-v-ebcc59f4]{padding-right:2rem}.status-export-wrap a[data-v-ebcc59f4]{color:#333}.status-export-wrap .el-icon[data-v-ebcc59f4]{vertical-align:text-top}.status-export-wrap .el-col[data-v-ebcc59f4]{text-align:left}.status-wrap[data-v-da8e5ef0]{border-top:1px solid #ddd;background-color:#f5f5f5;height:3rem;line-height:3rem;font-size:1.2rem;color:#555}.status-wrap .pay[data-v-da8e5ef0]{font-size:xxx-large}.status-wrap .pay img[data-v-da8e5ef0]{width:100%;margin:0}.status-wrap .copy[data-v-da8e5ef0]{padding-left:.5rem}.status-wrap .copy a[data-v-da8e5ef0]{color:#555}.status-wrap a.memory[data-v-da8e5ef0]{margin-right:.6rem}.status-wrap a.memory img[data-v-da8e5ef0]{height:3rem;vertical-align:bottom;margin-right:.1rem}.net-wrap[data-v-6a3f3b43]{box-sizing:border-box;background-color:#fafafa;border:1px solid #d0d7de;width:calc(100% - 40px);height:calc(100% - 40px);position:absolute;left:20px;top:20px}
|
||||
#file-input[data-v-4892cd3c]{opacity:0;position:absolute;z-index:-1}.el-icon[data-v-4892cd3c]{font-size:1.6rem;vertical-align:middle;color:#555}body.sunny{background-image:url(../img/bg.a2158f12.jpg);background-repeat:no-repeat;background-size:cover;background-position:bottom;position:absolute;left:0;top:0;right:0;bottom:0}body.sunny .status-wrap{background-color:hsla(0,0%,100%,.5)}body.sunny .head-wrap{background-color:hsla(0,0%,100%,.7)}body.sunny .net-list-wrap ul li,body.sunny .net-wrap{background-color:hsla(0,0%,98%,.5)}.head-wrap[data-v-f3fbe048]{background-color:#fafafa;padding:1rem;border-bottom:1px solid #ddd;box-shadow:1px 2px 3px rgba(0,0,0,.05);font-size:1.4rem}.head-wrap span.label[data-v-f3fbe048]{line-height:2.4rem;margin-right:.6rem;color:#555}a[data-v-56d38c60]{color:#666;text-decoration:underline}a.green[data-v-56d38c60]{color:green;font-weight:700}a.download[data-v-56d38c60]{margin-left:.6rem}a.download .el-icon[data-v-56d38c60]{vertical-align:middle;font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-56d38c60]{animation:loading-56d38c60 1s linear infinite}@keyframes loading-56d38c60{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}a[data-v-a998806a]{color:#666;text-decoration:underline}a.green[data-v-a998806a]{color:green;font-weight:700}img.system[data-v-a998806a]{height:1.6rem;vertical-align:middle;margin-right:.4rem}.el-icon.loading[data-v-8a7ccef2],a.loading[data-v-8a7ccef2]{vertical-align:middle;font-weight:700;animation:loading-8a7ccef2 1s linear infinite}.el-switch.is-disabled[data-v-8a7ccef2]{opacity:1}.el-input[data-v-8a7ccef2]{width:8rem}.gateway[data-v-8a7ccef2]{background:linear-gradient(90deg,#c5b260,#858585,#c5b260,#858585);-webkit-background-clip:text;-webkit-text-fill-color:hsla(0,0%,100%,0)}.gateway.green[data-v-8a7ccef2]{background:linear-gradient(90deg,#e4bb10,green,#e4bb10,green);-webkit-background-clip:text;-webkit-text-fill-color:hsla(0,0%,100%,0)}.delay[data-v-8a7ccef2]{position:absolute;right:0;bottom:0;line-height:normal}.switch-btn[data-v-8a7ccef2]{font-size:1.5rem}@keyframes loading-8a7ccef2{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.net-list-wrap ul[data-v-5052ddc7]{padding:2rem 2rem 1rem 2rem}.net-list-wrap ul li[data-v-5052ddc7]{margin-bottom:1rem;border:1px solid #ddd;background-color:#fff;font-size:1.3rem;border-radius:.4rem}.net-list-wrap ul li dt[data-v-5052ddc7]{padding:.6rem;border-bottom:1px solid #ddd}.net-list-wrap ul li dd.tuntap[data-v-5052ddc7]{padding:1rem;position:relative}.net-list-wrap .page[data-v-5052ddc7]{padding:.6rem 0;border-top:1px solid #ddd;background-color:hsla(0,0%,98%,.5);box-shadow:-1px -2px 3px rgba(0,0,0,.05)}.net-list-wrap .page-wrap[data-v-5052ddc7]{display:inline-block}.status-api-wrap[data-v-4470fcde]{padding-right:2rem}.status-api-wrap a[data-v-4470fcde]{color:#333}.status-api-wrap span[data-v-4470fcde]{border-radius:1rem;background-color:rgba(0,0,0,.1);padding:0 .6rem;margin-left:.2rem}.status-api-wrap.connected a[data-v-4470fcde]{color:green;font-weight:700}.status-api-wrap.connected span[data-v-4470fcde]{background-color:green;color:#fff}.status-api-wrap .el-icon[data-v-4470fcde]{vertical-align:text-top}.status-server-wrap[data-v-360b8353]{padding-right:.5rem}.status-server-wrap a[data-v-360b8353]{color:#333}.status-server-wrap a+a[data-v-360b8353]{margin-left:.6rem}.status-server-wrap.connected a[data-v-360b8353]{color:green;font-weight:700}.status-server-wrap .el-icon[data-v-360b8353]{vertical-align:text-bottom}.status-server-wrap a.download .el-icon[data-v-360b8353]{font-weight:700;margin-left:.3rem}.status-server-wrap a.download .el-icon.loading[data-v-360b8353]{animation:loading-360b8353 1s linear infinite}@keyframes loading-360b8353{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.el-col[data-v-5b9d3bc4]{text-align:left}.status-export-wrap[data-v-ebcc59f4]{padding-right:2rem}.status-export-wrap a[data-v-ebcc59f4]{color:#333}.status-export-wrap .el-icon[data-v-ebcc59f4]{vertical-align:text-top}.status-export-wrap .el-col[data-v-ebcc59f4]{text-align:left}.status-wrap[data-v-da8e5ef0]{border-top:1px solid #ddd;background-color:#f5f5f5;height:3rem;line-height:3rem;font-size:1.2rem;color:#555}.status-wrap .pay[data-v-da8e5ef0]{font-size:xxx-large}.status-wrap .pay img[data-v-da8e5ef0]{width:100%;margin:0}.status-wrap .copy[data-v-da8e5ef0]{padding-left:.5rem}.status-wrap .copy a[data-v-da8e5ef0]{color:#555}.status-wrap a.memory[data-v-da8e5ef0]{margin-right:.6rem}.status-wrap a.memory img[data-v-da8e5ef0]{height:3rem;vertical-align:bottom;margin-right:.1rem}.net-wrap[data-v-6a3f3b43]{box-sizing:border-box;background-color:#fafafa;border:1px solid #d0d7de;width:calc(100% - 40px);height:calc(100% - 40px);position:absolute;left:20px;top:20px}
|
||||
@@ -1 +1 @@
|
||||
#file-input[data-v-4892cd3c]{opacity:0;position:absolute;z-index:-1}.el-icon[data-v-4892cd3c]{font-size:1.6rem;vertical-align:middle;color:#555}#file-input[data-v-792478eb]{opacity:0;position:absolute;z-index:-1}.head[data-v-792478eb]{background-color:#f6f8fa;border-bottom:1px solid #d0d7de;box-shadow:1px 1px 4px rgba(0,0,0,.05);height:5rem;line-height:5rem}.head .logo[data-v-792478eb]{padding:.5rem 0 0 1rem}.head .logo img[data-v-792478eb]{vertical-align:top;height:4rem}.head .menu[data-v-792478eb]{padding-left:1rem;font-size:1.4rem}.head .menu li[data-v-792478eb]{box-sizing:border-box;padding:.5rem 0;margin-right:.5rem}.head .menu a[data-v-792478eb]{display:block;color:#333;padding:0 1rem;line-height:4rem}.head .menu a.router-link-active[data-v-792478eb],.head .menu a[data-v-792478eb]:hover{background-color:rgba(0,0,0,.1);font-weight:700}.head .menu a .el-icon[data-v-792478eb]{vertical-align:sub}.head .image[data-v-792478eb]{padding-right:1rem}body.sunny{background-image:url(../img/bg.a2158f12.jpg);background-repeat:no-repeat;background-size:cover;background-position:bottom;position:absolute;left:0;top:0;right:0;bottom:0}body.sunny .app-wrap{background-color:hsla(0,0%,100%,.5)}body.sunny .status-wrap{background-color:hsla(0,0%,96%,.3)}body.sunny .status-wrap .copy a{color:#333}body.sunny .el-table{background-color:hsla(0,0%,100%,.5)}body.sunny .head{background-color:rgba(246,248,250,.5)}body.sunny .el-table tr,body.sunny .el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell{background-color:rgba(246,248,250,.2)}.el-pagination__total,body.sunny .el-pagination__sizes,body.sunny .status-wrap .copy a{color:#000}body.sunny a{color:#576acf}.status-api-wrap[data-v-4470fcde]{padding-right:2rem}.status-api-wrap a[data-v-4470fcde]{color:#333}.status-api-wrap span[data-v-4470fcde]{border-radius:1rem;background-color:rgba(0,0,0,.1);padding:0 .6rem;margin-left:.2rem}.status-api-wrap.connected a[data-v-4470fcde]{color:green;font-weight:700}.status-api-wrap.connected span[data-v-4470fcde]{background-color:green;color:#fff}.status-api-wrap .el-icon[data-v-4470fcde]{vertical-align:text-top}.status-server-wrap[data-v-360b8353]{padding-right:.5rem}.status-server-wrap a[data-v-360b8353]{color:#333}.status-server-wrap a+a[data-v-360b8353]{margin-left:.6rem}.status-server-wrap.connected a[data-v-360b8353]{color:green;font-weight:700}.status-server-wrap .el-icon[data-v-360b8353]{vertical-align:text-bottom}.status-server-wrap a.download .el-icon[data-v-360b8353]{font-weight:700;margin-left:.3rem}.status-server-wrap a.download .el-icon.loading[data-v-360b8353]{animation:loading-360b8353 1s linear infinite}@keyframes loading-360b8353{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.el-col[data-v-5b9d3bc4]{text-align:left}.status-export-wrap[data-v-ebcc59f4]{padding-right:2rem}.status-export-wrap a[data-v-ebcc59f4]{color:#333}.status-export-wrap .el-icon[data-v-ebcc59f4]{vertical-align:text-top}.status-export-wrap .el-col[data-v-ebcc59f4]{text-align:left}a[data-v-56d38c60]{color:#666;text-decoration:underline}a.green[data-v-56d38c60]{color:green;font-weight:700}a.download[data-v-56d38c60]{margin-left:.6rem}a.download .el-icon[data-v-56d38c60]{vertical-align:middle;font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-56d38c60]{animation:loading-56d38c60 1s linear infinite}@keyframes loading-56d38c60{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.status-wrap[data-v-da8e5ef0]{border-top:1px solid #ddd;background-color:#f5f5f5;height:3rem;line-height:3rem;font-size:1.2rem;color:#555}.status-wrap .pay[data-v-da8e5ef0]{font-size:xxx-large}.status-wrap .pay img[data-v-da8e5ef0]{width:100%;margin:0}.status-wrap .copy[data-v-da8e5ef0]{padding-left:.5rem}.status-wrap .copy a[data-v-da8e5ef0]{color:#555}.status-wrap a.memory[data-v-da8e5ef0]{margin-right:.6rem}.status-wrap a.memory img[data-v-da8e5ef0]{height:3rem;vertical-align:bottom;margin-right:.1rem}.body[data-v-18ef6737]{padding:1rem 0 0 0}.footer[data-v-18ef6737]{padding:1rem 0}.body[data-v-c9a17ce0]{padding:1rem 0 0 0}.footer[data-v-c9a17ce0]{padding:1rem 0}.body[data-v-d420efea],.el-card+.el-card[data-v-c9a17ce0]{margin-top:1rem}.footer[data-v-d420efea]{margin-top:2rem}@media screen and (max-width:1000px){body .app-wrap[data-v-5ea3415a]{width:calc(100% - 40px);height:calc(100% - 40px);position:absolute;left:20px;top:20px;right:0;bottom:0;transform:none;max-width:calc(100% - 40px)}}.app-wrap[data-v-5ea3415a]{box-sizing:border-box;background-color:#fff;border:1px solid #d0d7de;width:81rem;max-width:80%;height:90%;position:absolute;left:50%;top:50%;transform:translateX(-50%) translateY(-50%)}
|
||||
#file-input[data-v-4892cd3c]{opacity:0;position:absolute;z-index:-1}.el-icon[data-v-4892cd3c]{font-size:1.6rem;vertical-align:middle;color:#555}#file-input[data-v-792478eb]{opacity:0;position:absolute;z-index:-1}.head[data-v-792478eb]{background-color:#f6f8fa;border-bottom:1px solid #d0d7de;box-shadow:1px 1px 4px rgba(0,0,0,.05);height:5rem;line-height:5rem}.head .logo[data-v-792478eb]{padding:.5rem 0 0 1rem}.head .logo img[data-v-792478eb]{vertical-align:top;height:4rem}.head .menu[data-v-792478eb]{padding-left:1rem;font-size:1.4rem}.head .menu li[data-v-792478eb]{box-sizing:border-box;padding:.5rem 0;margin-right:.5rem}.head .menu a[data-v-792478eb]{display:block;color:#333;padding:0 1rem;line-height:4rem}.head .menu a.router-link-active[data-v-792478eb],.head .menu a[data-v-792478eb]:hover{background-color:rgba(0,0,0,.1);font-weight:700}.head .menu a .el-icon[data-v-792478eb]{vertical-align:sub}.head .image[data-v-792478eb]{padding-right:1rem}body.sunny{background-image:url(../img/bg.a2158f12.jpg);background-repeat:no-repeat;background-size:cover;background-position:bottom;position:absolute;left:0;top:0;right:0;bottom:0}body.sunny .app-wrap{background-color:hsla(0,0%,100%,.5)}body.sunny .status-wrap{background-color:hsla(0,0%,96%,.3)}body.sunny .status-wrap .copy a{color:#333}body.sunny .el-table{background-color:hsla(0,0%,100%,.5)}body.sunny .head{background-color:rgba(246,248,250,.5)}body.sunny .el-table tr,body.sunny .el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell{background-color:rgba(246,248,250,.2)}.el-pagination__total,body.sunny .el-pagination__sizes,body.sunny .status-wrap .copy a{color:#000}body.sunny a{color:#576acf}.status-api-wrap[data-v-4470fcde]{padding-right:2rem}.status-api-wrap a[data-v-4470fcde]{color:#333}.status-api-wrap span[data-v-4470fcde]{border-radius:1rem;background-color:rgba(0,0,0,.1);padding:0 .6rem;margin-left:.2rem}.status-api-wrap.connected a[data-v-4470fcde]{color:green;font-weight:700}.status-api-wrap.connected span[data-v-4470fcde]{background-color:green;color:#fff}.status-api-wrap .el-icon[data-v-4470fcde]{vertical-align:text-top}.status-server-wrap[data-v-360b8353]{padding-right:.5rem}.status-server-wrap a[data-v-360b8353]{color:#333}.status-server-wrap a+a[data-v-360b8353]{margin-left:.6rem}.status-server-wrap.connected a[data-v-360b8353]{color:green;font-weight:700}.status-server-wrap .el-icon[data-v-360b8353]{vertical-align:text-bottom}.status-server-wrap a.download .el-icon[data-v-360b8353]{font-weight:700;margin-left:.3rem}.status-server-wrap a.download .el-icon.loading[data-v-360b8353]{animation:loading-360b8353 1s linear infinite}@keyframes loading-360b8353{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.el-col[data-v-5b9d3bc4]{text-align:left}.status-export-wrap[data-v-ebcc59f4]{padding-right:2rem}.status-export-wrap a[data-v-ebcc59f4]{color:#333}.status-export-wrap .el-icon[data-v-ebcc59f4]{vertical-align:text-top}.status-export-wrap .el-col[data-v-ebcc59f4]{text-align:left}a[data-v-56d38c60]{color:#666;text-decoration:underline}a.green[data-v-56d38c60]{color:green;font-weight:700}a.download[data-v-56d38c60]{margin-left:.6rem}a.download .el-icon[data-v-56d38c60]{vertical-align:middle;font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-56d38c60]{animation:loading-56d38c60 1s linear infinite}@keyframes loading-56d38c60{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.status-wrap[data-v-da8e5ef0]{border-top:1px solid #ddd;background-color:#f5f5f5;height:3rem;line-height:3rem;font-size:1.2rem;color:#555}.status-wrap .pay[data-v-da8e5ef0]{font-size:xxx-large}.status-wrap .pay img[data-v-da8e5ef0]{width:100%;margin:0}.status-wrap .copy[data-v-da8e5ef0]{padding-left:.5rem}.status-wrap .copy a[data-v-da8e5ef0]{color:#555}.status-wrap a.memory[data-v-da8e5ef0]{margin-right:.6rem}.status-wrap a.memory img[data-v-da8e5ef0]{height:3rem;vertical-align:bottom;margin-right:.1rem}.body[data-v-57c28d6f]{padding:1rem 0 0 0}.footer[data-v-57c28d6f]{padding:1rem 0}.body[data-v-c9a17ce0]{padding:1rem 0 0 0}.footer[data-v-c9a17ce0]{padding:1rem 0}.body[data-v-d420efea],.el-card+.el-card[data-v-c9a17ce0]{margin-top:1rem}.footer[data-v-d420efea]{margin-top:2rem}@media screen and (max-width:1000px){body .app-wrap[data-v-5ea3415a]{width:calc(100% - 40px);height:calc(100% - 40px);position:absolute;left:20px;top:20px;right:0;bottom:0;transform:none;max-width:calc(100% - 40px)}}.app-wrap[data-v-5ea3415a]{box-sizing:border-box;background-color:#fff;border:1px solid #d0d7de;width:81rem;max-width:80%;height:90%;position:absolute;left:50%;top:50%;transform:translateX(-50%) translateY(-50%)}
|
||||
@@ -1 +1 @@
|
||||
<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>linker.web</title><script defer="defer" src="js/chunk-vendors.df6dc380.js"></script><script defer="defer" src="js/app.17874bee.js"></script><link href="css/chunk-vendors.d8267b33.css" rel="stylesheet"><link href="css/app.acc92c6f.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but linker.web doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
|
||||
<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>linker.web</title><script defer="defer" src="js/chunk-vendors.df6dc380.js"></script><script defer="defer" src="js/app.05eb3a8f.js"></script><link href="css/chunk-vendors.d8267b33.css" rel="stylesheet"><link href="css/app.acc92c6f.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but linker.web doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
|
||||
@@ -1 +0,0 @@
|
||||
"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[155],{4277:function(e,a,n){n.r(a),n.d(a,{default:function(){return M}});var t=n(6768);const l={class:"net-wrap app-wrap"},s={class:"inner absolute flex flex-column flex-nowrap"},i={class:"head"},r={class:"body flex-1 relative"},u={class:"status"};function c(e,a,n,c,d,o){const g=(0,t.g2)("Head"),p=(0,t.g2)("List"),v=(0,t.g2)("Status");return(0,t.uX)(),(0,t.CE)("div",l,[(0,t.Lk)("div",s,[(0,t.Lk)("div",i,[(0,t.bF)(g)]),(0,t.Lk)("div",r,[(0,t.bF)(p)]),(0,t.Lk)("div",u,[(0,t.bF)(v,{config:!1})])])])}n(4114);const d=e=>((0,t.Qi)("data-v-6bee0a84"),e=e(),(0,t.jt)(),e),o={class:"head-wrap"},g={class:"tools flex"},p=d((()=>(0,t.Lk)("span",{class:"label"},"服务器 ",-1))),v=d((()=>(0,t.Lk)("span",{class:"flex-1"},null,-1))),h={style:{"margin-left":"1rem"}};function f(e,a,n,l,s,i){const r=(0,t.g2)("el-option"),u=(0,t.g2)("el-select"),c=(0,t.g2)("Refresh"),d=(0,t.g2)("el-icon"),f=(0,t.g2)("el-button"),k=(0,t.g2)("Background");return(0,t.uX)(),(0,t.CE)("div",o,[(0,t.Lk)("div",g,[p,(0,t.bF)(u,{modelValue:l.state.server,"onUpdate:modelValue":a[0]||(a[0]=e=>l.state.server=e),placeholder:"服务器",style:{width:"16rem"},size:"small"},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(l.state.servers,(e=>((0,t.uX)(),(0,t.Wv)(r,{key:e.Host,label:e.Name,value:e.Host},null,8,["label","value"])))),128))])),_:1},8,["modelValue"]),v,(0,t.bF)(f,{size:"small",onClick:l.handleRefresh},{default:(0,t.k6)((()=>[(0,t.eW)(" 刷新(F5)"),(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(c)])),_:1})])),_:1},8,["onClick"]),(0,t.Lk)("div",h,[(0,t.bF)(k,{name:"net"})])])])}var k=n(3830),m=n(144),b=n(7477),C=n(5096),L={components:{Edit:b.ffu,Refresh:b.C42,Background:C.A},setup(){const e=(0,k.B)(),a=(0,m.Kh)({server:"linker.snltty.com:1802",servers:[]});(0,t.wB)((()=>e.value.config.Running.Client.Servers),(()=>{a.servers=(e.value.config.Running.Client.Servers||[]).slice(0,1),a.server=e.value.config.Client.Server}));const n=()=>{window.location.reload()};return{state:a,handleRefresh:n}}},w=n(1241);const S=(0,w.A)(L,[["render",f],["__scopeId","data-v-6bee0a84"]]);var F=S;const _=e=>((0,t.Qi)("data-v-5052ddc7"),e=e(),(0,t.jt)(),e),x={class:"net-list-wrap flex flex-column absolute"},z={class:"flex-1 scrollbar"},E={class:"flex"},I=_((()=>(0,t.Lk)("div",{class:"flex-1"},null,-1))),T={class:"tuntap"},A={class:"page t-c"},B={class:"page-wrap t-c"};function P(e,a,n,l,s,i){const r=(0,t.g2)("DeviceName"),u=(0,t.g2)("UpdaterBtn"),c=(0,t.g2)("TuntapShow"),d=(0,t.g2)("el-pagination");return(0,t.uX)(),(0,t.CE)("div",x,[(0,t.Lk)("div",z,[(0,t.Lk)("ul",null,[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(l.devices.page.List,((e,a)=>((0,t.uX)(),(0,t.CE)("li",{key:a},[(0,t.Lk)("dl",null,[(0,t.Lk)("dt",E,[(0,t.Lk)("div",null,[(0,t.bF)(r,{item:e},null,8,["item"])]),I,(0,t.Lk)("div",null,[(0,t.bF)(u,{config:!1,item:e},null,8,["item"])])]),(0,t.Lk)("dd",T,[l.tuntap.list[e.MachineId]?((0,t.uX)(),(0,t.Wv)(c,{key:0,item:e},null,8,["item"])):(0,t.Q3)("",!0)])])])))),128))])]),(0,t.Lk)("div",A,[(0,t.Lk)("div",B,[(0,t.bF)(d,{size:"small",background:"",layout:"prev,pager, next","pager-count":5,total:l.devices.page.Count,"page-size":l.devices.page.Request.Size,"current-page":l.devices.page.Request.Page,onCurrentChange:l.handlePageChange,onSizeChange:l.handlePageSizeChange,"page-sizes":[10,20,50,100,255]},null,8,["total","page-size","current-page","onCurrentChange","onSizeChange"])])])])}var R=n(8104),y=n(7985),X=n(9383),D=n(2126),N=n(886),U=n(3630),V={components:{StarFilled:b.BQ2,UpdaterBtn:D.A,DeviceName:N.A,TuntapShow:U.A},setup(e){(0,k.B)();const a=(0,m.Kh)({}),{devices:n,machineId:l,_getSignList:s,_getSignList1:i,handleDeviceEdit:r,handlePageChange:u,handlePageSizeChange:c,handleDel:d,clearDevicesTimeout:o}=(0,y.r)(),{tuntap:g,_getTuntapInfo:p,handleTuntapRefresh:v,clearTuntapTimeout:h,handleTuntapEdit:f,sortTuntapIP:b}=(0,R.O)(),{_getUpdater:C,clearUpdaterTimeout:L}=(0,X.d)();return(0,t.sV)((()=>{u(),v(),s(),i(),p(),C()})),(0,t.hi)((()=>{o(),h(),L()})),{state:a,devices:n,machineId:l,handlePageChange:u,handlePageSizeChange:c,tuntap:g}}};const H=(0,w.A)(V,[["render",P],["__scopeId","data-v-5052ddc7"]]);var K=H,Q=n(3236),W=n(1387),j={components:{Head:F,List:K,Status:Q.A},setup(){document.addEventListener("contextmenu",(function(e){e.preventDefault()}));const e=(0,k.B)(),a=(0,W.rd)();return(0,t.sV)((()=>{0==e.value.hasAccess("NetManager")&&a.push({name:"NoPermission"})})),{}}};const q=(0,w.A)(j,[["render",c],["__scopeId","data-v-6a3f3b43"]]);var M=q}}]);
|
||||
1
linker.tray.win/web/js/429.8082aa90.js
Normal file
1
linker.tray.win/web/js/429.8082aa90.js
Normal file
@@ -0,0 +1 @@
|
||||
"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[429],{2347:function(e,a,n){n.r(a),n.d(a,{default:function(){return M}});var t=n(6768);const l={class:"net-wrap app-wrap"},s={class:"inner absolute flex flex-column flex-nowrap"},i={class:"head"},r={class:"body flex-1 relative"},u={class:"status"};function c(e,a,n,c,d,o){const g=(0,t.g2)("Head"),p=(0,t.g2)("List"),v=(0,t.g2)("Status");return(0,t.uX)(),(0,t.CE)("div",l,[(0,t.Lk)("div",s,[(0,t.Lk)("div",i,[(0,t.bF)(g)]),(0,t.Lk)("div",r,[(0,t.bF)(p)]),(0,t.Lk)("div",u,[(0,t.bF)(v,{config:!1})])])])}n(4114);const d=e=>((0,t.Qi)("data-v-f3fbe048"),e=e(),(0,t.jt)(),e),o={class:"head-wrap"},g={class:"tools flex"},p=d((()=>(0,t.Lk)("span",{class:"label"},"服务器 ",-1))),v=d((()=>(0,t.Lk)("span",{class:"flex-1"},null,-1))),f={style:{"margin-left":"1rem"}};function h(e,a,n,l,s,i){const r=(0,t.g2)("el-option"),u=(0,t.g2)("el-select"),c=(0,t.g2)("Refresh"),d=(0,t.g2)("el-icon"),h=(0,t.g2)("el-button"),k=(0,t.g2)("Background");return(0,t.uX)(),(0,t.CE)("div",o,[(0,t.Lk)("div",g,[p,(0,t.bF)(u,{modelValue:l.state.server,"onUpdate:modelValue":a[0]||(a[0]=e=>l.state.server=e),placeholder:"服务器",style:{width:"16rem"},size:"small"},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(l.state.servers,(e=>((0,t.uX)(),(0,t.Wv)(r,{key:e.Host,label:e.Name,value:e.Host},null,8,["label","value"])))),128))])),_:1},8,["modelValue"]),v,(0,t.bF)(h,{size:"small",onClick:l.handleRefresh},{default:(0,t.k6)((()=>[(0,t.eW)(" 刷新(F5)"),(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(c)])),_:1})])),_:1},8,["onClick"]),(0,t.Lk)("div",f,[(0,t.bF)(k,{name:"net"})])])])}var k=n(3830),m=n(144),b=n(7477),C=n(5096),L={components:{Edit:b.ffu,Refresh:b.C42,Background:C.A},setup(){const e=(0,k.B)(),a=(0,m.Kh)({server:"linker.snltty.com:1802",servers:[]});(0,t.wB)((()=>e.value.config.Running.Client.Servers),(()=>{a.servers=(e.value.config.Running.Client.Servers||[]).slice(0,1),a.server=e.value.config.Client.ServerInfo.Host}));const n=()=>{window.location.reload()};return{state:a,handleRefresh:n}}},w=n(1241);const S=(0,w.A)(L,[["render",h],["__scopeId","data-v-f3fbe048"]]);var F=S;const _=e=>((0,t.Qi)("data-v-5052ddc7"),e=e(),(0,t.jt)(),e),x={class:"net-list-wrap flex flex-column absolute"},z={class:"flex-1 scrollbar"},I={class:"flex"},E=_((()=>(0,t.Lk)("div",{class:"flex-1"},null,-1))),T={class:"tuntap"},A={class:"page t-c"},B={class:"page-wrap t-c"};function P(e,a,n,l,s,i){const r=(0,t.g2)("DeviceName"),u=(0,t.g2)("UpdaterBtn"),c=(0,t.g2)("TuntapShow"),d=(0,t.g2)("el-pagination");return(0,t.uX)(),(0,t.CE)("div",x,[(0,t.Lk)("div",z,[(0,t.Lk)("ul",null,[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(l.devices.page.List,((e,a)=>((0,t.uX)(),(0,t.CE)("li",{key:a},[(0,t.Lk)("dl",null,[(0,t.Lk)("dt",I,[(0,t.Lk)("div",null,[(0,t.bF)(r,{item:e},null,8,["item"])]),E,(0,t.Lk)("div",null,[(0,t.bF)(u,{config:!1,item:e},null,8,["item"])])]),(0,t.Lk)("dd",T,[l.tuntap.list[e.MachineId]?((0,t.uX)(),(0,t.Wv)(c,{key:0,item:e},null,8,["item"])):(0,t.Q3)("",!0)])])])))),128))])]),(0,t.Lk)("div",A,[(0,t.Lk)("div",B,[(0,t.bF)(d,{size:"small",background:"",layout:"prev,pager, next","pager-count":5,total:l.devices.page.Count,"page-size":l.devices.page.Request.Size,"current-page":l.devices.page.Request.Page,onCurrentChange:l.handlePageChange,onSizeChange:l.handlePageSizeChange,"page-sizes":[10,20,50,100,255]},null,8,["total","page-size","current-page","onCurrentChange","onSizeChange"])])])])}var R=n(8104),y=n(7985),X=n(9383),D=n(2126),H=n(886),N=n(3630),U={components:{StarFilled:b.BQ2,UpdaterBtn:D.A,DeviceName:H.A,TuntapShow:N.A},setup(e){(0,k.B)();const a=(0,m.Kh)({}),{devices:n,machineId:l,_getSignList:s,_getSignList1:i,handleDeviceEdit:r,handlePageChange:u,handlePageSizeChange:c,handleDel:d,clearDevicesTimeout:o}=(0,y.r)(),{tuntap:g,_getTuntapInfo:p,handleTuntapRefresh:v,clearTuntapTimeout:f,handleTuntapEdit:h,sortTuntapIP:b}=(0,R.O)(),{_getUpdater:C,clearUpdaterTimeout:L}=(0,X.d)();return(0,t.sV)((()=>{u(),v(),s(),i(),p(),C()})),(0,t.hi)((()=>{o(),f(),L()})),{state:a,devices:n,machineId:l,handlePageChange:u,handlePageSizeChange:c,tuntap:g}}};const V=(0,w.A)(U,[["render",P],["__scopeId","data-v-5052ddc7"]]);var K=V,Q=n(3236),W=n(1387),j={components:{Head:F,List:K,Status:Q.A},setup(){document.addEventListener("contextmenu",(function(e){e.preventDefault()}));const e=(0,k.B)(),a=(0,W.rd)();return(0,t.sV)((()=>{0==e.value.hasAccess("NetManager")&&a.push({name:"NoPermission"})})),{}}};const q=(0,w.A)(j,[["render",c],["__scopeId","data-v-6a3f3b43"]]);var M=q}}]);
|
||||
1
linker.tray.win/web/js/518.5b2e2a90.js
Normal file
1
linker.tray.win/web/js/518.5b2e2a90.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -16,9 +16,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker tun</PackageReleaseNotes>
|
||||
<Version>1.3.8</Version>
|
||||
<AssemblyVersion>1.3.8</AssemblyVersion>
|
||||
<FileVersion>1.3.8</FileVersion>
|
||||
<Version>1.3.9</Version>
|
||||
<AssemblyVersion>1.3.9</AssemblyVersion>
|
||||
<FileVersion>1.3.9</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -256,7 +256,8 @@ namespace linker.tunnel.connection
|
||||
{
|
||||
LastTicks = 0;
|
||||
|
||||
LoggerHelper.Instance.Error($"tunnel connection writer offline {ToString()}");
|
||||
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||
LoggerHelper.Instance.Error($"tunnel connection writer offline {ToString()}");
|
||||
|
||||
callback?.Closed(this, userToken);
|
||||
callback = null;
|
||||
|
||||
@@ -287,7 +287,8 @@ namespace linker.tunnel.connection
|
||||
public void Dispose()
|
||||
{
|
||||
LastTicks = 0;
|
||||
LoggerHelper.Instance.Error($"tunnel connection {this.GetHashCode()} writer offline {ToString()}");
|
||||
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||
LoggerHelper.Instance.Error($"tunnel connection {this.GetHashCode()} writer offline {ToString()}");
|
||||
|
||||
callback?.Closed(this, userToken);
|
||||
callback = null;
|
||||
|
||||
@@ -112,7 +112,8 @@ namespace linker.tunnel.connection
|
||||
finally
|
||||
{
|
||||
Dispose();
|
||||
LoggerHelper.Instance.Error($"tunnel connection writer offline {ToString()}");
|
||||
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||
LoggerHelper.Instance.Error($"tunnel connection writer offline {ToString()}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,9 +16,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker tunnel</PackageReleaseNotes>
|
||||
<Version>1.3.8</Version>
|
||||
<AssemblyVersion>1.3.8</AssemblyVersion>
|
||||
<FileVersion>1.3.8</FileVersion>
|
||||
<Version>1.3.9</Version>
|
||||
<AssemblyVersion>1.3.9</AssemblyVersion>
|
||||
<FileVersion>1.3.9</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -113,7 +113,7 @@ export default {
|
||||
password:step.value.form.client.password || globalData.value.config.Client.CApi.ApiPassword,
|
||||
|
||||
hasServer:step.value.form.client.hasServer ||false,
|
||||
server:step.value.form.client.server ||globalData.value.config.Client.Server,
|
||||
server:step.value.form.client.server ||globalData.value.config.Client.ServerInfo.Host,
|
||||
serverSecretKey:step.value.form.client.serverSecretKey ||globalData.value.config.Client.ServerSecretKey,
|
||||
sForwardSecretKey:step.value.form.client.sForwardSecretKey ||globalData.value.config.Running.SForwardSecretKey,
|
||||
relaySecretKey:step.value.form.client.relaySecretKey ||(globalData.value.config.Running.Relay.Servers[0] || {SecretKey:'snltty'}).SecretKey,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<Version ckey="signServers"/>
|
||||
<el-table :data="state.list" border size="small" width="100%" :height="`${state.height}px`" @cell-dblclick="handleCellClick">
|
||||
<el-table-column prop="Name" label="名称">
|
||||
<el-table-column prop="Name" label="名称" width="100">
|
||||
<template #default="scope">
|
||||
<template v-if="scope.row.NameEditing">
|
||||
<el-input autofocus size="small" v-model="scope.row.Name"
|
||||
@@ -31,6 +31,15 @@
|
||||
<template v-else></template>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="Arg" label="Json参数" >
|
||||
<template #default="scope">
|
||||
<template v-if="scope.row.ArgEditing">
|
||||
<el-input type="password" show-password size="small" v-model="scope.row.Arg"
|
||||
@blur="handleEditBlur(scope.row, 'Arg')"></el-input>
|
||||
</template>
|
||||
<template v-else></template>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="Oper" label="操作" width="150">
|
||||
<template #default="scope">
|
||||
<div>
|
||||
@@ -57,7 +66,7 @@
|
||||
<script>
|
||||
import { setSignInServers } from '@/apis/signin';
|
||||
import { injectGlobalData } from '@/provide';
|
||||
import { ElMessage } from 'element-plus';
|
||||
import { ElMessage, ElMessageBox } from 'element-plus';
|
||||
import { computed, inject, reactive, watch } from 'vue'
|
||||
import Version from './Version.vue';
|
||||
import { Delete,Plus,Select } from '@element-plus/icons-vue';
|
||||
@@ -70,7 +79,7 @@ export default {
|
||||
const globalData = injectGlobalData();
|
||||
const state = reactive({
|
||||
list:globalData.value.config.Running.Client.Servers || [],
|
||||
server:computed(()=>globalData.value.config.Client.Server),
|
||||
server:computed(()=>globalData.value.config.Client.ServerInfo.Host),
|
||||
height: computed(()=>globalData.value.height-135),
|
||||
});
|
||||
watch(()=>globalData.value.config.Running.Client.Servers,()=>{
|
||||
@@ -87,6 +96,7 @@ export default {
|
||||
c[`NameEditing`] = false;
|
||||
c[`HostEditing`] = false;
|
||||
c[`SecretKeyEditing`] = false;
|
||||
c[`ArgEditing`] = false;
|
||||
})
|
||||
row[`${p}Editing`] = true;
|
||||
row[`__editing`] = true;
|
||||
@@ -116,6 +126,18 @@ export default {
|
||||
}
|
||||
|
||||
const handleSave = ()=>{
|
||||
for (let i = 0; i < state.list.length; i++) {
|
||||
if(!state.list[i].Arg) continue;
|
||||
try{
|
||||
if(typeof(JSON.parse(state.list[i].Arg)) != 'object'){
|
||||
ElMessage.error('Json参数错误,需要JSON格式');
|
||||
return;
|
||||
}
|
||||
}catch(e){
|
||||
ElMessage.error('Json参数错误,需要JSON格式');
|
||||
return;
|
||||
}
|
||||
}
|
||||
setSignInServers(state.list).then(()=>{
|
||||
ElMessage.success('已操作');
|
||||
}).catch(()=>{
|
||||
|
||||
@@ -30,7 +30,7 @@ export default {
|
||||
});
|
||||
watch(()=>globalData.value.config.Running.Client.Servers,()=>{
|
||||
state.servers = (globalData.value.config.Running.Client.Servers || []).slice(0,1);
|
||||
state.server = globalData.value.config.Client.Server;
|
||||
state.server = globalData.value.config.Client.ServerInfo.Host;
|
||||
});
|
||||
const handleRefresh = ()=>{
|
||||
window.location.reload();
|
||||
|
||||
@@ -19,17 +19,17 @@
|
||||
<Title>linker</Title>
|
||||
<Authors>snltty</Authors>
|
||||
<Company>snltty</Company>
|
||||
<Description>1. 优化隧道连接逻辑,降低首帧时间,先中继,成功则后台打洞,后台打洞成功则切换隧道,中继失败则立即打洞
|
||||
2. 虚拟网卡,可能会丢失一两个包,TCP不会断开连接
|
||||
3. 端口转发,在发送数据包失败后,会尝试切换隧道再次发送,无缝切换隧道
|
||||
4. 优化服务端消息处理器</Description>
|
||||
<Description>1. 优化虚拟网卡中继逻辑
|
||||
2. 信标服务器可设置静态Json参数
|
||||
3. 优化UDP打洞
|
||||
4. 数据库加密,保护你的隐私</Description>
|
||||
<Copyright>snltty</Copyright>
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker</PackageReleaseNotes>
|
||||
<Version>1.3.8</Version>
|
||||
<AssemblyVersion>1.3.8</AssemblyVersion>
|
||||
<FileVersion>1.3.8</FileVersion>
|
||||
<Version>1.3.9</Version>
|
||||
<AssemblyVersion>1.3.9</AssemblyVersion>
|
||||
<FileVersion>1.3.9</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ namespace linker.plugins.signin
|
||||
|
||||
public bool SetArgs(ApiControllerParamsInfo param)
|
||||
{
|
||||
actionTransfer.SetActions(param.Content);
|
||||
actionTransfer.SetActionArg(param.Content);
|
||||
clientSignInTransfer.SignOut();
|
||||
_ = clientSignInTransfer.SignIn();
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using linker.libs;
|
||||
using linker.config;
|
||||
using linker.libs;
|
||||
using linker.libs.extends;
|
||||
using System.Net.Http.Json;
|
||||
using System.Text.Json.Nodes;
|
||||
@@ -7,17 +8,26 @@ namespace linker.plugins.action
|
||||
public sealed class ActionTransfer
|
||||
{
|
||||
public const string ACTION_ARG_KEY = "ACTION_ARGS";
|
||||
|
||||
private string action = new ActionInfo { Key = "token", Value = Helper.GlobalString }.ToJson();
|
||||
public void SetActions(string action)
|
||||
|
||||
public void SetActionArg(string action)
|
||||
{
|
||||
this.action = action;
|
||||
}
|
||||
public string GetAction()
|
||||
public string GetActionArg()
|
||||
{
|
||||
return action;
|
||||
}
|
||||
|
||||
public bool TryGetActionArg(Dictionary<string, string> args, out string str)
|
||||
{
|
||||
if (args.TryGetValue(ACTION_ARG_KEY, out str) == false || string.IsNullOrWhiteSpace(str))
|
||||
{
|
||||
args.TryGetValue("signin-arg", out str);
|
||||
}
|
||||
return string.IsNullOrWhiteSpace(str) == false;
|
||||
}
|
||||
|
||||
public async Task<string> ExcuteActions(string actionJson, string url)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(url)) return string.Empty;
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace linker.plugins.action
|
||||
|
||||
public async Task<string> Invoke(Dictionary<string, string> args)
|
||||
{
|
||||
args.TryAdd(ActionTransfer.ACTION_ARG_KEY, actionTransfer.GetAction());
|
||||
args.TryAdd(ActionTransfer.ACTION_ARG_KEY, actionTransfer.GetActionArg());
|
||||
|
||||
await Task.CompletedTask;
|
||||
return string.Empty;
|
||||
@@ -28,8 +28,12 @@ namespace linker.plugins.action
|
||||
|
||||
public async Task<string> Verify(SignInfo signInfo, SignCacheInfo cache)
|
||||
{
|
||||
if (signInfo.Args.TryGetValue(ActionTransfer.ACTION_ARG_KEY, out string str))
|
||||
if (string.IsNullOrWhiteSpace(fileConfig.Data.Action.SignInActionUrl) == false)
|
||||
{
|
||||
if (actionTransfer.TryGetActionArg(signInfo.Args, out string str) == false)
|
||||
{
|
||||
return $"singin action URL exists, but [{signInfo.MachineName}] action value is not configured";
|
||||
}
|
||||
return await actionTransfer.ExcuteActions(str, fileConfig.Data.Action.SignInActionUrl);
|
||||
}
|
||||
|
||||
@@ -52,13 +56,13 @@ namespace linker.plugins.action
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(fileConfig.Data.Action.RelayActionUrl) == false)
|
||||
{
|
||||
if (fromMachine.Args.TryGetValue(ActionTransfer.ACTION_ARG_KEY, out string str) == false || string.IsNullOrWhiteSpace(str))
|
||||
if (actionTransfer.TryGetActionArg(fromMachine.Args, out string str) == false)
|
||||
{
|
||||
return $"action URL exists, but [{fromMachine.MachineName}] action value is not configured";
|
||||
return $"relay action URL exists, but [{fromMachine.MachineName}] action value is not configured";
|
||||
}
|
||||
if (toMachine != null && toMachine.Args.TryGetValue(ActionTransfer.ACTION_ARG_KEY, out str) == false || string.IsNullOrWhiteSpace(str))
|
||||
if (toMachine != null && actionTransfer.TryGetActionArg(toMachine.Args, out str) == false)
|
||||
{
|
||||
return $"action URL exists, but [{toMachine.MachineName}]e action value is not configured";
|
||||
return $"relay action URL exists, but [{toMachine.MachineName}]e action value is not configured";
|
||||
}
|
||||
return await actionTransfer.ExcuteActions(str, fileConfig.Data.Action.RelayActionUrl);
|
||||
}
|
||||
@@ -81,9 +85,9 @@ namespace linker.plugins.action
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(fileConfig.Data.Action.SForwardActionUrl) == false)
|
||||
{
|
||||
if (cache.Args.TryGetValue(ActionTransfer.ACTION_ARG_KEY, out string str) == false || string.IsNullOrWhiteSpace(str))
|
||||
if (actionTransfer.TryGetActionArg(cache.Args, out string str) == false)
|
||||
{
|
||||
return "action URL exists, but action value is not configured";
|
||||
return "sforward action URL exists, but action value is not configured";
|
||||
}
|
||||
return await actionTransfer.ExcuteActions(str, fileConfig.Data.Action.SForwardActionUrl);
|
||||
}
|
||||
|
||||
@@ -36,10 +36,9 @@ namespace linker.plugins.client
|
||||
this.signInArgsTransfer = signInArgsTransfer;
|
||||
this.runningConfigTransfer = runningConfigTransfer;
|
||||
|
||||
if (string.IsNullOrWhiteSpace(config.Data.Client.Server) && runningConfig.Data.Client.Servers.Length > 0)
|
||||
if (runningConfig.Data.Client.Servers.Length > 0)
|
||||
{
|
||||
config.Data.Client.Server = runningConfig.Data.Client.Servers.FirstOrDefault().Host;
|
||||
config.Data.Client.ServerSecretKey = runningConfig.Data.Client.Servers.FirstOrDefault().SecretKey;
|
||||
config.Data.Client.ServerInfo = runningConfig.Data.Client.Servers.FirstOrDefault();
|
||||
}
|
||||
|
||||
runningConfigTransfer.Setter(configKey, SetServers);
|
||||
@@ -90,13 +89,13 @@ namespace linker.plugins.client
|
||||
try
|
||||
{
|
||||
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||
LoggerHelper.Instance.Info($"connect to signin server:{config.Data.Client.Server}");
|
||||
LoggerHelper.Instance.Info($"connect to signin server:{config.Data.Client.ServerInfo.Host}");
|
||||
|
||||
IPEndPoint ip = NetworkHelper.GetEndPoint(config.Data.Client.Server, 1802);
|
||||
IPEndPoint ip = NetworkHelper.GetEndPoint(config.Data.Client.ServerInfo.Host, 1802);
|
||||
if (ip == null)
|
||||
{
|
||||
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||
LoggerHelper.Instance.Error($"get domain ip fail:{config.Data.Client.Server}");
|
||||
LoggerHelper.Instance.Error($"get domain ip fail:{config.Data.Client.ServerInfo.Host}");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -317,15 +316,14 @@ namespace linker.plugins.client
|
||||
}
|
||||
private async Task SetServersReSignin(ClientServerInfo[] servers)
|
||||
{
|
||||
string server = config.Data.Client.Server;
|
||||
string server = config.Data.Client.ServerInfo.Host;
|
||||
runningConfig.Data.Client.Servers = servers;
|
||||
if (runningConfig.Data.Client.Servers.Length > 0)
|
||||
{
|
||||
config.Data.Client.Server = runningConfig.Data.Client.Servers.FirstOrDefault().Host;
|
||||
config.Data.Client.ServerSecretKey = runningConfig.Data.Client.Servers.FirstOrDefault().SecretKey;
|
||||
config.Data.Client.ServerInfo = runningConfig.Data.Client.Servers.FirstOrDefault();
|
||||
}
|
||||
runningConfig.Data.Update();
|
||||
if (server != config.Data.Client.Server)
|
||||
if (server != config.Data.Client.ServerInfo.Host)
|
||||
{
|
||||
SignOut();
|
||||
await SignIn();
|
||||
|
||||
@@ -16,7 +16,8 @@ namespace linker.plugins.client
|
||||
}
|
||||
public async Task<string> Invoke(Dictionary<string, string> args)
|
||||
{
|
||||
args.TryAdd("signin-secretkey", fileConfig.Data.Client.ServerSecretKey);
|
||||
args.TryAdd("signin-secretkey", fileConfig.Data.Client.ServerInfo.SecretKey);
|
||||
args.TryAdd("signin-arg", fileConfig.Data.Client.ServerInfo.Arg);
|
||||
|
||||
await Task.CompletedTask;
|
||||
return string.Empty;
|
||||
|
||||
@@ -42,7 +42,7 @@ namespace linker.config
|
||||
public ConfigClientInfo Client { get; set; } = new ConfigClientInfo();
|
||||
}
|
||||
|
||||
public sealed partial class ConfigClientInfo: IConfig
|
||||
public sealed partial class ConfigClientInfo : IConfig
|
||||
{
|
||||
private ICrypto crypto;
|
||||
public ConfigClientInfo()
|
||||
@@ -94,11 +94,11 @@ namespace linker.config
|
||||
public bool OnlyNode { get; set; }
|
||||
|
||||
#if DEBUG
|
||||
public string Server { get; set; } = new IPEndPoint(IPAddress.Loopback, 1802).ToString();
|
||||
public ClientServerInfo ServerInfo { get; set; } = new ClientServerInfo { Host = new IPEndPoint(IPAddress.Loopback, 1802).ToString(), Name = "default", SecretKey = string.Empty };
|
||||
#else
|
||||
public string Server { get; set; } = "linker.snltty.com:1802";
|
||||
public ClientServerInfo ServerInfo { get; set; } = new ClientServerInfo { Host = "linker.snltty.com:1802", Name = "default", SecretKey = string.Empty };
|
||||
#endif
|
||||
public string ServerSecretKey { get; set; } = string.Empty;
|
||||
|
||||
private string id = string.Empty;
|
||||
public string Id
|
||||
@@ -159,6 +159,7 @@ namespace linker.config
|
||||
public string Name { get; set; } = string.Empty;
|
||||
public string Host { get; set; } = string.Empty;
|
||||
public string SecretKey { get; set; } = string.Empty;
|
||||
public string Arg { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
[AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)]
|
||||
|
||||
@@ -49,14 +49,12 @@ namespace linker.plugins.config
|
||||
|
||||
if (info.Client.HasServer)
|
||||
{
|
||||
config.Data.Client.Server = info.Client.Server;
|
||||
config.Data.Client.ServerSecretKey = info.Client.ServerSecretKey;
|
||||
|
||||
runningConfig.Data.SForwardSecretKey = info.Client.SForwardSecretKey;
|
||||
runningConfig.Data.UpdaterSecretKey = info.Client.UpdaterSecretKey;
|
||||
foreach (var item in runningConfig.Data.Relay.Servers)
|
||||
{
|
||||
item.SecretKey = info.Client.RelaySecretKey;
|
||||
item.Host = info.Client.Server;
|
||||
}
|
||||
foreach (var item in runningConfig.Data.Tunnel.Servers)
|
||||
{
|
||||
@@ -67,6 +65,8 @@ namespace linker.plugins.config
|
||||
item.Host = info.Client.Server;
|
||||
item.SecretKey = info.Client.ServerSecretKey;
|
||||
}
|
||||
if (runningConfig.Data.Client.Servers.Length > 0)
|
||||
config.Data.Client.ServerInfo = runningConfig.Data.Client.Servers.FirstOrDefault();
|
||||
}
|
||||
}
|
||||
if (info.Common.Modes.Contains("server"))
|
||||
@@ -242,7 +242,7 @@ namespace linker.plugins.config
|
||||
public bool HasServer { get; set; }
|
||||
public string Server { get; set; }
|
||||
public string ServerSecretKey { get; set; }
|
||||
|
||||
|
||||
public string SForwardSecretKey { get; set; }
|
||||
public string RelaySecretKey { get; set; }
|
||||
public string UpdaterSecretKey { get; set; }
|
||||
|
||||
@@ -183,17 +183,20 @@ namespace linker.plugins.relay
|
||||
ServerName = item.Name
|
||||
};
|
||||
|
||||
LoggerHelper.Instance.Info($"relay to {relayInfo.RemoteMachineId}->{relayInfo.RemoteMachineName} {relayInfo.ToJson()}");
|
||||
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||
LoggerHelper.Instance.Info($"relay to {relayInfo.RemoteMachineId}->{relayInfo.RemoteMachineName} {relayInfo.ToJson()}");
|
||||
ITunnelConnection connection = await transport.RelayAsync(relayInfo).ConfigureAwait(false);
|
||||
if (connection != null)
|
||||
{
|
||||
LoggerHelper.Instance.Debug($"relay to {relayInfo.RemoteMachineId}->{relayInfo.RemoteMachineName} success,{relayInfo.ToJson()}");
|
||||
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||
LoggerHelper.Instance.Debug($"relay to {relayInfo.RemoteMachineId}->{relayInfo.RemoteMachineName} success,{relayInfo.ToJson()}");
|
||||
ConnectedCallback(relayInfo, connection);
|
||||
return connection;
|
||||
}
|
||||
else
|
||||
{
|
||||
LoggerHelper.Instance.Error($"relay to {relayInfo.RemoteMachineId}->{relayInfo.RemoteMachineName} fail,{relayInfo.ToJson()}");
|
||||
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||
LoggerHelper.Instance.Error($"relay to {relayInfo.RemoteMachineId}->{relayInfo.RemoteMachineName} fail,{relayInfo.ToJson()}");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -232,12 +235,14 @@ namespace linker.plugins.relay
|
||||
{
|
||||
if (connection != null)
|
||||
{
|
||||
LoggerHelper.Instance.Debug($"relay from {relayInfo.RemoteMachineId}->{relayInfo.RemoteMachineName} success,{relayInfo.ToJson()}");
|
||||
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||
LoggerHelper.Instance.Debug($"relay from {relayInfo.RemoteMachineId}->{relayInfo.RemoteMachineName} success,{relayInfo.ToJson()}");
|
||||
ConnectedCallback(relayInfo, connection);
|
||||
}
|
||||
else
|
||||
{
|
||||
LoggerHelper.Instance.Error($"relay from {relayInfo.RemoteMachineId}->{relayInfo.RemoteMachineName} error,{relayInfo.ToJson()}");
|
||||
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||
LoggerHelper.Instance.Error($"relay from {relayInfo.RemoteMachineId}->{relayInfo.RemoteMachineName} error,{relayInfo.ToJson()}");
|
||||
}
|
||||
}).ConfigureAwait(false);
|
||||
return true;
|
||||
|
||||
@@ -73,14 +73,13 @@ namespace linker.plugins.tunnel
|
||||
{
|
||||
return connection;
|
||||
}
|
||||
|
||||
if (await WaitAsync(machineId) == false)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (await WaitAsync(machineId) == false)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
//获得锁之前再次看看之前有没有连接成功
|
||||
if (connections.TryGetValue(machineId, out connection) && connection.Connected)
|
||||
{
|
||||
@@ -111,8 +110,6 @@ namespace linker.plugins.tunnel
|
||||
}
|
||||
private async Task<ITunnelConnection> RelayAndP2P(string machineId, TunnelProtocolType denyProtocols)
|
||||
{
|
||||
if (tunnelTransfer.IsBackground(machineId, TransactionId)) return null;
|
||||
|
||||
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"{TransactionId} relay to {machineId}");
|
||||
ITunnelConnection connection = await relayTransfer.ConnectAsync(config.Data.Client.Id, machineId, TransactionId).ConfigureAwait(false);
|
||||
if (connection != null)
|
||||
@@ -125,6 +122,8 @@ namespace linker.plugins.tunnel
|
||||
}
|
||||
else
|
||||
{
|
||||
if (tunnelTransfer.IsBackground(machineId, TransactionId)) return null;
|
||||
|
||||
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"{TransactionId} p2p to {machineId}");
|
||||
connection = await tunnelTransfer.ConnectAsync(machineId, TransactionId, denyProtocols).ConfigureAwait(false);
|
||||
if (connection != null)
|
||||
|
||||
@@ -65,7 +65,7 @@ namespace linker.plugins.tunnel
|
||||
serviceCollection.AddSingleton<ITunnelAdapter, TunnelAdapter>();
|
||||
|
||||
LoggerHelper.Instance.Info($"tunnel route level getting.");
|
||||
config.Data.Client.Tunnel.RouteLevel = NetworkHelper.GetRouteLevel(config.Data.Client.Server, out List<IPAddress> ips);
|
||||
config.Data.Client.Tunnel.RouteLevel = NetworkHelper.GetRouteLevel(config.Data.Client.ServerInfo.Host, out List<IPAddress> ips);
|
||||
config.Data.Client.Tunnel.RouteIPs = ips.ToArray();
|
||||
LoggerHelper.Instance.Warning($"route ips:{string.Join(",", ips.Select(c => c.ToString()))}");
|
||||
config.Data.Client.Tunnel.LocalIPs = NetworkHelper.GetIPV6().Concat(NetworkHelper.GetIPV4()).ToArray();
|
||||
|
||||
@@ -10,6 +10,7 @@ using System.Buffers.Binary;
|
||||
using linker.plugins.client;
|
||||
using linker.plugins.tunnel;
|
||||
using System.Buffers;
|
||||
using System.Net;
|
||||
|
||||
namespace linker.plugins.tuntap
|
||||
{
|
||||
@@ -41,7 +42,7 @@ namespace linker.plugins.tuntap
|
||||
};
|
||||
}
|
||||
/// <summary>
|
||||
/// 收到隧道数据
|
||||
/// 收到隧道数据,写入网卡
|
||||
/// </summary>
|
||||
/// <param name="connection"></param>
|
||||
/// <param name="buffer"></param>
|
||||
@@ -64,7 +65,7 @@ namespace linker.plugins.tuntap
|
||||
await Task.CompletedTask;
|
||||
}
|
||||
/// <summary>
|
||||
/// 收到网卡数据
|
||||
/// 收到网卡数据,发送给对方
|
||||
/// </summary>
|
||||
/// <param name="packet"></param>
|
||||
/// <returns></returns>
|
||||
@@ -94,6 +95,7 @@ namespace linker.plugins.tuntap
|
||||
|
||||
if (ipConnections.TryGetValue(ip, out ITunnelConnection connection) == false || connection == null || connection.Connected == false)
|
||||
{
|
||||
//开始操作,开始失败直接丢包
|
||||
if (operatingMultipleManager.StartOperation(ip) == false)
|
||||
{
|
||||
return;
|
||||
@@ -101,7 +103,9 @@ namespace linker.plugins.tuntap
|
||||
|
||||
_ = ConnectTunnel(ip).ContinueWith((result, state) =>
|
||||
{
|
||||
//结束操作
|
||||
operatingMultipleManager.StopOperation((uint)state);
|
||||
//连接成功就缓存隧道
|
||||
if (result.Result != null)
|
||||
{
|
||||
ipConnections.AddOrUpdate((uint)state, result.Result, (a, b) => result.Result);
|
||||
|
||||
@@ -62,7 +62,7 @@ namespace linker.plugins.tuntap
|
||||
LoggerHelper.Instance.Debug($"tuntap initialize");
|
||||
linkerTunDeviceAdapter.Shutdown();
|
||||
linkerTunDeviceAdapter.Clear();
|
||||
NetworkHelper.GetRouteLevel(config.Data.Client.Server, out routeIps);
|
||||
NetworkHelper.GetRouteLevel(config.Data.Client.ServerInfo.Host, out routeIps);
|
||||
NotifyConfig();
|
||||
CheckTuntapStatusTask();
|
||||
PingTask();
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using linker.libs.extends;
|
||||
using LiteDB;
|
||||
using LiteDB.Engine;
|
||||
using System.Net;
|
||||
|
||||
namespace linker.store
|
||||
@@ -17,8 +18,30 @@ namespace linker.store
|
||||
bsonMapper.RegisterType<IPEndPoint>(serialize: (a) => a.ToString(), deserialize: (a) => IPEndPoint.Parse(a.AsString));
|
||||
bsonMapper.RegisterType<IPAddress>(serialize: (a) => a.ToString(), deserialize: (a) => IPAddress.Parse(a.AsString));
|
||||
bsonMapper.RegisterType<IPAddress[]>(serialize: (a) => a.ToJson(), deserialize: (a) => a.AsString.DeJson<IPAddress[]>());
|
||||
database = new LiteDatabase(@"./configs/db.db", bsonMapper);
|
||||
|
||||
if (Encoded() == false)
|
||||
{
|
||||
database = new LiteDatabase(@"./configs/db.db", bsonMapper);
|
||||
var rebuildOptions = new RebuildOptions { Password = "snltty" };
|
||||
database.Rebuild(rebuildOptions);
|
||||
}
|
||||
else
|
||||
{
|
||||
database = new LiteDatabase(new ConnectionString("Filename=./configs/db.db; Password=snltty"), bsonMapper);
|
||||
}
|
||||
}
|
||||
|
||||
private bool Encoded()
|
||||
{
|
||||
try
|
||||
{
|
||||
string text = File.ReadAllText("./configs/db.db");
|
||||
return text.Contains("This is a LiteDB file") == false;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public ILiteCollection<T> GetCollection<T>(string name)
|
||||
|
||||
12
version.txt
12
version.txt
@@ -1,6 +1,6 @@
|
||||
v1.3.8
|
||||
2024-09-19 10:18:43
|
||||
1. 优化隧道连接逻辑,降低首帧时间,先中继,成功则后台打洞,后台打洞成功则切换隧道,中继失败则立即打洞
|
||||
2. 虚拟网卡,可能会丢失一两个包,TCP不会断开连接
|
||||
3. 端口转发,在发送数据包失败后,会尝试切换隧道再次发送,无缝切换隧道
|
||||
4. 优化服务端消息处理器
|
||||
v1.3.9
|
||||
2024-09-19 16:24:49
|
||||
1. 优化虚拟网卡中继逻辑
|
||||
2. 信标服务器可设置静态Json参数
|
||||
3. 优化UDP打洞
|
||||
4. 数据库加密,保护你的隐私
|
||||
Reference in New Issue
Block a user