mirror of
https://github.com/snltty/linker.git
synced 2025-10-23 01:00:52 +08:00
中继有BUG
This commit is contained in:
@@ -49,11 +49,29 @@ systemctl enable linker
|
|||||||
1. 服务端端口 `1802` TCP+UDP
|
1. 服务端端口 `1802` TCP+UDP
|
||||||
2. 客户端端口 `1804`、`1803` TCP
|
2. 客户端端口 `1804`、`1803` TCP
|
||||||
3. 配置文件夹 `./configs`
|
3. 配置文件夹 `./configs`
|
||||||
4. 插件文件夹 `./plugins`
|
4. 日志文件夹 `./logs`
|
||||||
5. 网页文件夹 `./web`
|
5. x64 `snltty/linker-debian-x64`
|
||||||
6. 日志文件夹 `./logs`
|
6. arm64 `snltty/linker-debian-arm64`
|
||||||
|
|
||||||
|
#### 客户端
|
||||||
```
|
```
|
||||||
snltty/linker-musl-x64
|
docker run -it -d --name linker \
|
||||||
snltty/linker-musl-arm64
|
-p 1804:1804/tcp -p 1803:1803/tcp \
|
||||||
|
-v /usr/local/linker-docker/configs:/app/configs \
|
||||||
|
-v /usr/local/linker-docker/logs:/app/logs \
|
||||||
|
--device /dev/net/tun \
|
||||||
|
--restart=always \
|
||||||
|
--privileged=true \
|
||||||
|
snltty/linker-debian-x64
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 服务端
|
||||||
|
```
|
||||||
|
docker run -it -d --name linker \
|
||||||
|
-p 1802:1802/tcp -p 1802:1802/udp \
|
||||||
|
-v /usr/local/linker-docker/configs:/app/configs \
|
||||||
|
-v /usr/local/linker-docker/logs:/app/logs \
|
||||||
|
--restart=always \
|
||||||
|
--privileged=true \
|
||||||
|
snltty/linker-debian-x64
|
||||||
```
|
```
|
@@ -4,8 +4,8 @@ import { sendWebsocketMsg } from './request'
|
|||||||
export const getUpdater = () => {
|
export const getUpdater = () => {
|
||||||
return sendWebsocketMsg('updaterclient/get');
|
return sendWebsocketMsg('updaterclient/get');
|
||||||
}
|
}
|
||||||
export const confirm = (machineId, version) => {
|
export const confirm = (data) => {
|
||||||
return sendWebsocketMsg('updaterclient/confirm', { machineId, version });
|
return sendWebsocketMsg('updaterclient/confirm', data);
|
||||||
}
|
}
|
||||||
export const exit = (machineId) => {
|
export const exit = (machineId) => {
|
||||||
return sendWebsocketMsg('updaterclient/exit', machineId);
|
return sendWebsocketMsg('updaterclient/exit', machineId);
|
||||||
|
@@ -130,9 +130,13 @@ export default {
|
|||||||
if(updateInfo.Status == 2){
|
if(updateInfo.Status == 2){
|
||||||
|
|
||||||
const selectedValue = ref(updaterVersion.value);
|
const selectedValue = ref(updaterVersion.value);
|
||||||
const selectOptions = [h(ElOption, { label: `${updaterVersion.value} - 最新版本`, value: updaterVersion.value })];
|
const selectOptions = [
|
||||||
|
h(ElOption, { label: `仅[${row.MachineName}] -> ${updaterVersion.value}(最新版本)`, value: updaterVersion.value }),
|
||||||
|
h(ElOption, { label: `[所有] -> ${updaterVersion.value}(最新版本)`, value: `all->${updaterVersion.value}` }),
|
||||||
|
];
|
||||||
if(row.Version != serverVersion.value && updaterVersion.value != serverVersion.value){
|
if(row.Version != serverVersion.value && updaterVersion.value != serverVersion.value){
|
||||||
selectOptions.push(h(ElOption, { label: `${serverVersion.value} - 服务器版本`, value: serverVersion.value }));
|
selectOptions.push(h(ElOption, { label: `仅[${row.MachineName}] -> ${serverVersion.value}(服务器版本)`, value: serverVersion.value }));
|
||||||
|
selectOptions.push(h(ElOption, { label: `[所有] -> ${serverVersion.value}(服务器版本)`, value: `all->${serverVersion.value}` }));
|
||||||
}
|
}
|
||||||
|
|
||||||
ElMessageBox({
|
ElMessageBox({
|
||||||
@@ -148,7 +152,15 @@ export default {
|
|||||||
confirmButtonText: '确定',
|
confirmButtonText: '确定',
|
||||||
cancelButtonText: '取消'
|
cancelButtonText: '取消'
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
confirm(row.MachineId,selectedValue.value);
|
const data = {
|
||||||
|
MachineId:row.MachineId,
|
||||||
|
Version:selectedValue.value.replace('all->',''),
|
||||||
|
All:selectedValue.value.indexOf('all->') >= 0
|
||||||
|
};
|
||||||
|
if(data.All){
|
||||||
|
data.MachineId = '';
|
||||||
|
}
|
||||||
|
confirm(data);
|
||||||
}).catch(() => {});
|
}).catch(() => {});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -14,7 +14,6 @@ export const provideUpdater = () => {
|
|||||||
const _getUpdater = () => {
|
const _getUpdater = () => {
|
||||||
if (globalData.value.api.connected) {
|
if (globalData.value.api.connected) {
|
||||||
getUpdater().then((res) => {
|
getUpdater().then((res) => {
|
||||||
console.log(res);
|
|
||||||
const self = Object.values(res).filter(c => !!c.Version)[0];
|
const self = Object.values(res).filter(c => !!c.Version)[0];
|
||||||
if (self) {
|
if (self) {
|
||||||
updater.value.current.DateTime = self.DateTime;
|
updater.value.current.DateTime = self.DateTime;
|
||||||
|
@@ -1,5 +1,12 @@
|
|||||||
<template>
|
<template>
|
||||||
<Version ckey="relayServers"/>
|
<Version ckey="relayServers">
|
||||||
|
<div>
|
||||||
|
<el-radio-group v-model="state.byRelay" size="small" style="vertical-align:bottom" @change="handleByRelayChange">
|
||||||
|
<el-radio-button label="延迟优先" :value="true" />
|
||||||
|
<el-radio-button label="顺序优先" :value="false" />
|
||||||
|
</el-radio-group>
|
||||||
|
</div>
|
||||||
|
</Version>
|
||||||
<el-table :data="state.list" border size="small" width="100%" :height="`${state.height}px`" @cell-dblclick="handleCellClick">
|
<el-table :data="state.list" border size="small" width="100%" :height="`${state.height}px`" @cell-dblclick="handleCellClick">
|
||||||
<el-table-column prop="Name" label="名称" width="100">
|
<el-table-column prop="Name" label="名称" width="100">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
@@ -94,12 +101,14 @@ export default {
|
|||||||
const globalData = injectGlobalData();
|
const globalData = injectGlobalData();
|
||||||
const state = reactive({
|
const state = reactive({
|
||||||
list:globalData.value.config.Running.Relay.Servers.sort((a,b)=>a.Disabled - b.Disabled),
|
list:globalData.value.config.Running.Relay.Servers.sort((a,b)=>a.Disabled - b.Disabled),
|
||||||
|
byRelay:globalData.value.config.Running.Relay.ByRelay,
|
||||||
types:[],
|
types:[],
|
||||||
height: computed(()=>globalData.value.height-127)
|
height: computed(()=>globalData.value.height-127)
|
||||||
});
|
});
|
||||||
watch(()=>globalData.value.config.Running.Relay.Servers,()=>{
|
watch(()=>globalData.value.config.Running.Relay.Servers,()=>{
|
||||||
if(state.list.filter(c=>c['__editing']).length == 0){
|
if(state.list.filter(c=>c['__editing']).length == 0){
|
||||||
state.list = globalData.value.config.Running.Relay.Servers.sort((a,b)=>a.Disabled - b.Disabled);
|
state.list = globalData.value.config.Running.Relay.Servers.sort((a,b)=>a.Disabled - b.Disabled);
|
||||||
|
state.byRelay = globalData.value.config.Running.Relay.ByRelay;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -151,9 +160,15 @@ export default {
|
|||||||
handleSave(state.list);
|
handleSave(state.list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const handleByRelayChange = ()=>{
|
||||||
|
handleSave();
|
||||||
|
}
|
||||||
const handleSave = ()=>{
|
const handleSave = ()=>{
|
||||||
state.list = state.list.slice().sort((a,b)=>a.Disabled - b.Disabled);
|
state.list = state.list.slice().sort((a,b)=>a.Disabled - b.Disabled);
|
||||||
setRelayServers(state.list).then(()=>{
|
setRelayServers({
|
||||||
|
servers:state.list,
|
||||||
|
byRelay:state.byRelay
|
||||||
|
}).then(()=>{
|
||||||
ElMessage.success('已操作');
|
ElMessage.success('已操作');
|
||||||
}).catch(()=>{
|
}).catch(()=>{
|
||||||
ElMessage.success('操作失败');
|
ElMessage.success('操作失败');
|
||||||
@@ -164,7 +179,7 @@ export default {
|
|||||||
_getRelayTypes();
|
_getRelayTypes();
|
||||||
});
|
});
|
||||||
|
|
||||||
return {state,handleCellClick,handleEditBlur,handleDel,handleAdd,handleSort}
|
return {state,handleCellClick,handleEditBlur,handleDel,handleAdd,handleSort,handleByRelayChange}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
@@ -1,8 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="running-version-wrap">
|
<div class="running-version-wrap flex">
|
||||||
<span>配置版本 : {{version || 1}}</span>
|
<span>配置版本 : {{version || 1}}</span>
|
||||||
<el-button size="small" @click=handleEdit>手动修改版本</el-button>
|
<el-button size="small" @click=handleEdit>手动修改版本</el-button>
|
||||||
<span>高版本一端自动同步到低版本一端</span>
|
<span>高版本一端自动同步到低版本一端</span>
|
||||||
|
<span class="flex-1"></span>
|
||||||
|
<slot></slot>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
|
@@ -27,5 +27,6 @@ COPY . .
|
|||||||
RUN chmod +x ./linker \
|
RUN chmod +x ./linker \
|
||||||
&& chmod +x ./plugins/tuntap/tun2socks
|
&& chmod +x ./plugins/tuntap/tun2socks
|
||||||
|
|
||||||
|
ENV LINKER_IS_DOCKER="linker"
|
||||||
|
|
||||||
ENTRYPOINT ["./linker"]
|
ENTRYPOINT ["./linker"]
|
@@ -2,11 +2,10 @@ FROM alpine:latest
|
|||||||
|
|
||||||
ENV TZ=Asia/Shanghai DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
|
ENV TZ=Asia/Shanghai DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
|
||||||
RUN echo "https://mirrors.ustc.edu.cn/alpine/latest-stable/main/" > /etc/apk/repositories \
|
RUN echo "https://mirrors.ustc.edu.cn/alpine/latest-stable/main/" > /etc/apk/repositories \
|
||||||
&& apk add --no-cache libstdc++ libintl tzdata zeromq bash \
|
&& apk add --no-cache libstdc++ libintl tzdata zeromq bash net-tools iproute2 \
|
||||||
&& ln -snf /usr/share/zoneinfo/$clTZ /etc/localtime \
|
&& ln -snf /usr/share/zoneinfo/$clTZ /etc/localtime \
|
||||||
&& echo $TZ > /etc/timezone
|
&& echo $TZ > /etc/timezone
|
||||||
|
|
||||||
|
|
||||||
EXPOSE 1802/tcp
|
EXPOSE 1802/tcp
|
||||||
EXPOSE 1802/udp
|
EXPOSE 1802/udp
|
||||||
EXPOSE 1803/tcp
|
EXPOSE 1803/tcp
|
||||||
@@ -20,5 +19,7 @@ COPY . .
|
|||||||
RUN chmod +x ./linker \
|
RUN chmod +x ./linker \
|
||||||
&& chmod +x ./plugins/tuntap/tun2socks
|
&& chmod +x ./plugins/tuntap/tun2socks
|
||||||
|
|
||||||
|
RUN mkdir -p /dev/net && mknod /dev/net/tun c 10 200 && chmod 600 /dev/net/tun
|
||||||
|
|
||||||
|
|
||||||
ENTRYPOINT ["./linker"]
|
ENTRYPOINT ["./linker"]
|
@@ -6,6 +6,7 @@ using MemoryPack;
|
|||||||
using linker.plugins.client;
|
using linker.plugins.client;
|
||||||
using linker.plugins.capi;
|
using linker.plugins.capi;
|
||||||
using linker.plugins.messenger;
|
using linker.plugins.messenger;
|
||||||
|
using linker.client.config;
|
||||||
|
|
||||||
namespace linker.plugins.relay
|
namespace linker.plugins.relay
|
||||||
{
|
{
|
||||||
@@ -42,7 +43,7 @@ namespace linker.plugins.relay
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public bool SetServers(ApiControllerParamsInfo param)
|
public bool SetServers(ApiControllerParamsInfo param)
|
||||||
{
|
{
|
||||||
RelayServerInfo[] info = param.Content.DeJson<RelayServerInfo[]>();
|
RelayRunningSyncInfo info = param.Content.DeJson<RelayRunningSyncInfo>();
|
||||||
relayTransfer.OnServers(info);
|
relayTransfer.OnServers(info);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@@ -84,9 +84,10 @@ namespace linker.plugins.relay
|
|||||||
/// 收到中继协议列表
|
/// 收到中继协议列表
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="servers"></param>
|
/// <param name="servers"></param>
|
||||||
public void OnServers(RelayServerInfo[] servers)
|
public void OnServers(RelayRunningSyncInfo info)
|
||||||
{
|
{
|
||||||
running.Data.Relay.Servers = servers;
|
running.Data.Relay.Servers = info.Servers;
|
||||||
|
running.Data.Relay.ByRelay = info.ByRelay;
|
||||||
running.Data.Update();
|
running.Data.Update();
|
||||||
runningConfigTransfer.IncrementVersion(configKey);
|
runningConfigTransfer.IncrementVersion(configKey);
|
||||||
SyncServers();
|
SyncServers();
|
||||||
@@ -94,13 +95,19 @@ namespace linker.plugins.relay
|
|||||||
}
|
}
|
||||||
private void SetServers(Memory<byte> data)
|
private void SetServers(Memory<byte> data)
|
||||||
{
|
{
|
||||||
running.Data.Relay.Servers = MemoryPackSerializer.Deserialize<RelayServerInfo[]>(data.Span);
|
RelayRunningSyncInfo relayRunningSyncInfo = MemoryPackSerializer.Deserialize<RelayRunningSyncInfo>(data.Span);
|
||||||
|
running.Data.Relay.Servers = relayRunningSyncInfo.Servers;
|
||||||
|
running.Data.Relay.ByRelay = relayRunningSyncInfo.ByRelay;
|
||||||
running.Data.Update();
|
running.Data.Update();
|
||||||
_ = TaskRelay();
|
_ = TaskRelay();
|
||||||
}
|
}
|
||||||
private void SyncServers()
|
private void SyncServers()
|
||||||
{
|
{
|
||||||
runningConfigTransfer.Sync(configKey, MemoryPackSerializer.Serialize(running.Data.Relay.Servers));
|
runningConfigTransfer.Sync(configKey, MemoryPackSerializer.Serialize(new RelayRunningSyncInfo
|
||||||
|
{
|
||||||
|
Servers = running.Data.Relay.Servers,
|
||||||
|
ByRelay = running.Data.Relay.ByRelay,
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -145,10 +152,13 @@ namespace linker.plugins.relay
|
|||||||
}
|
}
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
IEnumerable<ITransport> _transports = transports.OrderBy(c => c.Type);
|
var servers = running.Data.Relay.Servers
|
||||||
foreach (RelayServerInfo item in running.Data.Relay.Servers.Where(c => c.Disabled == false && string.IsNullOrWhiteSpace(c.Host) == false))
|
.Where(c => c.Disabled == false)
|
||||||
|
.Where(c => string.IsNullOrWhiteSpace(c.Host) == false)
|
||||||
|
.Where(c => c.Delay >= 0).OrderBy(c => c.Delay);
|
||||||
|
foreach (RelayServerInfo item in servers)
|
||||||
{
|
{
|
||||||
ITransport transport = _transports.FirstOrDefault(c => c.Type == item.RelayType);
|
ITransport transport = transports.FirstOrDefault(c => c.Type == item.RelayType);
|
||||||
if (transport == null)
|
if (transport == null)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
@@ -218,6 +228,10 @@ namespace linker.plugins.relay
|
|||||||
LoggerHelper.Instance.Debug($"relay from {relayInfo.RemoteMachineId}->{relayInfo.RemoteMachineName} success,{relayInfo.ToJson()}");
|
LoggerHelper.Instance.Debug($"relay from {relayInfo.RemoteMachineId}->{relayInfo.RemoteMachineName} success,{relayInfo.ToJson()}");
|
||||||
ConnectedCallback(relayInfo, connection);
|
ConnectedCallback(relayInfo, connection);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LoggerHelper.Instance.Error($"relay from {relayInfo.RemoteMachineId}->{relayInfo.RemoteMachineName} error,{relayInfo.ToJson()}");
|
||||||
|
}
|
||||||
}).ConfigureAwait(false);
|
}).ConfigureAwait(false);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@@ -21,6 +21,19 @@ namespace linker.client.config
|
|||||||
/// 中继服务器列表
|
/// 中继服务器列表
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public RelayServerInfo[] Servers { get; set; } = Array.Empty<RelayServerInfo>();
|
public RelayServerInfo[] Servers { get; set; } = Array.Empty<RelayServerInfo>();
|
||||||
|
|
||||||
|
public bool ByRelay { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[MemoryPackable]
|
||||||
|
public sealed partial class RelayRunningSyncInfo
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 中继服务器列表
|
||||||
|
/// </summary>
|
||||||
|
public RelayServerInfo[] Servers { get; set; } = Array.Empty<RelayServerInfo>();
|
||||||
|
|
||||||
|
public bool ByRelay { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -71,7 +71,6 @@ namespace linker.plugins.relay.transport
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
connection.Cancel();
|
connection.Cancel();
|
||||||
ClearSocket(socket);
|
|
||||||
|
|
||||||
//通知对方,确认中继
|
//通知对方,确认中继
|
||||||
resp = await messengerSender.SendReply(new MessageRequestWrap
|
resp = await messengerSender.SendReply(new MessageRequestWrap
|
||||||
@@ -85,6 +84,7 @@ namespace linker.plugins.relay.transport
|
|||||||
connection.Disponse(7);
|
connection.Disponse(7);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
ClearSocket(socket);
|
||||||
|
|
||||||
SslStream sslStream = null;
|
SslStream sslStream = null;
|
||||||
if (relayInfo.SSL)
|
if (relayInfo.SSL)
|
||||||
@@ -133,7 +133,6 @@ namespace linker.plugins.relay.transport
|
|||||||
Socket socket = new Socket(relayInfo.Server.AddressFamily, SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
|
Socket socket = new Socket(relayInfo.Server.AddressFamily, SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
|
||||||
socket.KeepAlive();
|
socket.KeepAlive();
|
||||||
await socket.ConnectAsync(relayInfo.Server).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false);
|
await socket.ConnectAsync(relayInfo.Server).WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false);
|
||||||
|
|
||||||
IConnection connection = await messengerResolver.BeginReceiveClient(socket);
|
IConnection connection = await messengerResolver.BeginReceiveClient(socket);
|
||||||
await messengerSender.SendOnly(new MessageRequestWrap
|
await messengerSender.SendOnly(new MessageRequestWrap
|
||||||
{
|
{
|
||||||
@@ -141,10 +140,9 @@ namespace linker.plugins.relay.transport
|
|||||||
MessengerId = (ushort)RelayMessengerIds.RelayConfirm,
|
MessengerId = (ushort)RelayMessengerIds.RelayConfirm,
|
||||||
Payload = MemoryPackSerializer.Serialize(relayInfo)
|
Payload = MemoryPackSerializer.Serialize(relayInfo)
|
||||||
}).ConfigureAwait(false);
|
}).ConfigureAwait(false);
|
||||||
|
|
||||||
connection.Cancel();
|
connection.Cancel();
|
||||||
|
await Task.Delay(30).ConfigureAwait(false);
|
||||||
ClearSocket(socket);
|
ClearSocket(socket);
|
||||||
|
|
||||||
_ = WaitSSL(connection, socket, relayInfo).ContinueWith((result) =>
|
_ = WaitSSL(connection, socket, relayInfo).ContinueWith((result) =>
|
||||||
{
|
{
|
||||||
callback(result.Result);
|
callback(result.Result);
|
||||||
@@ -163,6 +161,8 @@ namespace linker.plugins.relay.transport
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async Task<TunnelConnectionTcp> WaitSSL(IConnection connection, Socket socket, RelayInfo relayInfo)
|
private async Task<TunnelConnectionTcp> WaitSSL(IConnection connection, Socket socket, RelayInfo relayInfo)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
SslStream sslStream = null;
|
SslStream sslStream = null;
|
||||||
if (relayInfo.SSL)
|
if (relayInfo.SSL)
|
||||||
@@ -173,6 +173,7 @@ namespace linker.plugins.relay.transport
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
sslStream = new SslStream(connection.SourceNetworkStream, false);
|
sslStream = new SslStream(connection.SourceNetworkStream, false);
|
||||||
|
Console.WriteLine(socket.Available);
|
||||||
await sslStream.AuthenticateAsServerAsync(certificate, false, SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13, false).ConfigureAwait(false);
|
await sslStream.AuthenticateAsServerAsync(certificate, false, SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13, false).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
return new TunnelConnectionTcp
|
return new TunnelConnectionTcp
|
||||||
@@ -192,6 +193,16 @@ namespace linker.plugins.relay.transport
|
|||||||
BufferSize = 3,
|
BufferSize = 3,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||||
|
{
|
||||||
|
LoggerHelper.Instance.Error(ex);
|
||||||
|
}
|
||||||
|
connection?.Disponse();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
private void ClearSocket(Socket socket)
|
private void ClearSocket(Socket socket)
|
||||||
{
|
{
|
||||||
byte[] buffer = ArrayPool<byte>.Shared.Rent(1 * 1024);
|
byte[] buffer = ArrayPool<byte>.Shared.Rent(1 * 1024);
|
||||||
|
@@ -90,11 +90,7 @@ namespace linker.plugins.updater
|
|||||||
{
|
{
|
||||||
UpdaterConfirmInfo confirm = param.Content.DeJson<UpdaterConfirmInfo>();
|
UpdaterConfirmInfo confirm = param.Content.DeJson<UpdaterConfirmInfo>();
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(confirm.MachineId) || confirm.MachineId == config.Data.Client.Id)
|
if (confirm.All)
|
||||||
{
|
|
||||||
updaterTransfer.Confirm(confirm.Version);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
await messengerSender.SendOnly(new MessageRequestWrap
|
await messengerSender.SendOnly(new MessageRequestWrap
|
||||||
{
|
{
|
||||||
@@ -102,6 +98,11 @@ namespace linker.plugins.updater
|
|||||||
MessengerId = (ushort)UpdaterMessengerIds.ConfirmForward,
|
MessengerId = (ushort)UpdaterMessengerIds.ConfirmForward,
|
||||||
Payload = MemoryPackSerializer.Serialize(confirm)
|
Payload = MemoryPackSerializer.Serialize(confirm)
|
||||||
});
|
});
|
||||||
|
updaterTransfer.Confirm(confirm.Version);
|
||||||
|
}
|
||||||
|
else if (confirm.MachineId == config.Data.Client.Id)
|
||||||
|
{
|
||||||
|
updaterTransfer.Confirm(confirm.Version);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public async Task Exit(ApiControllerParamsInfo param)
|
public async Task Exit(ApiControllerParamsInfo param)
|
||||||
|
@@ -21,6 +21,7 @@ namespace linker.plugins.updater.config
|
|||||||
{
|
{
|
||||||
public string MachineId { get; set; }
|
public string MachineId { get; set; }
|
||||||
public string Version { get; set; }
|
public string Version { get; set; }
|
||||||
|
public bool All { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
[MemoryPackable]
|
[MemoryPackable]
|
||||||
|
@@ -108,7 +108,26 @@ namespace linker.plugins.updater.messenger
|
|||||||
public async Task ConfirmForward(IConnection connection)
|
public async Task ConfirmForward(IConnection connection)
|
||||||
{
|
{
|
||||||
UpdaterConfirmInfo confirm = MemoryPackSerializer.Deserialize<UpdaterConfirmInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
UpdaterConfirmInfo confirm = MemoryPackSerializer.Deserialize<UpdaterConfirmInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
||||||
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) && signCaching.TryGet(confirm.MachineId, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId)
|
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) == false)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (confirm.All)
|
||||||
|
{
|
||||||
|
var tasks = signCaching.Get(cache.GroupId).Where(c => c.MachineId != connection.Id).Select(c =>
|
||||||
|
{
|
||||||
|
return messengerSender.SendOnly(new MessageRequestWrap
|
||||||
|
{
|
||||||
|
Connection = c.Connection,
|
||||||
|
MessengerId = (ushort)UpdaterMessengerIds.Confirm,
|
||||||
|
Payload = connection.ReceiveRequestWrap.Payload
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
await Task.WhenAll(tasks);
|
||||||
|
}
|
||||||
|
else if (signCaching.TryGet(confirm.MachineId, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId)
|
||||||
{
|
{
|
||||||
await messengerSender.SendOnly(new MessageRequestWrap
|
await messengerSender.SendOnly(new MessageRequestWrap
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user