This commit is contained in:
snltty
2025-02-20 17:04:13 +08:00
parent 35c6c3d400
commit 31e9745205
102 changed files with 918 additions and 250 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -14,9 +14,9 @@
<Copyright>snltty</Copyright>
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<Version>1.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>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -9,6 +9,8 @@
Relay = 2703,
SForward = 2704,
Citys = 2705,
Max = 2799
}
}

View File

@@ -30,7 +30,7 @@ namespace linker.messenger.forward
this.signInClientStore = signInClientStore;
this.serializer = serializer;
signInClientState.NetworkEnabledHandle += Reset;
signInClientState.OnSignInSuccess += Reset;
}
string groupid = string.Empty;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -23,6 +23,8 @@
SignIn_V_1_3_1 = 13,
Names = 14,
None = 99
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -39,7 +39,7 @@ namespace linker.messenger.tuntap
this.exRouteTransfer = exRouteTransfer;
this.signInClientState = signInClientState;
signInClientState.NetworkEnabledHandle += NetworkEnable;
signInClientState.OnSignInSuccess += NetworkEnable;
}
string groupid = string.Empty;

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<project ver="10" name="linker.tray.win" libEmbed="true" icon="..\linker\favicon.ico" ui="win" output="linker.tray.win.exe" CompanyName="snltty" FileDescription="linker.tray.win" LegalCopyright="Copyright (C) snltty 2024" ProductName="linker.tray.win" InternalName="linker.install.win" FileVersion="0.0.0.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"/>

Binary file not shown.

View 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

View 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

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.8 KiB

View File

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

View File

@@ -1 +1 @@
<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>linker.web</title><script defer="defer" src="js/chunk-vendors.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>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

@@ -16,9 +16,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker tun</PackageReleaseNotes>
<Version>1.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'">

View File

@@ -16,9 +16,9 @@
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
<PackageReleaseNotes>linker tunnel</PackageReleaseNotes>
<Version>1.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'">

View 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

View 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

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.8 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

@@ -12,3 +12,6 @@ export const getSForwardFlows = (data) => {
export const getRelayFlows = (data) => {
return sendWebsocketMsg('flow/GetRelayFlows', data);
}
export const getCitys = () => {
return sendWebsocketMsg('flow/GetCitys');
}

View File

@@ -31,3 +31,7 @@ export const setSignInName = (data) => {
export const setSignInGroups = (data) => {
return sendWebsocketMsg('signIn/SetGroups', data);
}
export const getSignInNames = () => {
return sendWebsocketMsg('signIn/names');
}

View File

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

View File

@@ -92,6 +92,8 @@ export default {
'status.flowRelaySource': '发起端',
'status.flowRelayTarget': '目标端',
'status.flowSearchDomainPort': '域名/端口',
'status.flowArea': '地区',
'status.flowNet': '网络',
'status.tunnelName': '名称',
'status.tunnelLabel': '说明',

View File

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

View File

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

View File

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

View File

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

View File

@@ -12,6 +12,7 @@ export const provideTunnel = () => {
current: null,
list: {},
hashcode: 0,
showMap: false
});
provide(tunnelSymbol, tunnel);
const _getTunnelInfo = () => {

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

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

View File

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

Some files were not shown because too many files have changed in this diff Show More