mirror of
https://github.com/snltty/linker.git
synced 2025-10-27 19:10:27 +08:00
整理代码
This commit is contained in:
@@ -7,7 +7,6 @@ using System.Collections.Concurrent;
|
||||
using System.Net.Sockets;
|
||||
using System.Net;
|
||||
using linker.tunnel.wanport;
|
||||
using System.Transactions;
|
||||
|
||||
namespace linker.tunnel
|
||||
{
|
||||
@@ -43,6 +42,7 @@ namespace linker.tunnel
|
||||
item.OnSendConnectFail = tunnelAdapter.SendConnectFail;
|
||||
item.OnSendConnectSuccess = tunnelAdapter.SendConnectSuccess;
|
||||
item.OnConnected = _OnConnected;
|
||||
item.SetAdapter(tunnelAdapter);
|
||||
}
|
||||
|
||||
var transportItems = tunnelAdapter.GetTunnelTransports();
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using linker.tunnel.connection;
|
||||
using linker.tunnel.adapter;
|
||||
using linker.tunnel.connection;
|
||||
using linker.tunnel.wanport;
|
||||
using System.Net;
|
||||
|
||||
@@ -61,6 +62,8 @@ namespace linker.tunnel.transport
|
||||
/// </summary>
|
||||
public Action<ITunnelConnection> OnConnected { get; set; }
|
||||
|
||||
public void SetAdapter(ITunnelAdapter tunnelAdapter);
|
||||
|
||||
/// <summary>
|
||||
/// 连接对方
|
||||
/// </summary>
|
||||
|
||||
@@ -46,27 +46,15 @@ namespace linker.tunnel.transport
|
||||
private byte[] endBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.end");
|
||||
private IPEndPoint quicListenEP = null;
|
||||
|
||||
private readonly ITunnelAdapter tunnelAdapter;
|
||||
public TransportMsQuic(ITunnelAdapter tunnelAdapter)
|
||||
private ITunnelAdapter tunnelAdapter;
|
||||
public TransportMsQuic()
|
||||
{
|
||||
_ = QuicListen();
|
||||
}
|
||||
|
||||
public void SetAdapter(ITunnelAdapter tunnelAdapter)
|
||||
{
|
||||
this.tunnelAdapter = tunnelAdapter;
|
||||
_ = QuicListen();
|
||||
|
||||
/*
|
||||
* QUIC监听 QuicStart
|
||||
*
|
||||
* 大致流程
|
||||
*
|
||||
* 1、ConnectAsync 告诉B,我要连接你
|
||||
*
|
||||
* 2、B 收到消息调用 OnBegin,然后绑定一个 socketB 等待 A 的消息,
|
||||
* 3、B 给 A 发送一些消息 ,在 BindAndTTL,
|
||||
*
|
||||
* 4、A 绑定一个监听 socketA,然后发消息给 B , 如果 B 收到消息,就会回一条消息,这个监听就会收到消息,在 ConnectForward
|
||||
* 5、A 再绑定一个 socketA1,用以接收quic的连接,
|
||||
*
|
||||
* 6、socketA1 收到消息,则通过 socketA 发送给B, socketB 收到消息,创建一个udp,发送给quic监听,完成一个线路
|
||||
*/
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -54,8 +54,11 @@ namespace linker.tunnel.transport
|
||||
/// </summary>
|
||||
public Action<ITunnelConnection> OnConnected { get; set; } = (state) => { };
|
||||
|
||||
private readonly ITunnelAdapter tunnelAdapter;
|
||||
public TunnelTransportTcpNutssb(ITunnelAdapter tunnelAdapter)
|
||||
private ITunnelAdapter tunnelAdapter;
|
||||
public TunnelTransportTcpNutssb()
|
||||
{
|
||||
}
|
||||
public void SetAdapter(ITunnelAdapter tunnelAdapter)
|
||||
{
|
||||
this.tunnelAdapter = tunnelAdapter;
|
||||
}
|
||||
|
||||
@@ -56,8 +56,11 @@ namespace linker.tunnel.transport
|
||||
private byte[] endBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.end");
|
||||
|
||||
|
||||
private readonly ITunnelAdapter tunnelAdapter;
|
||||
public TransportTcpP2PNAT(ITunnelAdapter tunnelAdapter)
|
||||
private ITunnelAdapter tunnelAdapter;
|
||||
public TransportTcpP2PNAT()
|
||||
{
|
||||
}
|
||||
public void SetAdapter(ITunnelAdapter tunnelAdapter)
|
||||
{
|
||||
this.tunnelAdapter = tunnelAdapter;
|
||||
}
|
||||
|
||||
@@ -44,12 +44,16 @@ namespace linker.tunnel.transport
|
||||
|
||||
|
||||
private readonly ConcurrentDictionary<string, TaskCompletionSource<Socket>> distDic = new ConcurrentDictionary<string, TaskCompletionSource<Socket>>();
|
||||
private readonly ITunnelAdapter tunnelAdapter;
|
||||
public TransportTcpPortMap(ITunnelAdapter tunnelAdapter)
|
||||
private ITunnelAdapter tunnelAdapter;
|
||||
public TransportTcpPortMap()
|
||||
{
|
||||
}
|
||||
public void SetAdapter(ITunnelAdapter tunnelAdapter)
|
||||
{
|
||||
this.tunnelAdapter = tunnelAdapter;
|
||||
}
|
||||
|
||||
|
||||
Socket socket;
|
||||
public async Task Listen(int localPort)
|
||||
{
|
||||
|
||||
@@ -6,6 +6,7 @@ using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Text;
|
||||
using linker.tunnel.wanport;
|
||||
using linker.tunnel.adapter;
|
||||
|
||||
namespace linker.tunnel.transport
|
||||
{
|
||||
@@ -52,6 +53,9 @@ namespace linker.tunnel.transport
|
||||
public TransportUdp()
|
||||
{
|
||||
}
|
||||
public void SetAdapter(ITunnelAdapter tunnelAdapter)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 开始连接对方
|
||||
|
||||
@@ -46,11 +46,14 @@ namespace linker.tunnel.transport
|
||||
|
||||
private readonly ConcurrentDictionary<string, TaskCompletionSource<State>> distDic = new ConcurrentDictionary<string, TaskCompletionSource<State>>();
|
||||
private readonly ConcurrentDictionary<IPEndPoint, ConnectionCacheInfo> connectionsDic = new ConcurrentDictionary<IPEndPoint, ConnectionCacheInfo>(new IPEndPointComparer());
|
||||
private readonly ITunnelAdapter tunnelAdapter;
|
||||
public TransportUdpPortMap(ITunnelAdapter tunnelAdapter)
|
||||
private ITunnelAdapter tunnelAdapter;
|
||||
public TransportUdpPortMap()
|
||||
{
|
||||
CleanTask();
|
||||
}
|
||||
public void SetAdapter(ITunnelAdapter tunnelAdapter)
|
||||
{
|
||||
this.tunnelAdapter = tunnelAdapter;
|
||||
CleanTask();
|
||||
}
|
||||
|
||||
Socket socket;
|
||||
|
||||
@@ -13,7 +13,8 @@
|
||||
@blur="handleEditBlur(scope.row, 'ListenPort')"></el-input>
|
||||
</template>
|
||||
<template v-else>
|
||||
{{ scope.row.ListenPort }}
|
||||
<strong v-if="scope.row.Error" :title="scope.row.Error" class="red">{{ scope.row.ListenPort }}</strong>
|
||||
<span v-else>{{ scope.row.ListenPort }}</span>
|
||||
</template>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -24,7 +25,8 @@
|
||||
@blur="handleEditBlur(scope.row, 'ConnectAddr')"></el-input>
|
||||
</template>
|
||||
<template v-else>
|
||||
{{ scope.row.ConnectAddr }}
|
||||
<strong v-if="scope.row.Error" :title="scope.row.Error" class="red">{{ scope.row.ConnectAddr }}</strong>
|
||||
<span v-else>{{ scope.row.ConnectAddr }}</span>
|
||||
</template>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -35,7 +37,8 @@
|
||||
@blur="handleEditBlur(scope.row, 'ConnectPort')"></el-input>
|
||||
</template>
|
||||
<template v-else>
|
||||
{{ scope.row.ConnectPort }}
|
||||
<strong v-if="scope.row.Error" :title="scope.row.Error" class="red">{{ scope.row.ConnectPort }}</strong>
|
||||
<span v-else>{{ scope.row.ConnectPort }}</span>
|
||||
</template>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
@@ -7,6 +7,12 @@ namespace linker.plugins.action
|
||||
{
|
||||
public const string ACTION_ARG_KEY = "ACTION_ARGS";
|
||||
|
||||
|
||||
public string SignInActionUrl => config.Data.Action.SignInActionUrl;
|
||||
public string RelayActionUrl => config.Data.Action.SignInActionUrl;
|
||||
public string SForwardActionUrl => config.Data.Action.SignInActionUrl;
|
||||
|
||||
|
||||
private readonly FileConfig config;
|
||||
public ActionTransfer(FileConfig config)
|
||||
{
|
||||
|
||||
@@ -122,7 +122,7 @@ namespace linker.plugins.action
|
||||
|
||||
public async Task<string> Validate(SignInfo signInfo, SignCacheInfo cache)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(fileConfig.Data.Action.SignInActionUrl) == false)
|
||||
if (string.IsNullOrWhiteSpace(actionTransfer.SignInActionUrl) == false)
|
||||
{
|
||||
if (actionTransfer.TryGetActionArg(signInfo.Args, out string str, out string machineKey) == false)
|
||||
{
|
||||
@@ -140,7 +140,7 @@ namespace linker.plugins.action
|
||||
IPAddress = signInfo.Connection.Address.Address
|
||||
}
|
||||
};
|
||||
return await actionTransfer.ExcuteActions(Replace(replace, str), fileConfig.Data.Action.SignInActionUrl);
|
||||
return await actionTransfer.ExcuteActions(Replace(replace, str), actionTransfer.SignInActionUrl);
|
||||
}
|
||||
|
||||
return string.Empty;
|
||||
@@ -160,7 +160,7 @@ namespace linker.plugins.action
|
||||
|
||||
public async Task<string> Validate(linker.plugins.relay.client.transport.RelayInfo relayInfo, SignCacheInfo fromMachine, SignCacheInfo toMachine)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(fileConfig.Data.Action.RelayActionUrl) == false)
|
||||
if (string.IsNullOrWhiteSpace(actionTransfer.RelayActionUrl) == false)
|
||||
{
|
||||
if (actionTransfer.TryGetActionArg(fromMachine.Args, out string str, out string machineKey) == false)
|
||||
{
|
||||
@@ -191,7 +191,7 @@ namespace linker.plugins.action
|
||||
IPAddress = fromMachine.Connection.Address.Address,
|
||||
}
|
||||
};
|
||||
return await actionTransfer.ExcuteActions(Replace(replace, str), fileConfig.Data.Action.RelayActionUrl);
|
||||
return await actionTransfer.ExcuteActions(Replace(replace, str), actionTransfer.RelayActionUrl);
|
||||
}
|
||||
return string.Empty;
|
||||
}
|
||||
@@ -210,7 +210,7 @@ namespace linker.plugins.action
|
||||
|
||||
public async Task<string> Validate(SignCacheInfo cache, SForwardAddInfo sForwardAddInfo)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(fileConfig.Data.Action.SForwardActionUrl) == false)
|
||||
if (string.IsNullOrWhiteSpace(actionTransfer.SForwardActionUrl) == false)
|
||||
{
|
||||
if (actionTransfer.TryGetActionArg(cache.Args, out string str, out string machineKey) == false)
|
||||
{
|
||||
@@ -233,7 +233,7 @@ namespace linker.plugins.action
|
||||
IPAddress = cache.Connection.Address.Address
|
||||
}
|
||||
};
|
||||
return await actionTransfer.ExcuteActions(Replace(replace, str), fileConfig.Data.Action.SForwardActionUrl);
|
||||
return await actionTransfer.ExcuteActions(Replace(replace, str), actionTransfer.SForwardActionUrl);
|
||||
}
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
@@ -4,13 +4,13 @@ using MemoryPack;
|
||||
|
||||
namespace linker.plugins.client
|
||||
{
|
||||
public sealed class ConfigSyncSignInSecretKey : IConfigSync
|
||||
public sealed class ClientConfigSyncSecretKey : IConfigSync
|
||||
{
|
||||
public string Name => "SignInSecretKey";
|
||||
|
||||
private readonly FileConfig fileConfig;
|
||||
private readonly ClientConfigTransfer clientConfigTransfer;
|
||||
public ConfigSyncSignInSecretKey(FileConfig fileConfig, ClientConfigTransfer clientConfigTransfer)
|
||||
public ClientConfigSyncSecretKey(FileConfig fileConfig, ClientConfigTransfer clientConfigTransfer)
|
||||
{
|
||||
this.fileConfig = fileConfig;
|
||||
this.clientConfigTransfer = clientConfigTransfer;
|
||||
@@ -22,17 +22,16 @@ namespace linker.plugins.client
|
||||
|
||||
public void SetData(Memory<byte> data)
|
||||
{
|
||||
clientConfigTransfer.Server.SecretKey = MemoryPackSerializer.Deserialize<string>(data.Span);
|
||||
fileConfig.Data.Update();
|
||||
clientConfigTransfer.SetSecretKey(MemoryPackSerializer.Deserialize<string>(data.Span));
|
||||
}
|
||||
}
|
||||
public sealed class ConfigSyncGroupSecretKey : IConfigSync
|
||||
public sealed class ClientConfigSyncGroupSecretKey : IConfigSync
|
||||
{
|
||||
public string Name => "GroupSecretKey";
|
||||
|
||||
private readonly FileConfig fileConfig;
|
||||
private readonly ClientConfigTransfer clientConfigTransfer;
|
||||
public ConfigSyncGroupSecretKey(FileConfig fileConfig, ClientConfigTransfer clientConfigTransfer)
|
||||
public ClientConfigSyncGroupSecretKey(FileConfig fileConfig, ClientConfigTransfer clientConfigTransfer)
|
||||
{
|
||||
this.fileConfig = fileConfig;
|
||||
this.clientConfigTransfer = clientConfigTransfer;
|
||||
@@ -38,6 +38,12 @@ namespace linker.plugins.client
|
||||
config.Data.Update();
|
||||
}
|
||||
|
||||
public void SetSecretKey(string secretKey)
|
||||
{
|
||||
Server.SecretKey = secretKey;
|
||||
config.Data.Update();
|
||||
}
|
||||
|
||||
public void SetId(string id)
|
||||
{
|
||||
config.Data.Client.Id = id;
|
||||
|
||||
@@ -25,8 +25,8 @@ namespace linker.plugins.client
|
||||
serviceCollection.AddSingleton<SignInArgsSecretKeyClient>();
|
||||
serviceCollection.AddSingleton<SignInArgsGroupPasswordClient>();
|
||||
|
||||
serviceCollection.AddSingleton<ConfigSyncSignInSecretKey>();
|
||||
serviceCollection.AddSingleton<ConfigSyncGroupSecretKey>();
|
||||
serviceCollection.AddSingleton<ClientConfigSyncSecretKey>();
|
||||
serviceCollection.AddSingleton<ClientConfigSyncGroupSecretKey>();
|
||||
|
||||
serviceCollection.AddSingleton<ClientConfigTransfer>();
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using linker.plugins.signIn.args;
|
||||
using linker.plugins.signin.messenger;
|
||||
using linker.config;
|
||||
using linker.plugins.signIn;
|
||||
|
||||
namespace linker.plugins.client
|
||||
{
|
||||
@@ -36,9 +37,11 @@ namespace linker.plugins.client
|
||||
public sealed class SignInArgsSecretKeyServer : ISignInArgs
|
||||
{
|
||||
private readonly FileConfig fileConfig;
|
||||
public SignInArgsSecretKeyServer(FileConfig fileConfig)
|
||||
private readonly SignInConfigTransfer signInConfigTransfer;
|
||||
public SignInArgsSecretKeyServer(FileConfig fileConfig, SignInConfigTransfer signInConfigTransfer)
|
||||
{
|
||||
this.fileConfig = fileConfig;
|
||||
this.signInConfigTransfer = signInConfigTransfer;
|
||||
}
|
||||
public async Task<string> Invoke(string host, Dictionary<string, string> args)
|
||||
{
|
||||
@@ -54,9 +57,9 @@ namespace linker.plugins.client
|
||||
/// <returns></returns>
|
||||
public async Task<string> Validate(SignInfo signInfo, SignCacheInfo cache)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(fileConfig.Data.Server.SignIn.SecretKey) == false)
|
||||
if (string.IsNullOrWhiteSpace(signInConfigTransfer.SecretKey) == false)
|
||||
{
|
||||
if (signInfo.Args.TryGetValue("signin-secretkey", out string secretkey) == false || secretkey != fileConfig.Data.Server.SignIn.SecretKey)
|
||||
if (signInfo.Args.TryGetValue("signin-secretkey", out string secretkey) == false || secretkey != signInConfigTransfer.SecretKey)
|
||||
{
|
||||
return $"server secretkey validate fail";
|
||||
}
|
||||
|
||||
@@ -9,6 +9,8 @@ using linker.plugins.flow.messenger;
|
||||
using linker.libs.extends;
|
||||
using linker.plugins.sforward.proxy;
|
||||
using linker.plugins.relay;
|
||||
using linker.plugins.relay.client;
|
||||
using linker.plugins.sforward;
|
||||
|
||||
namespace linker.plugins.flow
|
||||
{
|
||||
@@ -18,13 +20,17 @@ namespace linker.plugins.flow
|
||||
private readonly ClientSignInState clientSignInState;
|
||||
private readonly FileConfig config;
|
||||
private readonly RunningConfig runningConfig;
|
||||
private readonly RelayClientConfigTransfer relayClientConfigTransfer;
|
||||
private readonly SForwardTransfer sForwardTransfer;
|
||||
|
||||
public FlowClientApiController(IMessengerSender messengerSender, ClientSignInState clientSignInState, FileConfig config, RunningConfig runningConfig)
|
||||
public FlowClientApiController(IMessengerSender messengerSender, ClientSignInState clientSignInState, FileConfig config, RunningConfig runningConfig, RelayClientConfigTransfer relayClientConfigTransfer, SForwardTransfer sForwardTransfer)
|
||||
{
|
||||
this.messengerSender = messengerSender;
|
||||
this.clientSignInState = clientSignInState;
|
||||
this.config = config;
|
||||
this.runningConfig = runningConfig;
|
||||
this.relayClientConfigTransfer = relayClientConfigTransfer;
|
||||
this.sForwardTransfer = sForwardTransfer;
|
||||
}
|
||||
|
||||
public async Task<FlowInfo> GetFlows(ApiControllerParamsInfo param)
|
||||
@@ -58,7 +64,7 @@ namespace linker.plugins.flow
|
||||
public async Task<SForwardFlowResponseInfo> GetSForwardFlows(ApiControllerParamsInfo param)
|
||||
{
|
||||
SForwardFlowRequestInfo info = param.Content.DeJson<SForwardFlowRequestInfo>();
|
||||
info.SecretKey = config.Data.Client.SForward.SecretKey;
|
||||
info.SecretKey = sForwardTransfer.SecretKey;
|
||||
|
||||
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
|
||||
{
|
||||
@@ -77,7 +83,7 @@ namespace linker.plugins.flow
|
||||
public async Task<RelayFlowResponseInfo> GetRelayFlows(ApiControllerParamsInfo param)
|
||||
{
|
||||
RelayFlowRequestInfo info = param.Content.DeJson<RelayFlowRequestInfo>();
|
||||
info.SecretKey = config.Data.Client.Relay.Server.SecretKey;
|
||||
info.SecretKey = relayClientConfigTransfer.Server.SecretKey;
|
||||
|
||||
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
|
||||
{
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
using linker.config;
|
||||
using linker.plugins.messenger;
|
||||
using linker.plugins.relay.server;
|
||||
using linker.plugins.sforward;
|
||||
using linker.plugins.signin.messenger;
|
||||
using MemoryPack;
|
||||
|
||||
@@ -13,10 +15,12 @@ namespace linker.plugins.flow.messenger
|
||||
private readonly RelayFlow relayFlow;
|
||||
private readonly SignCaching signCaching;
|
||||
private readonly FileConfig fileConfig;
|
||||
private readonly RelayServerConfigTransfer relayServerConfigTransfer;
|
||||
private readonly SForwardServerConfigTransfer sForwardServerConfigTransfer;
|
||||
|
||||
private DateTime start = DateTime.Now;
|
||||
|
||||
public FlowMessenger(FlowTransfer flowTransfer, MessengerFlow messengerFlow, SForwardFlow sForwardFlow, RelayFlow relayFlow, SignCaching signCaching, FileConfig fileConfig)
|
||||
public FlowMessenger(FlowTransfer flowTransfer, MessengerFlow messengerFlow, SForwardFlow sForwardFlow, RelayFlow relayFlow, SignCaching signCaching, FileConfig fileConfig, RelayServerConfigTransfer relayServerConfigTransfer, SForwardServerConfigTransfer sForwardServerConfigTransfer)
|
||||
{
|
||||
this.flowTransfer = flowTransfer;
|
||||
this.messengerFlow = messengerFlow;
|
||||
@@ -24,6 +28,8 @@ namespace linker.plugins.flow.messenger
|
||||
this.relayFlow = relayFlow;
|
||||
this.signCaching = signCaching;
|
||||
this.fileConfig = fileConfig;
|
||||
this.relayServerConfigTransfer = relayServerConfigTransfer;
|
||||
this.sForwardServerConfigTransfer = sForwardServerConfigTransfer;
|
||||
}
|
||||
|
||||
[MessengerId((ushort)FlowMessengerIds.List)]
|
||||
@@ -55,7 +61,7 @@ namespace linker.plugins.flow.messenger
|
||||
sForwardFlow.Update();
|
||||
SForwardFlowRequestInfo info = MemoryPackSerializer.Deserialize<SForwardFlowRequestInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
||||
|
||||
if (fileConfig.Data.Server.SForward.SecretKey == info.SecretKey)
|
||||
if (sForwardServerConfigTransfer.SecretKey == info.SecretKey)
|
||||
{
|
||||
info.GroupId = string.Empty;
|
||||
}
|
||||
@@ -79,7 +85,7 @@ namespace linker.plugins.flow.messenger
|
||||
{
|
||||
relayFlow.Update();
|
||||
RelayFlowRequestInfo info = MemoryPackSerializer.Deserialize<RelayFlowRequestInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
||||
if (fileConfig.Data.Server.Relay.SecretKey == info.SecretKey)
|
||||
if (relayServerConfigTransfer.SecretKey == info.SecretKey)
|
||||
{
|
||||
info.GroupId = string.Empty;
|
||||
}
|
||||
|
||||
@@ -20,8 +20,8 @@ namespace linker.plugins.forward.proxy
|
||||
|
||||
protected override string TransactionId => "forward";
|
||||
|
||||
public ForwardProxy(ClientConfigTransfer clientConfigTransfer, TunnelTransfer tunnelTransfer, RelayTransfer relayTransfer, PcpTransfer pcpTransfer, ClientSignInTransfer clientSignInTransfer, ClientSignInState clientSignInState, RunningConfig runningConfig)
|
||||
: base(tunnelTransfer, relayTransfer, pcpTransfer, clientSignInTransfer, clientSignInState, runningConfig, clientConfigTransfer)
|
||||
public ForwardProxy(ClientConfigTransfer clientConfigTransfer, TunnelTransfer tunnelTransfer, RelayTransfer relayTransfer, PcpTransfer pcpTransfer, ClientSignInTransfer clientSignInTransfer, ClientSignInState clientSignInState, RelayClientConfigTransfer relayClientConfigTransfer)
|
||||
: base(tunnelTransfer, relayTransfer, pcpTransfer, clientSignInTransfer, clientSignInState, clientConfigTransfer, relayClientConfigTransfer)
|
||||
{
|
||||
TaskUdp();
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using linker.config;
|
||||
using linker.plugins.client;
|
||||
using linker.plugins.server;
|
||||
using linker.startup;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
@@ -59,8 +60,10 @@ namespace linker.plugins.messenger
|
||||
{
|
||||
loaded = true;
|
||||
|
||||
ServerConfigTransfer serverConfigTransfer = serviceProvider.GetService<ServerConfigTransfer>();
|
||||
|
||||
IMessengerResolver messengerResolver = serviceProvider.GetService<IMessengerResolver>();
|
||||
messengerResolver.Initialize(config.Data.Server.SSL.File, config.Data.Server.SSL.Password);
|
||||
messengerResolver.Initialize(serverConfigTransfer.SSL.File, serverConfigTransfer.SSL.Password);
|
||||
|
||||
MessengerResolverTypesLoader messengerResolverTypesLoader = serviceProvider.GetService<MessengerResolverTypesLoader>();
|
||||
}
|
||||
|
||||
@@ -33,13 +33,16 @@ namespace linker.plugins.relay
|
||||
serviceCollection.AddSingleton<RelayTestTransfer>();
|
||||
|
||||
|
||||
serviceCollection.AddSingleton<ConfigSyncRelaySecretKey>();
|
||||
serviceCollection.AddSingleton<RelaConfigSyncSecretKey>();
|
||||
|
||||
serviceCollection.AddSingleton<RelayTypesLoader>();
|
||||
|
||||
serviceCollection.AddSingleton<RelayServerMasterTransfer>();
|
||||
serviceCollection.AddSingleton<RelayServerNodeTransfer>();
|
||||
serviceCollection.AddSingleton<IRelayCaching, RelayCachingMemory>();
|
||||
|
||||
serviceCollection.AddSingleton<RelayClientConfigTransfer>();
|
||||
|
||||
}
|
||||
|
||||
public void AddServer(ServiceCollection serviceCollection, FileConfig config)
|
||||
@@ -57,6 +60,7 @@ namespace linker.plugins.relay
|
||||
|
||||
serviceCollection.AddSingleton<RelayValidatorSecretKey>();
|
||||
|
||||
serviceCollection.AddSingleton<RelayServerConfigTransfer>();
|
||||
}
|
||||
|
||||
public void UseClient(ServiceProvider serviceProvider, FileConfig config)
|
||||
|
||||
@@ -4,28 +4,26 @@ using MemoryPack;
|
||||
|
||||
namespace linker.plugins.relay.client
|
||||
{
|
||||
public sealed class ConfigSyncRelaySecretKey : IConfigSync
|
||||
public sealed class RelaConfigSyncSecretKey : IConfigSync
|
||||
{
|
||||
public string Name => "RelaySecretKey";
|
||||
|
||||
private readonly FileConfig fileConfig;
|
||||
public ConfigSyncRelaySecretKey(FileConfig fileConfig)
|
||||
private readonly RelayClientConfigTransfer relayClientConfigTransfer;
|
||||
public RelaConfigSyncSecretKey(FileConfig fileConfig, RelayClientConfigTransfer relayClientConfigTransfer)
|
||||
{
|
||||
this.fileConfig = fileConfig;
|
||||
this.relayClientConfigTransfer = relayClientConfigTransfer;
|
||||
}
|
||||
public Memory<byte> GetData()
|
||||
{
|
||||
return MemoryPackSerializer.Serialize(fileConfig.Data.Client.Relay.Servers.FirstOrDefault().SecretKey);
|
||||
return MemoryPackSerializer.Serialize(relayClientConfigTransfer.Server.SecretKey);
|
||||
}
|
||||
|
||||
public void SetData(Memory<byte> data)
|
||||
{
|
||||
string value = MemoryPackSerializer.Deserialize<string>(data.Span);
|
||||
foreach (var item in fileConfig.Data.Client.Relay.Servers)
|
||||
{
|
||||
item.SecretKey = value;
|
||||
}
|
||||
fileConfig.Data.Update();
|
||||
relayClientConfigTransfer.SetServerSecretKey(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -15,13 +15,15 @@ namespace linker.plugins.relay.client
|
||||
private readonly RunningConfig runningConfig;
|
||||
private readonly RelayTestTransfer relayTestTransfer;
|
||||
private readonly RelayTransfer relayTransfer;
|
||||
private readonly RelayClientConfigTransfer relayClientConfigTransfer;
|
||||
|
||||
public RelayApiController(FileConfig config, RunningConfig runningConfig, RelayTestTransfer relayTestTransfer, RelayTransfer relayTransfer)
|
||||
public RelayApiController(FileConfig config, RunningConfig runningConfig, RelayTestTransfer relayTestTransfer, RelayTransfer relayTransfer, RelayClientConfigTransfer relayClientConfigTransfer)
|
||||
{
|
||||
this.config = config;
|
||||
this.runningConfig = runningConfig;
|
||||
this.relayTestTransfer = relayTestTransfer;
|
||||
this.relayTransfer = relayTransfer;
|
||||
this.relayClientConfigTransfer = relayClientConfigTransfer;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -33,8 +35,7 @@ namespace linker.plugins.relay.client
|
||||
public bool SetServers(ApiControllerParamsInfo param)
|
||||
{
|
||||
RelayServerInfo info = param.Content.DeJson<RelayServerInfo>();
|
||||
config.Data.Client.Relay.Servers = [info];
|
||||
config.Data.Update();
|
||||
relayClientConfigTransfer.SetServer(info);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -48,8 +49,7 @@ namespace linker.plugins.relay.client
|
||||
{
|
||||
RelayConnectInfo relayConnectInfo = param.Content.DeJson<RelayConnectInfo>();
|
||||
_ = relayTransfer.ConnectAsync(relayConnectInfo.FromMachineId, relayConnectInfo.ToMachineId, relayConnectInfo.TransactionId, relayConnectInfo.NodeId);
|
||||
runningConfig.Data.Relay.DefaultNodeId = relayConnectInfo.NodeId;
|
||||
runningConfig.Data.Update();
|
||||
relayClientConfigTransfer.SetDefaultNodeId(relayConnectInfo.NodeId);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
39
linker/plugins/relay/client/RelayClientConfigTransfer.cs
Normal file
39
linker/plugins/relay/client/RelayClientConfigTransfer.cs
Normal file
@@ -0,0 +1,39 @@
|
||||
using linker.client.config;
|
||||
using linker.config;
|
||||
|
||||
namespace linker.plugins.relay.client
|
||||
{
|
||||
public sealed class RelayClientConfigTransfer
|
||||
{
|
||||
public string DefaultNodeId => runningConfig.Data.Relay.DefaultNodeId;
|
||||
public RelayServerInfo Server => config.Data.Client.Relay.Servers[0];
|
||||
|
||||
private readonly FileConfig config;
|
||||
private readonly RunningConfig runningConfig;
|
||||
public RelayClientConfigTransfer(FileConfig config, RunningConfig runningConfig)
|
||||
{
|
||||
this.config = config;
|
||||
this.runningConfig = runningConfig;
|
||||
}
|
||||
|
||||
public void SetDefaultNodeId(string defaultNodeId)
|
||||
{
|
||||
runningConfig.Data.Relay.DefaultNodeId = defaultNodeId;
|
||||
runningConfig.Data.Update();
|
||||
}
|
||||
|
||||
public void SetServer(RelayServerInfo server)
|
||||
{
|
||||
config.Data.Client.Relay.Servers = [server];
|
||||
runningConfig.Data.Update();
|
||||
}
|
||||
public void SetServerSecretKey(string secretKey)
|
||||
{
|
||||
foreach (var item in config.Data.Client.Relay.Servers)
|
||||
{
|
||||
item.SecretKey = secretKey;
|
||||
}
|
||||
runningConfig.Data.Update();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -16,15 +16,17 @@ namespace linker.plugins.relay.client
|
||||
private readonly RelayTransfer relayTransfer;
|
||||
private readonly ClientSignInState clientSignInState;
|
||||
private readonly ClientConfigTransfer clientConfigTransfer;
|
||||
private readonly RelayClientConfigTransfer relayClientConfigTransfer;
|
||||
|
||||
public List<RelayNodeReportInfo> Nodes { get; private set; } = new List<RelayNodeReportInfo>();
|
||||
|
||||
public RelayTestTransfer(FileConfig fileConfig, RelayTransfer relayTransfer, ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer)
|
||||
public RelayTestTransfer(FileConfig fileConfig, RelayTransfer relayTransfer, ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer, RelayClientConfigTransfer relayClientConfigTransfer)
|
||||
{
|
||||
this.fileConfig = fileConfig;
|
||||
this.relayTransfer = relayTransfer;
|
||||
this.clientSignInState = clientSignInState;
|
||||
this.clientConfigTransfer = clientConfigTransfer;
|
||||
this.relayClientConfigTransfer = relayClientConfigTransfer;
|
||||
|
||||
TestTask();
|
||||
}
|
||||
@@ -39,13 +41,13 @@ namespace linker.plugins.relay.client
|
||||
{
|
||||
try
|
||||
{
|
||||
ITransport transport = relayTransfer.Transports.FirstOrDefault(d => d.Type == fileConfig.Data.Client.Relay.Server.RelayType);
|
||||
ITransport transport = relayTransfer.Transports.FirstOrDefault(d => d.Type == relayClientConfigTransfer.Server.RelayType);
|
||||
if (transport != null)
|
||||
{
|
||||
Nodes = await transport.RelayTestAsync(new RelayTestInfo
|
||||
{
|
||||
MachineId = clientConfigTransfer.Id,
|
||||
SecretKey = fileConfig.Data.Client.Relay.Server.SecretKey
|
||||
SecretKey = relayClientConfigTransfer.Server.SecretKey
|
||||
});
|
||||
var tasks = Nodes.Select(async (c) =>
|
||||
{
|
||||
|
||||
@@ -20,9 +20,11 @@ namespace linker.plugins.relay.client
|
||||
private ConcurrentDictionary<string, bool> connectingDic = new ConcurrentDictionary<string, bool>();
|
||||
private Dictionary<string, List<Action<ITunnelConnection>>> OnConnected { get; } = new Dictionary<string, List<Action<ITunnelConnection>>>();
|
||||
|
||||
public RelayTransfer(FileConfig fileConfig)
|
||||
private readonly RelayClientConfigTransfer relayClientConfigTransfer;
|
||||
public RelayTransfer(FileConfig fileConfig, RelayClientConfigTransfer relayClientConfigTransfer)
|
||||
{
|
||||
this.fileConfig = fileConfig;
|
||||
this.relayClientConfigTransfer = relayClientConfigTransfer;
|
||||
}
|
||||
|
||||
public void LoadTransports(List<ITransport> list)
|
||||
@@ -71,7 +73,7 @@ namespace linker.plugins.relay.client
|
||||
}
|
||||
try
|
||||
{
|
||||
ITransport transport = Transports.FirstOrDefault(c => c.Type == fileConfig.Data.Client.Relay.Server.RelayType && fileConfig.Data.Client.Relay.Server.Disabled == false);
|
||||
ITransport transport = Transports.FirstOrDefault(c => c.Type == relayClientConfigTransfer.Server.RelayType && relayClientConfigTransfer.Server.Disabled == false);
|
||||
if (transport == null)
|
||||
{
|
||||
return null;
|
||||
@@ -84,10 +86,10 @@ namespace linker.plugins.relay.client
|
||||
FromMachineName = string.Empty,
|
||||
RemoteMachineId = remoteMachineId,
|
||||
RemoteMachineName = string.Empty,
|
||||
SecretKey = fileConfig.Data.Client.Relay.Server.SecretKey,
|
||||
SecretKey = relayClientConfigTransfer.Server.SecretKey,
|
||||
TransactionId = transactionId,
|
||||
TransportName = transport.Name,
|
||||
SSL = fileConfig.Data.Client.Relay.Server.SSL,
|
||||
SSL = relayClientConfigTransfer.Server.SSL,
|
||||
NodeId = nodeId
|
||||
};
|
||||
|
||||
|
||||
@@ -33,7 +33,6 @@ namespace linker.config
|
||||
/// 中继服务器列表
|
||||
/// </summary>
|
||||
public RelayServerInfo[] Servers { get; set; } = new RelayServerInfo[] { new RelayServerInfo { } };
|
||||
public RelayServerInfo Server => Servers[0];
|
||||
|
||||
}
|
||||
|
||||
|
||||
18
linker/plugins/relay/server/RelayServerConfigTransfer.cs
Normal file
18
linker/plugins/relay/server/RelayServerConfigTransfer.cs
Normal file
@@ -0,0 +1,18 @@
|
||||
using linker.config;
|
||||
|
||||
namespace linker.plugins.relay.server
|
||||
{
|
||||
public sealed class RelayServerConfigTransfer
|
||||
{
|
||||
public string SecretKey => config.Data.Server.Relay.SecretKey;
|
||||
public RelayNodeInfo Node=> config.Data.Server.Relay.Distributed.Node;
|
||||
public RelayMasterInfo Master => config.Data.Server.Relay.Distributed.Master;
|
||||
|
||||
|
||||
private readonly FileConfig config;
|
||||
public RelayServerConfigTransfer(FileConfig config)
|
||||
{
|
||||
this.config = config;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -14,16 +14,14 @@ namespace linker.plugins.relay.server
|
||||
|
||||
|
||||
private readonly IRelayCaching relayCaching;
|
||||
private readonly FileConfig fileConfig;
|
||||
|
||||
private readonly ICrypto crypto;
|
||||
private readonly ConcurrentDictionary<string, RelayNodeReportInfo> reports = new ConcurrentDictionary<string, RelayNodeReportInfo>();
|
||||
|
||||
public RelayServerMasterTransfer(IRelayCaching relayCaching, FileConfig fileConfig)
|
||||
public RelayServerMasterTransfer(IRelayCaching relayCaching, RelayServerConfigTransfer relayServerConfigTransfer)
|
||||
{
|
||||
this.relayCaching = relayCaching;
|
||||
this.fileConfig = fileConfig;
|
||||
crypto = CryptoFactory.CreateSymmetric(fileConfig.Data.Server.Relay.Distributed.Master.SecretKey);
|
||||
crypto = CryptoFactory.CreateSymmetric(relayServerConfigTransfer.Master.SecretKey);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ using linker.libs;
|
||||
using linker.libs.extends;
|
||||
using linker.plugins.relay.server.caching;
|
||||
using linker.plugins.resolver;
|
||||
using linker.plugins.server;
|
||||
using MemoryPack;
|
||||
using System.Buffers;
|
||||
using System.Net;
|
||||
@@ -16,6 +17,8 @@ namespace linker.plugins.relay.server
|
||||
|
||||
private readonly IRelayCaching relayCaching;
|
||||
private readonly FileConfig fileConfig;
|
||||
private readonly RelayServerConfigTransfer relayServerConfigTransfer;
|
||||
private readonly ServerConfigTransfer serverConfigTransfer;
|
||||
|
||||
private readonly ICrypto cryptoNode;
|
||||
private readonly ICrypto cryptoMaster;
|
||||
@@ -25,16 +28,18 @@ namespace linker.plugins.relay.server
|
||||
|
||||
RelaySpeedLimit limitTotal = new RelaySpeedLimit();
|
||||
|
||||
public RelayServerNodeTransfer(IRelayCaching relayCaching, FileConfig fileConfig)
|
||||
public RelayServerNodeTransfer(IRelayCaching relayCaching, FileConfig fileConfig, RelayServerConfigTransfer relayServerConfigTransfer, ServerConfigTransfer serverConfigTransfer)
|
||||
{
|
||||
this.relayCaching = relayCaching;
|
||||
this.fileConfig = fileConfig;
|
||||
this.relayServerConfigTransfer = relayServerConfigTransfer;
|
||||
this.serverConfigTransfer = serverConfigTransfer;
|
||||
|
||||
limitTotal.SetLimit((uint)Math.Ceiling((fileConfig.Data.Server.Relay.Distributed.Node.MaxBandwidthTotal * 1024 * 1024) / 8.0));
|
||||
limitTotal.SetLimit((uint)Math.Ceiling((relayServerConfigTransfer.Node.MaxBandwidthTotal * 1024 * 1024) / 8.0));
|
||||
ResetBytes();
|
||||
|
||||
cryptoNode = CryptoFactory.CreateSymmetric(fileConfig.Data.Server.Relay.Distributed.Node.MasterSecretKey);
|
||||
cryptoMaster = CryptoFactory.CreateSymmetric(fileConfig.Data.Server.Relay.Distributed.Master.SecretKey);
|
||||
cryptoNode = CryptoFactory.CreateSymmetric(relayServerConfigTransfer.Node.MasterSecretKey);
|
||||
cryptoMaster = CryptoFactory.CreateSymmetric(relayServerConfigTransfer.Master.SecretKey);
|
||||
ReportTask();
|
||||
|
||||
}
|
||||
@@ -45,8 +50,8 @@ namespace linker.plugins.relay.server
|
||||
try
|
||||
{
|
||||
IPEndPoint server = nodeid == RelayNodeInfo.MASTER_NODE_ID
|
||||
? new IPEndPoint(IPAddress.Loopback, fileConfig.Data.Server.ServicePort)
|
||||
: await NetworkHelper.GetEndPointAsync(fileConfig.Data.Server.Relay.Distributed.Node.MasterHost, 1802);
|
||||
? new IPEndPoint(IPAddress.Loopback, serverConfigTransfer.Port)
|
||||
: await NetworkHelper.GetEndPointAsync(relayServerConfigTransfer.Node.MasterHost, 1802);
|
||||
ICrypto crypto = nodeid == RelayNodeInfo.MASTER_NODE_ID ? cryptoMaster : cryptoNode;
|
||||
|
||||
Socket socket = new Socket(server.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
|
||||
@@ -103,9 +108,9 @@ namespace linker.plugins.relay.server
|
||||
/// <returns></returns>
|
||||
public bool ValidateConnection()
|
||||
{
|
||||
bool res = fileConfig.Data.Server.Relay.Distributed.Node.MaxConnection == 0 || fileConfig.Data.Server.Relay.Distributed.Node.MaxConnection * 2 > connectionNum;
|
||||
bool res = relayServerConfigTransfer.Node.MaxConnection == 0 || relayServerConfigTransfer.Node.MaxConnection * 2 > connectionNum;
|
||||
if (res == false && LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||
LoggerHelper.Instance.Debug($"relay ValidateConnection false,{connectionNum}/{fileConfig.Data.Server.Relay.Distributed.Node.MaxConnection * 2}");
|
||||
LoggerHelper.Instance.Debug($"relay ValidateConnection false,{connectionNum}/{relayServerConfigTransfer.Node.MaxConnection * 2}");
|
||||
|
||||
return res;
|
||||
}
|
||||
@@ -116,11 +121,11 @@ namespace linker.plugins.relay.server
|
||||
/// <returns></returns>
|
||||
public bool ValidateBytes()
|
||||
{
|
||||
bool res = fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotal == 0
|
||||
|| (fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotal > 0 && fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotalLastBytes > 0);
|
||||
bool res = relayServerConfigTransfer.Node.MaxGbTotal == 0
|
||||
|| (relayServerConfigTransfer.Node.MaxGbTotal > 0 && relayServerConfigTransfer.Node.MaxGbTotalLastBytes > 0);
|
||||
|
||||
if (res == false && LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||
LoggerHelper.Instance.Debug($"relay ValidateBytes false,{fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotalLastBytes}bytes/{fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotal}gb");
|
||||
LoggerHelper.Instance.Debug($"relay ValidateBytes false,{relayServerConfigTransfer.Node.MaxGbTotalLastBytes}bytes/{relayServerConfigTransfer.Node.MaxGbTotal}gb");
|
||||
|
||||
return res;
|
||||
}
|
||||
@@ -132,15 +137,15 @@ namespace linker.plugins.relay.server
|
||||
public bool AddBytes(ulong length)
|
||||
{
|
||||
bytes += length;
|
||||
if (fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotal == 0)
|
||||
if (relayServerConfigTransfer.Node.MaxGbTotal == 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotalLastBytes >= length)
|
||||
fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotalLastBytes -= length;
|
||||
else fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotalLastBytes = 0;
|
||||
return fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotalLastBytes > 0;
|
||||
if (relayServerConfigTransfer.Node.MaxGbTotalLastBytes >= length)
|
||||
relayServerConfigTransfer.Node.MaxGbTotalLastBytes -= length;
|
||||
else relayServerConfigTransfer.Node.MaxGbTotalLastBytes = 0;
|
||||
return relayServerConfigTransfer.Node.MaxGbTotalLastBytes > 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -149,7 +154,7 @@ namespace linker.plugins.relay.server
|
||||
/// <returns></returns>
|
||||
public uint GetBandwidthLimit()
|
||||
{
|
||||
return (uint)Math.Ceiling((fileConfig.Data.Server.Relay.Distributed.Node.MaxBandwidth * 1024 * 1024) / 8.0);
|
||||
return (uint)Math.Ceiling((relayServerConfigTransfer.Node.MaxBandwidth * 1024 * 1024) / 8.0);
|
||||
}
|
||||
/// <summary>
|
||||
/// 是否需要总限速
|
||||
@@ -172,10 +177,10 @@ namespace linker.plugins.relay.server
|
||||
|
||||
private void ResetBytes()
|
||||
{
|
||||
if (fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotalMonth != DateTime.Now.Month)
|
||||
if (relayServerConfigTransfer.Node.MaxGbTotalMonth != DateTime.Now.Month)
|
||||
{
|
||||
fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotalMonth = DateTime.Now.Month;
|
||||
fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotalLastBytes = (ulong)(fileConfig.Data.Server.Relay.Distributed.Node.MaxGbTotal * 1024 * 1024 * 1024);
|
||||
relayServerConfigTransfer.Node.MaxGbTotalMonth = DateTime.Now.Month;
|
||||
relayServerConfigTransfer.Node.MaxGbTotalLastBytes = (ulong)(relayServerConfigTransfer.Node.MaxGbTotal * 1024 * 1024 * 1024);
|
||||
fileConfig.Data.Update();
|
||||
}
|
||||
}
|
||||
@@ -191,9 +196,9 @@ namespace linker.plugins.relay.server
|
||||
{
|
||||
new RelayNodeInfo{
|
||||
Id = RelayNodeInfo.MASTER_NODE_ID,
|
||||
Host = new IPEndPoint(IPAddress.Any,fileConfig.Data.Server.ServicePort).ToString(),
|
||||
MasterHost = new IPEndPoint(IPAddress.Loopback,fileConfig.Data.Server.ServicePort).ToString(),
|
||||
MasterSecretKey = fileConfig.Data.Server.Relay.Distributed.Master.SecretKey,
|
||||
Host = new IPEndPoint(IPAddress.Any,serverConfigTransfer.Port).ToString(),
|
||||
MasterHost = new IPEndPoint(IPAddress.Loopback,serverConfigTransfer.Port).ToString(),
|
||||
MasterSecretKey = relayServerConfigTransfer.Master.SecretKey,
|
||||
MaxBandwidth = 0,
|
||||
MaxConnection = 0,
|
||||
MaxBandwidthTotal=0,
|
||||
@@ -203,7 +208,7 @@ namespace linker.plugins.relay.server
|
||||
Name = "default",
|
||||
Public = false
|
||||
},
|
||||
fileConfig.Data.Server.Relay.Distributed.Node
|
||||
relayServerConfigTransfer.Node
|
||||
}.Where(c => string.IsNullOrWhiteSpace(c.MasterHost) == false && string.IsNullOrWhiteSpace(c.MasterSecretKey) == false)
|
||||
.Where(c => string.IsNullOrWhiteSpace(c.Name) == false && string.IsNullOrWhiteSpace(c.Id) == false);
|
||||
|
||||
@@ -215,7 +220,7 @@ namespace linker.plugins.relay.server
|
||||
try
|
||||
{
|
||||
ICrypto crypto = node.Id == RelayNodeInfo.MASTER_NODE_ID ? cryptoMaster : cryptoNode;
|
||||
IPEndPoint endPoint = await NetworkHelper.GetEndPointAsync(node.Host, fileConfig.Data.Server.ServicePort) ?? new IPEndPoint(IPAddress.Any, fileConfig.Data.Server.ServicePort);
|
||||
IPEndPoint endPoint = await NetworkHelper.GetEndPointAsync(node.Host, serverConfigTransfer.Port) ?? new IPEndPoint(IPAddress.Any, serverConfigTransfer.Port);
|
||||
|
||||
|
||||
RelayNodeReportInfo relayNodeReportInfo = new RelayNodeReportInfo
|
||||
@@ -233,7 +238,7 @@ namespace linker.plugins.relay.server
|
||||
EndPoint = endPoint,
|
||||
};
|
||||
|
||||
IPEndPoint ep = await NetworkHelper.GetEndPointAsync(node.MasterHost, fileConfig.Data.Server.ServicePort);
|
||||
IPEndPoint ep = await NetworkHelper.GetEndPointAsync(node.MasterHost, serverConfigTransfer.Port);
|
||||
|
||||
byte[] content = crypto.Encode(MemoryPackSerializer.Serialize(relayNodeReportInfo));
|
||||
byte[] data = new byte[content.Length + 1];
|
||||
|
||||
@@ -19,15 +19,16 @@ namespace linker.plugins.relay.server.validator
|
||||
public sealed class RelayValidatorSecretKey : IRelayValidator
|
||||
{
|
||||
private readonly FileConfig fileConfig;
|
||||
|
||||
public RelayValidatorSecretKey(FileConfig fileConfig)
|
||||
private readonly RelayServerConfigTransfer relayServerConfigTransfer;
|
||||
public RelayValidatorSecretKey(FileConfig fileConfig, RelayServerConfigTransfer relayServerConfigTransfer)
|
||||
{
|
||||
this.fileConfig = fileConfig;
|
||||
this.relayServerConfigTransfer = relayServerConfigTransfer;
|
||||
}
|
||||
|
||||
public async Task<string> Validate(RelayInfo relayInfo, SignCacheInfo fromMachine, SignCacheInfo toMachine)
|
||||
{
|
||||
if (relayInfo.SecretKey != fileConfig.Data.Server.Relay.SecretKey)
|
||||
if (relayInfo.SecretKey != relayServerConfigTransfer.SecretKey)
|
||||
{
|
||||
return $"SecretKey validate fail";
|
||||
}
|
||||
|
||||
16
linker/plugins/server/ServerConfigTransfer.cs
Normal file
16
linker/plugins/server/ServerConfigTransfer.cs
Normal file
@@ -0,0 +1,16 @@
|
||||
using linker.config;
|
||||
|
||||
namespace linker.plugins.server
|
||||
{
|
||||
public sealed class ServerConfigTransfer
|
||||
{
|
||||
public int Port => config.Data.Server.ServicePort;
|
||||
public ServerCertificateInfo SSL => config.Data.Server.SSL;
|
||||
|
||||
private readonly FileConfig config;
|
||||
public ServerConfigTransfer(FileConfig config)
|
||||
{
|
||||
this.config = config;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -13,7 +13,7 @@ namespace linker.plugins.server
|
||||
public StartupLevel Level => StartupLevel.Normal;
|
||||
public string Name => "server";
|
||||
public bool Required => true;
|
||||
public string[] Dependent => new string[] {"messenger", "serialize", "firewall", "signin", "config"};
|
||||
public string[] Dependent => new string[] { "messenger", "serialize", "firewall", "signin", "config" };
|
||||
public StartupLoadType LoadType => StartupLoadType.Normal;
|
||||
|
||||
public void AddClient(ServiceCollection serviceCollection, FileConfig config)
|
||||
@@ -23,6 +23,7 @@ namespace linker.plugins.server
|
||||
public void AddServer(ServiceCollection serviceCollection, FileConfig config)
|
||||
{
|
||||
serviceCollection.AddSingleton<TcpServer>();
|
||||
serviceCollection.AddSingleton<ServerConfigTransfer>();
|
||||
}
|
||||
|
||||
public void UseClient(ServiceProvider serviceProvider, FileConfig config)
|
||||
@@ -31,21 +32,19 @@ namespace linker.plugins.server
|
||||
|
||||
public void UseServer(ServiceProvider serviceProvider, FileConfig config)
|
||||
{
|
||||
ServerConfigTransfer serverConfigTransfer = serviceProvider.GetService<ServerConfigTransfer>();
|
||||
LoggerHelper.Instance.Info($"start server");
|
||||
try
|
||||
{
|
||||
//服务
|
||||
TcpServer tcpServer = serviceProvider.GetService<TcpServer>();
|
||||
if (config.Data.Server.ServicePort > 0)
|
||||
{
|
||||
tcpServer.Start(config.Data.Server.ServicePort);
|
||||
}
|
||||
tcpServer.Start(serverConfigTransfer.Port);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LoggerHelper.Instance.Error(ex);
|
||||
}
|
||||
LoggerHelper.Instance.Warning($"server listen:{config.Data.Server.ServicePort}");
|
||||
LoggerHelper.Instance.Warning($"server listen:{serverConfigTransfer.Port}");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using linker.libs.extends;
|
||||
using linker.plugins.messenger;
|
||||
using linker.plugins.resolver;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
@@ -22,6 +21,7 @@ namespace linker.plugins.server
|
||||
|
||||
public void Start(int port)
|
||||
{
|
||||
if (port <= 0) return;
|
||||
if (socket == null)
|
||||
{
|
||||
socket = BindAccept(port);
|
||||
@@ -61,8 +61,8 @@ namespace linker.plugins.server
|
||||
{
|
||||
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, port);
|
||||
Socket socket = new Socket(localEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
|
||||
socket.IPv6Only(localEndPoint.AddressFamily, false);
|
||||
socket.ReuseBind(localEndPoint);
|
||||
//socket.IPv6Only(localEndPoint.AddressFamily, false);
|
||||
socket.Bind(localEndPoint);
|
||||
socket.Listen(int.MaxValue);
|
||||
|
||||
SocketAsyncEventArgs acceptEventArg = new SocketAsyncEventArgs
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
using linker.config;
|
||||
using linker.plugins.config;
|
||||
using MemoryPack;
|
||||
|
||||
namespace linker.plugins.sforward
|
||||
{
|
||||
public sealed class ConfigSyncSForwardSecretKey : IConfigSync
|
||||
{
|
||||
public string Name => "SForwardSecretKey";
|
||||
|
||||
private readonly FileConfig fileConfig;
|
||||
public ConfigSyncSForwardSecretKey(FileConfig fileConfig)
|
||||
{
|
||||
this.fileConfig = fileConfig;
|
||||
}
|
||||
public Memory<byte> GetData()
|
||||
{
|
||||
return MemoryPackSerializer.Serialize(fileConfig.Data.Client.SForward.SecretKey);
|
||||
}
|
||||
|
||||
public void SetData(Memory<byte> data)
|
||||
{
|
||||
fileConfig.Data.Client.SForward.SecretKey = MemoryPackSerializer.Deserialize<string>(data.Span);
|
||||
fileConfig.Data.Update();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -38,7 +38,7 @@ namespace linker.plugins.sforward
|
||||
/// <returns></returns>
|
||||
public string GetSecretKey(ApiControllerParamsInfo param)
|
||||
{
|
||||
return forwardTransfer.GetSecretKey();
|
||||
return forwardTransfer.SecretKey;
|
||||
}
|
||||
/// <summary>
|
||||
/// 设置密钥
|
||||
@@ -172,7 +172,7 @@ namespace linker.plugins.sforward
|
||||
|
||||
public sealed class SForwardListInfo
|
||||
{
|
||||
public ConcurrentDictionary<string,int> List { get; set; }
|
||||
public ConcurrentDictionary<string, int> List { get; set; }
|
||||
public ulong HashCode { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
26
linker/plugins/sforward/SForwardConfigSync.cs
Normal file
26
linker/plugins/sforward/SForwardConfigSync.cs
Normal file
@@ -0,0 +1,26 @@
|
||||
using linker.config;
|
||||
using linker.plugins.config;
|
||||
using MemoryPack;
|
||||
|
||||
namespace linker.plugins.sforward
|
||||
{
|
||||
public sealed class SForwardConfigSyncSecretKey : IConfigSync
|
||||
{
|
||||
public string Name => "SForwardSecretKey";
|
||||
|
||||
private readonly SForwardTransfer sForwardTransfer;
|
||||
public SForwardConfigSyncSecretKey(SForwardTransfer sForwardTransfer)
|
||||
{
|
||||
this.sForwardTransfer = sForwardTransfer;
|
||||
}
|
||||
public Memory<byte> GetData()
|
||||
{
|
||||
return MemoryPackSerializer.Serialize(sForwardTransfer.SecretKey);
|
||||
}
|
||||
|
||||
public void SetData(Memory<byte> data)
|
||||
{
|
||||
sForwardTransfer.SetSecretKey(MemoryPackSerializer.Deserialize<string>(data.Span));
|
||||
}
|
||||
}
|
||||
}
|
||||
23
linker/plugins/sforward/SForwardServerConfigTransfer.cs
Normal file
23
linker/plugins/sforward/SForwardServerConfigTransfer.cs
Normal file
@@ -0,0 +1,23 @@
|
||||
using linker.config;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace linker.plugins.sforward
|
||||
{
|
||||
public sealed class SForwardServerConfigTransfer
|
||||
{
|
||||
public string SecretKey => config.Data.Server.SForward.SecretKey;
|
||||
public byte BufferSize => config.Data.Server.SForward.BufferSize;
|
||||
public int WebPort => config.Data.Server.SForward.WebPort;
|
||||
public int[] TunnelPortRange => config.Data.Server.SForward.TunnelPortRange;
|
||||
|
||||
private readonly FileConfig config;
|
||||
public SForwardServerConfigTransfer(FileConfig config)
|
||||
{
|
||||
this.config = config;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -28,7 +28,7 @@ namespace linker.plugins.sforward
|
||||
serviceCollection.AddSingleton<SForwardTransfer>();
|
||||
serviceCollection.AddSingleton<SForwardClientMessenger>();
|
||||
|
||||
serviceCollection.AddSingleton<ConfigSyncSForwardSecretKey>();
|
||||
serviceCollection.AddSingleton<SForwardConfigSyncSecretKey>();
|
||||
|
||||
}
|
||||
|
||||
@@ -39,6 +39,7 @@ namespace linker.plugins.sforward
|
||||
serviceCollection.AddSingleton<ISForwardServerCahing, SForwardServerCahing>();
|
||||
serviceCollection.AddSingleton<ISForwardValidator, Validator>();
|
||||
|
||||
serviceCollection.AddSingleton<SForwardServerConfigTransfer>();
|
||||
}
|
||||
|
||||
bool added = false;
|
||||
@@ -59,12 +60,13 @@ namespace linker.plugins.sforward
|
||||
public void UseServer(ServiceProvider serviceProvider, FileConfig config)
|
||||
{
|
||||
SForwardProxy sForwardProxy = serviceProvider.GetService<SForwardProxy>();
|
||||
if (config.Data.Server.SForward.WebPort > 0)
|
||||
SForwardServerConfigTransfer sForwardServerConfigTransfer = serviceProvider.GetService<SForwardServerConfigTransfer>();
|
||||
if (sForwardServerConfigTransfer.WebPort > 0)
|
||||
{
|
||||
sForwardProxy.Start(config.Data.Server.SForward.WebPort, true, config.Data.Server.SForward.BufferSize,string.Empty);
|
||||
LoggerHelper.Instance.Warning($"listen server forward web in {config.Data.Server.SForward.WebPort}");
|
||||
sForwardProxy.Start(sForwardServerConfigTransfer.WebPort, true, sForwardServerConfigTransfer.BufferSize,string.Empty);
|
||||
LoggerHelper.Instance.Warning($"listen server forward web in {sForwardServerConfigTransfer.WebPort}");
|
||||
}
|
||||
LoggerHelper.Instance.Warning($"listen server forward tunnel in {string.Join("-", config.Data.Server.SForward.TunnelPortRange)}");
|
||||
LoggerHelper.Instance.Warning($"listen server forward tunnel in {string.Join("-", sForwardServerConfigTransfer.TunnelPortRange)}");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,6 +19,10 @@ namespace linker.plugins.sforward
|
||||
public string Name => "sforward";
|
||||
public VersionManager DataVersion { get; } = new VersionManager();
|
||||
|
||||
public VersionManager Version { get; } = new VersionManager();
|
||||
|
||||
public string SecretKey => fileConfig.Data.Client.SForward.SecretKey;
|
||||
|
||||
|
||||
private readonly FileConfig fileConfig;
|
||||
private readonly RunningConfig running;
|
||||
@@ -28,8 +32,9 @@ namespace linker.plugins.sforward
|
||||
|
||||
private readonly NumberSpaceUInt32 ns = new NumberSpaceUInt32();
|
||||
private readonly ConcurrentDictionary<string, int> countDic = new ConcurrentDictionary<string, int>();
|
||||
private readonly OperatingManager operatingManager = new OperatingManager();
|
||||
|
||||
|
||||
public VersionManager Version { get; } = new VersionManager();
|
||||
|
||||
public SForwardTransfer(FileConfig fileConfig, RunningConfig running, ClientSignInState clientSignInState, IMessengerSender messengerSender, ClientConfigTransfer clientConfigTransfer)
|
||||
{
|
||||
@@ -68,23 +73,17 @@ namespace linker.plugins.sforward
|
||||
{
|
||||
DataVersion.Add();
|
||||
}
|
||||
|
||||
public ConcurrentDictionary<string, int> GetCount()
|
||||
{
|
||||
return countDic;
|
||||
}
|
||||
|
||||
public string GetSecretKey()
|
||||
{
|
||||
return fileConfig.Data.Client.SForward.SecretKey;
|
||||
}
|
||||
public void SetSecretKey(string key)
|
||||
{
|
||||
fileConfig.Data.Client.SForward.SecretKey = key;
|
||||
fileConfig.Data.Update();
|
||||
}
|
||||
|
||||
|
||||
private void Start()
|
||||
{
|
||||
uint maxid = running.Data.SForwards.Count > 0 ? running.Data.SForwards.Max(c => c.Id) : 1;
|
||||
@@ -188,7 +187,6 @@ namespace linker.plugins.sforward
|
||||
Version.Add();
|
||||
}
|
||||
|
||||
|
||||
public List<SForwardInfo> Get()
|
||||
{
|
||||
return running.Data.SForwards;
|
||||
@@ -258,8 +256,6 @@ namespace linker.plugins.sforward
|
||||
return arr.Length == 2 && int.TryParse(arr[0], out min) && int.TryParse(arr[1], out max);
|
||||
}
|
||||
|
||||
|
||||
private readonly OperatingManager operatingManager = new OperatingManager();
|
||||
/// <summary>
|
||||
/// 测试本机服务
|
||||
/// </summary>
|
||||
|
||||
@@ -24,8 +24,9 @@ namespace linker.plugins.sforward.messenger
|
||||
private readonly SignCaching signCaching;
|
||||
private readonly FileConfig configWrap;
|
||||
private readonly ISForwardValidator validator;
|
||||
private readonly SForwardServerConfigTransfer sForwardServerConfigTransfer;
|
||||
|
||||
public SForwardServerMessenger(SForwardProxy proxy, ISForwardServerCahing sForwardServerCahing, IMessengerSender sender, SignCaching signCaching, FileConfig configWrap, ISForwardValidator validator)
|
||||
public SForwardServerMessenger(SForwardProxy proxy, ISForwardServerCahing sForwardServerCahing, IMessengerSender sender, SignCaching signCaching, FileConfig configWrap, ISForwardValidator validator, SForwardServerConfigTransfer sForwardServerConfigTransfer)
|
||||
{
|
||||
this.proxy = proxy;
|
||||
proxy.WebConnect = WebConnect;
|
||||
@@ -36,6 +37,7 @@ namespace linker.plugins.sforward.messenger
|
||||
this.signCaching = signCaching;
|
||||
this.configWrap = configWrap;
|
||||
this.validator = validator;
|
||||
this.sForwardServerConfigTransfer = sForwardServerConfigTransfer;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -46,7 +48,7 @@ namespace linker.plugins.sforward.messenger
|
||||
public async Task Add(IConnection connection)
|
||||
{
|
||||
SForwardAddInfo sForwardAddInfo = MemoryPackSerializer.Deserialize<SForwardAddInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
||||
SForwardAddResultInfo result = new SForwardAddResultInfo { Success = true, BufferSize = configWrap.Data.Server.SForward.BufferSize };
|
||||
SForwardAddResultInfo result = new SForwardAddResultInfo { Success = true, BufferSize = sForwardServerConfigTransfer.BufferSize };
|
||||
|
||||
if (signCaching.TryGet(connection.Id, out SignCacheInfo cache) == false)
|
||||
{
|
||||
@@ -76,7 +78,7 @@ namespace linker.plugins.sforward.messenger
|
||||
if (sForwardServerCahing.TryAdd(port, connection.Id))
|
||||
{
|
||||
proxy.Stop(port);
|
||||
result.Message = proxy.Start(port, false, configWrap.Data.Server.SForward.BufferSize, cache.GroupId);
|
||||
result.Message = proxy.Start(port, false, sForwardServerConfigTransfer.BufferSize, cache.GroupId);
|
||||
if (string.IsNullOrWhiteSpace(result.Message) == false)
|
||||
{
|
||||
LoggerHelper.Instance.Error(result.Message);
|
||||
@@ -113,7 +115,7 @@ namespace linker.plugins.sforward.messenger
|
||||
else
|
||||
{
|
||||
proxy.Stop(sForwardAddInfo.RemotePort);
|
||||
string msg = proxy.Start(sForwardAddInfo.RemotePort, false, configWrap.Data.Server.SForward.BufferSize, cache.GroupId);
|
||||
string msg = proxy.Start(sForwardAddInfo.RemotePort, false, sForwardServerConfigTransfer.BufferSize, cache.GroupId);
|
||||
if (string.IsNullOrWhiteSpace(msg) == false)
|
||||
{
|
||||
result.Success = false;
|
||||
@@ -314,7 +316,7 @@ namespace linker.plugins.sforward.messenger
|
||||
{
|
||||
Connection = sign.Connection,
|
||||
MessengerId = (ushort)SForwardMessengerIds.Proxy,
|
||||
Payload = MemoryPackSerializer.Serialize(new SForwardProxyInfo { Domain = host, RemotePort = port, Id = id, BufferSize = configWrap.Data.Server.SForward.BufferSize })
|
||||
Payload = MemoryPackSerializer.Serialize(new SForwardProxyInfo { Domain = host, RemotePort = port, Id = id, BufferSize = sForwardServerConfigTransfer.BufferSize })
|
||||
}).ConfigureAwait(false);
|
||||
}
|
||||
return false;
|
||||
@@ -334,7 +336,7 @@ namespace linker.plugins.sforward.messenger
|
||||
{
|
||||
Connection = sign.Connection,
|
||||
MessengerId = (ushort)SForwardMessengerIds.Proxy,
|
||||
Payload = MemoryPackSerializer.Serialize(new SForwardProxyInfo { RemotePort = port, Id = id, BufferSize = configWrap.Data.Server.SForward.BufferSize })
|
||||
Payload = MemoryPackSerializer.Serialize(new SForwardProxyInfo { RemotePort = port, Id = id, BufferSize = sForwardServerConfigTransfer.BufferSize })
|
||||
}).ConfigureAwait(false);
|
||||
}
|
||||
return false;
|
||||
@@ -354,7 +356,7 @@ namespace linker.plugins.sforward.messenger
|
||||
{
|
||||
Connection = sign.Connection,
|
||||
MessengerId = (ushort)SForwardMessengerIds.ProxyUdp,
|
||||
Payload = MemoryPackSerializer.Serialize(new SForwardProxyInfo { RemotePort = port, Id = id, BufferSize = configWrap.Data.Server.SForward.BufferSize })
|
||||
Payload = MemoryPackSerializer.Serialize(new SForwardProxyInfo { RemotePort = port, Id = id, BufferSize = sForwardServerConfigTransfer.BufferSize })
|
||||
}).ConfigureAwait(false);
|
||||
}
|
||||
return false;
|
||||
|
||||
@@ -10,23 +10,25 @@ namespace linker.plugins.sforward.validator
|
||||
public sealed class Validator : ISForwardValidator
|
||||
{
|
||||
private readonly FileConfig config;
|
||||
public Validator(FileConfig config)
|
||||
private readonly SForwardServerConfigTransfer sForwardServerConfigTransfer;
|
||||
public Validator(FileConfig config, SForwardServerConfigTransfer sForwardServerConfigTransfer)
|
||||
{
|
||||
this.config = config;
|
||||
this.sForwardServerConfigTransfer = sForwardServerConfigTransfer;
|
||||
}
|
||||
|
||||
public async Task<string> Validate(SignCacheInfo signCacheInfo, SForwardAddInfo sForwardAddInfo)
|
||||
{
|
||||
if (config.Data.Server.SForward.SecretKey != sForwardAddInfo.SecretKey)
|
||||
if (sForwardServerConfigTransfer.SecretKey != sForwardAddInfo.SecretKey)
|
||||
{
|
||||
return $"sforward secretKey 【{sForwardAddInfo.SecretKey}】 valid fail";
|
||||
}
|
||||
|
||||
if (sForwardAddInfo.RemotePort > 0)
|
||||
{
|
||||
if (sForwardAddInfo.RemotePort < config.Data.Server.SForward.TunnelPortRange[0] || sForwardAddInfo.RemotePort > config.Data.Server.SForward.TunnelPortRange[1])
|
||||
if (sForwardAddInfo.RemotePort < sForwardServerConfigTransfer.TunnelPortRange[0] || sForwardAddInfo.RemotePort > sForwardServerConfigTransfer.TunnelPortRange[1])
|
||||
{
|
||||
return $"sforward tunnel port range {string.Join("-", config.Data.Server.SForward.TunnelPortRange)}";
|
||||
return $"sforward tunnel port range {string.Join("-", sForwardServerConfigTransfer.TunnelPortRange)}";
|
||||
}
|
||||
}
|
||||
await Task.CompletedTask;
|
||||
|
||||
15
linker/plugins/signIn/SignInConfigTransfer.cs
Normal file
15
linker/plugins/signIn/SignInConfigTransfer.cs
Normal file
@@ -0,0 +1,15 @@
|
||||
using linker.config;
|
||||
|
||||
namespace linker.plugins.signIn
|
||||
{
|
||||
public sealed class SignInConfigTransfer
|
||||
{
|
||||
public string SecretKey => config.Data.Server.SignIn.SecretKey;
|
||||
|
||||
private readonly FileConfig config;
|
||||
public SignInConfigTransfer(FileConfig config)
|
||||
{
|
||||
this.config = config;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
using linker.config;
|
||||
using linker.plugins.signin.messenger;
|
||||
using linker.plugins.signIn;
|
||||
using linker.plugins.signIn.args;
|
||||
using linker.startup;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
@@ -37,6 +38,10 @@ namespace linker.plugins.signin
|
||||
serviceCollection.AddSingleton<SignInArgsTransfer>();
|
||||
serviceCollection.AddSingleton<SignInArgsTypesLoader>();
|
||||
serviceCollection.AddSingleton<SignInArgsMachineKeyServer>();
|
||||
|
||||
serviceCollection.AddSingleton<SignInConfigTransfer>();
|
||||
|
||||
|
||||
}
|
||||
|
||||
public void UseClient(ServiceProvider serviceProvider, FileConfig config)
|
||||
|
||||
@@ -8,6 +8,8 @@ using linker.plugins.client;
|
||||
using linker.plugins.messenger;
|
||||
using linker.plugins.socks5.config;
|
||||
using linker.plugins.decenter;
|
||||
using linker.plugins.tunnel;
|
||||
using linker.plugins.tuntap;
|
||||
|
||||
namespace linker.plugins.socks5
|
||||
{
|
||||
@@ -23,6 +25,8 @@ namespace linker.plugins.socks5
|
||||
private readonly RunningConfig runningConfig;
|
||||
private readonly TunnelProxy tunnelProxy;
|
||||
private readonly ClientConfigTransfer clientConfigTransfer;
|
||||
private readonly TunnelConfigTransfer tunnelConfigTransfer;
|
||||
private readonly TuntapConfigTransfer tuntapConfigTransfer;
|
||||
|
||||
public VersionManager Version { get; } = new VersionManager();
|
||||
private readonly ConcurrentDictionary<string, Socks5Info> socks5Infos = new ConcurrentDictionary<string, Socks5Info>();
|
||||
@@ -30,7 +34,7 @@ namespace linker.plugins.socks5
|
||||
|
||||
|
||||
private readonly SemaphoreSlim slim = new SemaphoreSlim(1);
|
||||
public Socks5ConfigTransfer(IMessengerSender messengerSender, ClientSignInState clientSignInState, FileConfig config, RunningConfig runningConfig, TunnelProxy tunnelProxy, ClientConfigTransfer clientConfigTransfer)
|
||||
public Socks5ConfigTransfer(IMessengerSender messengerSender, ClientSignInState clientSignInState, FileConfig config, RunningConfig runningConfig, TunnelProxy tunnelProxy, ClientConfigTransfer clientConfigTransfer, TunnelConfigTransfer tunnelConfigTransfer, TuntapConfigTransfer tuntapConfigTransfer)
|
||||
{
|
||||
this.messengerSender = messengerSender;
|
||||
this.clientSignInState = clientSignInState;
|
||||
@@ -38,6 +42,8 @@ namespace linker.plugins.socks5
|
||||
this.runningConfig = runningConfig;
|
||||
this.tunnelProxy = tunnelProxy;
|
||||
this.clientConfigTransfer = clientConfigTransfer;
|
||||
this.tunnelConfigTransfer = tunnelConfigTransfer;
|
||||
this.tuntapConfigTransfer = tuntapConfigTransfer;
|
||||
|
||||
clientSignInState.NetworkEnabledHandle += (times) => DataVersion.Add();
|
||||
tunnelProxy.RefreshConfig += RefreshConfig;
|
||||
@@ -122,7 +128,6 @@ namespace linker.plugins.socks5
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 重启
|
||||
/// </summary>
|
||||
@@ -196,11 +201,11 @@ namespace linker.plugins.socks5
|
||||
{
|
||||
//排除的IP,
|
||||
uint[] excludeIps =//本机局域网IP
|
||||
config.Data.Client.Tunnel.LocalIPs.Where(c => c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
|
||||
tunnelConfigTransfer.LocalIPs.Where(c => c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
|
||||
//路由上的IP
|
||||
.Concat(config.Data.Client.Tunnel.RouteIPs)
|
||||
.Concat(tunnelConfigTransfer.RouteIPs)
|
||||
//网卡IP 服务器IP
|
||||
.Concat(new IPAddress[] { runningConfig.Data.Tuntap.IP, clientSignInState.Connection.Address.Address })
|
||||
.Concat(new IPAddress[] { tuntapConfigTransfer.IP, clientSignInState.Connection.Address.Address })
|
||||
//网卡配置的局域网IP
|
||||
.Concat(runningConfig.Data.Socks5.Lans.Select(c => c.IP))
|
||||
.Select(NetworkHelper.IP2Value)
|
||||
|
||||
@@ -28,8 +28,8 @@ namespace linker.plugins.socks5
|
||||
|
||||
protected override string TransactionId => "socks5";
|
||||
|
||||
public TunnelProxy(ClientConfigTransfer clientConfigTransfer, TunnelTransfer tunnelTransfer, RelayTransfer relayTransfer, PcpTransfer pcpTransfer, ClientSignInTransfer clientSignInTransfer, ClientSignInState clientSignInState, RunningConfig runningConfig)
|
||||
: base(tunnelTransfer, relayTransfer, pcpTransfer, clientSignInTransfer, clientSignInState, runningConfig, clientConfigTransfer)
|
||||
public TunnelProxy(ClientConfigTransfer clientConfigTransfer, TunnelTransfer tunnelTransfer, RelayTransfer relayTransfer, PcpTransfer pcpTransfer, ClientSignInTransfer clientSignInTransfer, ClientSignInState clientSignInState, RelayClientConfigTransfer relayClientConfigTransfer)
|
||||
: base(tunnelTransfer, relayTransfer, pcpTransfer, clientSignInTransfer, clientSignInState, clientConfigTransfer, relayClientConfigTransfer)
|
||||
{
|
||||
this.clientSignInTransfer = clientSignInTransfer;
|
||||
TaskUdp();
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
using linker.config;
|
||||
using linker.plugins.config;
|
||||
using linker.tunnel.transport;
|
||||
using MemoryPack;
|
||||
|
||||
namespace linker.plugins.tunnel
|
||||
{
|
||||
public sealed class ConfigSyncTunnelTransports : IConfigSync
|
||||
{
|
||||
public string Name => "TunnelTransports";
|
||||
|
||||
private readonly FileConfig fileConfig;
|
||||
public ConfigSyncTunnelTransports(FileConfig fileConfig)
|
||||
{
|
||||
this.fileConfig = fileConfig;
|
||||
}
|
||||
public Memory<byte> GetData()
|
||||
{
|
||||
return MemoryPackSerializer.Serialize(fileConfig.Data.Client.Tunnel.Transports);
|
||||
}
|
||||
|
||||
public void SetData(Memory<byte> data)
|
||||
{
|
||||
fileConfig.Data.Client.Tunnel.Transports = MemoryPackSerializer.Deserialize<List<TunnelTransportItemInfo>>(data.Span);
|
||||
fileConfig.Data.Update();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -17,42 +17,30 @@ namespace linker.plugins.tunnel
|
||||
{
|
||||
public IPAddress LocalIP => clientSignInState.Connection?.LocalAddress.Address ?? IPAddress.Any;
|
||||
public IPEndPoint ServerHost => clientSignInState.Connection?.Address ?? null;
|
||||
|
||||
public X509Certificate2 Certificate { get; private set; }
|
||||
public X509Certificate2 Certificate => tunnelConfigTransfer.Certificate;
|
||||
|
||||
private readonly ClientSignInState clientSignInState;
|
||||
private readonly IMessengerSender messengerSender;
|
||||
private readonly FileConfig config;
|
||||
private readonly RunningConfig running;
|
||||
private readonly TunnelExcludeIPTransfer excludeIPTransfer;
|
||||
private readonly ClientConfigTransfer clientConfigTransfer;
|
||||
private readonly TunnelConfigTransfer tunnelConfigTransfer;
|
||||
|
||||
public TunnelAdapter(ClientSignInState clientSignInState, IMessengerSender messengerSender, FileConfig config, RunningConfig running, TunnelExcludeIPTransfer excludeIPTransfer, ClientConfigTransfer clientConfigTransfer)
|
||||
public TunnelAdapter(ClientSignInState clientSignInState, IMessengerSender messengerSender, TunnelExcludeIPTransfer excludeIPTransfer, ClientConfigTransfer clientConfigTransfer, TunnelConfigTransfer tunnelConfigTransfer)
|
||||
{
|
||||
this.clientSignInState = clientSignInState;
|
||||
this.messengerSender = messengerSender;
|
||||
this.config = config;
|
||||
this.running = running;
|
||||
this.excludeIPTransfer = excludeIPTransfer;
|
||||
this.clientConfigTransfer = clientConfigTransfer;
|
||||
|
||||
string path = Path.GetFullPath(clientConfigTransfer.SSL.File);
|
||||
if (File.Exists(path))
|
||||
{
|
||||
Certificate = new X509Certificate2(path, clientConfigTransfer.SSL.Password, X509KeyStorageFlags.Exportable);
|
||||
}
|
||||
|
||||
|
||||
this.tunnelConfigTransfer = tunnelConfigTransfer;
|
||||
}
|
||||
|
||||
public List<TunnelTransportItemInfo> GetTunnelTransports()
|
||||
{
|
||||
return config.Data.Client.Tunnel.Transports;
|
||||
return tunnelConfigTransfer.Transports;
|
||||
}
|
||||
public void SetTunnelTransports(List<TunnelTransportItemInfo> transports, bool updateVersion)
|
||||
{
|
||||
config.Data.Client.Tunnel.Transports = transports;
|
||||
config.Data.Update();
|
||||
tunnelConfigTransfer.SetTransports(transports);
|
||||
}
|
||||
|
||||
public NetworkInfo GetLocalConfig()
|
||||
@@ -60,7 +48,7 @@ namespace linker.plugins.tunnel
|
||||
var excludeips = excludeIPTransfer.Get();
|
||||
return new NetworkInfo
|
||||
{
|
||||
LocalIps = config.Data.Client.Tunnel.LocalIPs.Where(c =>
|
||||
LocalIps = tunnelConfigTransfer.LocalIPs.Where(c =>
|
||||
{
|
||||
if (c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
|
||||
{
|
||||
@@ -78,7 +66,7 @@ namespace linker.plugins.tunnel
|
||||
return true;
|
||||
})
|
||||
.ToArray(),
|
||||
RouteLevel = config.Data.Client.Tunnel.RouteLevel + running.Data.Tunnel.RouteLevelPlus,
|
||||
RouteLevel = tunnelConfigTransfer.RouteLevel,
|
||||
MachineId = clientConfigTransfer.Id
|
||||
};
|
||||
}
|
||||
|
||||
@@ -17,23 +17,23 @@ namespace linker.plugins.tunnel
|
||||
protected virtual string TransactionId { get; }
|
||||
protected readonly ConcurrentDictionary<string, ITunnelConnection> connections = new ConcurrentDictionary<string, ITunnelConnection>();
|
||||
|
||||
private readonly RunningConfig runningConfig;
|
||||
private readonly TunnelTransfer tunnelTransfer;
|
||||
private readonly RelayTransfer relayTransfer;
|
||||
private readonly PcpTransfer pcpTransfer;
|
||||
private readonly ClientSignInTransfer clientSignInTransfer;
|
||||
private readonly ClientSignInState clientSignInState;
|
||||
private readonly ClientConfigTransfer clientConfigTransfer;
|
||||
private readonly RelayClientConfigTransfer relayClientConfigTransfer;
|
||||
|
||||
public TunnelBase(TunnelTransfer tunnelTransfer, RelayTransfer relayTransfer, PcpTransfer pcpTransfer, ClientSignInTransfer clientSignInTransfer, ClientSignInState clientSignInState, RunningConfig runningConfig, ClientConfigTransfer clientConfigTransfer)
|
||||
public TunnelBase(TunnelTransfer tunnelTransfer, RelayTransfer relayTransfer, PcpTransfer pcpTransfer, ClientSignInTransfer clientSignInTransfer, ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer, RelayClientConfigTransfer relayClientConfigTransfer)
|
||||
{
|
||||
this.runningConfig = runningConfig;
|
||||
this.tunnelTransfer = tunnelTransfer;
|
||||
this.relayTransfer = relayTransfer;
|
||||
this.pcpTransfer = pcpTransfer;
|
||||
this.clientSignInTransfer = clientSignInTransfer;
|
||||
this.clientSignInState = clientSignInState;
|
||||
this.clientConfigTransfer = clientConfigTransfer;
|
||||
this.relayClientConfigTransfer = relayClientConfigTransfer;
|
||||
|
||||
//监听打洞成功
|
||||
tunnelTransfer.SetConnectedCallback(TransactionId, OnConnected);
|
||||
@@ -127,7 +127,7 @@ namespace linker.plugins.tunnel
|
||||
{
|
||||
//中继
|
||||
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"{TransactionId} relay to {machineId}");
|
||||
ITunnelConnection connection = await relayTransfer.ConnectAsync(clientConfigTransfer.Id, machineId, TransactionId, runningConfig.Data.Relay.DefaultNodeId).ConfigureAwait(false);
|
||||
ITunnelConnection connection = await relayTransfer.ConnectAsync(clientConfigTransfer.Id, machineId, TransactionId, relayClientConfigTransfer.DefaultNodeId).ConfigureAwait(false);
|
||||
if (connection != null)
|
||||
{
|
||||
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"{TransactionId} relay success,{connection.ToString()}");
|
||||
|
||||
26
linker/plugins/tunnel/TunnelConfigSync.cs
Normal file
26
linker/plugins/tunnel/TunnelConfigSync.cs
Normal file
@@ -0,0 +1,26 @@
|
||||
using linker.plugins.config;
|
||||
using linker.tunnel.transport;
|
||||
using MemoryPack;
|
||||
|
||||
namespace linker.plugins.tunnel
|
||||
{
|
||||
public sealed class TunnelConfigSyncTransports : IConfigSync
|
||||
{
|
||||
public string Name => "TunnelTransports";
|
||||
|
||||
private readonly TunnelConfigTransfer tunnelConfigTransfer;
|
||||
public TunnelConfigSyncTransports( TunnelConfigTransfer tunnelConfigTransfer)
|
||||
{
|
||||
this.tunnelConfigTransfer = tunnelConfigTransfer;
|
||||
}
|
||||
public Memory<byte> GetData()
|
||||
{
|
||||
return MemoryPackSerializer.Serialize(tunnelConfigTransfer.Transports);
|
||||
}
|
||||
|
||||
public void SetData(Memory<byte> data)
|
||||
{
|
||||
tunnelConfigTransfer.SetTransports(MemoryPackSerializer.Deserialize<List<TunnelTransportItemInfo>>(data.Span));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,49 +5,58 @@ using linker.plugins.client;
|
||||
using linker.plugins.decenter;
|
||||
using linker.plugins.messenger;
|
||||
using linker.tunnel;
|
||||
using linker.tunnel.adapter;
|
||||
using linker.tunnel.transport;
|
||||
using MemoryPack;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Net;
|
||||
using System.Net.Quic;
|
||||
using System.Security.Cryptography.X509Certificates;
|
||||
|
||||
namespace linker.plugins.tunnel
|
||||
{
|
||||
public sealed class TunnelConfigTransfer:IDecenter
|
||||
public sealed class TunnelConfigTransfer : IDecenter
|
||||
{
|
||||
public string Name => "tunnel";
|
||||
public VersionManager DataVersion { get; } = new VersionManager();
|
||||
|
||||
public int RouteLevel => config.Data.Client.Tunnel.RouteLevel + running.Data.Tunnel.RouteLevelPlus;
|
||||
public IPAddress[] LocalIPs => config.Data.Client.Tunnel.LocalIPs;
|
||||
public IPAddress[] RouteIPs => config.Data.Client.Tunnel.RouteIPs;
|
||||
public List<TunnelTransportItemInfo> Transports => config.Data.Client.Tunnel.Transports;
|
||||
public X509Certificate2 Certificate { get; private set; }
|
||||
|
||||
private readonly FileConfig config;
|
||||
private readonly RunningConfig running;
|
||||
private readonly ClientSignInState clientSignInState;
|
||||
private readonly IMessengerSender messengerSender;
|
||||
private readonly ITunnelAdapter tunnelAdapter;
|
||||
private readonly TunnelUpnpTransfer upnpTransfer;
|
||||
private readonly ClientConfigTransfer clientConfigTransfer;
|
||||
|
||||
public VersionManager Version { get; } = new VersionManager();
|
||||
public ConcurrentDictionary<string, TunnelTransportRouteLevelInfo> Config { get; } = new ConcurrentDictionary<string, TunnelTransportRouteLevelInfo>();
|
||||
|
||||
public TunnelConfigTransfer(FileConfig config, RunningConfig running, ClientSignInState clientSignInState, IMessengerSender messengerSender, ITunnelAdapter tunnelAdapter, TunnelUpnpTransfer upnpTransfer, ClientConfigTransfer clientConfigTransfer)
|
||||
public TunnelConfigTransfer(FileConfig config, RunningConfig running, ClientSignInState clientSignInState, IMessengerSender messengerSender, TunnelUpnpTransfer upnpTransfer, ClientConfigTransfer clientConfigTransfer)
|
||||
{
|
||||
this.config = config;
|
||||
this.running = running;
|
||||
this.clientSignInState = clientSignInState;
|
||||
this.messengerSender = messengerSender;
|
||||
this.tunnelAdapter = tunnelAdapter;
|
||||
this.upnpTransfer = upnpTransfer;
|
||||
this.clientConfigTransfer = clientConfigTransfer;
|
||||
|
||||
string path = Path.GetFullPath(clientConfigTransfer.SSL.File);
|
||||
if (File.Exists(path))
|
||||
{
|
||||
Certificate = new X509Certificate2(path, clientConfigTransfer.SSL.Password, X509KeyStorageFlags.Exportable);
|
||||
}
|
||||
clientSignInState.NetworkEnabledHandle += (times) =>
|
||||
{
|
||||
RefreshRouteLevel();
|
||||
DataVersion.Add();
|
||||
TimerHelper.Async(RefreshRouteLevel);
|
||||
RefreshPortMap();
|
||||
};
|
||||
TestQuic();
|
||||
}
|
||||
|
||||
public Memory<byte> GetData()
|
||||
{
|
||||
TunnelTransportRouteLevelInfo tunnelTransportRouteLevelInfo = GetLocalRouteLevel();
|
||||
@@ -73,18 +82,21 @@ namespace linker.plugins.tunnel
|
||||
Version.Add();
|
||||
}
|
||||
|
||||
public void SetTransports(List<TunnelTransportItemInfo> transports)
|
||||
{
|
||||
config.Data.Client.Tunnel.Transports = transports;
|
||||
config.Data.Update();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 刷新网关等级数据
|
||||
/// </summary>
|
||||
private void RefreshRouteLevel()
|
||||
{
|
||||
TimerHelper.Async(() =>
|
||||
public void RefreshRouteLevel()
|
||||
{
|
||||
config.Data.Client.Tunnel.RouteLevel = NetworkHelper.GetRouteLevel(clientConfigTransfer.Server.Host, out List<IPAddress> ips);
|
||||
config.Data.Client.Tunnel.RouteIPs = ips.ToArray();
|
||||
config.Data.Client.Tunnel.LocalIPs = NetworkHelper.GetIPV6().Concat(NetworkHelper.GetIPV4()).ToArray();
|
||||
});
|
||||
DataVersion.Add();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -168,7 +180,7 @@ namespace linker.plugins.tunnel
|
||||
}
|
||||
else
|
||||
{
|
||||
upnpTransfer.SetMap(clientSignInState.Connection.LocalAddress.Address,18180);
|
||||
upnpTransfer.SetMap(clientSignInState.Connection.LocalAddress.Address, 18180);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,9 +65,9 @@ namespace linker.plugins.tunnel
|
||||
|
||||
serviceCollection.AddSingleton<TunnelUpnpTransfer>();
|
||||
|
||||
serviceCollection.AddSingleton<ConfigSyncTunnelTransports>();
|
||||
|
||||
serviceCollection.AddSingleton<TunnelConfigSyncTransports>();
|
||||
|
||||
serviceCollection.AddSingleton<TunnelConfigTransfer>();
|
||||
}
|
||||
|
||||
public void AddServer(ServiceCollection serviceCollection, FileConfig config)
|
||||
@@ -83,16 +83,6 @@ namespace linker.plugins.tunnel
|
||||
|
||||
public void UseClient(ServiceProvider serviceProvider, FileConfig config)
|
||||
{
|
||||
ClientConfigTransfer clientConfigTransfer = serviceProvider.GetService<ClientConfigTransfer>();
|
||||
LoggerHelper.Instance.Info($"tunnel route level getting.");
|
||||
config.Data.Client.Tunnel.RouteLevel = NetworkHelper.GetRouteLevel(clientConfigTransfer.Server.Host, out List<IPAddress> ips);
|
||||
config.Data.Client.Tunnel.RouteIPs = ips.ToArray();
|
||||
LoggerHelper.Instance.Warning($"route ips:{string.Join(",", ips.Select(c => c.ToString()))}");
|
||||
config.Data.Client.Tunnel.LocalIPs = NetworkHelper.GetIPV6().Concat(NetworkHelper.GetIPV4()).ToArray();
|
||||
LoggerHelper.Instance.Warning($"tunnel local ips :{string.Join(",", config.Data.Client.Tunnel.LocalIPs.Select(c => c.ToString()))}");
|
||||
LoggerHelper.Instance.Warning($"tunnel route level:{config.Data.Client.Tunnel.RouteLevel}");
|
||||
|
||||
|
||||
ITunnelAdapter tunnelAdapter = serviceProvider.GetService<ITunnelAdapter>();
|
||||
TunnelUpnpTransfer upnpTransfer = serviceProvider.GetService<TunnelUpnpTransfer>();
|
||||
|
||||
@@ -117,11 +107,17 @@ namespace linker.plugins.tunnel
|
||||
TunnelTransfer tunnel = serviceProvider.GetService<TunnelTransfer>();
|
||||
tunnel.LoadTransports(compack, tunnelAdapter, upnpTransfer, transports);
|
||||
|
||||
TunnelConfigTransfer tunnelConfigTransfer = serviceProvider.GetService<TunnelConfigTransfer>();
|
||||
TunnelExcludeIPTransfer excludeIPTransfer = serviceProvider.GetService<TunnelExcludeIPTransfer>();
|
||||
TunnelExcludeIPTypesLoader tunnelExcludeIPTypesLoader = serviceProvider.GetService<TunnelExcludeIPTypesLoader>();
|
||||
|
||||
ClientConfigTransfer clientConfigTransfer = serviceProvider.GetService<ClientConfigTransfer>();
|
||||
TunnelConfigTransfer tunnelConfigTransfer = serviceProvider.GetService<TunnelConfigTransfer>();
|
||||
|
||||
LoggerHelper.Instance.Info($"tunnel route level getting.");
|
||||
tunnelConfigTransfer.RefreshRouteLevel();
|
||||
LoggerHelper.Instance.Warning($"route ips:{string.Join(",", tunnelConfigTransfer.RouteIPs.Select(c => c.ToString()))}");
|
||||
LoggerHelper.Instance.Warning($"tunnel local ips :{string.Join(",", tunnelConfigTransfer.LocalIPs.Select(c => c.ToString()))}");
|
||||
LoggerHelper.Instance.Warning($"tunnel route level:{tunnelConfigTransfer.RouteLevel}");
|
||||
}
|
||||
|
||||
public void UseServer(ServiceProvider serviceProvider, FileConfig config)
|
||||
|
||||
@@ -5,15 +5,15 @@ namespace linker.plugins.tuntap
|
||||
{
|
||||
public sealed class ExcludeIP : ITunnelExcludeIP
|
||||
{
|
||||
private readonly RunningConfig runningConfig;
|
||||
public ExcludeIP(RunningConfig runningConfig)
|
||||
private readonly TuntapConfigTransfer tuntapConfigTransfer;
|
||||
public ExcludeIP(TuntapConfigTransfer tuntapConfigTransfer)
|
||||
{
|
||||
this.runningConfig = runningConfig;
|
||||
this.tuntapConfigTransfer = tuntapConfigTransfer;
|
||||
}
|
||||
public ExcludeIPItem[] Get()
|
||||
{
|
||||
//网卡IP不参与打洞
|
||||
return new ExcludeIPItem[] { new ExcludeIPItem { IPAddress = runningConfig.Data.Tuntap.IP, Mask = 32 } };
|
||||
return new ExcludeIPItem[] { new ExcludeIPItem { IPAddress = tuntapConfigTransfer.IP, Mask = 32 } };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,8 +10,7 @@ using linker.plugins.tuntap.config;
|
||||
using linker.tun;
|
||||
using linker.plugins.tuntap.lease;
|
||||
using linker.plugins.decenter;
|
||||
using System.Text.RegularExpressions;
|
||||
using linker.libs.extends;
|
||||
using linker.plugins.tunnel;
|
||||
|
||||
namespace linker.plugins.tuntap
|
||||
{
|
||||
@@ -20,15 +19,20 @@ namespace linker.plugins.tuntap
|
||||
public string Name => "tuntap";
|
||||
public VersionManager DataVersion { get; } = new VersionManager();
|
||||
|
||||
private TuntapConfigInfo configInfo => runningConfig.Data.Tuntap;
|
||||
public IPAddress IP=> configInfo.IP;
|
||||
public bool Running => configInfo.Running;
|
||||
public TuntapSwitch Switch => configInfo.Switch;
|
||||
public string DeviceName => "linker";
|
||||
|
||||
|
||||
private readonly IMessengerSender messengerSender;
|
||||
private readonly ClientSignInState clientSignInState;
|
||||
private readonly FileConfig config;
|
||||
private readonly TuntapProxy tuntapProxy;
|
||||
private readonly RunningConfig runningConfig;
|
||||
private readonly TuntapTransfer tuntapTransfer;
|
||||
private readonly LeaseClientTreansfer leaseClientTreansfer;
|
||||
private readonly ClientConfigTransfer clientConfigTransfer;
|
||||
private readonly TunnelConfigTransfer tunnelConfigTransfer;
|
||||
|
||||
private LinkerTunDeviceRouteItem[] routeItems = new LinkerTunDeviceRouteItem[0];
|
||||
private List<LinkerTunDeviceForwardItem> forwardItems = new List<LinkerTunDeviceForwardItem>();
|
||||
@@ -38,30 +42,33 @@ namespace linker.plugins.tuntap
|
||||
public ConcurrentDictionary<string, TuntapInfo> Infos => tuntapInfos;
|
||||
|
||||
|
||||
public Action HandleReset { get; set; }
|
||||
public Action<TuntapVeaLanIPAddress[]> HandleSetIPs { get; set; }
|
||||
public Action<string,uint> HandleSetIP { get; set; }
|
||||
public Action<string> HandleRemoveIP { get; set; }
|
||||
|
||||
|
||||
private readonly SemaphoreSlim slim = new SemaphoreSlim(1);
|
||||
public TuntapConfigTransfer(IMessengerSender messengerSender, ClientSignInState clientSignInState, FileConfig config, TuntapProxy tuntapProxy, RunningConfig runningConfig, TuntapTransfer tuntapTransfer, LeaseClientTreansfer leaseClientTreansfer, ClientConfigTransfer clientConfigTransfer)
|
||||
public TuntapConfigTransfer(IMessengerSender messengerSender, ClientSignInState clientSignInState, RunningConfig runningConfig, TuntapTransfer tuntapTransfer, LeaseClientTreansfer leaseClientTreansfer, ClientConfigTransfer clientConfigTransfer, TunnelConfigTransfer tunnelConfigTransfer)
|
||||
{
|
||||
this.messengerSender = messengerSender;
|
||||
this.clientSignInState = clientSignInState;
|
||||
this.config = config;
|
||||
this.tuntapProxy = tuntapProxy;
|
||||
this.runningConfig = runningConfig;
|
||||
this.tuntapTransfer = tuntapTransfer;
|
||||
this.leaseClientTreansfer = leaseClientTreansfer;
|
||||
this.clientConfigTransfer = clientConfigTransfer;
|
||||
this.tunnelConfigTransfer = tunnelConfigTransfer;
|
||||
|
||||
clientSignInState.NetworkEnabledHandle += NetworkEnable;
|
||||
tuntapProxy.RefreshConfig = RefreshConfig;
|
||||
|
||||
tuntapTransfer.OnSetupBefore += () => { DataVersion.Add(); };
|
||||
tuntapTransfer.OnSetupAfter += () => { DataVersion.Add(); };
|
||||
tuntapTransfer.OnSetupSuccess += () => { DataVersion.Add(); runningConfig.Data.Tuntap.Running = true; runningConfig.Data.Update(); AddForward(); };
|
||||
tuntapTransfer.OnSetupSuccess += () => { DataVersion.Add(); configInfo.Running = true; runningConfig.Data.Update(); AddForward(); };
|
||||
|
||||
tuntapTransfer.OnShutdownBefore += () => { DataVersion.Add(); };
|
||||
tuntapTransfer.OnShutdownAfter += () => { DataVersion.Add(); };
|
||||
tuntapTransfer.OnShutdownSuccess += () => { DataVersion.Add(); DeleteForward(); DelRoute(); runningConfig.Data.Tuntap.Running = false; runningConfig.Data.Update(); DataVersion.Add(); };
|
||||
tuntapTransfer.OnShutdownSuccess += () => { DataVersion.Add(); DeleteForward(); DelRoute(); configInfo.Running = false; runningConfig.Data.Update(); DataVersion.Add(); };
|
||||
|
||||
InitConfig();
|
||||
}
|
||||
|
||||
string groupid = string.Empty;
|
||||
@@ -69,21 +76,13 @@ namespace linker.plugins.tuntap
|
||||
{
|
||||
if (groupid != clientConfigTransfer.Group.Id)
|
||||
{
|
||||
tuntapInfos.Clear(); tuntapProxy.ClearIPs();
|
||||
tuntapInfos.Clear(); HandleReset();
|
||||
}
|
||||
groupid = clientConfigTransfer.Group.Id;
|
||||
|
||||
RefreshIP();
|
||||
}
|
||||
|
||||
|
||||
private void InitConfig()
|
||||
{
|
||||
if (runningConfig.Data.Tuntap.Lans.Count == 0 && runningConfig.Data.Tuntap.LanIPs.Length > 0)
|
||||
{
|
||||
runningConfig.Data.Tuntap.Lans = runningConfig.Data.Tuntap.LanIPs.Select((a, b) => new TuntapLanInfo { IP = a, PrefixLength = (byte)runningConfig.Data.Tuntap.Masks[b] }).ToList();
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 更新本机网卡信息
|
||||
/// </summary>
|
||||
@@ -92,25 +91,22 @@ namespace linker.plugins.tuntap
|
||||
{
|
||||
TimerHelper.Async(async () =>
|
||||
{
|
||||
IPAddress oldIP = runningConfig.Data.Tuntap.IP;
|
||||
byte prefixLength = runningConfig.Data.Tuntap.PrefixLength;
|
||||
IPAddress oldIP = configInfo.IP;
|
||||
byte prefixLength = configInfo.PrefixLength;
|
||||
|
||||
runningConfig.Data.Tuntap.IP = info.IP ?? IPAddress.Any;
|
||||
runningConfig.Data.Tuntap.Lans = info.Lans;
|
||||
runningConfig.Data.Tuntap.PrefixLength = info.PrefixLength;
|
||||
runningConfig.Data.Tuntap.Switch = info.Switch;
|
||||
runningConfig.Data.Tuntap.Forwards = info.Forwards;
|
||||
configInfo.IP = info.IP ?? IPAddress.Any;
|
||||
configInfo.Lans = info.Lans;
|
||||
configInfo.PrefixLength = info.PrefixLength;
|
||||
configInfo.Switch = info.Switch;
|
||||
configInfo.Forwards = info.Forwards;
|
||||
runningConfig.Data.Update();
|
||||
|
||||
TuntapGroup2IPInfo tuntapGroup2IPInfo = new TuntapGroup2IPInfo { IP = runningConfig.Data.Tuntap.IP, PrefixLength = runningConfig.Data.Tuntap.PrefixLength };
|
||||
runningConfig.Data.Tuntap.Group2IP.AddOrUpdate(clientConfigTransfer.Group.Id, tuntapGroup2IPInfo, (a, b) => tuntapGroup2IPInfo);
|
||||
TuntapGroup2IPInfo tuntapGroup2IPInfo = new TuntapGroup2IPInfo { IP = configInfo.IP, PrefixLength = configInfo.PrefixLength };
|
||||
configInfo.Group2IP.AddOrUpdate(clientConfigTransfer.Group.Id, tuntapGroup2IPInfo, (a, b) => tuntapGroup2IPInfo);
|
||||
|
||||
await LeaseIP();
|
||||
|
||||
bool needReboot = (oldIP.Equals(runningConfig.Data.Tuntap.IP) == false || prefixLength != runningConfig.Data.Tuntap.PrefixLength) && runningConfig.Data.Tuntap.Running
|
||||
|| runningConfig.Data.Tuntap.Running && tuntapTransfer.Status != TuntapStatus.Running;
|
||||
|
||||
if (needReboot)
|
||||
if ((oldIP.Equals(configInfo.IP) == false || prefixLength != configInfo.PrefixLength) && configInfo.Running)
|
||||
{
|
||||
await RetstartDevice();
|
||||
}
|
||||
@@ -123,22 +119,21 @@ namespace linker.plugins.tuntap
|
||||
DataVersion.Add();
|
||||
});
|
||||
}
|
||||
|
||||
public Memory<byte> GetData()
|
||||
{
|
||||
TuntapInfo info = new TuntapInfo
|
||||
{
|
||||
IP = runningConfig.Data.Tuntap.IP,
|
||||
Lans = runningConfig.Data.Tuntap.Lans.Where(c => c.IP != null && c.IP.Equals(IPAddress.Any) == false).Select(c => { c.Exists = false; return c; }).ToList(),
|
||||
PrefixLength = runningConfig.Data.Tuntap.PrefixLength,
|
||||
IP = configInfo.IP,
|
||||
Lans = configInfo.Lans.Where(c => c.IP != null && c.IP.Equals(IPAddress.Any) == false).Select(c => { c.Exists = false; return c; }).ToList(),
|
||||
PrefixLength = configInfo.PrefixLength,
|
||||
MachineId = clientConfigTransfer.Id,
|
||||
Status = tuntapTransfer.Status,
|
||||
SetupError = tuntapTransfer.SetupError,
|
||||
NatError = tuntapTransfer.NatError,
|
||||
SystemInfo = $"{System.Runtime.InteropServices.RuntimeInformation.OSDescription} {(string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("SNLTTY_LINKER_IS_DOCKER")) == false ? "Docker" : "")}",
|
||||
|
||||
Forwards = runningConfig.Data.Tuntap.Forwards,
|
||||
Switch = runningConfig.Data.Tuntap.Switch
|
||||
Forwards = configInfo.Forwards,
|
||||
Switch = configInfo.Switch
|
||||
};
|
||||
tuntapInfos.AddOrUpdate(info.MachineId, info, (a, b) => info);
|
||||
Version.Add();
|
||||
@@ -214,7 +209,13 @@ namespace linker.plugins.tuntap
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 刷新信息,把自己的网卡配置发给别人,顺便把别人的网卡信息带回来
|
||||
/// </summary>
|
||||
public void RefreshConfig()
|
||||
{
|
||||
DataVersion.Add();
|
||||
}
|
||||
/// <summary>
|
||||
/// 刷新IP
|
||||
/// </summary>
|
||||
@@ -222,8 +223,8 @@ namespace linker.plugins.tuntap
|
||||
{
|
||||
TimerHelper.Async(async () =>
|
||||
{
|
||||
IPAddress oldIP = runningConfig.Data.Tuntap.IP;
|
||||
byte prefixLength = runningConfig.Data.Tuntap.PrefixLength;
|
||||
IPAddress oldIP = configInfo.IP;
|
||||
byte prefixLength = configInfo.PrefixLength;
|
||||
|
||||
await LeaseIP();
|
||||
while (tuntapTransfer.Status == TuntapStatus.Operating)
|
||||
@@ -231,19 +232,41 @@ namespace linker.plugins.tuntap
|
||||
await Task.Delay(1000);
|
||||
}
|
||||
|
||||
bool run = (oldIP.Equals(runningConfig.Data.Tuntap.IP) == false || prefixLength != runningConfig.Data.Tuntap.PrefixLength) && runningConfig.Data.Tuntap.Running
|
||||
|| runningConfig.Data.Tuntap.Running && tuntapTransfer.Status != TuntapStatus.Running;
|
||||
bool run = (oldIP.Equals(configInfo.IP) == false || prefixLength != configInfo.PrefixLength) && configInfo.Running
|
||||
|| configInfo.Running && tuntapTransfer.Status != TuntapStatus.Running;
|
||||
|
||||
if (run)
|
||||
{
|
||||
tuntapTransfer.Shutdown();
|
||||
tuntapTransfer.Setup(runningConfig.Data.Tuntap.IP, runningConfig.Data.Tuntap.PrefixLength);
|
||||
tuntapTransfer.Setup(configInfo.IP, configInfo.PrefixLength);
|
||||
}
|
||||
DataVersion.Add();
|
||||
});
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// 租赁IP
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private async Task LeaseIP()
|
||||
{
|
||||
if (configInfo.Group2IP.TryGetValue(clientConfigTransfer.Group.Id, out TuntapGroup2IPInfo tuntapGroup2IPInfo))
|
||||
{
|
||||
if (tuntapGroup2IPInfo.IP.Equals(configInfo.IP) == false || tuntapGroup2IPInfo.PrefixLength != configInfo.PrefixLength)
|
||||
{
|
||||
configInfo.IP = tuntapGroup2IPInfo.IP;
|
||||
configInfo.PrefixLength = tuntapGroup2IPInfo.PrefixLength;
|
||||
}
|
||||
}
|
||||
LeaseInfo leaseInfo = await leaseClientTreansfer.LeaseIp(configInfo.IP, configInfo.PrefixLength);
|
||||
configInfo.IP = leaseInfo.IP;
|
||||
configInfo.PrefixLength = leaseInfo.PrefixLength;
|
||||
runningConfig.Data.Update();
|
||||
|
||||
tuntapGroup2IPInfo = new TuntapGroup2IPInfo { IP = configInfo.IP, PrefixLength = configInfo.PrefixLength };
|
||||
configInfo.Group2IP.AddOrUpdate(clientConfigTransfer.Group.Id, tuntapGroup2IPInfo, (a, b) => tuntapGroup2IPInfo);
|
||||
}
|
||||
/// <summary>
|
||||
/// 重启网卡
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
@@ -251,7 +274,7 @@ namespace linker.plugins.tuntap
|
||||
{
|
||||
tuntapTransfer.Shutdown();
|
||||
await LeaseIP();
|
||||
tuntapTransfer.Setup(runningConfig.Data.Tuntap.IP, runningConfig.Data.Tuntap.PrefixLength);
|
||||
tuntapTransfer.Setup(configInfo.IP, configInfo.PrefixLength);
|
||||
}
|
||||
/// <summary>
|
||||
/// 关闭网卡
|
||||
@@ -260,36 +283,7 @@ namespace linker.plugins.tuntap
|
||||
{
|
||||
tuntapTransfer.Shutdown();
|
||||
}
|
||||
/// <summary>
|
||||
/// 租赁IP
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private async Task LeaseIP()
|
||||
{
|
||||
if (runningConfig.Data.Tuntap.Group2IP.TryGetValue(clientConfigTransfer.Group.Id, out TuntapGroup2IPInfo tuntapGroup2IPInfo))
|
||||
{
|
||||
if (tuntapGroup2IPInfo.IP.Equals(runningConfig.Data.Tuntap.IP) == false || tuntapGroup2IPInfo.PrefixLength != runningConfig.Data.Tuntap.PrefixLength)
|
||||
{
|
||||
runningConfig.Data.Tuntap.IP = tuntapGroup2IPInfo.IP;
|
||||
runningConfig.Data.Tuntap.PrefixLength = tuntapGroup2IPInfo.PrefixLength;
|
||||
}
|
||||
}
|
||||
LeaseInfo leaseInfo = await leaseClientTreansfer.LeaseIp(runningConfig.Data.Tuntap.IP, runningConfig.Data.Tuntap.PrefixLength);
|
||||
runningConfig.Data.Tuntap.IP = leaseInfo.IP;
|
||||
runningConfig.Data.Tuntap.PrefixLength = leaseInfo.PrefixLength;
|
||||
runningConfig.Data.Update();
|
||||
|
||||
tuntapGroup2IPInfo = new TuntapGroup2IPInfo { IP = runningConfig.Data.Tuntap.IP, PrefixLength = runningConfig.Data.Tuntap.PrefixLength };
|
||||
runningConfig.Data.Tuntap.Group2IP.AddOrUpdate(clientConfigTransfer.Group.Id, tuntapGroup2IPInfo, (a, b) => tuntapGroup2IPInfo);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 刷新信息,把自己的网卡配置发给别人,顺便把别人的网卡信息带回来
|
||||
/// </summary>
|
||||
public void RefreshConfig()
|
||||
{
|
||||
DataVersion.Add();
|
||||
}
|
||||
|
||||
// <summary>
|
||||
/// 添加端口转发
|
||||
@@ -314,7 +308,7 @@ namespace linker.plugins.tuntap
|
||||
}
|
||||
private List<LinkerTunDeviceForwardItem> ParseForwardItems()
|
||||
{
|
||||
return runningConfig.Data.Tuntap.Forwards.Select(c => new LinkerTunDeviceForwardItem { ListenAddr = c.ListenAddr, ListenPort = c.ListenPort, ConnectAddr = c.ConnectAddr, ConnectPort = c.ConnectPort }).ToList();
|
||||
return configInfo.Forwards.Select(c => new LinkerTunDeviceForwardItem { ListenAddr = c.ListenAddr, ListenPort = c.ListenPort, ConnectAddr = c.ConnectAddr, ConnectPort = c.ConnectPort }).ToList();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -334,16 +328,16 @@ namespace linker.plugins.tuntap
|
||||
TuntapVeaLanIPAddress[] ips = ipsList.SelectMany(c => c.IPS).ToArray();
|
||||
routeItems = ipsList.SelectMany(c => c.IPS).Select(c => new LinkerTunDeviceRouteItem { Address = c.OriginIPAddress, PrefixLength = c.PrefixLength }).ToArray();
|
||||
|
||||
tuntapTransfer.AddRoute(routeItems, runningConfig.Data.Tuntap.IP);
|
||||
tuntapTransfer.AddRoute(routeItems, configInfo.IP);
|
||||
|
||||
tuntapProxy.SetIPs(ips);
|
||||
HandleSetIPs(ips);
|
||||
foreach (var item in tuntapInfos.Values)
|
||||
{
|
||||
tuntapProxy.SetIP(item.MachineId, NetworkHelper.IP2Value(item.IP));
|
||||
HandleSetIP(item.MachineId, NetworkHelper.IP2Value(item.IP));
|
||||
}
|
||||
foreach (var item in tuntapInfos.Values.Where(c => c.IP.Equals(IPAddress.Any)))
|
||||
{
|
||||
tuntapProxy.RemoveIP(item.MachineId);
|
||||
HandleRemoveIP(item.MachineId);
|
||||
}
|
||||
Version.Add();
|
||||
}
|
||||
@@ -352,13 +346,13 @@ namespace linker.plugins.tuntap
|
||||
{
|
||||
//排除的IP,
|
||||
uint[] excludeIps =//本机局域网IP
|
||||
config.Data.Client.Tunnel.LocalIPs.Where(c => c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
|
||||
tunnelConfigTransfer.LocalIPs.Where(c => c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
|
||||
//路由上的IP
|
||||
.Concat(config.Data.Client.Tunnel.RouteIPs)
|
||||
.Concat(tunnelConfigTransfer.RouteIPs)
|
||||
//网卡IP 服务器IP
|
||||
.Concat(new IPAddress[] { runningConfig.Data.Tuntap.IP, clientSignInState.Connection.Address.Address })
|
||||
.Concat(new IPAddress[] { configInfo.IP, clientSignInState.Connection.Address.Address })
|
||||
//网卡配置的局域网IP
|
||||
.Concat(runningConfig.Data.Tuntap.Lans.Select(c => c.IP))
|
||||
.Concat(configInfo.Lans.Select(c => c.IP))
|
||||
.Select(NetworkHelper.IP2Value)
|
||||
.ToArray();
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@ using linker.libs;
|
||||
using linker.plugins.tuntap.config;
|
||||
using linker.tun;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Xml.Linq;
|
||||
|
||||
namespace linker.plugins.tuntap
|
||||
{
|
||||
@@ -29,7 +28,7 @@ namespace linker.plugins.tuntap
|
||||
{
|
||||
TimerHelper.SetInterval(async () =>
|
||||
{
|
||||
if (setupTimes > 0 && runningConfig.Data.Tuntap.Running && OperatingSystem.IsWindows())
|
||||
if (setupTimes > 0 && tuntapConfigTransfer.Running && OperatingSystem.IsWindows())
|
||||
{
|
||||
await InterfaceCheck().ConfigureAwait(false);
|
||||
InterfaceOrder();
|
||||
@@ -41,7 +40,7 @@ namespace linker.plugins.tuntap
|
||||
{
|
||||
if (await InterfaceAvailable() == false && tuntapTransfer.Status != TuntapStatus.Operating)
|
||||
{
|
||||
LoggerHelper.Instance.Error($"tuntap inerface {tuntapTransfer.DeviceName} is down, restarting");
|
||||
LoggerHelper.Instance.Error($"tuntap inerface {tuntapConfigTransfer.DeviceName} is down, restarting");
|
||||
linkerTunDeviceAdapter.Shutdown();
|
||||
await Task.Delay(5000).ConfigureAwait(false);
|
||||
if (await InterfaceAvailable() == false && tuntapTransfer.Status != TuntapStatus.Operating)
|
||||
@@ -52,7 +51,7 @@ namespace linker.plugins.tuntap
|
||||
}
|
||||
private async Task<bool> InterfaceAvailable()
|
||||
{
|
||||
NetworkInterface networkInterface = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(c => c.Name == tuntapTransfer.DeviceName);
|
||||
NetworkInterface networkInterface = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(c => c.Name == tuntapConfigTransfer.DeviceName);
|
||||
return networkInterface != null && networkInterface.OperationalStatus == OperationalStatus.Up && await InterfacePing();
|
||||
}
|
||||
private async Task<bool> InterfacePing()
|
||||
@@ -60,7 +59,7 @@ namespace linker.plugins.tuntap
|
||||
try
|
||||
{
|
||||
using Ping ping = new Ping();
|
||||
PingReply pingReply = await ping.SendPingAsync(runningConfig.Data.Tuntap.IP, 500);
|
||||
PingReply pingReply = await ping.SendPingAsync(tuntapConfigTransfer.IP, 500);
|
||||
return pingReply.Status == IPStatus.Success;
|
||||
}
|
||||
catch (Exception)
|
||||
@@ -71,7 +70,7 @@ namespace linker.plugins.tuntap
|
||||
|
||||
private void InterfaceOrder()
|
||||
{
|
||||
NetworkInterface linker = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(c => c.Name == tuntapTransfer.DeviceName);
|
||||
NetworkInterface linker = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(c => c.Name == tuntapConfigTransfer.DeviceName);
|
||||
NetworkInterface first = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault();
|
||||
|
||||
if (linker != null && linker.Name != first.Name)
|
||||
@@ -79,14 +78,14 @@ namespace linker.plugins.tuntap
|
||||
int metricv4 = 0;
|
||||
int metricv6 = 0;
|
||||
List<string> commands = new List<string> {
|
||||
$"netsh interface ipv4 set interface \"{tuntapTransfer.DeviceName}\" metric={++metricv4}",
|
||||
$"netsh interface ipv6 set interface \"{tuntapTransfer.DeviceName}\" metric={++metricv6}"
|
||||
$"netsh interface ipv4 set interface \"{tuntapConfigTransfer.DeviceName}\" metric={++metricv4}",
|
||||
$"netsh interface ipv6 set interface \"{tuntapConfigTransfer.DeviceName}\" metric={++metricv6}"
|
||||
};
|
||||
commands.AddRange(NetworkInterface.GetAllNetworkInterfaces()
|
||||
.Where(c => c.Name != tuntapTransfer.DeviceName)
|
||||
.Where(c => c.Name != tuntapConfigTransfer.DeviceName)
|
||||
.Select(c => $"netsh interface ipv4 set interface \"{c.Name}\" metric={++metricv4}"));
|
||||
commands.AddRange(NetworkInterface.GetAllNetworkInterfaces()
|
||||
.Where(c => c.Name != tuntapTransfer.DeviceName)
|
||||
.Where(c => c.Name != tuntapConfigTransfer.DeviceName)
|
||||
.Select(c => $"netsh interface ipv6 set interface \"{c.Name}\" metric={++metricv6}"));
|
||||
CommandHelper.Windows(string.Empty, commands.ToArray());
|
||||
}
|
||||
|
||||
@@ -15,18 +15,14 @@ namespace linker.plugins.tuntap
|
||||
{
|
||||
private readonly TuntapTransfer tuntapTransfer;
|
||||
private readonly TuntapConfigTransfer tuntapConfigTransfer;
|
||||
private readonly FileConfig config;
|
||||
private readonly TuntapProxy tuntapProxy;
|
||||
private readonly RunningConfig runningConfig;
|
||||
private readonly ClientConfigTransfer clientConfigTransfer;
|
||||
|
||||
public TuntapPingTransfer(TuntapTransfer tuntapTransfer, TuntapConfigTransfer tuntapConfigTransfer, FileConfig config, TuntapProxy tuntapProxy, RunningConfig runningConfig, ClientConfigTransfer clientConfigTransfer)
|
||||
public TuntapPingTransfer(TuntapTransfer tuntapTransfer, TuntapConfigTransfer tuntapConfigTransfer, TuntapProxy tuntapProxy, ClientConfigTransfer clientConfigTransfer)
|
||||
{
|
||||
this.tuntapTransfer = tuntapTransfer;
|
||||
this.tuntapConfigTransfer = tuntapConfigTransfer;
|
||||
this.config = config;
|
||||
this.tuntapProxy = tuntapProxy;
|
||||
this.runningConfig = runningConfig;
|
||||
this.clientConfigTransfer = clientConfigTransfer;
|
||||
|
||||
PingTask();
|
||||
@@ -51,10 +47,10 @@ namespace linker.plugins.tuntap
|
||||
}
|
||||
private async Task Ping()
|
||||
{
|
||||
if (tuntapTransfer.Status == TuntapStatus.Running && (runningConfig.Data.Tuntap.Switch & TuntapSwitch.ShowDelay) == TuntapSwitch.ShowDelay)
|
||||
if (tuntapTransfer.Status == TuntapStatus.Running && (tuntapConfigTransfer.Switch & TuntapSwitch.ShowDelay) == TuntapSwitch.ShowDelay)
|
||||
{
|
||||
var items = tuntapConfigTransfer.Infos.Values.Where(c => c.IP != null && c.IP.Equals(IPAddress.Any) == false && (c.Status & TuntapStatus.Running) == TuntapStatus.Running);
|
||||
if ((runningConfig.Data.Tuntap.Switch & TuntapSwitch.AutoConnect) != TuntapSwitch.AutoConnect)
|
||||
if ((tuntapConfigTransfer.Switch & TuntapSwitch.AutoConnect) != TuntapSwitch.AutoConnect)
|
||||
{
|
||||
var connections = tuntapProxy.GetConnections();
|
||||
items = items.Where(c => connections.TryGetValue(c.MachineId, out ITunnelConnection connection) && connection.Connected || c.MachineId == clientConfigTransfer.Id);
|
||||
|
||||
@@ -26,19 +26,21 @@ namespace linker.plugins.tuntap
|
||||
private readonly LinkerTunDeviceAdapter linkerTunDeviceAdapter;
|
||||
|
||||
private HashSet<uint> ipRefreshCache = new HashSet<uint>();
|
||||
public Action RefreshConfig = () => { };
|
||||
|
||||
private readonly RunningConfig runningConfig;
|
||||
private readonly ClientSignInState clientSignInState;
|
||||
private readonly ClientSignInTransfer clientSignInTransfer;
|
||||
private readonly TuntapConfigTransfer tuntapConfigTransfer;
|
||||
|
||||
public TuntapProxy(ClientConfigTransfer clientConfigTransfer, RunningConfig runningConfig, TunnelTransfer tunnelTransfer, RelayTransfer relayTransfer, PcpTransfer pcpTransfer, ClientSignInTransfer clientSignInTransfer, LinkerTunDeviceAdapter linkerTunDeviceAdapter, ClientSignInState clientSignInState)
|
||||
: base(tunnelTransfer, relayTransfer, pcpTransfer, clientSignInTransfer, clientSignInState, runningConfig, clientConfigTransfer)
|
||||
public TuntapProxy(ClientConfigTransfer clientConfigTransfer, TunnelTransfer tunnelTransfer, RelayTransfer relayTransfer, PcpTransfer pcpTransfer, ClientSignInTransfer clientSignInTransfer, LinkerTunDeviceAdapter linkerTunDeviceAdapter, ClientSignInState clientSignInState,RelayClientConfigTransfer relayClientConfigTransfer, TuntapConfigTransfer tuntapConfigTransfer)
|
||||
: base(tunnelTransfer, relayTransfer, pcpTransfer, clientSignInTransfer, clientSignInState, clientConfigTransfer, relayClientConfigTransfer)
|
||||
{
|
||||
this.clientSignInTransfer = clientSignInTransfer;
|
||||
this.runningConfig = runningConfig;
|
||||
this.linkerTunDeviceAdapter = linkerTunDeviceAdapter;
|
||||
this.clientSignInState = clientSignInState;
|
||||
this.tuntapConfigTransfer = tuntapConfigTransfer;
|
||||
|
||||
tuntapConfigTransfer.HandleReset += ClearIPs;
|
||||
tuntapConfigTransfer.HandleSetIPs += SetIPs;
|
||||
tuntapConfigTransfer.HandleSetIP += SetIP;
|
||||
tuntapConfigTransfer.HandleRemoveIP += RemoveIP;
|
||||
}
|
||||
|
||||
protected override void Connected(ITunnelConnection connection)
|
||||
@@ -73,7 +75,7 @@ namespace linker.plugins.tuntap
|
||||
/// <returns></returns>
|
||||
public async Task Closed(ITunnelConnection connection, object state)
|
||||
{
|
||||
RefreshConfig();
|
||||
tuntapConfigTransfer.RefreshConfig();
|
||||
Version.Add();
|
||||
await Task.CompletedTask;
|
||||
}
|
||||
@@ -88,7 +90,7 @@ namespace linker.plugins.tuntap
|
||||
//IPV4广播组播、IPV6 多播
|
||||
if (packet.IPV4Broadcast || packet.IPV6Multicast)
|
||||
{
|
||||
if (connections.IsEmpty == false && (runningConfig.Data.Tuntap.Switch & TuntapSwitch.Multicast) == 0)
|
||||
if (connections.IsEmpty == false && (tuntapConfigTransfer.Switch & TuntapSwitch.Multicast) == 0)
|
||||
{
|
||||
await Task.WhenAll(connections.Values.Where(c => c != null && c.Connected).Select(c => c.SendAsync(packet.Packet)));
|
||||
}
|
||||
@@ -130,7 +132,7 @@ namespace linker.plugins.tuntap
|
||||
/// 设置IP,等下有连接进来,用IP匹配,才能知道这个连接是要连谁
|
||||
/// </summary>
|
||||
/// <param name="ips"></param>
|
||||
public void SetIPs(TuntapVeaLanIPAddress[] ips)
|
||||
private void SetIPs(TuntapVeaLanIPAddress[] ips)
|
||||
{
|
||||
var dic = ips.GroupBy(c => c.NetWork).ToDictionary(c => c.Key, d => d.Select(e => e.MachineId).ToList());
|
||||
foreach (var item in dic.Where(c => c.Value.Count > 0))
|
||||
@@ -151,7 +153,7 @@ namespace linker.plugins.tuntap
|
||||
/// </summary>
|
||||
/// <param name="machineId"></param>
|
||||
/// <param name="ip"></param>
|
||||
public void SetIP(string machineId, uint ip)
|
||||
private void SetIP(string machineId, uint ip)
|
||||
{
|
||||
ip2MachineDic.AddOrUpdate(ip, machineId, (a, b) => machineId);
|
||||
if (ipConnections.TryGetValue(ip, out ITunnelConnection connection) && machineId != connection.RemoteMachineId)
|
||||
@@ -163,7 +165,7 @@ namespace linker.plugins.tuntap
|
||||
/// 移除
|
||||
/// </summary>
|
||||
/// <param name="machineId"></param>
|
||||
public void RemoveIP(string machineId)
|
||||
private void RemoveIP(string machineId)
|
||||
{
|
||||
foreach (var item in ip2MachineDic.Where(c => c.Value == machineId).ToList())
|
||||
{
|
||||
@@ -197,7 +199,7 @@ namespace linker.plugins.tuntap
|
||||
if (ipRefreshCache.Contains(ip) == false)
|
||||
{
|
||||
ipRefreshCache.Add(ip);
|
||||
RefreshConfig();
|
||||
tuntapConfigTransfer.RefreshConfig();
|
||||
}
|
||||
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||
{
|
||||
@@ -208,7 +210,7 @@ namespace linker.plugins.tuntap
|
||||
|
||||
}
|
||||
|
||||
public void ClearIPs()
|
||||
private void ClearIPs()
|
||||
{
|
||||
ip2MachineDic.Clear();
|
||||
ipConnections.Clear();
|
||||
|
||||
@@ -57,6 +57,7 @@ namespace linker.plugins.tuntap
|
||||
TuntapPingTransfer tuntapPingTransfer = serviceProvider.GetService<TuntapPingTransfer>();
|
||||
TuntapDeviceStatusTransfer tuntapDeviceStatusTransfer = serviceProvider.GetService<TuntapDeviceStatusTransfer>();
|
||||
|
||||
tuntapTransfer.Init(tuntapConfigTransfer.DeviceName, tuntapProxy);
|
||||
}
|
||||
|
||||
public void UseServer(ServiceProvider serviceProvider, FileConfig config)
|
||||
|
||||
@@ -16,8 +16,6 @@ namespace linker.plugins.tuntap
|
||||
public string SetupError => linkerTunDeviceAdapter.SetupError;
|
||||
public string NatError => linkerTunDeviceAdapter.NatError;
|
||||
|
||||
public string DeviceName => "linker";
|
||||
|
||||
public Action OnSetupBefore { get; set; } = () => { };
|
||||
public Action OnSetupAfter { get; set; } = () => { };
|
||||
public Action OnSetupSuccess { get; set; } = () => { };
|
||||
@@ -25,11 +23,14 @@ namespace linker.plugins.tuntap
|
||||
public Action OnShutdownAfter { get; set; } = () => { };
|
||||
public Action OnShutdownSuccess { get; set; } = () => { };
|
||||
|
||||
public TuntapTransfer(ClientSignInState clientSignInState, LinkerTunDeviceAdapter linkerTunDeviceAdapter, TuntapProxy tuntapProxy, RunningConfig runningConfig)
|
||||
public TuntapTransfer(LinkerTunDeviceAdapter linkerTunDeviceAdapter)
|
||||
{
|
||||
this.linkerTunDeviceAdapter = linkerTunDeviceAdapter;
|
||||
}
|
||||
|
||||
linkerTunDeviceAdapter.Initialize(DeviceName, tuntapProxy);
|
||||
public void Init(string name,ILinkerTunDeviceCallback linkerTunDeviceCallback)
|
||||
{
|
||||
linkerTunDeviceAdapter.Initialize(name, linkerTunDeviceCallback);
|
||||
AppDomain.CurrentDomain.ProcessExit += (s, e) => linkerTunDeviceAdapter.Shutdown();
|
||||
Console.CancelKeyPress += (s, e) => linkerTunDeviceAdapter.Shutdown();
|
||||
}
|
||||
|
||||
@@ -4,6 +4,18 @@ using MemoryPack;
|
||||
using System.Collections.Concurrent;
|
||||
using System.Net;
|
||||
|
||||
|
||||
|
||||
namespace linker.client.config
|
||||
{
|
||||
public sealed partial class RunningConfigInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// 虚拟网卡配置
|
||||
/// </summary>
|
||||
public TuntapConfigInfo Tuntap { get; set; } = new TuntapConfigInfo();
|
||||
}
|
||||
}
|
||||
namespace linker.plugins.tuntap.config
|
||||
{
|
||||
[MemoryPackable]
|
||||
@@ -20,16 +32,6 @@ namespace linker.plugins.tuntap.config
|
||||
/// </summary>
|
||||
public byte PrefixLength { get; set; } = 24;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 局域网IP列表
|
||||
/// </summary>
|
||||
[MemoryPackAllowSerialize]
|
||||
public IPAddress[] LanIPs { get; set; } = Array.Empty<IPAddress>();
|
||||
/// <summary>
|
||||
/// 局域网掩码列表,与IP列表一一对应
|
||||
/// </summary>
|
||||
public int[] Masks { get; set; } = Array.Empty<int>();
|
||||
/// <summary>
|
||||
/// 局域网配置列表
|
||||
/// </summary>
|
||||
@@ -349,14 +351,3 @@ namespace linker.plugins.tuntap.config
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
namespace linker.client.config
|
||||
{
|
||||
public sealed partial class RunningConfigInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// 虚拟网卡配置
|
||||
/// </summary>
|
||||
public TuntapConfigInfo Tuntap { get; set; } = new TuntapConfigInfo();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@ using linker.plugins.client;
|
||||
using linker.plugins.messenger;
|
||||
using linker.plugins.tuntap.messenger;
|
||||
using linker.libs;
|
||||
using linker.libs.extends;
|
||||
|
||||
namespace linker.plugins.tuntap.lease
|
||||
{
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
using linker.config;
|
||||
using linker.plugins.config;
|
||||
using MemoryPack;
|
||||
|
||||
namespace linker.plugins.updater
|
||||
{
|
||||
public sealed class ConfigSyncUpdaterSecretKey : IConfigSync
|
||||
{
|
||||
public string Name => "UpdaterSecretKey";
|
||||
|
||||
private readonly FileConfig fileConfig;
|
||||
public ConfigSyncUpdaterSecretKey(FileConfig fileConfig)
|
||||
{
|
||||
this.fileConfig = fileConfig;
|
||||
}
|
||||
public Memory<byte> GetData()
|
||||
{
|
||||
return MemoryPackSerializer.Serialize(fileConfig.Data.Client.Updater.SecretKey);
|
||||
}
|
||||
|
||||
public void SetData(Memory<byte> data)
|
||||
{
|
||||
fileConfig.Data.Client.Updater.SecretKey = MemoryPackSerializer.Deserialize<string>(data.Span);
|
||||
fileConfig.Data.Update();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -23,8 +23,9 @@ namespace linker.plugins.updater
|
||||
private readonly RunningConfig runningConfig;
|
||||
private readonly AccessTransfer accessTransfer;
|
||||
private readonly ClientConfigTransfer clientConfigTransfer;
|
||||
private readonly UpdaterCommonTransfer updaterCommonTransfer;
|
||||
|
||||
public UpdaterClientApiController(IMessengerSender messengerSender, UpdaterClientTransfer updaterTransfer, ClientSignInState clientSignInState, FileConfig config, RunningConfig runningConfig, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer)
|
||||
public UpdaterClientApiController(IMessengerSender messengerSender, UpdaterClientTransfer updaterTransfer, ClientSignInState clientSignInState, FileConfig config, RunningConfig runningConfig, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer, UpdaterCommonTransfer updaterCommonTransfer)
|
||||
{
|
||||
this.messengerSender = messengerSender;
|
||||
this.updaterTransfer = updaterTransfer;
|
||||
@@ -33,6 +34,7 @@ namespace linker.plugins.updater
|
||||
this.runningConfig = runningConfig;
|
||||
this.accessTransfer = accessTransfer;
|
||||
this.clientConfigTransfer = clientConfigTransfer;
|
||||
this.updaterCommonTransfer = updaterCommonTransfer;
|
||||
}
|
||||
|
||||
[ClientApiAccessAttribute(ClientApiAccess.Config)]
|
||||
@@ -50,7 +52,7 @@ namespace linker.plugins.updater
|
||||
[ClientApiAccessAttribute(ClientApiAccess.Config)]
|
||||
public void SetInterval(ApiControllerParamsInfo param)
|
||||
{
|
||||
updaterTransfer.SetInterval(int.Parse(param.Content));
|
||||
updaterCommonTransfer.SetInterval(int.Parse(param.Content));
|
||||
}
|
||||
|
||||
|
||||
@@ -75,7 +77,7 @@ namespace linker.plugins.updater
|
||||
{
|
||||
Connection = clientSignInState.Connection,
|
||||
MessengerId = (ushort)UpdaterMessengerIds.ConfirmServer,
|
||||
Payload = MemoryPackSerializer.Serialize(new UpdaterConfirmServerInfo { SecretKey = config.Data.Client.Updater.SecretKey, Version = param.Content })
|
||||
Payload = MemoryPackSerializer.Serialize(new UpdaterConfirmServerInfo { SecretKey = updaterTransfer.SecretKey, Version = param.Content })
|
||||
});
|
||||
}
|
||||
[ClientApiAccessAttribute(ClientApiAccess.UpdateServer)]
|
||||
@@ -85,7 +87,7 @@ namespace linker.plugins.updater
|
||||
{
|
||||
Connection = clientSignInState.Connection,
|
||||
MessengerId = (ushort)UpdaterMessengerIds.ExitServer,
|
||||
Payload = MemoryPackSerializer.Serialize(new UpdaterConfirmServerInfo { SecretKey = config.Data.Client.Updater.SecretKey, Version = string.Empty })
|
||||
Payload = MemoryPackSerializer.Serialize(new UpdaterConfirmServerInfo { SecretKey = updaterTransfer.SecretKey, Version = string.Empty })
|
||||
});
|
||||
}
|
||||
|
||||
@@ -123,7 +125,7 @@ namespace linker.plugins.updater
|
||||
return false;
|
||||
}
|
||||
|
||||
confirm.SecretKey = config.Data.Client.Updater.SecretKey;
|
||||
confirm.SecretKey = updaterTransfer.SecretKey;
|
||||
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
|
||||
{
|
||||
Connection = clientSignInState.Connection,
|
||||
|
||||
@@ -15,17 +15,20 @@ namespace linker.plugins.updater
|
||||
private ConcurrentDictionary<string, UpdateInfo> updateInfos = new ConcurrentDictionary<string, UpdateInfo>();
|
||||
private ConcurrentDictionary<string, LastTicksManager> subscribes = new ConcurrentDictionary<string, LastTicksManager>();
|
||||
|
||||
public string SecretKey => fileConfig.Data.Client.Updater.SecretKey;
|
||||
|
||||
private readonly FileConfig fileConfig;
|
||||
private readonly IMessengerSender messengerSender;
|
||||
private readonly ClientSignInState clientSignInState;
|
||||
private readonly UpdaterHelper updaterHelper;
|
||||
private readonly ClientConfigTransfer clientConfigTransfer;
|
||||
private readonly UpdaterCommonTransfer updaterCommonTransfer;
|
||||
|
||||
private readonly RunningConfig running;
|
||||
|
||||
public VersionManager Version { get; } = new VersionManager();
|
||||
|
||||
public UpdaterClientTransfer(FileConfig fileConfig, IMessengerSender messengerSender, ClientSignInState clientSignInState, UpdaterHelper updaterHelper, RunningConfig running, ClientConfigTransfer clientConfigTransfer)
|
||||
public UpdaterClientTransfer(FileConfig fileConfig, IMessengerSender messengerSender, ClientSignInState clientSignInState, UpdaterHelper updaterHelper, RunningConfig running, ClientConfigTransfer clientConfigTransfer, UpdaterCommonTransfer updaterCommonTransfer)
|
||||
{
|
||||
this.fileConfig = fileConfig;
|
||||
this.messengerSender = messengerSender;
|
||||
@@ -33,6 +36,7 @@ namespace linker.plugins.updater
|
||||
this.updaterHelper = updaterHelper;
|
||||
this.running = running;
|
||||
this.clientConfigTransfer = clientConfigTransfer;
|
||||
this.updaterCommonTransfer = updaterCommonTransfer;
|
||||
|
||||
clientSignInState.NetworkFirstEnabledHandle += Init;
|
||||
|
||||
@@ -53,11 +57,6 @@ namespace linker.plugins.updater
|
||||
fileConfig.Data.Client.Updater.SecretKey = key;
|
||||
fileConfig.Data.Update();
|
||||
}
|
||||
public void SetInterval(int sec)
|
||||
{
|
||||
fileConfig.Data.Common.UpdateIntervalSeconds = sec;
|
||||
fileConfig.Data.Update();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 所有客户端的更新信息
|
||||
@@ -143,7 +142,7 @@ namespace linker.plugins.updater
|
||||
{
|
||||
await updaterHelper.GetUpdateInfo(updateInfo);
|
||||
return true;
|
||||
}, () => fileConfig.Data.Common.UpdateIntervalSeconds*1000);
|
||||
}, () => updaterCommonTransfer.UpdateIntervalSeconds*1000);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
24
linker/plugins/updater/UpdaterCommonTransfer.cs
Normal file
24
linker/plugins/updater/UpdaterCommonTransfer.cs
Normal file
@@ -0,0 +1,24 @@
|
||||
using linker.config;
|
||||
|
||||
namespace linker.plugins.updater
|
||||
{
|
||||
public sealed class UpdaterCommonTransfer
|
||||
{
|
||||
|
||||
public string UpdateUrl => fileConfig.Data.Common.UpdateUrl;
|
||||
public int UpdateIntervalSeconds => fileConfig.Data.Common.UpdateIntervalSeconds;
|
||||
|
||||
private readonly FileConfig fileConfig;
|
||||
|
||||
public UpdaterCommonTransfer( FileConfig fileConfig)
|
||||
{
|
||||
this.fileConfig = fileConfig;
|
||||
}
|
||||
|
||||
public void SetInterval(int sec)
|
||||
{
|
||||
fileConfig.Data.Common.UpdateIntervalSeconds = sec;
|
||||
fileConfig.Data.Update();
|
||||
}
|
||||
}
|
||||
}
|
||||
25
linker/plugins/updater/UpdaterConfigSync.cs
Normal file
25
linker/plugins/updater/UpdaterConfigSync.cs
Normal file
@@ -0,0 +1,25 @@
|
||||
using linker.plugins.config;
|
||||
using MemoryPack;
|
||||
|
||||
namespace linker.plugins.updater
|
||||
{
|
||||
public sealed class UpdaterConfigSyncSecretKey : IConfigSync
|
||||
{
|
||||
public string Name => "UpdaterSecretKey";
|
||||
|
||||
private readonly UpdaterClientTransfer updaterClientTransfer;
|
||||
public UpdaterConfigSyncSecretKey(UpdaterClientTransfer updaterClientTransfer)
|
||||
{
|
||||
this.updaterClientTransfer = updaterClientTransfer;
|
||||
}
|
||||
public Memory<byte> GetData()
|
||||
{
|
||||
return MemoryPackSerializer.Serialize(updaterClientTransfer.SecretKey);
|
||||
}
|
||||
|
||||
public void SetData(Memory<byte> data)
|
||||
{
|
||||
updaterClientTransfer.SetSecretKey(MemoryPackSerializer.Deserialize<string>(data.Span));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,4 @@
|
||||
using linker.config;
|
||||
using linker.libs;
|
||||
using linker.libs;
|
||||
using MemoryPack;
|
||||
using System.Diagnostics;
|
||||
using System.IO.Compression;
|
||||
@@ -13,10 +12,10 @@ namespace linker.plugins.updater
|
||||
{
|
||||
private string[] extractExcludeFiles = [];
|
||||
|
||||
private readonly FileConfig fileConfig;
|
||||
public UpdaterHelper(FileConfig fileConfig)
|
||||
private readonly UpdaterCommonTransfer updaterCommonTransfer;
|
||||
public UpdaterHelper(UpdaterCommonTransfer updaterCommonTransfer)
|
||||
{
|
||||
this.fileConfig = fileConfig;
|
||||
this.updaterCommonTransfer = updaterCommonTransfer;
|
||||
ClearFiles();
|
||||
}
|
||||
|
||||
@@ -39,7 +38,7 @@ namespace linker.plugins.updater
|
||||
updateInfo.Status = UpdateStatus.Checking;
|
||||
|
||||
using HttpClient httpClient = new HttpClient();
|
||||
string str = await httpClient.GetStringAsync($"{fileConfig.Data.Common.UpdateUrl}/version.txt").WaitAsync(TimeSpan.FromSeconds(15));
|
||||
string str = await httpClient.GetStringAsync($"{updaterCommonTransfer.UpdateUrl}/version.txt").WaitAsync(TimeSpan.FromSeconds(15));
|
||||
|
||||
string[] arr = str.Split(Environment.NewLine).Select(c => c.Trim('\r').Trim('\n')).ToArray();
|
||||
|
||||
@@ -95,7 +94,7 @@ namespace linker.plugins.updater
|
||||
}
|
||||
sb.Append(RuntimeInformation.ProcessArchitecture.ToString().ToLower());
|
||||
|
||||
string url = $"{fileConfig.Data.Common.UpdateUrl}/{version}/{sb.ToString()}.zip";
|
||||
string url = $"{updaterCommonTransfer.UpdateUrl}/{version}/{sb.ToString()}.zip";
|
||||
|
||||
using HttpClient httpClient = new HttpClient();
|
||||
using HttpResponseMessage response = await httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
|
||||
|
||||
@@ -1,12 +1,20 @@
|
||||
namespace linker.plugins.updater
|
||||
using linker.config;
|
||||
|
||||
namespace linker.plugins.updater
|
||||
{
|
||||
public sealed class UpdaterServerTransfer
|
||||
{
|
||||
|
||||
public string SecretKey => fileConfig.Data.Server.Updater.SecretKey;
|
||||
|
||||
private UpdateInfo updateInfo = new UpdateInfo { Status = UpdateStatus.Checked };
|
||||
private readonly UpdaterHelper updaterHelper;
|
||||
public UpdaterServerTransfer(UpdaterHelper updaterHelper)
|
||||
private readonly FileConfig fileConfig;
|
||||
|
||||
public UpdaterServerTransfer(UpdaterHelper updaterHelper, FileConfig fileConfig)
|
||||
{
|
||||
this.updaterHelper = updaterHelper;
|
||||
this.fileConfig = fileConfig;
|
||||
}
|
||||
|
||||
public UpdateInfo Get()
|
||||
|
||||
@@ -28,7 +28,9 @@ namespace linker.plugins.updater
|
||||
serviceCollection.AddSingleton<UpdaterClientMessenger>();
|
||||
serviceCollection.AddSingleton<UpdaterClientApiController>();
|
||||
|
||||
serviceCollection.AddSingleton<ConfigSyncUpdaterSecretKey>();
|
||||
serviceCollection.AddSingleton<UpdaterConfigSyncSecretKey>();
|
||||
|
||||
serviceCollection.AddSingleton<UpdaterCommonTransfer>();
|
||||
}
|
||||
|
||||
public void AddServer(ServiceCollection serviceCollection, FileConfig config)
|
||||
@@ -37,6 +39,8 @@ namespace linker.plugins.updater
|
||||
serviceCollection.AddSingleton<UpdaterServerTransfer>();
|
||||
|
||||
serviceCollection.AddSingleton<UpdaterServerMessenger>();
|
||||
|
||||
serviceCollection.AddSingleton<UpdaterCommonTransfer>();
|
||||
}
|
||||
|
||||
public void UseClient(ServiceProvider serviceProvider, FileConfig config)
|
||||
|
||||
@@ -116,7 +116,7 @@ namespace linker.plugins.updater.messenger
|
||||
public void ConfirmServer(IConnection connection)
|
||||
{
|
||||
UpdaterConfirmServerInfo confirm = MemoryPackSerializer.Deserialize<UpdaterConfirmServerInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
||||
if (fileConfig.Data.Server.Updater.SecretKey == confirm.SecretKey)
|
||||
if (updaterServerTransfer.SecretKey == confirm.SecretKey)
|
||||
{
|
||||
updaterServerTransfer.Confirm(confirm.Version);
|
||||
}
|
||||
@@ -129,7 +129,7 @@ namespace linker.plugins.updater.messenger
|
||||
public void ExitServer(IConnection connection)
|
||||
{
|
||||
UpdaterConfirmServerInfo confirm = MemoryPackSerializer.Deserialize<UpdaterConfirmServerInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
||||
if (fileConfig.Data.Server.Updater.SecretKey == confirm.SecretKey)
|
||||
if (updaterServerTransfer.SecretKey == confirm.SecretKey)
|
||||
{
|
||||
Environment.Exit(1);
|
||||
}
|
||||
@@ -152,7 +152,7 @@ namespace linker.plugins.updater.messenger
|
||||
}
|
||||
|
||||
//需要密钥
|
||||
if ((confirm.All || confirm.GroupAll) && fileConfig.Data.Server.Updater.SecretKey != confirm.SecretKey)
|
||||
if ((confirm.All || confirm.GroupAll) && updaterServerTransfer.SecretKey != confirm.SecretKey)
|
||||
{
|
||||
connection.Write(Helper.FalseArray);
|
||||
return;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
v1.6.3
|
||||
2024-12-10 17:13:26
|
||||
2024-12-12 00:29:09
|
||||
1. 优化UI,显示网络计算IP数
|
||||
2. 修复内网穿透不停止直接删除导致的无法再次添加的问题
|
||||
3. 优化网卡的端口转发
|
||||
|
||||
Reference in New Issue
Block a user