优化更新

This commit is contained in:
snltty
2024-09-19 16:24:50 +08:00
parent 21b0a97e26
commit c0dc165c4e
37 changed files with 175 additions and 105 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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>

View File

@@ -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"/>

Binary file not shown.

View File

@@ -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}

View File

@@ -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%)}

View File

@@ -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>

View File

@@ -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}}]);

View 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}}]);

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

View File

@@ -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'">

View File

@@ -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;

View File

@@ -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;

View File

@@ -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()}");
}
}

View File

@@ -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'">

View File

@@ -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,

View File

@@ -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(()=>{

View File

@@ -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();

View File

@@ -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>

View File

@@ -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();

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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();

View File

@@ -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;

View File

@@ -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)]

View File

@@ -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; }

View File

@@ -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;

View File

@@ -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)

View File

@@ -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();

View File

@@ -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);

View File

@@ -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();

View File

@@ -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)

View File

@@ -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. 数据库加密,保护你的隐私