168
8
.github/workflows/docker.yml
vendored
@@ -57,9 +57,9 @@ jobs:
|
||||
docker tag snltty/linker-musl-x64:latest snltty/linker-musl:amd64 && \
|
||||
docker push snltty/linker-musl:amd64 && \
|
||||
docker manifest create snltty/linker-musl:latest snltty/linker-musl:amd64 snltty/linker-musl:arm64 snltty/linker-musl:arm && \
|
||||
docker manifest create snltty/linker-musl:v1.6.7 snltty/linker-musl:amd64 snltty/linker-musl:arm64 snltty/linker-musl:arm && \
|
||||
docker manifest create snltty/linker-musl:v1.6.8 snltty/linker-musl:amd64 snltty/linker-musl:arm64 snltty/linker-musl:arm && \
|
||||
docker manifest push snltty/linker-musl:latest && \
|
||||
docker manifest push snltty/linker-musl:v1.6.7 && \
|
||||
docker manifest push snltty/linker-musl:v1.6.8 && \
|
||||
docker pull --platform linux/arm/v7 snltty/linker-debian-arm:latest && \
|
||||
docker tag snltty/linker-debian-arm:latest snltty/linker-debian:arm && \
|
||||
docker push snltty/linker-debian:arm && \
|
||||
@@ -70,6 +70,6 @@ jobs:
|
||||
docker tag snltty/linker-debian-x64:latest snltty/linker-debian:amd64 && \
|
||||
docker push snltty/linker-debian:amd64 && \
|
||||
docker manifest create snltty/linker-debian:latest snltty/linker-debian:amd64 snltty/linker-debian:arm64 snltty/linker-debian:arm && \
|
||||
docker manifest create snltty/linker-debian:v1.6.7 snltty/linker-debian:amd64 snltty/linker-debian:arm64 snltty/linker-debian:arm && \
|
||||
docker manifest create snltty/linker-debian:v1.6.8 snltty/linker-debian:amd64 snltty/linker-debian:arm64 snltty/linker-debian:arm && \
|
||||
docker manifest push snltty/linker-debian:latest && \
|
||||
docker manifest push snltty/linker-debian:v1.6.7
|
||||
docker manifest push snltty/linker-debian:v1.6.8
|
||||
30
.github/workflows/dotnet.yml
vendored
@@ -31,11 +31,11 @@ jobs:
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.ACTIONS_TOKEN }}
|
||||
with:
|
||||
tag_name: v1.6.7
|
||||
release_name: v1.6.7.${{ steps.date.outputs.today }}
|
||||
tag_name: v1.6.8
|
||||
release_name: v1.6.8.${{ steps.date.outputs.today }}
|
||||
draft: false
|
||||
prerelease: false
|
||||
body: "1. 修复首次启动网卡未启动bug\r\n2. 自定义网卡名\r\n3. 可禁用NAT\r\n4. 修复网卡端口转发BUG\r\n5. 显示局域网IP"
|
||||
body: "1. 显示局域网IP\r\n2. 展示在线地图"
|
||||
- name: publish projects
|
||||
run: ./publish.bat
|
||||
- name: upload-win-x86-oss
|
||||
@@ -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.6.7/linker-win-x86.zip
|
||||
target-path: /downloads/linker/v1.6.8/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.6.7/linker-win-x64.zip
|
||||
target-path: /downloads/linker/v1.6.8/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.6.7/linker-win-arm64.zip
|
||||
target-path: /downloads/linker/v1.6.8/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.6.7/linker-linux-x64.zip
|
||||
target-path: /downloads/linker/v1.6.8/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.6.7/linker-linux-arm.zip
|
||||
target-path: /downloads/linker/v1.6.8/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.6.7/linker-linux-arm64.zip
|
||||
target-path: /downloads/linker/v1.6.8/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.6.7/linker-linux-musl-x64.zip
|
||||
target-path: /downloads/linker/v1.6.8/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.6.7/linker-linux-musl-arm.zip
|
||||
target-path: /downloads/linker/v1.6.8/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.6.7/linker-linux-musl-arm64.zip
|
||||
target-path: /downloads/linker/v1.6.8/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.6.7/linker-osx-x64.zip
|
||||
target-path: /downloads/linker/v1.6.8/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.6.7/linker-osx-arm64.zip
|
||||
target-path: /downloads/linker/v1.6.8/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.6.7/linker-windows-route.zip
|
||||
target-path: /downloads/linker/v1.6.8/linker-windows-route.zip
|
||||
- name: upload-version-oss
|
||||
id: upload-version-oss
|
||||
uses: tvrcgo/oss-action@v0.1.1
|
||||
|
||||
6
.github/workflows/ipk.yml
vendored
@@ -44,7 +44,7 @@ jobs:
|
||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||
bucket: ide-qbcode
|
||||
asset-path: ./public/publish-ipk/x64/linker-x64.ipk
|
||||
target-path: /downloads/linker/v1.6.7/linker-x64.ipk
|
||||
target-path: /downloads/linker/v1.6.8/linker-x64.ipk
|
||||
- name: upload-x64
|
||||
id: upload-x64
|
||||
uses: actions/upload-release-asset@master
|
||||
@@ -64,7 +64,7 @@ jobs:
|
||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||
bucket: ide-qbcode
|
||||
asset-path: ./public/publish-ipk/arm/linker-arm.ipk
|
||||
target-path: /downloads/linker/v1.6.7/linker-arm.ipk
|
||||
target-path: /downloads/linker/v1.6.8/linker-arm.ipk
|
||||
- name: upload-arm
|
||||
id: upload-arm
|
||||
uses: actions/upload-release-asset@master
|
||||
@@ -84,7 +84,7 @@ jobs:
|
||||
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
|
||||
bucket: ide-qbcode
|
||||
asset-path: ./public/publish-ipk/arm64/linker-arm64.ipk
|
||||
target-path: /downloads/linker/v1.6.7/linker-arm64.ipk
|
||||
target-path: /downloads/linker/v1.6.8/linker-arm64.ipk
|
||||
- name: upload-arm64
|
||||
id: upload-arm64
|
||||
uses: actions/upload-release-asset@master
|
||||
|
||||
52
.github/workflows/nuget.yml
vendored
@@ -79,29 +79,29 @@ jobs:
|
||||
|
||||
- name: Push
|
||||
run: |
|
||||
dotnet nuget push ./src/linker.libs/bin/release/linker.libs.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger/bin/release/linker.messenger.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.access/bin/release/linker.messenger.access.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.action/bin/release/linker.messenger.action.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.api/bin/release/linker.messenger.api.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.channel/bin/release/linker.messenger.channel.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.decenter/bin/release/linker.messenger.decenter.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.entry/bin/release/linker.messenger.entry.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.exroute/bin/release/linker.messenger.exroute.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.flow/bin/release/linker.messenger.flow.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.forward/bin/release/linker.messenger.forward.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.listen/bin/release/linker.messenger.listen.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.logger/bin/release/linker.messenger.logger.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.pcp/bin/release/linker.messenger.pcp.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.relay/bin/release/linker.messenger.relay.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.serializer.memorypack/bin/release/linker.messenger.serializer.memorypack.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.sforward/bin/release/linker.messenger.sforward.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.signin/bin/release/linker.messenger.signin.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.socks5/bin/release/linker.messenger.socks5.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.store.file/bin/release/linker.messenger.store.file.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.sync/bin/release/linker.messenger.sync.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.tunnel/bin/release/linker.messenger.tunnel.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.tuntap/bin/release/linker.messenger.tuntap.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.updater/bin/release/linker.messenger.updater.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.tun/bin/release/linker.tun.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.tunnel/bin/release/linker.tunnel.1.6.7.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.libs/bin/release/linker.libs.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger/bin/release/linker.messenger.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.access/bin/release/linker.messenger.access.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.action/bin/release/linker.messenger.action.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.api/bin/release/linker.messenger.api.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.channel/bin/release/linker.messenger.channel.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.decenter/bin/release/linker.messenger.decenter.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.entry/bin/release/linker.messenger.entry.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.exroute/bin/release/linker.messenger.exroute.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.flow/bin/release/linker.messenger.flow.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.forward/bin/release/linker.messenger.forward.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.listen/bin/release/linker.messenger.listen.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.logger/bin/release/linker.messenger.logger.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.pcp/bin/release/linker.messenger.pcp.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.relay/bin/release/linker.messenger.relay.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.serializer.memorypack/bin/release/linker.messenger.serializer.memorypack.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.sforward/bin/release/linker.messenger.sforward.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.signin/bin/release/linker.messenger.signin.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.socks5/bin/release/linker.messenger.socks5.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.store.file/bin/release/linker.messenger.store.file.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.sync/bin/release/linker.messenger.sync.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.tunnel/bin/release/linker.messenger.tunnel.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.tuntap/bin/release/linker.messenger.tuntap.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.messenger.updater/bin/release/linker.messenger.updater.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.tun/bin/release/linker.tun.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
dotnet nuget push ./src/linker.tunnel/bin/release/linker.tunnel.1.6.8.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
|
||||
|
||||
@@ -33,16 +33,16 @@ do
|
||||
fi
|
||||
done
|
||||
cd public/publish/docker/linux-${p}-x64/${f}
|
||||
docker buildx build -f ${target}/public/publish/docker/linux-${p}-x64/${f}/Dockerfile-${p} --platform="linux/x86_64" --force-rm -t "${image}-${p}-x64:latest" -t "${image}-${p}-x64:v1.6.7" . --push
|
||||
docker buildx build -f ${target}/public/publish/docker/linux-${p}-x64/${f}/Dockerfile-${p} --platform="linux/x86_64" --force-rm -t "${image}-${p}-x64:latest" -t "${image}-${p}-x64:v1.6.8" . --push
|
||||
cd ../../../../../
|
||||
|
||||
|
||||
cd public/publish/docker/linux-${p}-arm64/${f}
|
||||
docker buildx build -f ${target}/public/publish/docker/linux-${p}-arm64/${f}/Dockerfile-${p} --platform="linux/arm64" --force-rm -t "${image}-${p}-arm64:latest" -t "${image}-${p}-arm64:v1.6.7" . --push
|
||||
docker buildx build -f ${target}/public/publish/docker/linux-${p}-arm64/${f}/Dockerfile-${p} --platform="linux/arm64" --force-rm -t "${image}-${p}-arm64:latest" -t "${image}-${p}-arm64:v1.6.8" . --push
|
||||
cd ../../../../../
|
||||
|
||||
cd public/publish/docker/linux-${p}-arm/${f}
|
||||
docker buildx build -f ${target}/public/publish/docker/linux-${p}-arm/${f}/Dockerfile-${p} --platform="linux/arm/v7" --force-rm -t "${image}-${p}-arm:latest" -t "${image}-${p}-arm:v1.6.7" . --push
|
||||
docker buildx build -f ${target}/public/publish/docker/linux-${p}-arm/${f}/Dockerfile-${p} --platform="linux/arm/v7" --force-rm -t "${image}-${p}-arm:latest" -t "${image}-${p}-arm:v1.6.8" . --push
|
||||
cd ../../../../../
|
||||
done
|
||||
done
|
||||
@@ -22,7 +22,7 @@ do
|
||||
mkdir -p public/publish-ipk/${r}/data/usr/bin/linker
|
||||
cp -rf public/publish/${r}/* public/publish-ipk/${r}/data/usr/bin/linker/
|
||||
|
||||
sed -i "s|{version}|1.6.7|g" public/publish-ipk/${r}/control/control
|
||||
sed -i "s|{version}|1.6.8|g" public/publish-ipk/${r}/control/control
|
||||
sed -i 's/\r$//' public/publish-ipk/${r}/data/etc/init.d/linker
|
||||
sed -i 's/\r$//' public/publish-ipk/${r}/control/control
|
||||
sed -i 's/\r$//' public/publish-ipk/${r}/control/postinst
|
||||
|
||||
@@ -14,9 +14,9 @@
|
||||
<Copyright>snltty</Copyright>
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
<DebugType>full</DebugType>
|
||||
|
||||
@@ -25,7 +25,7 @@ namespace linker.messenger.access
|
||||
this.accessStore = accessStore;
|
||||
this.serializer = serializer;
|
||||
|
||||
signInClientState.NetworkEnabledHandle += (times) => SyncVersion.Add();
|
||||
signInClientState.OnSignInSuccess += (times) => SyncVersion.Add();
|
||||
accessStore.OnChanged += SyncVersion.Add;
|
||||
|
||||
}
|
||||
|
||||
@@ -16,9 +16,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker messenger api access</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -16,9 +16,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker messenger api action</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -17,9 +17,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker messenger api</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -16,9 +16,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker messenger channel</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -16,9 +16,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker messenger decenter</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -16,9 +16,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker messenger entry</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -16,9 +16,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker messenger exroute</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -38,6 +38,20 @@ namespace linker.messenger.flow
|
||||
}
|
||||
return new FlowInfo();
|
||||
}
|
||||
public async Task<List<FlowReportNetInfo>> GetCitys(ApiControllerParamsInfo param)
|
||||
{
|
||||
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
|
||||
{
|
||||
Connection = signInClientState.Connection,
|
||||
MessengerId = (ushort)FlowMessengerIds.Citys,
|
||||
});
|
||||
if (resp.Code == MessageResponeCodes.OK && resp.Data.Length > 0)
|
||||
{
|
||||
return serializer.Deserialize<List<FlowReportNetInfo>>(resp.Data.Span);
|
||||
}
|
||||
return new List<FlowReportNetInfo>();
|
||||
}
|
||||
|
||||
public async Task<Dictionary<ushort, FlowItemInfo>> GetMessengerFlows(ApiControllerParamsInfo param)
|
||||
{
|
||||
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using linker.libs;
|
||||
using linker.libs.extends;
|
||||
using linker.messenger.signin;
|
||||
using linker.messenger.tunnel;
|
||||
using System.Buffers;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Net;
|
||||
@@ -25,9 +26,11 @@ namespace linker.messenger.flow
|
||||
|
||||
private ConcurrentDictionary<IPAddress, OnlineFlowInfo> servers = new ConcurrentDictionary<IPAddress, OnlineFlowInfo>(new IPAddressComparer());
|
||||
private readonly SignInServerCaching signCaching;
|
||||
public FlowResolver(SignInServerCaching signCaching)
|
||||
private readonly ISerializer serializer;
|
||||
public FlowResolver(SignInServerCaching signCaching, ISerializer serializer)
|
||||
{
|
||||
this.signCaching = signCaching;
|
||||
this.serializer = serializer;
|
||||
OnlineTask();
|
||||
}
|
||||
|
||||
@@ -49,6 +52,11 @@ namespace linker.messenger.flow
|
||||
onlineFlowInfo.Time = time;
|
||||
onlineFlowInfo.Online = memory.Slice(0, 4).ToInt32();
|
||||
onlineFlowInfo.Total = memory.Slice(4, 4).ToInt32();
|
||||
|
||||
if (memory.Length > 8)
|
||||
{
|
||||
onlineFlowInfo.Nets = serializer.Deserialize<List<FlowReportNetInfo>>(memory.Slice(8).Span);
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
@@ -57,6 +65,17 @@ namespace linker.messenger.flow
|
||||
await Task.CompletedTask;
|
||||
}
|
||||
|
||||
public List<FlowReportNetInfo> GetCitys()
|
||||
{
|
||||
return servers.Values.SelectMany(c => c.Nets).GroupBy(c => c.City).Select(c => new FlowReportNetInfo
|
||||
{
|
||||
City = c.Key,
|
||||
Count = c.Count(),
|
||||
Lat = c.Count() == 1 ? c.First().Lat : c.Average(c => c.Lat),
|
||||
Lon = c.Count() == 1 ? c.First().Lon : c.Average(c => c.Lon)
|
||||
}).ToList();
|
||||
}
|
||||
|
||||
private void OnlineTask()
|
||||
{
|
||||
TimerHelper.SetInterval(() =>
|
||||
@@ -91,7 +110,17 @@ namespace linker.messenger.flow
|
||||
}
|
||||
private void Report()
|
||||
{
|
||||
byte[] buffer = ArrayPool<byte>.Shared.Rent(9);
|
||||
List<FlowReportNetInfo> nets = signCaching.Get().Where(c => c.Args.ContainsKey("tunnelNet")).Select(c => c.Args["tunnelNet"].DeJson<SignInArgsNetInfo>()).GroupBy(c => c.City).Select(c => new FlowReportNetInfo
|
||||
{
|
||||
City = c.Key,
|
||||
Count = c.Count(),
|
||||
Lat = c.Count() == 1 ? c.First().Lat : c.Average(c => c.Lat),
|
||||
Lon = c.Count() == 1 ? c.First().Lon : c.Average(c => c.Lon)
|
||||
}).ToList();
|
||||
byte[] netBytes = serializer.Serialize(nets);
|
||||
|
||||
|
||||
byte[] buffer = ArrayPool<byte>.Shared.Rent(9 + netBytes.Length);
|
||||
|
||||
try
|
||||
{
|
||||
@@ -100,10 +129,17 @@ namespace linker.messenger.flow
|
||||
onlone.ToBytes(buffer.AsMemory(1));
|
||||
total.ToBytes(buffer.AsMemory(5));
|
||||
|
||||
netBytes.CopyTo(buffer.AsMemory(9));
|
||||
|
||||
|
||||
using UdpClient udpClient = new UdpClient(AddressFamily.InterNetwork);
|
||||
udpClient.Client.WindowsUdpBug();
|
||||
|
||||
udpClient.Send(buffer.AsSpan(0, 9), "linker.snltty.com", 1802);
|
||||
string domain = "linker.snltty.com";
|
||||
#if DEBUG
|
||||
domain = "127.0.0.1";
|
||||
#endif
|
||||
udpClient.Send(buffer.AsSpan(0, 9 + netBytes.Length), domain, 1802);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
@@ -117,6 +153,8 @@ namespace linker.messenger.flow
|
||||
public long Time { get; set; }
|
||||
public int Online { get; set; }
|
||||
public int Total { get; set; }
|
||||
|
||||
public List<FlowReportNetInfo> Nets { get; set; } = new List<FlowReportNetInfo>();
|
||||
}
|
||||
|
||||
public sealed class IPAddressComparer : IEqualityComparer<IPAddress>
|
||||
|
||||
@@ -24,6 +24,14 @@ namespace linker.messenger.flow
|
||||
public DateTime Start { get; set; }
|
||||
public DateTime Now { get; set; }
|
||||
}
|
||||
public sealed partial class FlowReportNetInfo
|
||||
{
|
||||
public string City { get; set; }
|
||||
|
||||
public double Lat { get; set; }
|
||||
public double Lon { get; set; }
|
||||
public int Count { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -17,9 +17,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker messenger flow</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -15,10 +15,11 @@ namespace linker.messenger.flow.messenger
|
||||
private readonly IRelayServerStore relayServerStore;
|
||||
private readonly ISForwardServerStore sForwardServerStore;
|
||||
private readonly ISerializer serializer;
|
||||
private readonly FlowResolver flowResolver;
|
||||
|
||||
private DateTime start = DateTime.Now;
|
||||
|
||||
public FlowMessenger(FlowTransfer flowTransfer, MessengerFlow messengerFlow, SForwardFlow sForwardFlow, RelayFlow relayFlow, SignInServerCaching signCaching, IRelayServerStore relayServerStore, ISForwardServerStore sForwardServerStore, ISerializer serializer)
|
||||
public FlowMessenger(FlowTransfer flowTransfer, MessengerFlow messengerFlow, SForwardFlow sForwardFlow, RelayFlow relayFlow, SignInServerCaching signCaching, IRelayServerStore relayServerStore, ISForwardServerStore sForwardServerStore, ISerializer serializer, FlowResolver flowResolver)
|
||||
{
|
||||
this.flowTransfer = flowTransfer;
|
||||
this.messengerFlow = messengerFlow;
|
||||
@@ -28,6 +29,7 @@ namespace linker.messenger.flow.messenger
|
||||
this.relayServerStore = relayServerStore;
|
||||
this.sForwardServerStore = sForwardServerStore;
|
||||
this.serializer = serializer;
|
||||
this.flowResolver = flowResolver;
|
||||
}
|
||||
|
||||
[MessengerId((ushort)FlowMessengerIds.List)]
|
||||
@@ -46,6 +48,11 @@ namespace linker.messenger.flow.messenger
|
||||
};
|
||||
connection.Write(serializer.Serialize(serverFlowInfo));
|
||||
}
|
||||
[MessengerId((ushort)FlowMessengerIds.Citys)]
|
||||
public void Citys(IConnection connection)
|
||||
{
|
||||
connection.Write(serializer.Serialize(flowResolver.GetCitys()));
|
||||
}
|
||||
|
||||
[MessengerId((ushort)FlowMessengerIds.Messenger)]
|
||||
public void Messenger(IConnection connection)
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
Relay = 2703,
|
||||
SForward = 2704,
|
||||
|
||||
Citys = 2705,
|
||||
|
||||
Max = 2799
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace linker.messenger.forward
|
||||
this.signInClientStore = signInClientStore;
|
||||
this.serializer = serializer;
|
||||
|
||||
signInClientState.NetworkEnabledHandle += Reset;
|
||||
signInClientState.OnSignInSuccess += Reset;
|
||||
}
|
||||
|
||||
string groupid = string.Empty;
|
||||
|
||||
@@ -17,9 +17,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker messenger forward</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -17,9 +17,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker messenger listen</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -16,9 +16,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker messenger logger</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace linker.messenger.pcp
|
||||
this.pcpStore = pcpStore;
|
||||
this.serializer = serializer;
|
||||
|
||||
signInClientState.NetworkEnabledHandle += (times) => SyncVersion.Add();
|
||||
signInClientState.OnSignInSuccess += (times) => SyncVersion.Add();
|
||||
}
|
||||
|
||||
public List<string> GetNodes(string fromMachineId, string toMachineId)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using linker.libs;
|
||||
using linker.libs.extends;
|
||||
using linker.messenger.signin;
|
||||
using linker.tunnel;
|
||||
using linker.tunnel.connection;
|
||||
|
||||
@@ -11,20 +12,33 @@ namespace linker.messenger.pcp
|
||||
|
||||
private readonly IPcpStore pcpStore;
|
||||
private readonly TunnelTransfer tunnelTransfer;
|
||||
public PcpTransfer(IPcpStore pcpStore, TunnelTransfer tunnelTransfer)
|
||||
private readonly ISignInClientStore signInClientStore;
|
||||
public PcpTransfer(IPcpStore pcpStore, TunnelTransfer tunnelTransfer, ISignInClientStore signInClientStore)
|
||||
{
|
||||
this.pcpStore = pcpStore;
|
||||
this.tunnelTransfer = tunnelTransfer;
|
||||
this.signInClientStore = signInClientStore;
|
||||
|
||||
tunnelTransfer.SetConnectedCallback(transactionId, OnConnected);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// a<->b<->c 在ac通知,b交换数据,不通知
|
||||
/// </summary>
|
||||
/// <param name="connection"></param>
|
||||
private void OnConnected(ITunnelConnection connection)
|
||||
{
|
||||
TunnelTagInfo tag = connection.TransactionTag.DeJson<TunnelTagInfo>();
|
||||
|
||||
//connection.TransactionId = tag.OriginTransactionId;
|
||||
// connection.Type = TunnelType.Node;
|
||||
//我是节点
|
||||
if (tag.NodeId == signInClientStore.Id)
|
||||
{
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//connection.RemoteMachineName
|
||||
if (OnConnectedCallbacks.TryGetValue(Helper.GlobalString, out List<Action<ITunnelConnection>> callbacks))
|
||||
{
|
||||
foreach (var item in callbacks)
|
||||
@@ -32,7 +46,7 @@ namespace linker.messenger.pcp
|
||||
item(connection);
|
||||
}
|
||||
}
|
||||
if (OnConnectedCallbacks.TryGetValue(connection.TransactionId, out callbacks))
|
||||
if (OnConnectedCallbacks.TryGetValue(tag.TransactionId, out callbacks))
|
||||
{
|
||||
foreach (var item in callbacks)
|
||||
{
|
||||
@@ -49,6 +63,8 @@ namespace linker.messenger.pcp
|
||||
/// <returns></returns>
|
||||
public async Task<ITunnelConnection> ConnectAsync(string remoteMachineId, string transactionId, TunnelProtocolType denyProtocols)
|
||||
{
|
||||
//TunnelTagInfo tag = new TunnelTagInfo { FromMachineId = signInClientStore.Id, ToMachineId = remoteMachineId, TransactionId = transactionId, NodeId = string.Empty, NodeIds = pcpStore.PcpHistory.History };
|
||||
|
||||
await Task.CompletedTask;
|
||||
return null;
|
||||
}
|
||||
@@ -89,18 +105,27 @@ namespace linker.messenger.pcp
|
||||
|
||||
sealed class TunnelTagInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// 谁来的
|
||||
/// </summary>
|
||||
public string FromMachineId { get; set; }
|
||||
/// <summary>
|
||||
/// 节点id
|
||||
/// </summary>
|
||||
public string NodeId { get; set; }
|
||||
/// <summary>
|
||||
/// 到谁
|
||||
/// </summary>
|
||||
public string ToMachineId { get; set; }
|
||||
/// <summary>
|
||||
/// 原本的事务id
|
||||
/// </summary>
|
||||
public string TransactionId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是哪边的,l 和 r
|
||||
/// 所有尝试的节点id
|
||||
/// </summary>
|
||||
public char Side { get; set; } = 'l';
|
||||
public List<string> NodeIds { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,9 +17,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker messenger pcp</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -18,9 +18,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker messenger relay</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -16,9 +16,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker messenger serializer aot</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -24,6 +24,7 @@ namespace linker.messenger.serializer.memorypack
|
||||
MemoryPackFormatterProvider.Register(new SignInIdsResponseItemInfoFormatter());
|
||||
MemoryPackFormatterProvider.Register(new SignInResponseInfoFormatter());
|
||||
MemoryPackFormatterProvider.Register(new SignInConfigSetNameInfoFormatter());
|
||||
MemoryPackFormatterProvider.Register(new SignInNamesResponseItemInfoFormatter());
|
||||
|
||||
|
||||
MemoryPackFormatterProvider.Register(new SyncInfoFormatter());
|
||||
@@ -36,6 +37,7 @@ namespace linker.messenger.serializer.memorypack
|
||||
MemoryPackFormatterProvider.Register(new TunnelRouteLevelInfoFormatter());
|
||||
MemoryPackFormatterProvider.Register(new TunnelSetRouteLevelInfoFormatter());
|
||||
MemoryPackFormatterProvider.Register(new TunnelInterfaceInfoFormatter());
|
||||
MemoryPackFormatterProvider.Register(new TunnelNetInfoFormatter());
|
||||
|
||||
|
||||
MemoryPackFormatterProvider.Register(new DecenterSyncInfoFormatter());
|
||||
@@ -80,6 +82,8 @@ namespace linker.messenger.serializer.memorypack
|
||||
|
||||
|
||||
MemoryPackFormatterProvider.Register(new FlowItemInfoFormatter());
|
||||
MemoryPackFormatterProvider.Register(new FlowReportNetInfoFormatter());
|
||||
|
||||
MemoryPackFormatterProvider.Register(new FlowInfoFormatter());
|
||||
MemoryPackFormatterProvider.Register(new RelayFlowItemInfoFormatter());
|
||||
MemoryPackFormatterProvider.Register(new RelayFlowRequestInfoFormatter());
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using MemoryPack;
|
||||
using linker.messenger.flow;
|
||||
using linker.messenger.tunnel;
|
||||
|
||||
namespace linker.messenger.serializer.memorypack
|
||||
{
|
||||
@@ -55,6 +56,67 @@ namespace linker.messenger.serializer.memorypack
|
||||
}
|
||||
|
||||
|
||||
[MemoryPackable]
|
||||
public readonly partial struct SerializableFlowReportNetInfo
|
||||
{
|
||||
[MemoryPackIgnore]
|
||||
public readonly FlowReportNetInfo info;
|
||||
|
||||
[MemoryPackInclude]
|
||||
string City => info.City;
|
||||
[MemoryPackInclude]
|
||||
double Lat => info.Lat;
|
||||
[MemoryPackInclude]
|
||||
double Lon => info.Lon;
|
||||
|
||||
[MemoryPackInclude]
|
||||
int Count => info.Count;
|
||||
|
||||
[MemoryPackConstructor]
|
||||
SerializableFlowReportNetInfo(string city, double lat, double lon, int count)
|
||||
{
|
||||
var info = new FlowReportNetInfo
|
||||
{
|
||||
City = city,
|
||||
Lat = lat,
|
||||
Lon = lon,
|
||||
Count = count
|
||||
};
|
||||
this.info = info;
|
||||
}
|
||||
|
||||
public SerializableFlowReportNetInfo(FlowReportNetInfo tunnelCompactInfo)
|
||||
{
|
||||
this.info = tunnelCompactInfo;
|
||||
}
|
||||
}
|
||||
public class FlowReportNetInfoFormatter : MemoryPackFormatter<FlowReportNetInfo>
|
||||
{
|
||||
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref FlowReportNetInfo value)
|
||||
{
|
||||
if (value == null)
|
||||
{
|
||||
writer.WriteNullObjectHeader();
|
||||
return;
|
||||
}
|
||||
|
||||
writer.WritePackable(new SerializableFlowReportNetInfo(value));
|
||||
}
|
||||
|
||||
public override void Deserialize(ref MemoryPackReader reader, scoped ref FlowReportNetInfo value)
|
||||
{
|
||||
if (reader.PeekIsNull())
|
||||
{
|
||||
reader.Advance(1); // skip null block
|
||||
value = null;
|
||||
return;
|
||||
}
|
||||
|
||||
var wrapped = reader.ReadPackable<SerializableFlowReportNetInfo>();
|
||||
value = wrapped.info;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[MemoryPackable]
|
||||
public readonly partial struct SerializableFlowInfo
|
||||
|
||||
@@ -440,6 +440,60 @@ namespace linker.messenger.serializer.memorypack
|
||||
}
|
||||
}
|
||||
|
||||
[MemoryPackable]
|
||||
public readonly partial struct SerializableSignInNamesResponseItemInfo
|
||||
{
|
||||
[MemoryPackIgnore]
|
||||
public readonly SignInNamesResponseItemInfo info;
|
||||
|
||||
[MemoryPackInclude]
|
||||
string MachineId => info.MachineId;
|
||||
|
||||
[MemoryPackInclude]
|
||||
string MachineName => info.MachineName;
|
||||
|
||||
[MemoryPackInclude]
|
||||
bool Online => info.Online;
|
||||
|
||||
[MemoryPackConstructor]
|
||||
SerializableSignInNamesResponseItemInfo(string machineId, string machineName, bool online)
|
||||
{
|
||||
var info = new SignInNamesResponseItemInfo { MachineId = machineId, MachineName = machineName, Online = online };
|
||||
this.info = info;
|
||||
}
|
||||
|
||||
public SerializableSignInNamesResponseItemInfo(SignInNamesResponseItemInfo signInfo)
|
||||
{
|
||||
this.info = signInfo;
|
||||
}
|
||||
}
|
||||
public class SignInNamesResponseItemInfoFormatter : MemoryPackFormatter<SignInNamesResponseItemInfo>
|
||||
{
|
||||
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref SignInNamesResponseItemInfo value)
|
||||
{
|
||||
if (value == null)
|
||||
{
|
||||
writer.WriteNullObjectHeader();
|
||||
return;
|
||||
}
|
||||
|
||||
writer.WritePackable(new SerializableSignInNamesResponseItemInfo(value));
|
||||
}
|
||||
|
||||
public override void Deserialize(ref MemoryPackReader reader, scoped ref SignInNamesResponseItemInfo value)
|
||||
{
|
||||
if (reader.PeekIsNull())
|
||||
{
|
||||
reader.Advance(1); // skip null block
|
||||
value = null;
|
||||
return;
|
||||
}
|
||||
|
||||
var wrapped = reader.ReadPackable<SerializableSignInNamesResponseItemInfo>();
|
||||
value = wrapped.info;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
[MemoryPackable]
|
||||
|
||||
@@ -329,8 +329,11 @@ namespace linker.messenger.serializer.memorypack
|
||||
[MemoryPackInclude, MemoryPackAllowSerialize]
|
||||
IPAddress[] Routes => info.Routes;
|
||||
|
||||
[MemoryPackInclude, MemoryPackAllowSerialize]
|
||||
TunnelNetInfo Net => info.Net;
|
||||
|
||||
[MemoryPackConstructor]
|
||||
SerializableTunnelRouteLevelInfo(string machineId, int routeLevel, int routeLevelPlus, bool needReboot, int portMapWan, int portMapLan, string hostname, TunnelInterfaceInfo[] lans, IPAddress[] routes)
|
||||
SerializableTunnelRouteLevelInfo(string machineId, int routeLevel, int routeLevelPlus, bool needReboot, int portMapWan, int portMapLan, string hostname, TunnelInterfaceInfo[] lans, IPAddress[] routes, TunnelNetInfo net)
|
||||
{
|
||||
var info = new TunnelRouteLevelInfo
|
||||
{
|
||||
@@ -342,7 +345,8 @@ namespace linker.messenger.serializer.memorypack
|
||||
RouteLevelPlus = routeLevelPlus,
|
||||
HostName = hostname,
|
||||
Lans = lans,
|
||||
Routes = routes
|
||||
Routes = routes,
|
||||
Net = net
|
||||
};
|
||||
this.info = info;
|
||||
}
|
||||
@@ -436,6 +440,86 @@ namespace linker.messenger.serializer.memorypack
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[MemoryPackable]
|
||||
public readonly partial struct SerializableTunnelNetInfo
|
||||
{
|
||||
[MemoryPackIgnore]
|
||||
public readonly TunnelNetInfo info;
|
||||
|
||||
[MemoryPackInclude]
|
||||
string Country => info.Country;
|
||||
[MemoryPackInclude]
|
||||
string CountryCode => info.CountryCode;
|
||||
[MemoryPackInclude]
|
||||
string Region => info.Region;
|
||||
[MemoryPackInclude]
|
||||
string RegionName => info.RegionName;
|
||||
[MemoryPackInclude]
|
||||
string City => info.City;
|
||||
[MemoryPackInclude]
|
||||
double Lat => info.Lat;
|
||||
[MemoryPackInclude]
|
||||
double Lon => info.Lon;
|
||||
[MemoryPackInclude]
|
||||
string Isp => info.Isp;
|
||||
[MemoryPackInclude]
|
||||
string Org => info.Org;
|
||||
[MemoryPackInclude]
|
||||
string As => info.As;
|
||||
|
||||
[MemoryPackConstructor]
|
||||
SerializableTunnelNetInfo(string country, string countryCode, string region, string regionName, string city, double lat, double lon, string isp, string org, string As)
|
||||
{
|
||||
var info = new TunnelNetInfo
|
||||
{
|
||||
As = As,
|
||||
City = city,
|
||||
Country = country,
|
||||
CountryCode = countryCode,
|
||||
Isp = isp,
|
||||
Lat = lat,
|
||||
Lon = lon,
|
||||
Org = org,
|
||||
Region = region,
|
||||
RegionName = regionName
|
||||
};
|
||||
this.info = info;
|
||||
}
|
||||
|
||||
public SerializableTunnelNetInfo(TunnelNetInfo tunnelCompactInfo)
|
||||
{
|
||||
this.info = tunnelCompactInfo;
|
||||
}
|
||||
}
|
||||
public class TunnelNetInfoFormatter : MemoryPackFormatter<TunnelNetInfo>
|
||||
{
|
||||
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref TunnelNetInfo value)
|
||||
{
|
||||
if (value == null)
|
||||
{
|
||||
writer.WriteNullObjectHeader();
|
||||
return;
|
||||
}
|
||||
|
||||
writer.WritePackable(new SerializableTunnelNetInfo(value));
|
||||
}
|
||||
|
||||
public override void Deserialize(ref MemoryPackReader reader, scoped ref TunnelNetInfo value)
|
||||
{
|
||||
if (reader.PeekIsNull())
|
||||
{
|
||||
reader.Advance(1); // skip null block
|
||||
value = null;
|
||||
return;
|
||||
}
|
||||
|
||||
var wrapped = reader.ReadPackable<SerializableTunnelNetInfo>();
|
||||
value = wrapped.info;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[MemoryPackable]
|
||||
public readonly partial struct SerializableTunnelSetRouteLevelInfo
|
||||
{
|
||||
|
||||
@@ -16,9 +16,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker messenger serializer memorypack</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -16,9 +16,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker messenger sforward</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -61,6 +61,7 @@ namespace linker.messenger.signin
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
[Access(AccessValue.Group)]
|
||||
public void SetGroups(ApiControllerParamsInfo param)
|
||||
{
|
||||
@@ -132,7 +133,19 @@ namespace linker.messenger.signin
|
||||
}
|
||||
return new SignInIdsResponseInfo { };
|
||||
}
|
||||
|
||||
public async Task<List<SignInNamesResponseItemInfo>> Names(ApiControllerParamsInfo param)
|
||||
{
|
||||
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
|
||||
{
|
||||
Connection = signInClientState.Connection,
|
||||
MessengerId = (ushort)SignInMessengerIds.Names
|
||||
}).ConfigureAwait(false);
|
||||
if (resp.Code == MessageResponeCodes.OK)
|
||||
{
|
||||
return serializer.Deserialize<List<SignInNamesResponseItemInfo>>(resp.Data.Span);
|
||||
}
|
||||
return new List<SignInNamesResponseItemInfo>();
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class ConfigSetInfo
|
||||
|
||||
@@ -31,35 +31,52 @@ namespace linker.messenger.signin
|
||||
public IPEndPoint LanAddress => Connection?.LocalAddress ?? new IPEndPoint(IPAddress.Any, 0);
|
||||
|
||||
|
||||
private int networdkEnabledTimes = 0;
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 登录之前
|
||||
/// </summary>
|
||||
[JsonIgnore]
|
||||
public Action NetworkEnabledHandleBefore { get; set; }
|
||||
public Func<Task> OnSignInBrfore { get; set; }
|
||||
public async Task PushSignInBefore()
|
||||
{
|
||||
await OnSignInBrfore?.Invoke();
|
||||
}
|
||||
|
||||
|
||||
private int signInTimes = 0;
|
||||
[JsonIgnore]
|
||||
public Action OnSignInSuccessBefore { get; set; }
|
||||
/// <summary>
|
||||
/// 上线事件
|
||||
/// </summary>
|
||||
[JsonIgnore]
|
||||
public Action<int> NetworkEnabledHandle { get; set; }
|
||||
public Action<int> OnSignInSuccess { get; set; }
|
||||
/// <summary>
|
||||
/// 第一次上线
|
||||
/// </summary>
|
||||
[JsonIgnore]
|
||||
public Action NetworkFirstEnabledHandle { get; set; }
|
||||
|
||||
public void PushNetworkEnabledBefore()
|
||||
/// <summary>
|
||||
/// 发布上线事件
|
||||
/// </summary>
|
||||
public void PushSignInSuccessBefore()
|
||||
{
|
||||
NetworkEnabledHandleBefore?.Invoke();
|
||||
OnSignInSuccessBefore?.Invoke();
|
||||
}
|
||||
/// <summary>
|
||||
/// 发布上线事件
|
||||
/// </summary>
|
||||
public void PushNetworkEnabled()
|
||||
public void PushSignInSuccess()
|
||||
{
|
||||
if (networdkEnabledTimes == 0)
|
||||
if (signInTimes == 0)
|
||||
{
|
||||
NetworkFirstEnabledHandle?.Invoke();
|
||||
}
|
||||
NetworkEnabledHandle?.Invoke(networdkEnabledTimes);
|
||||
networdkEnabledTimes++;
|
||||
OnSignInSuccess?.Invoke(signInTimes);
|
||||
signInTimes++;
|
||||
}
|
||||
|
||||
public void Disponse()
|
||||
|
||||
@@ -76,6 +76,8 @@ namespace linker.messenger.signin
|
||||
|
||||
try
|
||||
{
|
||||
await clientSignInState.PushSignInBefore();
|
||||
|
||||
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||
LoggerHelper.Instance.Info($"connect to signin server:{signInClientStore.Server.Host}");
|
||||
|
||||
@@ -98,8 +100,8 @@ namespace linker.messenger.signin
|
||||
|
||||
await GetServerVersion().ConfigureAwait(false);
|
||||
|
||||
clientSignInState.PushNetworkEnabledBefore();
|
||||
clientSignInState.PushNetworkEnabled();
|
||||
clientSignInState.PushSignInSuccessBefore();
|
||||
clientSignInState.PushSignInSuccess();
|
||||
|
||||
GCHelper.FlushMemory();
|
||||
}
|
||||
|
||||
@@ -193,6 +193,18 @@ namespace linker.messenger.signin
|
||||
}
|
||||
}
|
||||
|
||||
[MessengerId((ushort)SignInMessengerIds.Names)]
|
||||
public void Names(IConnection connection)
|
||||
{
|
||||
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache))
|
||||
{
|
||||
List<SignInNamesResponseItemInfo> list = signCaching.Get(cache.GroupId).Select(c => new SignInNamesResponseItemInfo { MachineId = c.MachineId, MachineName = c.MachineName, Online = c.Connected }).ToList();
|
||||
|
||||
connection.Write(serializer.Serialize(list));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[MessengerId((ushort)SignInMessengerIds.Exists)]
|
||||
public void Exists(IConnection connection)
|
||||
{
|
||||
@@ -318,6 +330,13 @@ namespace linker.messenger.signin
|
||||
public string MachineName { get; set; }
|
||||
}
|
||||
|
||||
public sealed class SignInNamesResponseItemInfo
|
||||
{
|
||||
public string MachineId { get; set; }
|
||||
public string MachineName { get; set; }
|
||||
public bool Online { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 登录返回
|
||||
/// </summary>
|
||||
|
||||
@@ -23,6 +23,8 @@
|
||||
|
||||
SignIn_V_1_3_1 = 13,
|
||||
|
||||
Names = 14,
|
||||
|
||||
None = 99
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,9 +17,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker messenger signin</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -34,7 +34,7 @@ namespace linker.messenger.socks5
|
||||
this.serializer = serializer;
|
||||
this.socks5Store = socks5Store;
|
||||
|
||||
signInClientState.NetworkEnabledHandle += (times) => Refresh();
|
||||
signInClientState.OnSignInSuccess += (times) => Refresh();
|
||||
tunnelProxy.RefreshConfig += Refresh;
|
||||
socks5Transfer.OnChanged += Refresh;
|
||||
|
||||
|
||||
@@ -16,9 +16,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker messenger socks5</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -16,9 +16,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker messenger store file</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -18,9 +18,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker messenger sync</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -2,6 +2,12 @@
|
||||
|
||||
namespace linker.messenger.tunnel
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Chinanet 电信
|
||||
/// China Unicom 连通
|
||||
/// China Mobile 移动
|
||||
/// </summary>
|
||||
public sealed partial class TunnelRouteLevelInfo
|
||||
{
|
||||
public string MachineId { get; set; }
|
||||
@@ -16,6 +22,9 @@ namespace linker.messenger.tunnel
|
||||
public string HostName { get; set; }
|
||||
public TunnelInterfaceInfo[] Lans { get; set; } = Array.Empty<TunnelInterfaceInfo>();
|
||||
public IPAddress[] Routes { get; set; } = Array.Empty<IPAddress>();
|
||||
|
||||
|
||||
public TunnelNetInfo Net { get; set; } = new TunnelNetInfo();
|
||||
}
|
||||
|
||||
public sealed partial class TunnelInterfaceInfo
|
||||
@@ -26,6 +35,20 @@ namespace linker.messenger.tunnel
|
||||
public IPAddress[] Ips { get; set; } = Array.Empty<IPAddress>();
|
||||
}
|
||||
|
||||
public sealed partial class TunnelNetInfo
|
||||
{
|
||||
public string Country { get; set; } = string.Empty;
|
||||
public string CountryCode { get; set; } = string.Empty;
|
||||
public string Region { get; set; } = string.Empty;
|
||||
public string RegionName { get; set; } = string.Empty;
|
||||
public string City { get; set; } = string.Empty;
|
||||
public double Lat { get; set; }
|
||||
public double Lon { get; set; }
|
||||
public string Isp { get; set; } = string.Empty;
|
||||
public string Org { get; set; } = string.Empty;
|
||||
public string As { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
public sealed partial class TunnelSetRouteLevelInfo
|
||||
{
|
||||
public string MachineId { get; set; }
|
||||
|
||||
@@ -7,6 +7,7 @@ using Microsoft.Extensions.DependencyInjection;
|
||||
using System.Text.Json.Serialization;
|
||||
using System.Text.Json;
|
||||
using linker.tunnel.connection;
|
||||
using linker.messenger.signin.args;
|
||||
namespace linker.messenger.tunnel
|
||||
{
|
||||
public static class Entry
|
||||
@@ -29,14 +30,19 @@ namespace linker.messenger.tunnel
|
||||
|
||||
serviceCollection.AddSingleton<TunnelExRoute>();
|
||||
|
||||
serviceCollection.AddSingleton<SignInArgsNet>();
|
||||
|
||||
return serviceCollection;
|
||||
}
|
||||
public static ServiceProvider UseTunnelClient(this ServiceProvider serviceProvider)
|
||||
{
|
||||
SignInArgsTransfer signInArgsTransfer = serviceProvider.GetService<SignInArgsTransfer>();
|
||||
signInArgsTransfer.AddArgs(new List<ISignInArgs> { serviceProvider.GetService<SignInArgsNet>() });
|
||||
|
||||
TunnelNetworkTransfer tunnelNetworkTransfer = serviceProvider.GetService<TunnelNetworkTransfer>();
|
||||
|
||||
TunnelTransfer tunnelTransfer = serviceProvider.GetService<TunnelTransfer>();
|
||||
TunnelClientExcludeIPTransfer signInArgsTransfer = serviceProvider.GetService<TunnelClientExcludeIPTransfer>();
|
||||
TunnelClientExcludeIPTransfer tunnelClientExcludeIPTransfer = serviceProvider.GetService<TunnelClientExcludeIPTransfer>();
|
||||
|
||||
IMessengerResolver messengerResolver = serviceProvider.GetService<IMessengerResolver>();
|
||||
messengerResolver.AddMessenger(new List<IMessenger> { serviceProvider.GetService<TunnelClientMessenger>() });
|
||||
|
||||
37
src/linker.messenger.tunnel/SignInArgsNet.cs
Normal file
@@ -0,0 +1,37 @@
|
||||
using linker.messenger.signin.args;
|
||||
using linker.messenger.signin;
|
||||
using linker.libs.extends;
|
||||
|
||||
namespace linker.messenger.tunnel
|
||||
{
|
||||
public sealed class SignInArgsNet : ISignInArgs
|
||||
{
|
||||
public string Name => "tunnelNet";
|
||||
private readonly TunnelNetworkTransfer tunnelNetworkTransfer;
|
||||
public SignInArgsNet(TunnelNetworkTransfer tunnelNetworkTransfer)
|
||||
{
|
||||
this.tunnelNetworkTransfer = tunnelNetworkTransfer;
|
||||
}
|
||||
public async Task<string> Invoke(string host, Dictionary<string, string> args)
|
||||
{
|
||||
args.TryAdd("tunnelNet", new SignInArgsNetInfo { Lat = tunnelNetworkTransfer.Info.Net.Lat, Lon = tunnelNetworkTransfer.Info.Net.Lon, City = tunnelNetworkTransfer.Info.Net.City }.ToJson());
|
||||
|
||||
await Task.CompletedTask;
|
||||
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
public async Task<string> Validate(SignInfo signInfo, SignCacheInfo cache)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
public sealed class SignInArgsNetInfo
|
||||
{
|
||||
public double Lat { get; set; }
|
||||
public double Lon { get; set; }
|
||||
public string City { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
@@ -4,7 +4,6 @@ using linker.messenger.signin;
|
||||
using linker.plugins.tunnel;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Net;
|
||||
using System.Net.Mail;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Text.RegularExpressions;
|
||||
namespace linker.messenger.tunnel
|
||||
@@ -28,6 +27,7 @@ namespace linker.messenger.tunnel
|
||||
this.tunnelNetworkTransfer = tunnelNetworkTransfer;
|
||||
this.serializer = serializer;
|
||||
this.signInClientState = signInClientState;
|
||||
|
||||
}
|
||||
public void Refresh()
|
||||
{
|
||||
@@ -71,6 +71,7 @@ namespace linker.messenger.tunnel
|
||||
HostName = Dns.GetHostName(),
|
||||
Lans = GetInterfaces(),
|
||||
Routes = tunnelNetworkTransfer.Info.RouteIPs,
|
||||
Net = tunnelNetworkTransfer.Info.Net
|
||||
};
|
||||
}
|
||||
|
||||
@@ -85,5 +86,7 @@ namespace linker.messenger.tunnel
|
||||
Ips = c.GetIPProperties().UnicastAddresses.Select(c => c.Address).Where(c => c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork || (c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6 && c.GetAddressBytes().AsSpan(0, 8).SequenceEqual(ipv6LocalBytes) == false)).ToArray()
|
||||
}).Where(c => c.Ips.Length > 0 && c.Ips.Any(d => d.Equals(IPAddress.Loopback)) == false).ToArray();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using linker.libs;
|
||||
using linker.libs.extends;
|
||||
using linker.messenger.signin;
|
||||
using linker.tunnel;
|
||||
using System.Net;
|
||||
@@ -15,11 +16,13 @@ namespace linker.messenger.tunnel
|
||||
{
|
||||
this.signInClientStore = signInClientStore;
|
||||
|
||||
signInClientState.NetworkEnabledHandleBefore += () =>
|
||||
signInClientState.OnSignInBrfore += GetNet;
|
||||
signInClientState.OnSignInSuccessBefore += () =>
|
||||
{
|
||||
RefreshRouteLevel();
|
||||
tunnelTransfer.Refresh();
|
||||
};
|
||||
|
||||
TestQuic();
|
||||
|
||||
RefreshRouteLevel();
|
||||
@@ -39,6 +42,26 @@ namespace linker.messenger.tunnel
|
||||
LoggerHelper.Instance.Warning($"tunnel route level:{Info.RouteLevel}");
|
||||
}
|
||||
|
||||
private async Task GetNet()
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(Info.Net.City))
|
||||
{
|
||||
try
|
||||
{
|
||||
using HttpClient httpClient = new HttpClient();
|
||||
string str = await httpClient.GetStringAsync($"http://ip-api.com/json").WaitAsync(TimeSpan.FromMilliseconds(30000));
|
||||
|
||||
if (string.IsNullOrWhiteSpace(str) == false)
|
||||
{
|
||||
Info.Net = str.DeJson<TunnelNetInfo>();
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void TestQuic()
|
||||
{
|
||||
if (OperatingSystem.IsWindows())
|
||||
@@ -94,6 +117,10 @@ namespace linker.messenger.tunnel
|
||||
/// 路由上的IP
|
||||
/// </summary>
|
||||
public IPAddress[] RouteIPs { get; set; } = Array.Empty<IPAddress>();
|
||||
|
||||
public TunnelNetInfo Net { get; set; } = new TunnelNetInfo();
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,9 +16,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker messenger tunnel</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -31,7 +31,7 @@ namespace linker.messenger.tuntap
|
||||
this.exRouteTransfer = exRouteTransfer;
|
||||
|
||||
//与服务器连接,刷新一下IP
|
||||
signInClientState.NetworkEnabledHandle += (times) => tuntapConfigTransfer.RefreshIP();
|
||||
signInClientState.OnSignInSuccess += (times) => tuntapConfigTransfer.RefreshIP();
|
||||
|
||||
//初始化网卡
|
||||
tuntapTransfer.Init(this);
|
||||
|
||||
@@ -39,7 +39,7 @@ namespace linker.messenger.tuntap
|
||||
this.exRouteTransfer = exRouteTransfer;
|
||||
this.signInClientState = signInClientState;
|
||||
|
||||
signInClientState.NetworkEnabledHandle += NetworkEnable;
|
||||
signInClientState.OnSignInSuccess += NetworkEnable;
|
||||
|
||||
}
|
||||
string groupid = string.Empty;
|
||||
|
||||
@@ -16,9 +16,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker messenger tuntap</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -16,9 +16,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker messenger updater</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -16,9 +16,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker messenger</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -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.204" ProductVersion="0.0.0.204" 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.205" ProductVersion="0.0.0.205" 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
src/linker.tray.win/dist/linker.tray.win.exe
vendored
1
src/linker.tray.win/web/chinamobile.svg
Normal file
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1739957623593" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11516" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M835.776 579.776l-66.88-64.896s-15.52-11.52-33.056 5.184c0 0-64.48 62.912-119.424 113.472-52.16 47.36-104.32 96.32-123.84 110.272 0 0-84.384 86.4-191.328 1.984 0 0-145.664-114.24-289.792-310.528l-4.704 23.072s-5.376 19.136 7.36 37.056c0 0 112.576 166.016 251.072 285.056 0 0 69.024 73.632 157.344 89.568 0 0 72.864 19.904 142.112-35.84 33.856-25.856 107.52-94.72 169.216-153.28 56.96-54.144 101.92-101.12 101.92-101.12" fill="#0080CB" p-id="11517"></path><path d="M962.784 715.936l-58.944-64.896s-7.168-9.536-21.088 2.4c-13.92 11.936-195.488 188.704-264.768 236.48a232.16 232.16 0 0 1-129.76 51.744c-35.456 4-73.664-3.968-114.432-19.904-44.352-19.904-112.064-75.648-175.488-140.16-44.832-46.56-89.44-97.92-126.88-147.68-25.344-33.824-49.76-67.68-68.16-97.152 0 0 0 41.024 17.952 75.648 0 0 74.208 141.76 219.008 273.536 14.112 15.904 137.6 139.328 257.536 135.36 0 0 111.872 7.968 213.792-75.648 16.736-15.936 195.488-169.216 251.2-229.728M190.208 445.216l67.008 64.896s15.424 11.52 33.056-5.184c0 0 64.288-62.912 119.104-113.472 52.16-47.232 104.32-96.224 123.84-110.144 0 0 84.384-87.2 191.488-1.984 0 0 146.112 114.144 289.824 310.4l4.8-23.072s5.152-19.136-7.584-37.024c0 0-112.256-165.92-250.816-284.96 0 0-69.28-73.248-157.664-91.552 0 0-72.864-17.12-141.728 37.024-33.856 26.656-107.776 95.552-169.248 154.08-57.088 54.016-102.08 100.992-102.08 100.992" fill="#0080CB" p-id="11518"></path><path d="M62.88 309.184l58.88 64.896s7.424 9.536 21.248-2.4c13.792-11.936 195.584-188.32 264.768-238.08 39.84-28.256 82.432-46.592 129.408-49.76a237.632 237.632 0 0 1 114.656 19.52c44.576 19.904 112.288 74.432 175.584 140.512 44.576 46.176 89.568 97.536 127.008 147.2 25.056 33.824 49.76 67.68 68.064 97.152 0 0 0-41.024-17.92-75.648 0 0-74.432-141.632-218.976-275.392-14.336-12.736-137.728-136.576-257.6-133.76 0 0-111.84-6.4-213.856 77.216-16.544 13.952-195.392 168-251.264 228.544" fill="#0080CB" p-id="11519"></path><path d="M41.344 350.176s103.328 136.448 217.152 226.816c0 0 43.104 37.024 89.28-4.8l236.8-214.848s71.232-71.264 151.68-0.8c0 0 168.384 149.984 260.768 275.776 0 0 5.568 4.384 0 12.352-4.384 8.352-13.536 30.272-13.536 30.272s-101.12-131.008-218.176-227.744c0 0-45.376-34.624-84.8 1.984-39.04 36.64-224.544 206.24-254.016 227.744-29.44 21.504-78.272 44.16-147.296-17.536-53.984-48.16-195.2-181.536-250.784-265.536 0 0-4.992-4.8-0.992-13.824 5.728-10.752 13.92-29.856 13.92-29.856" fill="#9CC816" p-id="11520"></path></svg>
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
1
src/linker.tray.win/web/chinanet.svg
Normal file
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1739957464597" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6221" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M331.6 515.6c0-245.8 90.1-444.7 201.3-444.7 56.1 0 106.7 50.8 143.1 132.8l-37.2 10.1c-9-10.7-21.9-17.1-35.6-17.8-31.9 0-58 40.2-76.4 100.8-18.8 71.2-27.6 144.8-26.4 218.5 0 165.8 37.9 300.5 84.6 300.5 34.5 0 63.8-72.4 77.2-176.2l65.9-17.8c-21.6 194.5-100.7 338.7-195.3 338.7-111.1 0-201.2-199.1-201.2-444.9z" fill="#00438F" p-id="6222"></path><path d="M76 429c-26.4-105.2 97-230.3 285.1-304.6l9.5 38c-109.9 48.6-180 117.7-166.3 174.3 17.7 73.2 167.6 97.2 335.2 54.6s289.9-136.6 271.7-210.9c-7.6-32.2-41.4-54.6-90.7-66.6l-12.6-50.3c137 6.6 238.8 54.6 258.3 136.6C996 323.6 820.7 475.2 574.9 538.8S105.5 552.4 76 429z" fill="#00438F" p-id="6223"></path></svg>
|
||||
|
After Width: | Height: | Size: 990 B |
1
src/linker.tray.win/web/chinaunicom.svg
Normal file
|
After Width: | Height: | Size: 8.8 KiB |
@@ -1 +1 @@
|
||||
.table-sort th[data-v-4b2df38c]{border-bottom:0}.dropdown[data-v-6e34f330]{border:1px solid #ddd;padding:.4rem;font-size:1.3rem;border-radius:.4rem;position:relative}.dropdown .el-icon[data-v-6e34f330]{vertical-align:middle}.dropdown .badge[data-v-6e34f330]{position:absolute;right:-1rem;top:-50%;border-radius:10px;background-color:#f1ae05;color:#fff;padding:.2rem .6rem;font-size:1.2rem}a[data-v-90c5041c]{color:#666;text-decoration:underline}a.green[data-v-90c5041c]{color:green;font-weight:700}a.download[data-v-90c5041c]{margin-left:.6rem}a.download .el-icon[data-v-90c5041c]{vertical-align:middle;font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-90c5041c]{animation:loading-90c5041c 1s linear infinite}a.download+a.download[data-v-90c5041c]{margin-left:.2rem}@keyframes loading-90c5041c{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}img.system[data-v-ffd0d512]{height:1.6rem;vertical-align:middle;margin-right:.4rem}.self[data-v-ffd0d512]{color:#d400ff}.self .el-icon[data-v-ffd0d512]{vertical-align:text-bottom}.ipaddress span[data-v-5db71b03]{vertical-align:middle}.el-input[data-v-5db71b03]{width:12rem;margin-right:.6rem}.el-col[data-v-7a697708]{text-align:left}span.point[data-v-39aee530]{width:.8rem;height:.8rem;border-radius:50%;display:inline-block;vertical-align:middle;margin:-.2rem .3rem 0 -1.3rem;background-color:#eee;border:1px solid #ddd}span.point.p2p[data-v-39aee530]{background-color:#01c901;border:1px solid #049538}span.point.relay[data-v-39aee530]{background-color:#e3e811;border:1px solid #b3c410}span.point.node[data-v-39aee530]{background-color:#09dda9;border:1px solid #0cac90}.el-icon.loading[data-v-7aff655c],a.loading[data-v-7aff655c]{vertical-align:middle;font-weight:700;animation:loading-7aff655c 1s linear infinite}.el-switch.is-disabled[data-v-7aff655c]{opacity:1}.el-input[data-v-7aff655c]{width:8rem}.delay[data-v-7aff655c]{position:absolute;right:0;bottom:0;line-height:normal}.switch-btn[data-v-7aff655c]{font-size:1.5rem}.any[data-v-7aff655c]{position:absolute;left:-7px;top:-2px;line-height:normal}.any.green[data-v-7aff655c]{background:linear-gradient(270deg,#caff00,green,#0d6d23,#e38a00,green);background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:hsla(0,0%,100%,0)}@keyframes loading-7aff655c{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.wrap[data-v-786fe646]{padding-right:1rem}.remark[data-v-786fe646]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wrap[data-v-286c7cac]{padding-right:1rem}.el-switch.is-disabled[data-v-078917af]{opacity:1}.upgrade-wrap[data-v-078917af]{border:1px solid #ddd;margin-bottom:2rem;padding:0 0 1rem 0}.el-switch.is-disabled[data-v-67ed3552]{opacity:1}.calc span[data-v-67ed3552]{display:inline-block}.calc span.label[data-v-67ed3552]{width:6rem}.el-icon.loading[data-v-d37c5992],a.loading[data-v-d37c5992]{vertical-align:middle;font-weight:700;animation:loading-d37c5992 1s linear infinite}.el-switch.is-disabled[data-v-d37c5992]{opacity:1}.el-input[data-v-d37c5992]{width:8rem}.switch-btn[data-v-d37c5992]{font-size:1.5rem}@keyframes loading-d37c5992{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.el-switch.is-disabled[data-v-022e3781]{opacity:1}.upgrade-wrap[data-v-022e3781]{border:1px solid #ddd;margin-bottom:2rem;padding:1rem 0 1rem 0}.lan-item[data-v-022e3781]{margin-bottom:0}.el-switch.is-disabled[data-v-3c85bbf3]{opacity:1}.green[data-v-3c85bbf3]{font-weight:700}.el-switch.is-disabled[data-v-74ef14ca]{opacity:1}ul li[data-v-74ef14ca]{padding-left:2rem}a[data-v-6e9936ec]{text-decoration:underline}a+a[data-v-6e9936ec]{margin-left:1rem}a.green[data-v-6e9936ec]{font-weight:700}.head[data-v-bb70309e]{padding-bottom:1rem}.green[data-v-bb70309e]{color:green;font-weight:700}.error[data-v-bb70309e]{font-weight:700}.error .el-icon[data-v-bb70309e]{vertical-align:text-bottom}.head[data-v-9f4ae946]{padding-bottom:1rem}.error[data-v-9f4ae946]{font-weight:700}.error .el-icon[data-v-9f4ae946]{vertical-align:text-bottom}.head[data-v-32318a6a]{padding-bottom:1rem}.table-sort.el-table th.el-table__cell.is-leaf{border-bottom:0}.table-sort.el-table .el-table__inner-wrapper:before{height:0}.home-list-wrap[data-v-524833e4]{padding:1rem}.home-list-wrap .page[data-v-524833e4]{padding-top:1rem}.home-list-wrap .page-wrap[data-v-524833e4]{display:inline-block}
|
||||
.table-sort th[data-v-754b053a]{border-bottom:0}.dropdown[data-v-6e34f330]{border:1px solid #ddd;padding:.4rem;font-size:1.3rem;border-radius:.4rem;position:relative}.dropdown .el-icon[data-v-6e34f330]{vertical-align:middle}.dropdown .badge[data-v-6e34f330]{position:absolute;right:-1rem;top:-50%;border-radius:10px;background-color:#f1ae05;color:#fff;padding:.2rem .6rem;font-size:1.2rem}a[data-v-90c5041c]{color:#666;text-decoration:underline}a.green[data-v-90c5041c]{color:green;font-weight:700}a.download[data-v-90c5041c]{margin-left:.6rem}a.download .el-icon[data-v-90c5041c]{vertical-align:middle;font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-90c5041c]{animation:loading-90c5041c 1s linear infinite}a.download+a.download[data-v-90c5041c]{margin-left:.2rem}@keyframes loading-90c5041c{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}img.system[data-v-2fc150b6]{height:1.6rem;vertical-align:middle;margin-right:.4rem}.self[data-v-2fc150b6]{color:#d400ff}.self .el-icon[data-v-2fc150b6]{vertical-align:text-bottom}.ipaddress span[data-v-5db71b03]{vertical-align:middle}.el-input[data-v-5db71b03]{width:12rem;margin-right:.6rem}.el-col[data-v-7a697708]{text-align:left}span.point[data-v-39aee530]{width:.8rem;height:.8rem;border-radius:50%;display:inline-block;vertical-align:middle;margin:-.2rem .3rem 0 -1.3rem;background-color:#eee;border:1px solid #ddd}span.point.p2p[data-v-39aee530]{background-color:#01c901;border:1px solid #049538}span.point.relay[data-v-39aee530]{background-color:#e3e811;border:1px solid #b3c410}span.point.node[data-v-39aee530]{background-color:#09dda9;border:1px solid #0cac90}.el-icon.loading[data-v-7aff655c],a.loading[data-v-7aff655c]{vertical-align:middle;font-weight:700;animation:loading-7aff655c 1s linear infinite}.el-switch.is-disabled[data-v-7aff655c]{opacity:1}.el-input[data-v-7aff655c]{width:8rem}.delay[data-v-7aff655c]{position:absolute;right:0;bottom:0;line-height:normal}.switch-btn[data-v-7aff655c]{font-size:1.5rem}.any[data-v-7aff655c]{position:absolute;left:-7px;top:-2px;line-height:normal}.any.green[data-v-7aff655c]{background:linear-gradient(270deg,#caff00,green,#0d6d23,#e38a00,green);background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:hsla(0,0%,100%,0)}@keyframes loading-7aff655c{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.wrap[data-v-786fe646]{padding-right:1rem}.remark[data-v-786fe646]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wrap[data-v-286c7cac]{padding-right:1rem}.el-switch.is-disabled[data-v-078917af]{opacity:1}.upgrade-wrap[data-v-078917af]{border:1px solid #ddd;margin-bottom:2rem;padding:0 0 1rem 0}.el-switch.is-disabled[data-v-67ed3552]{opacity:1}.calc span[data-v-67ed3552]{display:inline-block}.calc span.label[data-v-67ed3552]{width:6rem}.el-icon.loading[data-v-d37c5992],a.loading[data-v-d37c5992]{vertical-align:middle;font-weight:700;animation:loading-d37c5992 1s linear infinite}.el-switch.is-disabled[data-v-d37c5992]{opacity:1}.el-input[data-v-d37c5992]{width:8rem}.switch-btn[data-v-d37c5992]{font-size:1.5rem}@keyframes loading-d37c5992{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.el-switch.is-disabled[data-v-022e3781]{opacity:1}.upgrade-wrap[data-v-022e3781]{border:1px solid #ddd;margin-bottom:2rem;padding:1rem 0 1rem 0}.lan-item[data-v-022e3781]{margin-bottom:0}.el-switch.is-disabled[data-v-3e4aa9c2]{opacity:1}.green[data-v-3e4aa9c2]{font-weight:700}img.system[data-v-3e4aa9c2]{height:1.4rem;vertical-align:middle;margin-right:.4rem}.el-switch.is-disabled[data-v-74ef14ca]{opacity:1}ul li[data-v-74ef14ca]{padding-left:2rem}a[data-v-6e9936ec]{text-decoration:underline}a+a[data-v-6e9936ec]{margin-left:1rem}a.green[data-v-6e9936ec]{font-weight:700}.head[data-v-bb70309e]{padding-bottom:1rem}.green[data-v-bb70309e]{color:green;font-weight:700}.error[data-v-bb70309e]{font-weight:700}.error .el-icon[data-v-bb70309e]{vertical-align:text-bottom}.head[data-v-9f4ae946]{padding-bottom:1rem}.error[data-v-9f4ae946]{font-weight:700}.error .el-icon[data-v-9f4ae946]{vertical-align:text-bottom}.head[data-v-32318a6a]{padding-bottom:1rem}.table-sort.el-table th.el-table__cell.is-leaf{border-bottom:0}.table-sort.el-table .el-table__inner-wrapper:before{height:0}.home-list-wrap[data-v-524833e4]{padding:1rem}.home-list-wrap .page[data-v-524833e4]{padding-top:1rem}.home-list-wrap .page-wrap[data-v-524833e4]{display:inline-block}
|
||||
@@ -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.1a70ad89.js"></script><script defer="defer" src="js/app.898f0026.js"></script><link href="css/chunk-vendors.d8267b33.css" rel="stylesheet"><link href="css/app.9573ab92.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><link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin=""/><script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js" integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=" crossorigin=""></script><script defer="defer" src="js/chunk-vendors.1a70ad89.js"></script><script defer="defer" src="js/app.c458d21a.js"></script><link href="css/chunk-vendors.d8267b33.css" rel="stylesheet"><link href="css/app.9573ab92.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
src/linker.tray.win/web/js/273.6490f091.js
Normal file
1
src/linker.tray.win/web/js/391.0790b8b9.js
Normal file
@@ -1 +1 @@
|
||||
"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[355],{427:function(e,n,a){a.r(n),a.d(n,{default:function(){return O}});var t=a(6768);const s={class:"net-wrap app-wrap"},l={class:"inner absolute flex flex-column flex-nowrap"},i={class:"head"},o={class:"body flex-1 relative"},c={class:"status"};function r(e,n,a,r,u,d){const g=(0,t.g2)("Head"),p=(0,t.g2)("List"),v=(0,t.g2)("Status");return(0,t.uX)(),(0,t.CE)("div",s,[(0,t.Lk)("div",l,[(0,t.Lk)("div",i,[(0,t.bF)(g)]),(0,t.Lk)("div",o,[(0,t.bF)(p)]),(0,t.Lk)("div",c,[(0,t.bF)(v,{config:!1})])])])}a(4114);const u=e=>((0,t.Qi)("data-v-1fd9ef80"),e=e(),(0,t.jt)(),e),d={class:"head-wrap"},g={class:"tools flex"},p=u((()=>(0,t.Lk)("span",{class:"label"},"服务器 ",-1))),v=u((()=>(0,t.Lk)("span",{class:"flex-1"},null,-1))),h={style:{"margin-left":"1rem"}};function f(e,n,a,s,l,i){const o=(0,t.g2)("el-input"),c=(0,t.g2)("Refresh"),r=(0,t.g2)("el-icon"),u=(0,t.g2)("el-button"),f=(0,t.g2)("Background");return(0,t.uX)(),(0,t.CE)("div",d,[(0,t.Lk)("div",g,[p,(0,t.bF)(o,{modelValue:s.state.server,"onUpdate:modelValue":n[0]||(n[0]=e=>s.state.server=e),readonly:"",style:{width:"14rem"},size:"small"},null,8,["modelValue"]),v,(0,t.bF)(u,{size:"small",onClick:s.handleRefresh},{default:(0,t.k6)((()=>[(0,t.eW)(" 刷新(F5)"),(0,t.bF)(r,null,{default:(0,t.k6)((()=>[(0,t.bF)(c)])),_:1})])),_:1},8,["onClick"]),(0,t.Lk)("div",h,[(0,t.bF)(f,{name:"net"})])])])}var k=a(3830),m=a(144),C=a(7477),b=a(5096),L={components:{Edit:C.ffu,Refresh:C.C42,Background:b.A},setup(){const e=(0,k.B)(),n=(0,m.Kh)({server:(0,t.EW)((()=>e.value.config.Client.Server.Host))}),a=()=>{window.location.reload()};return{state:n,handleRefresh:a}}},_=a(1241);const w=(0,_.A)(L,[["render",f],["__scopeId","data-v-1fd9ef80"]]);var F=w;const S=e=>((0,t.Qi)("data-v-68d1c30a"),e=e(),(0,t.jt)(),e),x={class:"net-list-wrap flex flex-column absolute"},T={class:"flex-1 scrollbar"},z={class:"flex"},E=S((()=>(0,t.Lk)("div",{class:"flex-1"},null,-1))),A={class:"tuntap"},I={class:"page t-c"},P={class:"page-wrap t-c"};function B(e,n,a,s,l,i){const o=(0,t.g2)("DeviceName"),c=(0,t.g2)("UpdaterBtn"),r=(0,t.g2)("TuntapShow"),u=(0,t.g2)("el-pagination");return(0,t.uX)(),(0,t.CE)("div",x,[(0,t.Lk)("div",T,[(0,t.Lk)("ul",null,[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(s.devices.page.List,((e,n)=>((0,t.uX)(),(0,t.CE)("li",{key:n},[(0,t.Lk)("dl",null,[(0,t.Lk)("dt",z,[(0,t.Lk)("div",null,[(0,t.bF)(o,{item:e},null,8,["item"])]),E,(0,t.Lk)("div",null,[(0,t.bF)(c,{config:!1,item:e},null,8,["item"])])]),(0,t.Lk)("dd",A,[s.tuntap.list[e.MachineId]?((0,t.uX)(),(0,t.Wv)(r,{key:0,item:e},null,8,["item"])):(0,t.Q3)("",!0)])])])))),128))])]),(0,t.Lk)("div",I,[(0,t.Lk)("div",P,[(0,t.bF)(u,{size:"small",background:"",layout:"prev,pager, next","pager-count":5,total:s.devices.page.Count,"page-size":s.devices.page.Request.Size,"current-page":s.devices.page.Request.Page,onCurrentChange:s.handlePageChange,onSizeChange:s.handlePageSizeChange,"page-sizes":[10,20,50,100,255]},null,8,["total","page-size","current-page","onCurrentChange","onSizeChange"])])])])}var y=a(8104),R=a(7985),D=a(9383),U=a(4001),X=a(3347),V=a(9982),N=a(9983),Q={components:{StarFilled:C.BQ2,UpdaterBtn:U.A,DeviceName:X.A,TuntapShow:V.A},setup(e){(0,k.B)();const n=(0,m.Kh)({}),{devices:a,machineId:s,_getSignList:l,_getSignList1:i,handleDeviceEdit:o,handlePageChange:c,handlePageSizeChange:r,handleDel:u,clearDevicesTimeout:d}=(0,R.r)(),{tuntap:g,_getTuntapInfo:p,handleTuntapRefresh:v,clearTuntapTimeout:h,handleTuntapEdit:f,sortTuntapIP:C}=(0,y.O)(),{_getUpdater:b,_subscribeUpdater:L,clearUpdaterTimeout:_}=(0,D.d)(),{connections:w,forwardConnections:F,_getForwardConnections:S,tuntapConnections:x,_getTuntapConnections:T,socks5Connections:z,_getSocks5Connections:E,handleTunnelConnections:A,clearConnectionsTimeout:I}=(0,N.L2)();return(0,t.sV)((()=>{c(),v(),l(),i(),p(),b(),L()})),(0,t.hi)((()=>{d(),h(),_()})),{state:n,devices:a,machineId:s,handlePageChange:c,handlePageSizeChange:r,tuntap:g}}};const H=(0,_.A)(Q,[["render",B],["__scopeId","data-v-68d1c30a"]]);var K=H,W=a(4195),j=a(1387),q={components:{Head:F,List:K,Status:W.A},setup(){document.addEventListener("contextmenu",(function(e){e.preventDefault()}));const e=(0,k.B)(),n=(0,j.rd)();return(0,t.sV)((()=>{0==e.value.hasAccess("NetManager")&&n.push({name:"NoPermission"})})),{}}};const M=(0,_.A)(q,[["render",r],["__scopeId","data-v-6a3f3b43"]]);var O=M}}]);
|
||||
"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[445],{427:function(e,n,a){a.r(n),a.d(n,{default:function(){return O}});var t=a(6768);const s={class:"net-wrap app-wrap"},l={class:"inner absolute flex flex-column flex-nowrap"},i={class:"head"},o={class:"body flex-1 relative"},c={class:"status"};function r(e,n,a,r,u,d){const g=(0,t.g2)("Head"),p=(0,t.g2)("List"),v=(0,t.g2)("Status");return(0,t.uX)(),(0,t.CE)("div",s,[(0,t.Lk)("div",l,[(0,t.Lk)("div",i,[(0,t.bF)(g)]),(0,t.Lk)("div",o,[(0,t.bF)(p)]),(0,t.Lk)("div",c,[(0,t.bF)(v,{config:!1})])])])}a(4114);const u=e=>((0,t.Qi)("data-v-1fd9ef80"),e=e(),(0,t.jt)(),e),d={class:"head-wrap"},g={class:"tools flex"},p=u((()=>(0,t.Lk)("span",{class:"label"},"服务器 ",-1))),v=u((()=>(0,t.Lk)("span",{class:"flex-1"},null,-1))),h={style:{"margin-left":"1rem"}};function f(e,n,a,s,l,i){const o=(0,t.g2)("el-input"),c=(0,t.g2)("Refresh"),r=(0,t.g2)("el-icon"),u=(0,t.g2)("el-button"),f=(0,t.g2)("Background");return(0,t.uX)(),(0,t.CE)("div",d,[(0,t.Lk)("div",g,[p,(0,t.bF)(o,{modelValue:s.state.server,"onUpdate:modelValue":n[0]||(n[0]=e=>s.state.server=e),readonly:"",style:{width:"14rem"},size:"small"},null,8,["modelValue"]),v,(0,t.bF)(u,{size:"small",onClick:s.handleRefresh},{default:(0,t.k6)((()=>[(0,t.eW)(" 刷新(F5)"),(0,t.bF)(r,null,{default:(0,t.k6)((()=>[(0,t.bF)(c)])),_:1})])),_:1},8,["onClick"]),(0,t.Lk)("div",h,[(0,t.bF)(f,{name:"net"})])])])}var k=a(3830),m=a(144),C=a(7477),b=a(5096),L={components:{Edit:C.ffu,Refresh:C.C42,Background:b.A},setup(){const e=(0,k.B)(),n=(0,m.Kh)({server:(0,t.EW)((()=>e.value.config.Client.Server.Host))}),a=()=>{window.location.reload()};return{state:n,handleRefresh:a}}},_=a(1241);const w=(0,_.A)(L,[["render",f],["__scopeId","data-v-1fd9ef80"]]);var F=w;const S=e=>((0,t.Qi)("data-v-68d1c30a"),e=e(),(0,t.jt)(),e),x={class:"net-list-wrap flex flex-column absolute"},T={class:"flex-1 scrollbar"},z={class:"flex"},E=S((()=>(0,t.Lk)("div",{class:"flex-1"},null,-1))),A={class:"tuntap"},I={class:"page t-c"},P={class:"page-wrap t-c"};function B(e,n,a,s,l,i){const o=(0,t.g2)("DeviceName"),c=(0,t.g2)("UpdaterBtn"),r=(0,t.g2)("TuntapShow"),u=(0,t.g2)("el-pagination");return(0,t.uX)(),(0,t.CE)("div",x,[(0,t.Lk)("div",T,[(0,t.Lk)("ul",null,[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(s.devices.page.List,((e,n)=>((0,t.uX)(),(0,t.CE)("li",{key:n},[(0,t.Lk)("dl",null,[(0,t.Lk)("dt",z,[(0,t.Lk)("div",null,[(0,t.bF)(o,{item:e},null,8,["item"])]),E,(0,t.Lk)("div",null,[(0,t.bF)(c,{config:!1,item:e},null,8,["item"])])]),(0,t.Lk)("dd",A,[s.tuntap.list[e.MachineId]?((0,t.uX)(),(0,t.Wv)(r,{key:0,item:e},null,8,["item"])):(0,t.Q3)("",!0)])])])))),128))])]),(0,t.Lk)("div",I,[(0,t.Lk)("div",P,[(0,t.bF)(u,{size:"small",background:"",layout:"prev,pager, next","pager-count":5,total:s.devices.page.Count,"page-size":s.devices.page.Request.Size,"current-page":s.devices.page.Request.Page,onCurrentChange:s.handlePageChange,onSizeChange:s.handlePageSizeChange,"page-sizes":[10,20,50,100,255]},null,8,["total","page-size","current-page","onCurrentChange","onSizeChange"])])])])}var y=a(8104),R=a(7985),D=a(9383),U=a(4001),X=a(2148),V=a(9982),N=a(9983),Q={components:{StarFilled:C.BQ2,UpdaterBtn:U.A,DeviceName:X.A,TuntapShow:V.A},setup(e){(0,k.B)();const n=(0,m.Kh)({}),{devices:a,machineId:s,_getSignList:l,_getSignList1:i,handleDeviceEdit:o,handlePageChange:c,handlePageSizeChange:r,handleDel:u,clearDevicesTimeout:d}=(0,R.r)(),{tuntap:g,_getTuntapInfo:p,handleTuntapRefresh:v,clearTuntapTimeout:h,handleTuntapEdit:f,sortTuntapIP:C}=(0,y.O)(),{_getUpdater:b,_subscribeUpdater:L,clearUpdaterTimeout:_}=(0,D.d)(),{connections:w,forwardConnections:F,_getForwardConnections:S,tuntapConnections:x,_getTuntapConnections:T,socks5Connections:z,_getSocks5Connections:E,handleTunnelConnections:A,clearConnectionsTimeout:I}=(0,N.L2)();return(0,t.sV)((()=>{c(),v(),l(),i(),p(),b(),L()})),(0,t.hi)((()=>{d(),h(),_()})),{state:n,devices:a,machineId:s,handlePageChange:c,handlePageSizeChange:r,tuntap:g}}};const H=(0,_.A)(Q,[["render",B],["__scopeId","data-v-68d1c30a"]]);var K=H,W=a(2710),j=a(1387),q={components:{Head:F,List:K,Status:W.A},setup(){document.addEventListener("contextmenu",(function(e){e.preventDefault()}));const e=(0,k.B)(),n=(0,j.rd)();return(0,t.sV)((()=>{0==e.value.hasAccess("NetManager")&&n.push({name:"NoPermission"})})),{}}};const M=(0,_.A)(q,[["render",r],["__scopeId","data-v-6a3f3b43"]]);var O=M}}]);
|
||||
1
src/linker.tray.win/web/js/559.9b949c4e.js
Normal file
1
src/linker.tray.win/web/js/708.e0917a20.js
Normal file
1
src/linker.tray.win/web/js/app.c458d21a.js
Normal file
BIN
src/linker.tray.win/web/marker-green.png
Normal file
|
After Width: | Height: | Size: 6.6 KiB |
BIN
src/linker.tray.win/web/marker-grey.png
Normal file
|
After Width: | Height: | Size: 4.7 KiB |
@@ -16,9 +16,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker tun</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
@@ -16,9 +16,9 @@
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
<PackageReleaseNotes>linker tunnel</PackageReleaseNotes>
|
||||
<Version>1.6.7</Version>
|
||||
<AssemblyVersion>1.6.7</AssemblyVersion>
|
||||
<FileVersion>1.6.7</FileVersion>
|
||||
<Version>1.6.8</Version>
|
||||
<AssemblyVersion>1.6.8</AssemblyVersion>
|
||||
<FileVersion>1.6.8</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
|
||||
1
src/linker.web/public/chinamobile.svg
Normal file
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1739957623593" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11516" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M835.776 579.776l-66.88-64.896s-15.52-11.52-33.056 5.184c0 0-64.48 62.912-119.424 113.472-52.16 47.36-104.32 96.32-123.84 110.272 0 0-84.384 86.4-191.328 1.984 0 0-145.664-114.24-289.792-310.528l-4.704 23.072s-5.376 19.136 7.36 37.056c0 0 112.576 166.016 251.072 285.056 0 0 69.024 73.632 157.344 89.568 0 0 72.864 19.904 142.112-35.84 33.856-25.856 107.52-94.72 169.216-153.28 56.96-54.144 101.92-101.12 101.92-101.12" fill="#0080CB" p-id="11517"></path><path d="M962.784 715.936l-58.944-64.896s-7.168-9.536-21.088 2.4c-13.92 11.936-195.488 188.704-264.768 236.48a232.16 232.16 0 0 1-129.76 51.744c-35.456 4-73.664-3.968-114.432-19.904-44.352-19.904-112.064-75.648-175.488-140.16-44.832-46.56-89.44-97.92-126.88-147.68-25.344-33.824-49.76-67.68-68.16-97.152 0 0 0 41.024 17.952 75.648 0 0 74.208 141.76 219.008 273.536 14.112 15.904 137.6 139.328 257.536 135.36 0 0 111.872 7.968 213.792-75.648 16.736-15.936 195.488-169.216 251.2-229.728M190.208 445.216l67.008 64.896s15.424 11.52 33.056-5.184c0 0 64.288-62.912 119.104-113.472 52.16-47.232 104.32-96.224 123.84-110.144 0 0 84.384-87.2 191.488-1.984 0 0 146.112 114.144 289.824 310.4l4.8-23.072s5.152-19.136-7.584-37.024c0 0-112.256-165.92-250.816-284.96 0 0-69.28-73.248-157.664-91.552 0 0-72.864-17.12-141.728 37.024-33.856 26.656-107.776 95.552-169.248 154.08-57.088 54.016-102.08 100.992-102.08 100.992" fill="#0080CB" p-id="11518"></path><path d="M62.88 309.184l58.88 64.896s7.424 9.536 21.248-2.4c13.792-11.936 195.584-188.32 264.768-238.08 39.84-28.256 82.432-46.592 129.408-49.76a237.632 237.632 0 0 1 114.656 19.52c44.576 19.904 112.288 74.432 175.584 140.512 44.576 46.176 89.568 97.536 127.008 147.2 25.056 33.824 49.76 67.68 68.064 97.152 0 0 0-41.024-17.92-75.648 0 0-74.432-141.632-218.976-275.392-14.336-12.736-137.728-136.576-257.6-133.76 0 0-111.84-6.4-213.856 77.216-16.544 13.952-195.392 168-251.264 228.544" fill="#0080CB" p-id="11519"></path><path d="M41.344 350.176s103.328 136.448 217.152 226.816c0 0 43.104 37.024 89.28-4.8l236.8-214.848s71.232-71.264 151.68-0.8c0 0 168.384 149.984 260.768 275.776 0 0 5.568 4.384 0 12.352-4.384 8.352-13.536 30.272-13.536 30.272s-101.12-131.008-218.176-227.744c0 0-45.376-34.624-84.8 1.984-39.04 36.64-224.544 206.24-254.016 227.744-29.44 21.504-78.272 44.16-147.296-17.536-53.984-48.16-195.2-181.536-250.784-265.536 0 0-4.992-4.8-0.992-13.824 5.728-10.752 13.92-29.856 13.92-29.856" fill="#9CC816" p-id="11520"></path></svg>
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
1
src/linker.web/public/chinanet.svg
Normal file
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1739957464597" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6221" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M331.6 515.6c0-245.8 90.1-444.7 201.3-444.7 56.1 0 106.7 50.8 143.1 132.8l-37.2 10.1c-9-10.7-21.9-17.1-35.6-17.8-31.9 0-58 40.2-76.4 100.8-18.8 71.2-27.6 144.8-26.4 218.5 0 165.8 37.9 300.5 84.6 300.5 34.5 0 63.8-72.4 77.2-176.2l65.9-17.8c-21.6 194.5-100.7 338.7-195.3 338.7-111.1 0-201.2-199.1-201.2-444.9z" fill="#00438F" p-id="6222"></path><path d="M76 429c-26.4-105.2 97-230.3 285.1-304.6l9.5 38c-109.9 48.6-180 117.7-166.3 174.3 17.7 73.2 167.6 97.2 335.2 54.6s289.9-136.6 271.7-210.9c-7.6-32.2-41.4-54.6-90.7-66.6l-12.6-50.3c137 6.6 238.8 54.6 258.3 136.6C996 323.6 820.7 475.2 574.9 538.8S105.5 552.4 76 429z" fill="#00438F" p-id="6223"></path></svg>
|
||||
|
After Width: | Height: | Size: 990 B |
1
src/linker.web/public/chinaunicom.svg
Normal file
|
After Width: | Height: | Size: 8.8 KiB |
@@ -1,17 +1,27 @@
|
||||
<!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.0">
|
||||
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
|
||||
<title><%= htmlWebpackPlugin.options.title %></title>
|
||||
<title>
|
||||
<%= htmlWebpackPlugin.options.title %>
|
||||
</title>
|
||||
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
|
||||
integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin="" />
|
||||
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"
|
||||
integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=" crossorigin=""></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<noscript>
|
||||
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
|
||||
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled.
|
||||
Please enable it to continue.</strong>
|
||||
</noscript>
|
||||
<div id="app"></div>
|
||||
<!-- built files will be auto injected -->
|
||||
</body>
|
||||
|
||||
</html>
|
||||
BIN
src/linker.web/public/marker-green.png
Normal file
|
After Width: | Height: | Size: 6.6 KiB |
BIN
src/linker.web/public/marker-grey.png
Normal file
|
After Width: | Height: | Size: 4.7 KiB |
@@ -12,3 +12,6 @@ export const getSForwardFlows = (data) => {
|
||||
export const getRelayFlows = (data) => {
|
||||
return sendWebsocketMsg('flow/GetRelayFlows', data);
|
||||
}
|
||||
export const getCitys = () => {
|
||||
return sendWebsocketMsg('flow/GetCitys');
|
||||
}
|
||||
@@ -31,3 +31,7 @@ export const setSignInName = (data) => {
|
||||
export const setSignInGroups = (data) => {
|
||||
return sendWebsocketMsg('signIn/SetGroups', data);
|
||||
}
|
||||
|
||||
export const getSignInNames = () => {
|
||||
return sendWebsocketMsg('signIn/names');
|
||||
}
|
||||
@@ -89,8 +89,9 @@ export default {
|
||||
'status.flowSearchName': 'Name',
|
||||
'status.flowRelaySource': 'Source',
|
||||
'status.flowRelayTarget': 'Target',
|
||||
'status.flowSearchDomainPort': 'Target',
|
||||
'status.flowSearchDomainPort': 'Domain/Port',
|
||||
'status.flowArea': 'Area',
|
||||
'status.flowNet': 'Network',
|
||||
|
||||
'status.tunnelName': 'Name',
|
||||
'status.tunnelLabel': 'Label',
|
||||
|
||||
@@ -92,6 +92,8 @@ export default {
|
||||
'status.flowRelaySource': '发起端',
|
||||
'status.flowRelayTarget': '目标端',
|
||||
'status.flowSearchDomainPort': '域名/端口',
|
||||
'status.flowArea': '地区',
|
||||
'status.flowNet': '网络',
|
||||
|
||||
'status.tunnelName': '名称',
|
||||
'status.tunnelLabel': '说明',
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
<div>
|
||||
<template v-if="tuntap.list[item.MachineId] && tuntap.list[item.MachineId].system">
|
||||
<span :title="tuntap.list[item.MachineId].SystemInfo">
|
||||
<img v-if="item.countryFlag" class="system" :src="item.countryFlag" />
|
||||
<img class="system":src="`/${tuntap.list[item.MachineId].system}.svg`" />
|
||||
<img v-if="tuntap.list[item.MachineId].systemDocker" class="system" src="/docker.svg" />
|
||||
</span>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<el-table border style="width: 100%" height="32px" size="small" @sort-change="handleSortChange" class="table-sort">
|
||||
<el-table-column prop="MachineId" label="设备名" width="110" sortable="custom" ></el-table-column>
|
||||
<el-table-column prop="Version" label="版本" width="110" sortable="custom"></el-table-column>
|
||||
<el-table-column prop="tunnel" label="网关" width="76" sortable="custom"></el-table-column>
|
||||
<el-table-column prop="tunnel" label="网络" width="76" sortable="custom"></el-table-column>
|
||||
<el-table-column v-if="tuntap.show" prop="tuntap" label="网卡IP" width="160" sortable="custom"></el-table-column>
|
||||
<el-table-column v-if="socks5.show" prop="socks5" label="代理转发" width="160" sortable="custom"></el-table-column>
|
||||
<el-table-column label="columns" fixed="right">
|
||||
|
||||
@@ -1,20 +1,34 @@
|
||||
<template>
|
||||
<el-table-column prop="tunnel" label="隧道" width="76">
|
||||
<el-table-column prop="tunnel" label="网络" width="76">
|
||||
<template #default="scope">
|
||||
<div v-if="tunnel.list[scope.row.MachineId]">
|
||||
<template v-if="tunnel.list[scope.row.MachineId]">
|
||||
<div>
|
||||
<template v-if="tunnel.list[scope.row.MachineId].Net.CountryCode">
|
||||
<img
|
||||
:title="`${tunnel.list[scope.row.MachineId].Net.Country}(${tunnel.list[scope.row.MachineId].Net.CountryCode})、${tunnel.list[scope.row.MachineId].Net.RegionName}(${tunnel.list[scope.row.MachineId].Net.Region})、${tunnel.list[scope.row.MachineId].Net.City}`"
|
||||
class="system"
|
||||
:src="`https://unpkg.com/flag-icons@7.2.3/flags/4x3/${tunnel.list[scope.row.MachineId].Net.CountryCode.toLowerCase()}.svg`" />
|
||||
</template>
|
||||
<template v-if="tunnel.list[scope.row.MachineId].Net.Isp">
|
||||
<img
|
||||
:title="`${tunnel.list[scope.row.MachineId].Net.Isp}、${tunnel.list[scope.row.MachineId].Net.Org}、${tunnel.list[scope.row.MachineId].Net.As}`"
|
||||
class="system" :src="netImg(tunnel.list[scope.row.MachineId].Net)" />
|
||||
</template>
|
||||
</div>
|
||||
<div class="flex">
|
||||
<a href="javascript:;" class="a-line"
|
||||
:class="{yellow:tunnel.list[scope.row.MachineId].NeedReboot}"
|
||||
:title="title(tunnel.list[scope.row.MachineId])"
|
||||
@click="handleTunnel(tunnel.list[scope.row.MachineId],scope.row)">
|
||||
<span>网关:{{tunnel.list[scope.row.MachineId].RouteLevel}}+{{tunnel.list[scope.row.MachineId].RouteLevelPlus}}</span>
|
||||
<span>{{tunnel.list[scope.row.MachineId].RouteLevel}}+{{tunnel.list[scope.row.MachineId].RouteLevelPlus}}</span>
|
||||
</a>
|
||||
</div>
|
||||
<div>
|
||||
<span class="flex-1"></span>
|
||||
<a href="javascript:;" title="与此设备的隧道连接" class="a-line" :class="{green:connectionCount(scope.row.MachineId)>0}" @click="handleConnections(scope.row)">
|
||||
<span :class="{gateway:connectionCount(scope.row.MachineId)>0}">连接:<span>{{connectionCount(scope.row.MachineId)}}</span></span>
|
||||
<span :class="{gateway:connectionCount(scope.row.MachineId)>0}"><span>{{connectionCount(scope.row.MachineId)}}</span></span>
|
||||
</a>
|
||||
</div>
|
||||
</template>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</template>
|
||||
<script>
|
||||
@@ -51,6 +65,21 @@ export default {
|
||||
?'需要重启'
|
||||
:texts.join('\r\n');
|
||||
}
|
||||
|
||||
const imgMap = {
|
||||
'chinanet':'chinanet.svg',
|
||||
'china unicom':'chinaunicom.svg',
|
||||
'china mobile':'chinamobile.svg',
|
||||
}
|
||||
const netImg = (item)=>{
|
||||
const isp = item.Isp.toLowerCase();
|
||||
for(let j in imgMap){
|
||||
if(isp.indexOf(j) > -1){
|
||||
return `/${imgMap[j]}`;
|
||||
}
|
||||
}
|
||||
return `/system.svg`;
|
||||
}
|
||||
const connectionCount = (machineId)=>{
|
||||
const length = [
|
||||
forwardConnections.value.list[machineId],
|
||||
@@ -82,7 +111,7 @@ export default {
|
||||
|
||||
return {
|
||||
tunnel, handleTunnel,handleTunnelRefresh,
|
||||
connectionCount,handleConnections,title
|
||||
connectionCount,handleConnections,title,netImg
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -92,4 +121,10 @@ export default {
|
||||
.el-switch.is-disabled{opacity :1;}
|
||||
|
||||
.green{font-weight:bold;}
|
||||
|
||||
img.system{
|
||||
height:1.4rem;
|
||||
vertical-align:middle;
|
||||
margin-right:.4rem
|
||||
}
|
||||
</style>
|
||||
@@ -1,9 +1,10 @@
|
||||
import { getSignInList, signInDel, setSignInOrder } from "@/apis/signin";
|
||||
import { injectGlobalData } from "@/provide";
|
||||
import { computed, reactive } from "vue";
|
||||
import { computed, inject, provide, reactive, ref } from "vue";
|
||||
|
||||
const queue = [];
|
||||
|
||||
const deviceSymbol = Symbol();
|
||||
export const provideDevices = () => {
|
||||
//https://api.ipbase.com/v1/json/8.8.8.8
|
||||
const globalData = injectGlobalData();
|
||||
@@ -22,6 +23,7 @@ export const provideDevices = () => {
|
||||
showAccessEdit: false,
|
||||
deviceInfo: null
|
||||
});
|
||||
provide(deviceSymbol, devices);
|
||||
const _getSignList = () => {
|
||||
getSignInList(devices.page.Request).then((res) => {
|
||||
devices.page.Request = res.Request;
|
||||
@@ -69,29 +71,6 @@ export const provideDevices = () => {
|
||||
devices.timer = setTimeout(_getSignList1, 5000);
|
||||
});
|
||||
}
|
||||
|
||||
const getCountryFlag = () => {
|
||||
try {
|
||||
if (queue.length == 0) {
|
||||
setTimeout(getCountryFlag, 1000);
|
||||
return;
|
||||
}
|
||||
const device = queue.shift();
|
||||
fetch(`http://ip-api.com/json/${device.IP.split(':')[0]}`).then(async (response) => {
|
||||
try {
|
||||
const json = await response.json();
|
||||
device.countryFlag = `https://unpkg.com/flag-icons@7.2.3/flags/4x3/${json.countryCode.toLowerCase()}.svg`;
|
||||
} catch (e) { }
|
||||
setTimeout(getCountryFlag, 1000);
|
||||
}).catch(() => {
|
||||
setTimeout(getCountryFlag, 1000);
|
||||
});
|
||||
} catch (e) {
|
||||
setTimeout(getCountryFlag, 1000);
|
||||
}
|
||||
}
|
||||
getCountryFlag();
|
||||
|
||||
const handleDeviceEdit = (row) => {
|
||||
devices.deviceInfo = row;
|
||||
devices.showDeviceEdit = true;
|
||||
@@ -132,3 +111,6 @@ export const provideDevices = () => {
|
||||
setSort
|
||||
}
|
||||
}
|
||||
export const useDevice = () => {
|
||||
return inject(deviceSymbol);
|
||||
}
|
||||
@@ -12,6 +12,7 @@ export const provideTunnel = () => {
|
||||
current: null,
|
||||
list: {},
|
||||
hashcode: 0,
|
||||
showMap: false
|
||||
});
|
||||
provide(tunnelSymbol, tunnel);
|
||||
const _getTunnelInfo = () => {
|
||||
|
||||
84
src/linker.web/src/views/full/status/server/OnlineAllMap.vue
Normal file
@@ -0,0 +1,84 @@
|
||||
<template>
|
||||
<el-dialog class="options-center" :title="$t('status.flowOnline')" destroy-on-close v-model="state.show" width="77rem" top="2vh">
|
||||
<div class="map-wrap" id="map">
|
||||
</div>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { nextTick, onMounted, reactive, watch } from 'vue';
|
||||
import { getCitys } from '@/apis/flow';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
export default {
|
||||
props: ['modelValue'],
|
||||
emits: ['update:modelValue'],
|
||||
setup (props,{emit}) {
|
||||
|
||||
const {t} = useI18n();
|
||||
const state = reactive({
|
||||
show: true,
|
||||
});
|
||||
|
||||
watch(() => state.show, (val) => {
|
||||
if (!val) {
|
||||
setTimeout(() => {
|
||||
emit('update:modelValue', val);
|
||||
}, 300);
|
||||
}
|
||||
});
|
||||
const drawMap = (citys)=>{
|
||||
|
||||
const map = L.map('map').setView([38,105], 4);
|
||||
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png',
|
||||
{
|
||||
attribution: 'linker',
|
||||
maxZoom: 17
|
||||
}).addTo(map);
|
||||
for(let i = 0; i < citys.length; i++){
|
||||
const item = citys[i];
|
||||
const icon = new L.Icon({
|
||||
iconSize: [18, 28],
|
||||
iconAnchor: [9, 28],
|
||||
shadowAnchor: [0, 0],
|
||||
popupAnchor: [0, -27],
|
||||
shadowSize: [0,0],
|
||||
iconUrl: '/marker-green.png',
|
||||
shadowUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/images/marker-shadow.png',
|
||||
});
|
||||
const html = `
|
||||
<div class="marker-content" >
|
||||
<h3 class="marker-title" style="font-size:1.6rem">${item.City} ${item.Count}</h3>
|
||||
</div>
|
||||
`;
|
||||
|
||||
const marker = new L.marker(new L.latLng([item.Lat,item.Lon]),{icon})
|
||||
.bindPopup(html,{})
|
||||
.on('mouseover', function (e) {
|
||||
this.openPopup();
|
||||
}).on('mouseout', function (e) {
|
||||
this.closePopup();
|
||||
}).addTo(map);
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(()=>{
|
||||
nextTick(()=>{
|
||||
getCitys().then((citys)=>{
|
||||
drawMap(citys);
|
||||
}).catch(()=>{});
|
||||
|
||||
});
|
||||
})
|
||||
|
||||
return {
|
||||
state
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
#map{
|
||||
height:60rem;
|
||||
}
|
||||
</style>
|
||||
90
src/linker.web/src/views/full/status/server/OnlineMap.vue
Normal file
@@ -0,0 +1,90 @@
|
||||
<template>
|
||||
<el-dialog class="options-center" :title="$t('status.flowOnline')" destroy-on-close v-model="state.show" width="77rem" top="2vh">
|
||||
<div class="map-wrap" id="map">
|
||||
</div>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { nextTick, onMounted, reactive, watch } from 'vue';
|
||||
import { getTunnelInfo } from '@/apis/tunnel';
|
||||
import { getSignInNames } from '@/apis/signin';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
export default {
|
||||
props: ['modelValue'],
|
||||
emits: ['update:modelValue'],
|
||||
setup (props,{emit}) {
|
||||
|
||||
const {t} = useI18n();
|
||||
const state = reactive({
|
||||
show: true,
|
||||
});
|
||||
|
||||
watch(() => state.show, (val) => {
|
||||
if (!val) {
|
||||
setTimeout(() => {
|
||||
emit('update:modelValue', val);
|
||||
}, 300);
|
||||
}
|
||||
});
|
||||
const drawMap = (tunnels,devices)=>{
|
||||
|
||||
const map = L.map('map').setView([38,105], 4);
|
||||
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png',
|
||||
{
|
||||
attribution: 'linker',
|
||||
maxZoom: 17
|
||||
}).addTo(map);
|
||||
for(let i = 0; i < devices.length; i++){
|
||||
const item = devices[i];
|
||||
const net = tunnels[item.MachineId].Net;
|
||||
const icon = new L.Icon({
|
||||
iconSize: [18, 28],
|
||||
iconAnchor: [9, 28],
|
||||
shadowAnchor: [0, 0],
|
||||
popupAnchor: [0, -27],
|
||||
shadowSize: [0,0],
|
||||
iconUrl: item.Online ? '/marker-green.png' : '/marker-grey.png',
|
||||
shadowUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/images/marker-shadow.png',
|
||||
});
|
||||
const html = `
|
||||
<div class="marker-content" >
|
||||
<h3 class="marker-title" style="font-size:1.6rem">${item.MachineName}</h3>
|
||||
<div class="marker-text" style="font-size:1.3rem">${t('status.flowArea')} : ${net.Country}(${net.CountryCode})、${net.RegionName}(${net.Region})、${net.City}</div>
|
||||
<div class="marker-text" style="font-size:1.3rem">${t('status.flowNet')} : ${net.Isp}、${net.Org}、${net.As}</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
const marker = new L.marker(new L.latLng([net.Lat,net.Lon]),{icon})
|
||||
.bindPopup(html,{})
|
||||
.on('mouseover', function (e) {
|
||||
this.openPopup();
|
||||
}).on('mouseout', function (e) {
|
||||
this.closePopup();
|
||||
}).addTo(map);
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(()=>{
|
||||
nextTick(()=>{
|
||||
getTunnelInfo().then((tunnels)=>{
|
||||
getSignInNames().then(devices=>{
|
||||
drawMap(tunnels.List,devices);
|
||||
}).catch(()=>{});
|
||||
}).catch(()=>{});
|
||||
|
||||
});
|
||||
})
|
||||
|
||||
return {
|
||||
state
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
#map{
|
||||
height:60rem;
|
||||
}
|
||||
</style>
|
||||
@@ -1,6 +1,9 @@
|
||||
<template>
|
||||
<div class="flow-wrap" v-if="config">
|
||||
<p>{{$t('status.flowOnline')}} <a href="javascript:;" :title="`${$t('status.flowThisServer')}\r\n${$t('status.flowOnline')}/${$t('status.flowOnline7Day')}`">{{state.overallOnline}}</a><a href="javascript:;" :title="`${$t('status.flowAllServer')}\r\n${$t('status.flowOnline')}/${$t('status.flowOnline7Day')}/${$t('status.flowServer')}`">{{ state.serverOnline }}</a></p>
|
||||
<p>{{$t('status.flowOnline')}}
|
||||
<a href="javascript:;" @click="state.showMap=true" :title="`${$t('status.flowThisServer')}\r\n${$t('status.flowOnline')}/${$t('status.flowOnline7Day')}`">{{state.overallOnline}}</a>
|
||||
<a href="javascript:;" @click="state.showAllMap=true" :title="`${$t('status.flowAllServer')}\r\n${$t('status.flowOnline')}/${$t('status.flowOnline7Day')}/${$t('status.flowServer')}`">{{ state.serverOnline }}</a>
|
||||
</p>
|
||||
<p>{{$t('status.flowUpload')}} <a href="javascript:;" :title="`${$t('status.flowThisServer')}\r\n${$t('status.flowAllSend')}`" @click="handleShow">{{state.overallSendtSpeed}}/s</a></p>
|
||||
<p>{{$t('status.flowDownload')}} <a href="javascript:;" :title="`${$t('status.flowThisServer')}\r\n${$t('status.flowAllReceive')}`" @click="handleShow">{{state.overallReceiveSpeed}}/s</a></p>
|
||||
</div>
|
||||
@@ -39,6 +42,8 @@
|
||||
<ServerFlowMessenger :config="config" v-if="state.details.Messenger" v-model="state.details.Messenger"></ServerFlowMessenger>
|
||||
<ServerFlowSForward :config="config" v-if="state.details.SForward" v-model="state.details.SForward"></ServerFlowSForward>
|
||||
<ServerFlowRelay :config="config" v-if="state.details.Relay" v-model="state.details.Relay"></ServerFlowRelay>
|
||||
<OnlineMap :config="config" v-if="state.showMap" v-model="state.showMap"></OnlineMap>
|
||||
<OnlineAllMap :config="config" v-if="state.showAllMap" v-model="state.showAllMap"></OnlineAllMap>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
@@ -49,9 +54,11 @@ import ServerFlowSForward from './ServerFlowSForward.vue';
|
||||
import ServerFlowRelay from './ServerFlowRelay.vue';
|
||||
import { injectGlobalData } from '@/provide';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import OnlineMap from './OnlineMap.vue';
|
||||
import OnlineAllMap from './OnlineAllMap.vue';
|
||||
export default {
|
||||
props:['config'],
|
||||
components:{ServerFlowMessenger,ServerFlowSForward,ServerFlowRelay},
|
||||
components:{ServerFlowMessenger,ServerFlowSForward,ServerFlowRelay,OnlineMap,OnlineAllMap},
|
||||
setup (props) {
|
||||
const {t} = useI18n();
|
||||
const globalData = injectGlobalData();
|
||||
@@ -72,7 +79,9 @@ export default {
|
||||
Messenger:false,
|
||||
SForward:false,
|
||||
Relay:false,
|
||||
}
|
||||
},
|
||||
showMap:false,
|
||||
showAllMap:false,
|
||||
});
|
||||
const handleShow = ()=>{
|
||||
state.show = true;
|
||||
|
||||