代码整理

This commit is contained in:
snltty
2024-12-13 15:52:27 +08:00
parent cc4a9ef3f1
commit b2faf65ab5
49 changed files with 684 additions and 503 deletions

View File

@@ -4,8 +4,6 @@ using System.Linq;
using System.Collections.Generic;
using Microsoft.CodeAnalysis.Text;
using System.Text;
using System;
using System.Diagnostics;
namespace linker.gen
{
@@ -25,6 +23,7 @@ namespace linker.gen
new GeneratorInfo{ ClassName="ApiClientTypesLoader", ClassNameSpace="linker.plugins.capi", InterfaceName="linker.plugins.capi.IApiClientController"},
new GeneratorInfo{ ClassName="ConfigSyncTypesLoader", ClassNameSpace="linker.plugins.config", InterfaceName="linker.plugins.config.IConfigSync"},
new GeneratorInfo{ ClassName="DecenterTypesLoader", ClassNameSpace="linker.plugins.decenter", InterfaceName="linker.plugins.decenter.IDecenter"},
new GeneratorInfo{ ClassName="RouteExcludeIPTypesLoader", ClassNameSpace="linker.plugins.route", InterfaceName="linker.plugins.route.IRouteExcludeIP" },
};
public void Initialize(IncrementalGeneratorInitializationContext context)

View File

@@ -174,7 +174,10 @@ namespace linker.tunnel.transport
if (state.SSL)
{
sslStream = new SslStream(new NetworkStream(socket, false), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null);
await sslStream.AuthenticateAsClientAsync(new SslClientAuthenticationOptions { EnabledSslProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13 }).ConfigureAwait(false);
await sslStream.AuthenticateAsClientAsync(new SslClientAuthenticationOptions
{
EnabledSslProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13
}).ConfigureAwait(false);
}
return new TunnelConnectionTcp

View File

@@ -12,41 +12,38 @@ namespace linker.plugins.access
{
public sealed class AccessApiController : IApiClientController
{
private readonly FileConfig config;
private readonly IMessengerSender sender;
private readonly ClientSignInState clientSignInState;
private readonly AccessTransfer accessTransfer;
private readonly AccessDecenter accessDecenter;
private readonly ClientConfigTransfer clientConfigTransfer;
public AccessApiController(FileConfig config, IMessengerSender sender, ClientSignInState clientSignInState, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer)
public AccessApiController(IMessengerSender sender, ClientSignInState clientSignInState, AccessDecenter accessDecenter, ClientConfigTransfer clientConfigTransfer)
{
this.config = config;
this.sender = sender;
this.clientSignInState = clientSignInState;
this.accessTransfer = accessTransfer;
this.accessDecenter = accessDecenter;
this.clientConfigTransfer = clientConfigTransfer;
}
public void Refresh(ApiControllerParamsInfo param)
{
accessTransfer.RefreshConfig();
accessDecenter.Refresh();
}
public AccessListInfo GetAccesss(ApiControllerParamsInfo param)
{
ulong hashCode = ulong.Parse(param.Content);
if (accessTransfer.Version.Eq(hashCode, out ulong version) == false)
if (accessDecenter.DataVersion.Eq(hashCode, out ulong version) == false)
{
return new AccessListInfo
{
HashCode = version,
List = accessTransfer.GetAccesss()
List = accessDecenter.Accesss
};
}
return new AccessListInfo { HashCode = version };
}
[ClientApiAccessAttribute(ClientApiAccess.Access)]
public async Task<bool> SetAccess(ApiControllerParamsInfo param)
{

View File

@@ -0,0 +1,54 @@
using linker.config;
using linker.libs;
using linker.plugins.client;
using linker.plugins.decenter;
using MemoryPack;
namespace linker.plugins.access
{
public sealed class AccessDecenter : IDecenter
{
public string Name => "access";
public VersionManager SyncVersion { get; } = new VersionManager();
public VersionManager DataVersion { get; } = new VersionManager();
public Dictionary<string, ClientApiAccess> Accesss { get; } = new Dictionary<string, ClientApiAccess>();
private readonly ClientConfigTransfer clientConfigTransfer;
private readonly AccessTransfer accessTransfer;
public AccessDecenter(ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer, AccessTransfer accessTransfer)
{
this.clientConfigTransfer = clientConfigTransfer;
this.accessTransfer = accessTransfer;
clientSignInState.NetworkEnabledHandle += (times) => SyncVersion.Add();
accessTransfer.OnChanged += SyncVersion.Add;
}
public void Refresh()
{
SyncVersion.Add();
}
public Memory<byte> GetData()
{
ConfigAccessInfo info = new ConfigAccessInfo { MachineId = clientConfigTransfer.Id, Access = accessTransfer.Access };
Accesss[info.MachineId] = info.Access;
DataVersion.Add();
return MemoryPackSerializer.Serialize(info);
}
public void SetData(Memory<byte> data)
{
ConfigAccessInfo access = MemoryPackSerializer.Deserialize<ConfigAccessInfo>(data.Span);
Accesss[access.MachineId] = access.Access;
DataVersion.Add();
}
public void SetData(List<ReadOnlyMemory<byte>> data)
{
List<ConfigAccessInfo> list = data.Select(c => MemoryPackSerializer.Deserialize<ConfigAccessInfo>(c.Span)).ToList();
foreach (var item in list)
{
Accesss[item.MachineId] = item.Access;
}
DataVersion.Add();
}
}
}

View File

@@ -23,6 +23,7 @@ namespace linker.plugins.access
serviceCollection.AddSingleton<AccessClientMessenger>();
serviceCollection.AddSingleton<AccessTransfer>();
serviceCollection.AddSingleton<AccessDecenter>();
}
public void AddServer(ServiceCollection serviceCollection, FileConfig config)

View File

@@ -1,69 +1,20 @@
using linker.config;
using linker.libs;
using linker.plugins.client;
using linker.plugins.decenter;
using linker.plugins.messenger;
using MemoryPack;
namespace linker.plugins.access
{
public sealed class AccessTransfer : IDecenter
public sealed class AccessTransfer
{
public string Name => "access";
public VersionManager DataVersion { get; } = new VersionManager();
public ClientApiAccess Access => fileConfig.Data.Client.Access;
public VersionManager Version { get; } = new VersionManager();
private Dictionary<string, ClientApiAccess> accesss = new Dictionary<string, ClientApiAccess>();
public Action OnChanged { get; set; } = () => { };
private readonly FileConfig fileConfig;
private readonly IMessengerSender sender;
private readonly ClientSignInState clientSignInState;
private readonly ClientConfigTransfer clientConfigTransfer;
public AccessTransfer(FileConfig fileConfig, IMessengerSender sender, ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer)
public AccessTransfer(FileConfig fileConfig)
{
this.fileConfig = fileConfig;
this.sender = sender;
this.clientSignInState = clientSignInState;
this.clientConfigTransfer = clientConfigTransfer;
clientSignInState.NetworkEnabledHandle += (times) => DataVersion.Add();
}
public Memory<byte> GetData()
{
ConfigAccessInfo info = new ConfigAccessInfo { MachineId = clientConfigTransfer.Id, Access = fileConfig.Data.Client.Access };
accesss[info.MachineId] = info.Access;
Version.Add();
return MemoryPackSerializer.Serialize(info);
}
public void SetData(Memory<byte> data)
{
ConfigAccessInfo access = MemoryPackSerializer.Deserialize<ConfigAccessInfo>(data.Span);
accesss[access.MachineId] = access.Access;
Version.Add();
}
public void SetData(List<ReadOnlyMemory<byte>> data)
{
List<ConfigAccessInfo> list = data.Select(c => MemoryPackSerializer.Deserialize<ConfigAccessInfo>(c.Span)).ToList();
accesss = list.ToDictionary(c => c.MachineId, d => d.Access);
accesss[clientConfigTransfer.Id] = fileConfig.Data.Client.Access;
Version.Add();
}
public void RefreshConfig()
{
DataVersion.Add();
}
/// <summary>
/// 获取所有人的权限
/// </summary>
/// <returns></returns>
public Dictionary<string, ClientApiAccess> GetAccesss()
{
return accesss;
}
/// <summary>
/// 设置权限
/// </summary>
@@ -73,16 +24,13 @@ namespace linker.plugins.access
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Debug($"from {info.FromMachineId} set access to {info.Access},my access {(ulong)fileConfig.Data.Client.Access}");
//我的权限删掉它的权限==0说明它至少拥有我的全部权限我是它的子集它有权管我
if (accesss.TryGetValue(info.FromMachineId, out ClientApiAccess access) && (~access & fileConfig.Data.Client.Access) == 0)
{
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Debug($"from {info.FromMachineId} set access to {info.Access} success");
fileConfig.Data.Client.Access = (ClientApiAccess)info.Access;
fileConfig.Data.Update();
OnChanged();
}
DataVersion.Add();
}
/// <summary>
/// 合并权限
/// </summary>

View File

@@ -17,18 +17,14 @@ namespace linker.plugins.client
public sealed class ClientSignInTransfer
{
private readonly ClientSignInState clientSignInState;
private readonly RunningConfig runningConfig;
private readonly FileConfig config;
private readonly IMessengerSender messengerSender;
private readonly IMessengerResolver messengerResolver;
private readonly SignInArgsTransfer signInArgsTransfer;
private readonly ClientConfigTransfer clientConfigTransfer;
public ClientSignInTransfer(ClientSignInState clientSignInState, RunningConfig runningConfig, FileConfig config, IMessengerSender messengerSender, IMessengerResolver messengerResolver, SignInArgsTransfer signInArgsTransfer, ClientConfigTransfer clientConfigTransfer)
public ClientSignInTransfer(ClientSignInState clientSignInState, IMessengerSender messengerSender, IMessengerResolver messengerResolver, SignInArgsTransfer signInArgsTransfer, ClientConfigTransfer clientConfigTransfer)
{
this.clientSignInState = clientSignInState;
this.runningConfig = runningConfig;
this.config = config;
this.messengerSender = messengerSender;
this.messengerResolver = messengerResolver;
this.signInArgsTransfer = signInArgsTransfer;

View File

@@ -0,0 +1,18 @@
using linker.plugins.route;
using System.Net;
namespace linker.plugins.client
{
public sealed class RouteExcludeIPSignin : IRouteExcludeIP
{
private readonly ClientSignInState clientSignInState;
public RouteExcludeIPSignin(ClientSignInState clientSignInState)
{
this.clientSignInState = clientSignInState;
}
public List<IPAddress> Get()
{
return new List<IPAddress> { clientSignInState.Connection?.Address.Address ?? IPAddress.Any };
}
}
}

View File

@@ -1,6 +1,5 @@
using linker.plugins.signIn.args;
using linker.plugins.signin.messenger;
using linker.config;
namespace linker.plugins.client
{
@@ -9,11 +8,9 @@ namespace linker.plugins.client
/// </summary>
public sealed class SignInArgsGroupPasswordClient : ISignInArgs
{
private readonly FileConfig fileConfig;
private readonly ClientConfigTransfer clientConfigTransfer;
public SignInArgsGroupPasswordClient(FileConfig fileConfig, ClientConfigTransfer clientConfigTransfer)
public SignInArgsGroupPasswordClient( ClientConfigTransfer clientConfigTransfer)
{
this.fileConfig = fileConfig;
this.clientConfigTransfer = clientConfigTransfer;
}
public async Task<string> Invoke(string host, Dictionary<string, string> args)
@@ -35,10 +32,8 @@ namespace linker.plugins.client
/// </summary>
public sealed class SignInArgsGroupPasswordServer : ISignInArgs
{
private readonly FileConfig fileConfig;
public SignInArgsGroupPasswordServer(FileConfig fileConfig)
public SignInArgsGroupPasswordServer()
{
this.fileConfig = fileConfig;
}
public async Task<string> Invoke(string host, Dictionary<string, string> args)
{

View File

@@ -50,7 +50,7 @@ namespace linker.plugins.decenter
{
try
{
var tasks = syncs.Where(c => c.DataVersion.Reset()).Select(c =>
var tasks = syncs.Where(c => c.SyncVersion.Reset()).Select(c =>
{
return new DecenterSyncTaskInfo
{

View File

@@ -4,10 +4,32 @@ namespace linker.plugins.decenter
{
public interface IDecenter
{
/// <summary>
/// 名称
/// </summary>
public string Name { get; }
/// <summary>
/// 同步版本,版本变化则同步
/// </summary>
public VersionManager SyncVersion { get; }
/// <summary>
/// 数据版本,从收到数据则更新
/// </summary>
public VersionManager DataVersion { get; }
/// <summary>
/// 获取本地数据
/// </summary>
/// <returns></returns>
public Memory<byte> GetData();
/// <summary>
/// 收到远端数据
/// </summary>
/// <param name="data"></param>
public void SetData(Memory<byte> data);
/// <summary>
/// 收到远端数据
/// </summary>
/// <param name="data"></param>
public void SetData(List<ReadOnlyMemory<byte>> data);
}
}

View File

@@ -22,19 +22,19 @@ namespace linker.plugins.forward
private readonly ForwardProxy forwardProxy;
private readonly IMessengerSender messengerSender;
private readonly ClientSignInState clientSignInState;
private readonly FileConfig config;
private readonly AccessTransfer accessTransfer;
private readonly ClientConfigTransfer clientConfigTransfer;
private readonly ForwardDecenter forwardDecenter;
public ForwardClientApiController(ForwardTransfer forwardTransfer, ForwardProxy forwardProxy, IMessengerSender messengerSender, ClientSignInState clientSignInState, FileConfig config, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer)
public ForwardClientApiController(ForwardTransfer forwardTransfer, ForwardProxy forwardProxy, IMessengerSender messengerSender, ClientSignInState clientSignInState, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer, ForwardDecenter forwardDecenter)
{
this.forwardTransfer = forwardTransfer;
this.forwardProxy = forwardProxy;
this.messengerSender = messengerSender;
this.clientSignInState = clientSignInState;
this.config = config;
this.accessTransfer = accessTransfer;
this.clientConfigTransfer = clientConfigTransfer;
this.forwardDecenter = forwardDecenter;
}
public ConnectionListInfo Connections(ApiControllerParamsInfo param)
@@ -64,16 +64,16 @@ namespace linker.plugins.forward
public void Refresh(ApiControllerParamsInfo param)
{
forwardTransfer.RefreshConfig();
forwardDecenter.Refresh();
}
public ForwardListInfo GetCount(ApiControllerParamsInfo param)
{
ulong hashCode = ulong.Parse(param.Content);
if (forwardTransfer.Version.Eq(hashCode, out ulong version) == false)
if (forwardDecenter.DataVersion.Eq(hashCode, out ulong version) == false)
{
return new ForwardListInfo
{
List = forwardTransfer.GetCount(),
List = forwardDecenter.CountDic,
HashCode = version
};
}

View File

@@ -0,0 +1,54 @@
using linker.libs;
using linker.plugins.client;
using linker.plugins.decenter;
using MemoryPack;
using System.Collections.Concurrent;
namespace linker.plugins.forward
{
public sealed class ForwardDecenter:IDecenter
{
public string Name => "forward";
public VersionManager SyncVersion { get; } = new VersionManager();
public VersionManager DataVersion { get; } = new VersionManager();
public ConcurrentDictionary<string, int> CountDic { get; }= new ConcurrentDictionary<string, int>();
private readonly ClientConfigTransfer clientConfigTransfer;
private readonly ForwardTransfer forwardTransfer;
public ForwardDecenter(ClientConfigTransfer clientConfigTransfer, ForwardTransfer forwardTransfer)
{
this.clientConfigTransfer = clientConfigTransfer;
this.forwardTransfer = forwardTransfer;
forwardTransfer.OnReset += CountDic.Clear;
forwardTransfer.OnChanged += SyncVersion.Add;
}
public Memory<byte> GetData()
{
CountInfo info = new CountInfo { MachineId = clientConfigTransfer.Id, Count = forwardTransfer.Count };
CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
DataVersion.Add();
return MemoryPackSerializer.Serialize(info);
}
public void SetData(Memory<byte> data)
{
CountInfo info = MemoryPackSerializer.Deserialize<CountInfo>(data.Span);
CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
DataVersion.Add();
}
public void SetData(List<ReadOnlyMemory<byte>> data)
{
List<CountInfo> list = data.Select(c => MemoryPackSerializer.Deserialize<CountInfo>(c.Span)).ToList();
foreach (var info in list)
{
CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
}
DataVersion.Add();
}
public void Refresh()
{
SyncVersion.Add();
}
}
}

View File

@@ -24,6 +24,7 @@ namespace linker.plugins.forward
serviceCollection.AddSingleton<ForwardClientMessenger>();
serviceCollection.AddSingleton<ForwardDecenter>();
}
public void AddServer(ServiceCollection serviceCollection, FileConfig config)

View File

@@ -1,21 +1,18 @@
using linker.client.config;
using linker.config;
using linker.libs;
using linker.plugins.client;
using linker.plugins.decenter;
using linker.plugins.forward.proxy;
using linker.plugins.messenger;
using MemoryPack;
using System.Collections.Concurrent;
namespace linker.plugins.forward
{
public sealed class ForwardTransfer : IDecenter
public sealed class ForwardTransfer
{
public string Name => "forward";
public VersionManager DataVersion { get; } = new VersionManager();
public int Count => running.Data.Forwards.Count(c => c.GroupId == clientConfigTransfer.Group.Id);
public Action OnChanged { get; set; } = () => { };
public Action OnReset{ get; set; } = () => { };
private readonly FileConfig fileConfig;
private readonly RunningConfig running;
private readonly ForwardProxy forwardProxy;
private readonly ClientSignInState clientSignInState;
@@ -23,13 +20,9 @@ namespace linker.plugins.forward
private readonly ClientConfigTransfer clientConfigTransfer;
private readonly NumberSpaceUInt32 ns = new NumberSpaceUInt32();
private readonly ConcurrentDictionary<string, int> countDic = new ConcurrentDictionary<string, int>();
public VersionManager Version { get; } = new VersionManager();
public ForwardTransfer(FileConfig fileConfig, RunningConfig running, ForwardProxy forwardProxy, ClientSignInState clientSignInState, IMessengerSender messengerSender, ClientConfigTransfer clientConfigTransfer)
public ForwardTransfer( RunningConfig running, ForwardProxy forwardProxy, ClientSignInState clientSignInState, IMessengerSender messengerSender, ClientConfigTransfer clientConfigTransfer)
{
this.fileConfig = fileConfig;
this.running = running;
this.forwardProxy = forwardProxy;
this.clientSignInState = clientSignInState;
@@ -37,40 +30,6 @@ namespace linker.plugins.forward
this.clientConfigTransfer = clientConfigTransfer;
clientSignInState.NetworkEnabledHandle += Reset;
}
public Memory<byte> GetData()
{
CountInfo info = new CountInfo { MachineId = clientConfigTransfer.Id, Count = running.Data.Forwards.Count(c => c.GroupId == clientConfigTransfer.Group.Id) };
countDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
Version.Add();
return MemoryPackSerializer.Serialize(info);
}
public void SetData(Memory<byte> data)
{
CountInfo info = MemoryPackSerializer.Deserialize<CountInfo>(data.Span);
countDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
Version.Add();
}
public void SetData(List<ReadOnlyMemory<byte>> data)
{
List<CountInfo> list = data.Select(c => MemoryPackSerializer.Deserialize<CountInfo>(c.Span)).ToList();
foreach (var info in list)
{
countDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
}
Version.Add();
}
public void RefreshConfig()
{
DataVersion.Add();
}
public ConcurrentDictionary<string, int> GetCount()
{
DataVersion.Add();
return countDic;
}
string groupid = string.Empty;
@@ -89,7 +48,7 @@ namespace linker.plugins.forward
if (groupid != clientConfigTransfer.Group.Id)
{
countDic.Clear();
OnReset();
Stop();
}
groupid = clientConfigTransfer.Group.Id;
@@ -117,7 +76,7 @@ namespace linker.plugins.forward
Stop(item);
}
}
DataVersion.Add();
OnChanged();
}
}
private void Start(ForwardInfo forwardInfo, bool errorStop = true)
@@ -157,7 +116,7 @@ namespace linker.plugins.forward
}
}
Version.Add();
OnChanged();
}
private void Stop()
@@ -185,7 +144,7 @@ namespace linker.plugins.forward
{
LoggerHelper.Instance.Error(ex);
}
Version.Add();
OnChanged();
}
public List<ForwardInfo> Get()

View File

@@ -51,7 +51,6 @@ namespace linker.plugins.logger
return true;
}
public LoggerSetParamInfo GetConfig(ApiControllerParamsInfo param)
{
return new LoggerSetParamInfo

View File

@@ -12,6 +12,7 @@ namespace linker.plugins.pcp
public sealed class PcpConfigTransfer : IDecenter
{
public string Name => "pcp";
public VersionManager SyncVersion { get; } = new VersionManager();
public VersionManager DataVersion { get; } = new VersionManager();
private ConcurrentDictionary<string, List<string>> history = new ConcurrentDictionary<string, List<string>>();
@@ -27,7 +28,7 @@ namespace linker.plugins.pcp
this.clientSignInState = clientSignInState;
this.clientConfigTransfer = clientConfigTransfer;
clientSignInState.NetworkEnabledHandle += (times) => DataVersion.Add();
clientSignInState.NetworkEnabledHandle += (times) => SyncVersion.Add();
}
public void AddHistory(ITunnelConnection connection)
@@ -36,7 +37,7 @@ namespace linker.plugins.pcp
{
runningConfig.Data.TunnelHistory.History.Add(connection.RemoteMachineId);
runningConfig.Data.Update();
DataVersion.Add();
SyncVersion.Add();
}
}
public List<string> GetNodes(string fromMachineId, string toMachineId)

View File

@@ -1,5 +1,4 @@
using linker.config;
using linker.plugins.config;
using linker.plugins.config;
using MemoryPack;
namespace linker.plugins.relay.client
@@ -8,11 +7,9 @@ namespace linker.plugins.relay.client
{
public string Name => "RelaySecretKey";
private readonly FileConfig fileConfig;
private readonly RelayClientConfigTransfer relayClientConfigTransfer;
public RelaConfigSyncSecretKey(FileConfig fileConfig, RelayClientConfigTransfer relayClientConfigTransfer)
public RelaConfigSyncSecretKey(RelayClientConfigTransfer relayClientConfigTransfer)
{
this.fileConfig = fileConfig;
this.relayClientConfigTransfer = relayClientConfigTransfer;
}
public Memory<byte> GetData()

View File

@@ -1,5 +1,4 @@
using linker.client.config;
using linker.config;
using linker.config;
using linker.libs.api;
using linker.libs.extends;
using linker.plugins.capi;
@@ -11,16 +10,12 @@ namespace linker.plugins.relay.client
/// </summary>
public sealed class RelayApiController : IApiClientController
{
private readonly FileConfig config;
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, RelayClientConfigTransfer relayClientConfigTransfer)
public RelayApiController(RelayTestTransfer relayTestTransfer, RelayTransfer relayTransfer, RelayClientConfigTransfer relayClientConfigTransfer)
{
this.config = config;
this.runningConfig = runningConfig;
this.relayTestTransfer = relayTestTransfer;
this.relayTransfer = relayTransfer;
this.relayClientConfigTransfer = relayClientConfigTransfer;

View File

@@ -14,16 +14,12 @@ namespace linker.plugins.relay.client
{
public List<ITransport> Transports { get; private set; }
private readonly FileConfig fileConfig;
private ConcurrentDictionary<string, bool> connectingDic = new ConcurrentDictionary<string, bool>();
private Dictionary<string, List<Action<ITunnelConnection>>> OnConnected { get; } = new Dictionary<string, List<Action<ITunnelConnection>>>();
private readonly RelayClientConfigTransfer relayClientConfigTransfer;
public RelayTransfer(FileConfig fileConfig, RelayClientConfigTransfer relayClientConfigTransfer)
public RelayTransfer(RelayClientConfigTransfer relayClientConfigTransfer)
{
this.fileConfig = fileConfig;
this.relayClientConfigTransfer = relayClientConfigTransfer;
}

View File

@@ -14,5 +14,18 @@ namespace linker.plugins.relay.server
{
this.config = config;
}
public void SetMaxGbTotalMonth(int month)
{
Node.MaxGbTotalMonth = month;
}
public void SetMaxGbTotalLastBytes(ulong value)
{
Node.MaxGbTotalLastBytes = value;
}
public void Update()
{
config.Data.Update();
}
}
}

View File

@@ -36,12 +36,10 @@ namespace linker.plugins.relay.server
this.serverConfigTransfer = serverConfigTransfer;
limitTotal.SetLimit((uint)Math.Ceiling((relayServerConfigTransfer.Node.MaxBandwidthTotal * 1024 * 1024) / 8.0));
ResetBytes();
cryptoNode = CryptoFactory.CreateSymmetric(relayServerConfigTransfer.Node.MasterSecretKey);
cryptoMaster = CryptoFactory.CreateSymmetric(relayServerConfigTransfer.Master.SecretKey);
ReportTask();
}
public async ValueTask<RelayCache> TryGetRelayCache(string key, string nodeid)
@@ -143,8 +141,8 @@ namespace linker.plugins.relay.server
}
if (relayServerConfigTransfer.Node.MaxGbTotalLastBytes >= length)
relayServerConfigTransfer.Node.MaxGbTotalLastBytes -= length;
else relayServerConfigTransfer.Node.MaxGbTotalLastBytes = 0;
relayServerConfigTransfer.SetMaxGbTotalLastBytes(relayServerConfigTransfer.Node.MaxGbTotalLastBytes - length);
else relayServerConfigTransfer.SetMaxGbTotalLastBytes(0);
return relayServerConfigTransfer.Node.MaxGbTotalLastBytes > 0;
}
@@ -179,21 +177,20 @@ namespace linker.plugins.relay.server
{
if (relayServerConfigTransfer.Node.MaxGbTotalMonth != DateTime.Now.Month)
{
relayServerConfigTransfer.Node.MaxGbTotalMonth = DateTime.Now.Month;
relayServerConfigTransfer.Node.MaxGbTotalLastBytes = (ulong)(relayServerConfigTransfer.Node.MaxGbTotal * 1024 * 1024 * 1024);
fileConfig.Data.Update();
relayServerConfigTransfer.SetMaxGbTotalMonth(DateTime.Now.Month);
relayServerConfigTransfer.SetMaxGbTotalLastBytes((ulong)(relayServerConfigTransfer.Node.MaxGbTotal * 1024 * 1024 * 1024));
}
relayServerConfigTransfer.Update();
}
private void ReportTask()
{
TimerHelper.SetInterval(async () =>
{
ResetBytes();
IEnumerable<RelayNodeInfo> nodes = new List<RelayNodeInfo>
{
//默认报告给自己,作为本服务器的一个默认中继节点
new RelayNodeInfo{
Id = RelayNodeInfo.MASTER_NODE_ID,
Host = new IPEndPoint(IPAddress.Any,serverConfigTransfer.Port).ToString(),
@@ -208,6 +205,7 @@ namespace linker.plugins.relay.server
Name = "default",
Public = false
},
//配置的中继节点
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);
@@ -222,7 +220,6 @@ namespace linker.plugins.relay.server
ICrypto crypto = node.Id == RelayNodeInfo.MASTER_NODE_ID ? cryptoMaster : cryptoNode;
IPEndPoint endPoint = await NetworkHelper.GetEndPointAsync(node.Host, serverConfigTransfer.Port) ?? new IPEndPoint(IPAddress.Any, serverConfigTransfer.Port);
RelayNodeReportInfo relayNodeReportInfo = new RelayNodeReportInfo
{
Id = node.Id,
@@ -253,12 +250,8 @@ namespace linker.plugins.relay.server
{
}
}
return true;
}, () => 5000);
}
}
}

View File

@@ -0,0 +1,9 @@
using System.Net;
namespace linker.plugins.route
{
public interface IRouteExcludeIP
{
public List<IPAddress> Get();
}
}

View File

@@ -0,0 +1,29 @@
using System.Net;
namespace linker.plugins.route
{
public sealed partial class RouteExcludeIPTransfer
{
private List<IRouteExcludeIP> excludeIPs;
public RouteExcludeIPTransfer()
{
}
public void LoadTunnelExcludeIPs(List<IRouteExcludeIP> list)
{
excludeIPs = list;
}
public List<IPAddress> Get()
{
List<IPAddress> result = new List<IPAddress>();
foreach (var item in excludeIPs)
{
result.AddRange(item.Get());
}
return result;
}
}
}

View File

@@ -0,0 +1,17 @@
using linker.libs;
using Microsoft.Extensions.DependencyInjection;
namespace linker.plugins.route
{
public sealed partial class RouteExcludeIPTypesLoader
{
public RouteExcludeIPTypesLoader(RouteExcludeIPTransfer tunnelExcludeIPTransfer, ServiceProvider serviceProvider)
{
var types = GetSourceGeneratorTypes();
var flows = types.Select(c => (IRouteExcludeIP)serviceProvider.GetService(c)).Where(c => c != null).ToList();
tunnelExcludeIPTransfer.LoadTunnelExcludeIPs(flows);
LoggerHelper.Instance.Info($"load route excludeips :{string.Join(",", flows.Select(c => c.GetType().Name))}");
}
}
}

View File

@@ -0,0 +1,40 @@
using linker.config;
using linker.startup;
using Microsoft.Extensions.DependencyInjection;
namespace linker.plugins.route
{
public sealed class RouteStartup : IStartup
{
public StartupLevel Level => StartupLevel.Normal;
public string Name => "route";
public bool Required => false;
public string[] Dependent => new string[] { "messenger", "signin", "serialize", "config" };
public StartupLoadType LoadType => StartupLoadType.Normal;
public void AddClient(ServiceCollection serviceCollection, FileConfig config)
{
serviceCollection.AddSingleton<RouteExcludeIPTransfer>();
serviceCollection.AddSingleton<RouteExcludeIPTypesLoader>();
}
public void AddServer(ServiceCollection serviceCollection, FileConfig config)
{
}
public void UseClient(ServiceProvider serviceProvider, FileConfig config)
{
RouteExcludeIPTransfer excludeIPTransfer = serviceProvider.GetService<RouteExcludeIPTransfer>();
RouteExcludeIPTypesLoader ruteExcludeIPTypesLoader = serviceProvider.GetService<RouteExcludeIPTypesLoader>();
}
public void UseServer(ServiceProvider serviceProvider, FileConfig config)
{
}
}
}

View File

@@ -17,18 +17,18 @@ namespace linker.plugins.sforward
private readonly SForwardTransfer forwardTransfer;
private readonly IMessengerSender messengerSender;
private readonly ClientSignInState clientSignInState;
private readonly FileConfig config;
private readonly AccessTransfer accessTransfer;
private readonly ClientConfigTransfer clientConfigTransfer;
private readonly SForwardDecenter sForwardDecenter;
public SForwardClientApiController(SForwardTransfer forwardTransfer, IMessengerSender messengerSender, ClientSignInState clientSignInState, FileConfig config, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer)
public SForwardClientApiController(SForwardTransfer forwardTransfer, IMessengerSender messengerSender, ClientSignInState clientSignInState, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer, SForwardDecenter sForwardDecenter)
{
this.forwardTransfer = forwardTransfer;
this.messengerSender = messengerSender;
this.clientSignInState = clientSignInState;
this.config = config;
this.accessTransfer = accessTransfer;
this.clientConfigTransfer = clientConfigTransfer;
this.sForwardDecenter = sForwardDecenter;
}
/// <summary>
@@ -53,7 +53,7 @@ namespace linker.plugins.sforward
public void Refresh(ApiControllerParamsInfo param)
{
forwardTransfer.RefreshConfig();
sForwardDecenter.Refresh();
}
/// <summary>
/// 获取数量
@@ -63,11 +63,11 @@ namespace linker.plugins.sforward
public SForwardListInfo GetCount(ApiControllerParamsInfo param)
{
ulong hashCode = ulong.Parse(param.Content);
if (forwardTransfer.Version.Eq(hashCode, out ulong version) == false)
if (sForwardDecenter.DataVersion.Eq(hashCode, out ulong version) == false)
{
return new SForwardListInfo
{
List = forwardTransfer.GetCount(),
List = sForwardDecenter.CountDic,
HashCode = version
};
}

View File

@@ -1,5 +1,4 @@
using linker.config;
using linker.plugins.config;
using linker.plugins.config;
using MemoryPack;
namespace linker.plugins.sforward

View File

@@ -0,0 +1,59 @@
using linker.libs;
using linker.plugins.client;
using linker.plugins.decenter;
using MemoryPack;
using System.Collections.Concurrent;
namespace linker.plugins.sforward
{
public sealed class SForwardDecenter : IDecenter
{
public string Name => "sforward";
public VersionManager SyncVersion { get; } = new VersionManager();
public VersionManager DataVersion { get; } = new VersionManager();
public ConcurrentDictionary<string, int> CountDic { get; } = new ConcurrentDictionary<string, int>();
private readonly ClientConfigTransfer clientConfigTransfer;
private readonly SForwardTransfer sForwardTransfer;
public SForwardDecenter( ClientConfigTransfer clientConfigTransfer, SForwardTransfer sForwardTransfer)
{
this.clientConfigTransfer = clientConfigTransfer;
this.sForwardTransfer = sForwardTransfer;
}
public Memory<byte> GetData()
{
CountInfo info = new CountInfo { MachineId = clientConfigTransfer.Id, Count = sForwardTransfer.Count };
CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
DataVersion.Add();
return MemoryPackSerializer.Serialize(info);
}
public void SetData(Memory<byte> data)
{
CountInfo info = MemoryPackSerializer.Deserialize<CountInfo>(data.Span);
CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
DataVersion.Add();
}
public void SetData(List<ReadOnlyMemory<byte>> data)
{
List<CountInfo> list = data.Select(c => MemoryPackSerializer.Deserialize<CountInfo>(c.Span)).ToList();
foreach (var info in list)
{
CountDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
}
DataVersion.Add();
}
public void Refresh()
{
SyncVersion.Add();
}
}
[MemoryPackable]
public sealed partial class CountInfo
{
public string MachineId { get; set; }
public int Count { get; set; }
}
}

View File

@@ -1,9 +1,4 @@
using linker.config;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace linker.plugins.sforward
{

View File

@@ -30,6 +30,8 @@ namespace linker.plugins.sforward
serviceCollection.AddSingleton<SForwardConfigSyncSecretKey>();
serviceCollection.AddSingleton<SForwardDecenter>();
}
public void AddServer(ServiceCollection serviceCollection, FileConfig config)

View File

@@ -9,20 +9,15 @@ using linker.libs.extends;
using linker.plugins.client;
using linker.plugins.messenger;
using linker.config;
using System.Collections.Concurrent;
using linker.plugins.decenter;
namespace linker.plugins.sforward
{
public sealed class SForwardTransfer : IDecenter
public sealed class SForwardTransfer
{
public string Name => "sforward";
public VersionManager DataVersion { get; } = new VersionManager();
public VersionManager Version { get; } = new VersionManager();
public string SecretKey => fileConfig.Data.Client.SForward.SecretKey;
public int Count => running.Data.SForwards.Count;
public Action OnChanged { get; set; } = () => { };
private readonly FileConfig fileConfig;
private readonly RunningConfig running;
@@ -31,11 +26,8 @@ namespace linker.plugins.sforward
private readonly ClientConfigTransfer clientConfigTransfer;
private readonly NumberSpaceUInt32 ns = new NumberSpaceUInt32();
private readonly ConcurrentDictionary<string, int> countDic = new ConcurrentDictionary<string, int>();
private readonly OperatingManager operatingManager = new OperatingManager();
public SForwardTransfer(FileConfig fileConfig, RunningConfig running, ClientSignInState clientSignInState, IMessengerSender messengerSender, ClientConfigTransfer clientConfigTransfer)
{
this.fileConfig = fileConfig;
@@ -47,36 +39,6 @@ namespace linker.plugins.sforward
clientSignInState.NetworkFirstEnabledHandle += () => Start();
}
public Memory<byte> GetData()
{
CountInfo info = new CountInfo { MachineId = clientConfigTransfer.Id, Count = running.Data.SForwards.Count };
countDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
Version.Add();
return MemoryPackSerializer.Serialize(info);
}
public void SetData(Memory<byte> data)
{
CountInfo info = MemoryPackSerializer.Deserialize<CountInfo>(data.Span);
countDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
Version.Add();
}
public void SetData(List<ReadOnlyMemory<byte>> data)
{
List<CountInfo> list = data.Select(c => MemoryPackSerializer.Deserialize<CountInfo>(c.Span)).ToList();
foreach (var info in list)
{
countDic.AddOrUpdate(info.MachineId, info.Count, (a, b) => info.Count);
}
Version.Add();
}
public void RefreshConfig()
{
DataVersion.Add();
}
public ConcurrentDictionary<string, int> GetCount()
{
return countDic;
}
public void SetSecretKey(string key)
{
@@ -101,7 +63,7 @@ namespace linker.plugins.sforward
}
}
DataVersion.Add();
OnChanged();
}
private void Start(SForwardInfo forwardInfo)
{
@@ -147,7 +109,7 @@ namespace linker.plugins.sforward
LoggerHelper.Instance.Error(ex);
}
Version.Add();
OnChanged();
}
private void Stop(SForwardInfo forwardInfo)
{
@@ -184,7 +146,7 @@ namespace linker.plugins.sforward
{
LoggerHelper.Instance.Error(ex);
}
Version.Add();
OnChanged();
}
public List<SForwardInfo> Get()
@@ -278,7 +240,7 @@ namespace linker.plugins.sforward
forward.LocalMsg = item.Item2;
}
}
Version.Add();
OnChanged();
}
catch (Exception)
{
@@ -301,13 +263,5 @@ namespace linker.plugins.sforward
}
}
}
}
[MemoryPackable]
public sealed partial class CountInfo
{
public string MachineId { get; set; }
public int Count { get; set; }
}
}

View File

@@ -0,0 +1,18 @@
using linker.plugins.route;
using System.Net;
namespace linker.plugins.socks5
{
public sealed class RouteExcludeIPSocks5 : IRouteExcludeIP
{
private readonly Socks5ConfigTransfer socks5ConfigTransfer;
public RouteExcludeIPSocks5(Socks5ConfigTransfer socks5ConfigTransfer)
{
this.socks5ConfigTransfer = socks5ConfigTransfer;
}
public List<IPAddress> Get()
{
return socks5ConfigTransfer.Lans.Select(c => c.IP).ToList();
}
}
}

View File

@@ -19,22 +19,20 @@ namespace linker.plugins.socks5
private readonly IMessengerSender messengerSender;
private readonly Socks5ConfigTransfer socks5ConfigTransfer;
private readonly ClientSignInState clientSignInState;
private readonly FileConfig config;
private readonly TunnelProxy tunnelProxy;
private readonly RunningConfig runningConfig;
private readonly AccessTransfer accessTransfer;
private readonly ClientConfigTransfer clientConfigTransfer;
private readonly Socks5Decenter socks5Decenter;
public Socks5ClientApiController(IMessengerSender messengerSender, Socks5ConfigTransfer socks5ConfigTransfer, ClientSignInState clientSignInState, FileConfig config, TunnelProxy tunnelProxy, RunningConfig runningConfig, Socks5ConfigTransfer Socks5ConfigTransfer, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer)
public Socks5ClientApiController(IMessengerSender messengerSender, Socks5ConfigTransfer socks5ConfigTransfer, ClientSignInState clientSignInState, TunnelProxy tunnelProxy, Socks5ConfigTransfer Socks5ConfigTransfer, AccessTransfer accessTransfer, ClientConfigTransfer clientConfigTransfer, Socks5Decenter socks5Decenter)
{
this.messengerSender = messengerSender;
this.socks5ConfigTransfer = socks5ConfigTransfer;
this.clientSignInState = clientSignInState;
this.config = config;
this.tunnelProxy = tunnelProxy;
this.runningConfig = runningConfig;
this.accessTransfer = accessTransfer;
this.clientConfigTransfer = clientConfigTransfer;
this.socks5Decenter = socks5Decenter;
}
public ConnectionListInfo Connections(ApiControllerParamsInfo param)
@@ -65,11 +63,11 @@ namespace linker.plugins.socks5
public Socks5ListInfo Get(ApiControllerParamsInfo param)
{
ulong hashCode = ulong.Parse(param.Content);
if (socks5ConfigTransfer.Version.Eq(hashCode, out ulong version) == false)
if (socks5Decenter.DataVersion.Eq(hashCode, out ulong version) == false)
{
return new Socks5ListInfo
{
List = socks5ConfigTransfer.Infos,
List = socks5Decenter.Infos,
HashCode = version
};
}
@@ -81,7 +79,7 @@ namespace linker.plugins.socks5
/// <param name="param"></param>
public void Refresh(ApiControllerParamsInfo param)
{
socks5ConfigTransfer.RefreshConfig();
socks5Decenter.Refresh();
}
/// <summary>

View File

@@ -1,132 +1,30 @@
using linker.client.config;
using linker.config;
using linker.libs;
using MemoryPack;
using System.Collections.Concurrent;
using System.Net;
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
{
public sealed class Socks5ConfigTransfer : IDecenter
public sealed class Socks5ConfigTransfer
{
public string Name => "socks5";
public VersionManager DataVersion { get; } = new VersionManager();
public List<Socks5LanInfo> Lans=> runningConfig.Data.Socks5.Lans;
public int Port=> runningConfig.Data.Socks5.Port;
public Action OnChanged { get; set; } = () => { };
private readonly IMessengerSender messengerSender;
private readonly ClientSignInState clientSignInState;
private readonly FileConfig config;
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>();
public ConcurrentDictionary<string, Socks5Info> Infos => socks5Infos;
private readonly SemaphoreSlim slim = new SemaphoreSlim(1);
public Socks5ConfigTransfer(IMessengerSender messengerSender, ClientSignInState clientSignInState, FileConfig config, RunningConfig runningConfig, TunnelProxy tunnelProxy, ClientConfigTransfer clientConfigTransfer, TunnelConfigTransfer tunnelConfigTransfer, TuntapConfigTransfer tuntapConfigTransfer)
public Socks5ConfigTransfer(FileConfig config, RunningConfig runningConfig, TunnelProxy tunnelProxy)
{
this.messengerSender = messengerSender;
this.clientSignInState = clientSignInState;
this.config = config;
this.runningConfig = runningConfig;
this.tunnelProxy = tunnelProxy;
this.clientConfigTransfer = clientConfigTransfer;
this.tunnelConfigTransfer = tunnelConfigTransfer;
this.tuntapConfigTransfer = tuntapConfigTransfer;
clientSignInState.NetworkEnabledHandle += (times) => DataVersion.Add();
tunnelProxy.RefreshConfig += RefreshConfig;
if (runningConfig.Data.Socks5.Running) Retstart();
}
public Memory<byte> GetData()
{
Socks5Info info = new Socks5Info
{
Lans = runningConfig.Data.Socks5.Lans.Where(c => c.IP != null && c.IP.Equals(IPAddress.Any) == false).Select(c => { c.Exists = false; return c; }).ToList(),
MachineId = clientConfigTransfer.Id,
Status = tunnelProxy.Running ? Socks5Status.Running : Socks5Status.Normal,
Port = runningConfig.Data.Socks5.Port,
SetupError = tunnelProxy.Error
};
socks5Infos.AddOrUpdate(info.MachineId, info, (a, b) => info);
Version.Add();
return MemoryPackSerializer.Serialize(info);
}
public void SetData(Memory<byte> data)
{
Socks5Info info = MemoryPackSerializer.Deserialize<Socks5Info>(data.Span);
TimerHelper.Async(async () =>
{
await slim.WaitAsync();
try
{
socks5Infos.AddOrUpdate(info.MachineId, info, (a, b) => info);
Version.Add();
AddRoute();
}
catch (Exception ex)
{
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
{
LoggerHelper.Instance.Error(ex);
}
}
slim.Release();
});
}
public void SetData(List<ReadOnlyMemory<byte>> data)
{
List<Socks5Info> list = data.Select(c => MemoryPackSerializer.Deserialize<Socks5Info>(c.Span)).ToList();
TimerHelper.Async(async () =>
{
await slim.WaitAsync();
try
{
foreach (var item in list)
{
socks5Infos.AddOrUpdate(item.MachineId, item, (a, b) => item);
item.LastTicks.Update();
}
var removes = socks5Infos.Keys.Except(list.Select(c => c.MachineId)).Where(c => c != clientConfigTransfer.Id).ToList();
foreach (var item in removes)
{
if (socks5Infos.TryGetValue(item, out Socks5Info socks5Info))
{
socks5Info.Status = Socks5Status.Normal;
socks5Info.LastTicks.Clear();
}
}
Version.Add();
AddRoute();
}
catch (Exception ex)
{
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
{
LoggerHelper.Instance.Error(ex);
}
}
finally
{
slim.Release();
}
});
}
/// <summary>
/// 重启
@@ -137,8 +35,7 @@ namespace linker.plugins.socks5
tunnelProxy.Start(runningConfig.Data.Socks5.Port);
runningConfig.Data.Socks5.Running = tunnelProxy.Running;
runningConfig.Data.Update();
GetData();
DataVersion.Add();
OnChanged();
}
/// <summary>
/// 网卡
@@ -148,17 +45,9 @@ namespace linker.plugins.socks5
tunnelProxy.Stop();
runningConfig.Data.Socks5.Running = tunnelProxy.Running;
runningConfig.Data.Update();
GetData();
DataVersion.Add();
OnChanged();
}
/// <summary>
/// 刷新信息,把自己的配置发给别人,顺便把别人的信息带回来
/// </summary>
public void RefreshConfig()
{
DataVersion.Add();
}
/// <summary>
/// 更新本机信息
/// </summary>
@@ -180,88 +69,8 @@ namespace linker.plugins.socks5
{
Retstart();
}
GetData();
DataVersion.Add();
OnChanged();
});
}
/// <summary>
/// 添加路由
/// </summary>
private void AddRoute()
{
List<Socks5LanIPAddressList> ipsList = ParseIPs(socks5Infos.Values.ToList());
Socks5LanIPAddress[] ips = ipsList.SelectMany(c => c.IPS).ToArray();
tunnelProxy.SetIPs(ips);
Version.Add();
}
private List<Socks5LanIPAddressList> ParseIPs(List<Socks5Info> infos)
{
//排除的IP
uint[] excludeIps =//本机局域网IP
tunnelConfigTransfer.LocalIPs.Where(c => c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
//路由上的IP
.Concat(tunnelConfigTransfer.RouteIPs)
//网卡IP 服务器IP
.Concat(new IPAddress[] { tuntapConfigTransfer.IP, clientSignInState.Connection.Address.Address })
//网卡配置的局域网IP
.Concat(runningConfig.Data.Socks5.Lans.Select(c => c.IP))
.Select(NetworkHelper.IP2Value)
.ToArray();
HashSet<uint> hashSet = new HashSet<uint>();
return infos
.Where(c => c.MachineId != clientConfigTransfer.Id)
.OrderByDescending(c => c.Status)
.OrderByDescending(c => c.LastTicks.Value)
.Select(c =>
{
var lans = c.Lans.Where(c => c.Disabled == false && c.IP.Equals(IPAddress.Any) == false).Where(c =>
{
uint ipInt = NetworkHelper.IP2Value(c.IP);
uint maskValue = NetworkHelper.PrefixLength2Value(c.PrefixLength);
uint network = ipInt & maskValue;
c.Exists = excludeIps.Any(d => (d & maskValue) == network) || hashSet.Contains(network);
hashSet.Add(network);
return c.Exists == false;
});
return new Socks5LanIPAddressList
{
MachineId = c.MachineId,
IPS = ParseIPs(lans.ToList(), c.MachineId)
.Where(c => excludeIps.Select(d => d & c.MaskValue).Contains(c.NetWork) == false).ToList(),
};
}).ToList();
}
private List<Socks5LanIPAddress> ParseIPs(List<Socks5LanInfo> lans, string machineid)
{
return lans.Where(c => c.IP.Equals(IPAddress.Any) == false && c != null).Select((c, index) =>
{
return ParseIPAddress(c.IP, c.PrefixLength, machineid);
}).ToList();
}
private Socks5LanIPAddress ParseIPAddress(IPAddress ip, byte prefixLength, string machineid)
{
uint ipInt = NetworkHelper.IP2Value(ip);
//掩码十进制
uint maskValue = NetworkHelper.PrefixLength2Value(prefixLength);
return new Socks5LanIPAddress
{
IPAddress = ipInt,
PrefixLength = prefixLength,
MaskValue = maskValue,
NetWork = ipInt & maskValue,
Broadcast = ipInt | ~maskValue,
OriginIPAddress = ip,
MachineId = machineid
};
}
}
}

View File

@@ -0,0 +1,199 @@
using linker.libs;
using linker.plugins.client;
using linker.plugins.decenter;
using linker.plugins.route;
using linker.plugins.socks5.config;
using linker.plugins.tunnel;
using linker.plugins.tuntap;
using MemoryPack;
using System.Collections.Concurrent;
using System.Net;
namespace linker.plugins.socks5
{
public sealed class Socks5Decenter : IDecenter
{
public string Name => "socks5";
public VersionManager SyncVersion { get; } = new VersionManager();
public VersionManager DataVersion { get; } = new VersionManager();
private readonly ConcurrentDictionary<string, Socks5Info> socks5Infos = new ConcurrentDictionary<string, Socks5Info>();
public ConcurrentDictionary<string, Socks5Info> Infos => socks5Infos;
private readonly ClientSignInState clientSignInState;
private readonly TunnelProxy tunnelProxy;
private readonly ClientConfigTransfer clientConfigTransfer;
private readonly Socks5ConfigTransfer socks5ConfigTransfer;
private readonly RouteExcludeIPTransfer routeExcludeIPTransfer;
private readonly SemaphoreSlim slim = new SemaphoreSlim(1);
public Socks5Decenter( ClientSignInState clientSignInState, TunnelProxy tunnelProxy, ClientConfigTransfer clientConfigTransfer, Socks5ConfigTransfer socks5ConfigTransfer, RouteExcludeIPTransfer routeExcludeIPTransfer)
{
this.clientSignInState = clientSignInState;
this.tunnelProxy = tunnelProxy;
this.clientConfigTransfer = clientConfigTransfer;
this.socks5ConfigTransfer = socks5ConfigTransfer;
this.routeExcludeIPTransfer = routeExcludeIPTransfer;
clientSignInState.NetworkEnabledHandle += (times) => Refresh();
tunnelProxy.RefreshConfig += Refresh;
socks5ConfigTransfer.OnChanged += Refresh;
}
/// <summary>
/// 刷新信息,把自己的配置发给别人,顺便把别人的信息带回来
/// </summary>
public void Refresh()
{
SyncVersion.Add();
}
public Memory<byte> GetData()
{
Socks5Info info = new Socks5Info
{
Lans = socks5ConfigTransfer.Lans.Where(c => c.IP != null && c.IP.Equals(IPAddress.Any) == false).Select(c => { c.Exists = false; return c; }).ToList(),
MachineId = clientConfigTransfer.Id,
Status = tunnelProxy.Running ? Socks5Status.Running : Socks5Status.Normal,
Port = socks5ConfigTransfer.Port,
SetupError = tunnelProxy.Error
};
socks5Infos.AddOrUpdate(info.MachineId, info, (a, b) => info);
DataVersion.Add();
return MemoryPackSerializer.Serialize(info);
}
public void SetData(Memory<byte> data)
{
Socks5Info info = MemoryPackSerializer.Deserialize<Socks5Info>(data.Span);
TimerHelper.Async(async () =>
{
await slim.WaitAsync();
try
{
socks5Infos.AddOrUpdate(info.MachineId, info, (a, b) => info);
DataVersion.Add();
AddRoute();
}
catch (Exception ex)
{
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
{
LoggerHelper.Instance.Error(ex);
}
}
slim.Release();
});
}
public void SetData(List<ReadOnlyMemory<byte>> data)
{
List<Socks5Info> list = data.Select(c => MemoryPackSerializer.Deserialize<Socks5Info>(c.Span)).ToList();
TimerHelper.Async(async () =>
{
await slim.WaitAsync();
try
{
foreach (var item in list)
{
socks5Infos.AddOrUpdate(item.MachineId, item, (a, b) => item);
item.LastTicks.Update();
}
var removes = socks5Infos.Keys.Except(list.Select(c => c.MachineId)).Where(c => c != clientConfigTransfer.Id).ToList();
foreach (var item in removes)
{
if (socks5Infos.TryGetValue(item, out Socks5Info socks5Info))
{
socks5Info.Status = Socks5Status.Normal;
socks5Info.LastTicks.Clear();
}
}
DataVersion.Add();
AddRoute();
}
catch (Exception ex)
{
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
{
LoggerHelper.Instance.Error(ex);
}
}
finally
{
slim.Release();
}
});
}
/// <summary>
/// 添加路由
/// </summary>
private void AddRoute()
{
List<Socks5LanIPAddressList> ipsList = ParseIPs(socks5Infos.Values.ToList());
Socks5LanIPAddress[] ips = ipsList.SelectMany(c => c.IPS).ToArray();
tunnelProxy.SetIPs(ips);
}
private List<Socks5LanIPAddressList> ParseIPs(List<Socks5Info> infos)
{
//排除的IP
uint[] excludeIps = routeExcludeIPTransfer.Get().Concat(socks5ConfigTransfer.Lans.Select(c => c.IP))
.Select(NetworkHelper.IP2Value)
.ToArray();
HashSet<uint> hashSet = new HashSet<uint>();
return infos
.Where(c => c.MachineId != clientConfigTransfer.Id)
.OrderByDescending(c => c.Status)
.OrderByDescending(c => c.LastTicks.Value)
.Select(c =>
{
var lans = c.Lans.Where(c => c.Disabled == false && c.IP.Equals(IPAddress.Any) == false).Where(c =>
{
uint ipInt = NetworkHelper.IP2Value(c.IP);
uint maskValue = NetworkHelper.PrefixLength2Value(c.PrefixLength);
uint network = ipInt & maskValue;
c.Exists = excludeIps.Any(d => (d & maskValue) == network) || hashSet.Contains(network);
hashSet.Add(network);
return c.Exists == false;
});
return new Socks5LanIPAddressList
{
MachineId = c.MachineId,
IPS = ParseIPs(lans.ToList(), c.MachineId)
.Where(c => excludeIps.Select(d => d & c.MaskValue).Contains(c.NetWork) == false).ToList(),
};
}).ToList();
}
private List<Socks5LanIPAddress> ParseIPs(List<Socks5LanInfo> lans, string machineid)
{
return lans.Where(c => c.IP.Equals(IPAddress.Any) == false && c != null).Select((c, index) =>
{
return ParseIPAddress(c.IP, c.PrefixLength, machineid);
}).ToList();
}
private Socks5LanIPAddress ParseIPAddress(IPAddress ip, byte prefixLength, string machineid)
{
uint ipInt = NetworkHelper.IP2Value(ip);
//掩码十进制
uint maskValue = NetworkHelper.PrefixLength2Value(prefixLength);
return new Socks5LanIPAddress
{
IPAddress = ipInt,
PrefixLength = prefixLength,
MaskValue = maskValue,
NetWork = ipInt & maskValue,
Broadcast = ipInt | ~maskValue,
OriginIPAddress = ip,
MachineId = machineid
};
}
}
}

View File

@@ -12,7 +12,6 @@ using linker.plugins.client;
using linker.plugins.socks5.config;
using System.Text;
using linker.plugins.relay.client;
using linker.client.config;
using linker.plugins.pcp;
namespace linker.plugins.socks5

View File

@@ -26,6 +26,7 @@ namespace linker.plugins.Socks5
serviceCollection.AddSingleton<Socks5ClientMessenger>();
serviceCollection.AddSingleton<Socks5ConfigTransfer>();
serviceCollection.AddSingleton<Socks5Decenter>();
}

View File

@@ -0,0 +1,20 @@
using linker.plugins.route;
using System.Net;
namespace linker.plugins.tunnel
{
public sealed class RouteExcludeIPTunnel : IRouteExcludeIP
{
private readonly TunnelConfigTransfer tunnelConfigTransfer;
public RouteExcludeIPTunnel(TunnelConfigTransfer tunnelConfigTransfer)
{
this.tunnelConfigTransfer = tunnelConfigTransfer;
}
public List<IPAddress> Get()
{
return tunnelConfigTransfer.LocalIPs.Where(c => c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
//路由上的IP
.Concat(tunnelConfigTransfer.RouteIPs).ToList();
}
}
}

View File

@@ -63,10 +63,7 @@ namespace linker.plugins.tunnel
new TransportUdp(),
});
clientSignInState.NetworkEnabledHandle += (times) =>
{
RefreshPortMap();
};
clientSignInState.NetworkEnabledHandle += (times) => RefreshPortMap();
tunnelConfigTransfer.OnChanged += RefreshPortMap;
}

View File

@@ -46,7 +46,7 @@ namespace linker.plugins.tunnel
public TunnelListInfo Get(ApiControllerParamsInfo param)
{
ulong hashCode = ulong.Parse(param.Content);
if (tunnelDecenter.Version.Eq(hashCode, out ulong version) == false)
if (tunnelDecenter.DataVersion.Eq(hashCode, out ulong version) == false)
{
return new TunnelListInfo
{

View File

@@ -8,9 +8,9 @@ namespace linker.plugins.tunnel
public sealed class TunnelDecenter:IDecenter
{
public string Name => "tunnel";
public VersionManager DataVersion { get; } = new VersionManager();
public VersionManager SyncVersion { get; } = new VersionManager();
public VersionManager Version { get; } = new VersionManager();
public VersionManager DataVersion { get; } = new VersionManager();
public ConcurrentDictionary<string, TunnelTransportRouteLevelInfo> Config { get; } = new ConcurrentDictionary<string, TunnelTransportRouteLevelInfo>();
private readonly TunnelConfigTransfer tunnelConfigTransfer;
@@ -25,20 +25,20 @@ namespace linker.plugins.tunnel
/// </summary>
public void Refresh()
{
DataVersion.Add();
SyncVersion.Add();
}
public Memory<byte> GetData()
{
TunnelTransportRouteLevelInfo tunnelTransportRouteLevelInfo = tunnelConfigTransfer.GetLocalRouteLevel();
Config.AddOrUpdate(tunnelTransportRouteLevelInfo.MachineId, tunnelTransportRouteLevelInfo, (a, b) => tunnelTransportRouteLevelInfo);
Version.Add();
DataVersion.Add();
return MemoryPackSerializer.Serialize(tunnelTransportRouteLevelInfo);
}
public void SetData(Memory<byte> data)
{
TunnelTransportRouteLevelInfo tunnelTransportRouteLevelInfo = MemoryPackSerializer.Deserialize<TunnelTransportRouteLevelInfo>(data.Span);
Config.AddOrUpdate(tunnelTransportRouteLevelInfo.MachineId, tunnelTransportRouteLevelInfo, (a, b) => tunnelTransportRouteLevelInfo);
Version.Add();
DataVersion.Add();
}
public void SetData(List<ReadOnlyMemory<byte>> data)
{
@@ -49,7 +49,7 @@ namespace linker.plugins.tunnel
}
TunnelTransportRouteLevelInfo config = tunnelConfigTransfer.GetLocalRouteLevel();
Config.AddOrUpdate(config.MachineId, config, (a, b) => config);
Version.Add();
DataVersion.Add();
}
}
}

View File

@@ -1,6 +1,4 @@
using linker.client.config;
using linker.config;
using linker.plugins.client;
namespace linker.plugins.tunnel.excludeip
{
@@ -8,15 +6,8 @@ namespace linker.plugins.tunnel.excludeip
{
private List<ITunnelExcludeIP> excludeIPs;
private readonly RunningConfig running;
private readonly ClientSignInState clientSignInState;
private readonly FileConfig fileConfig;
public TunnelExcludeIPTransfer(RunningConfig running, ClientSignInState clientSignInState, FileConfig fileConfig)
public TunnelExcludeIPTransfer()
{
this.running = running;
this.clientSignInState = clientSignInState;
this.fileConfig = fileConfig;
}
public void LoadTunnelExcludeIPs(List<ITunnelExcludeIP> list)

View File

@@ -1,5 +1,7 @@
using linker.client.config;
using linker.plugins.route;
using linker.plugins.tunnel.excludeip;
using System.Net;
namespace linker.plugins.tuntap
{
@@ -16,4 +18,17 @@ namespace linker.plugins.tuntap
return new ExcludeIPItem[] { new ExcludeIPItem { IPAddress = tuntapConfigTransfer.IP, Mask = 32 } };
}
}
public sealed class RouteExcludeIPTuntap : IRouteExcludeIP
{
private readonly TuntapConfigTransfer tuntapConfigTransfer;
public RouteExcludeIPTuntap(TuntapConfigTransfer tuntapConfigTransfer)
{
this.tuntapConfigTransfer = tuntapConfigTransfer;
}
public List<IPAddress> Get()
{
return new List<IPAddress> { tuntapConfigTransfer.IP };
}
}
}

View File

@@ -1,5 +1,6 @@
using linker.libs;
using linker.plugins.client;
using linker.plugins.route;
using linker.plugins.tunnel;
using linker.plugins.tuntap.config;
using linker.tun;
@@ -16,20 +17,18 @@ namespace linker.plugins.tuntap
private readonly TuntapConfigTransfer tuntapConfigTransfer;
private readonly TuntapDecenter tuntapDecenter;
private readonly TuntapProxy tuntapProxy;
private readonly ClientSignInState clientSignInState;
private readonly TunnelConfigTransfer tunnelConfigTransfer;
private readonly ClientConfigTransfer clientConfigTransfer;
private readonly RouteExcludeIPTransfer routeExcludeIPTransfer;
public TuntapAdapter(TuntapTransfer tuntapTransfer, TuntapConfigTransfer tuntapConfigTransfer, TuntapDecenter tuntapDecenter, TuntapProxy tuntapProxy,
ClientSignInState clientSignInState, TunnelConfigTransfer tunnelConfigTransfer, ClientConfigTransfer clientConfigTransfer)
ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer, RouteExcludeIPTransfer routeExcludeIPTransfer)
{
this.tuntapTransfer = tuntapTransfer;
this.tuntapConfigTransfer = tuntapConfigTransfer;
this.tuntapDecenter = tuntapDecenter;
this.tuntapProxy = tuntapProxy;
this.clientSignInState = clientSignInState;
this.tunnelConfigTransfer = tunnelConfigTransfer;
this.clientConfigTransfer = clientConfigTransfer;
this.routeExcludeIPTransfer = routeExcludeIPTransfer;
//初始化网卡
tuntapTransfer.Init(tuntapConfigTransfer.DeviceName, this);
@@ -169,17 +168,7 @@ namespace linker.plugins.tuntap
private List<TuntapVeaLanIPAddressList> ParseIPs(List<TuntapInfo> infos)
{
//排除的IP
uint[] excludeIps =//本机局域网IP
tunnelConfigTransfer.LocalIPs.Where(c => c.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
//路由上的IP
.Concat(tunnelConfigTransfer.RouteIPs)
//网卡IP 服务器IP
.Concat(new IPAddress[] { tuntapConfigTransfer.Info.IP, clientSignInState.Connection.Address.Address })
//网卡配置的局域网IP
.Concat(tuntapConfigTransfer.Info.Lans.Select(c => c.IP))
.Select(NetworkHelper.IP2Value)
.ToArray();
uint[] excludeIps = routeExcludeIPTransfer.Get().Select(NetworkHelper.IP2Value) .ToArray();
HashSet<uint> hashSet = new HashSet<uint>();
return infos

View File

@@ -76,7 +76,7 @@ namespace linker.plugins.tuntap
public TuntabListInfo Get(ApiControllerParamsInfo param)
{
ulong hashCode = ulong.Parse(param.Content);
if (tuntapDecenter.Version.Eq(hashCode, out ulong version) == false)
if (tuntapDecenter.DataVersion.Eq(hashCode, out ulong version) == false)
{
return new TuntabListInfo
{

View File

@@ -10,9 +10,9 @@ namespace linker.plugins.tuntap
public sealed class TuntapDecenter : IDecenter
{
public string Name => "tuntap";
public VersionManager DataVersion { get; } = new VersionManager();
public VersionManager SyncVersion { get; } = new VersionManager();
public VersionManager Version { get; } = new VersionManager();
public VersionManager DataVersion { get; } = new VersionManager();
public ConcurrentDictionary<string, TuntapInfo> Infos => tuntapInfos;
private readonly SemaphoreSlim slim = new SemaphoreSlim(1);
@@ -43,14 +43,14 @@ namespace linker.plugins.tuntap
public void Refresh()
{
DataVersion.Add();
SyncVersion.Add();
}
public Memory<byte> GetData()
{
TuntapInfo info = HandleCurrentInfo();
tuntapInfos.AddOrUpdate(info.MachineId, info, (a, b) => info);
Version.Add();
DataVersion.Add();
return MemoryPackSerializer.Serialize(info);
}
public void SetData(Memory<byte> data)
@@ -68,7 +68,7 @@ namespace linker.plugins.tuntap
{
OnChangeBefore();
tuntapInfos.AddOrUpdate(info.MachineId, info, (a, b) => info);
Version.Add();
DataVersion.Add();
OnChangeAfter();
}
catch (Exception ex)
@@ -105,7 +105,7 @@ namespace linker.plugins.tuntap
tuntapInfo.LastTicks.Clear();
}
}
Version.Add();
DataVersion.Add();
OnChangeAfter();
}
catch (Exception ex)

View File

@@ -61,7 +61,7 @@ namespace linker.plugins.tuntap
using Ping ping = new Ping();
PingReply pingReply = await ping.SendPingAsync(c.IP, 500);
c.Delay = pingReply.Status == IPStatus.Success ? (int)pingReply.RoundtripTime : -1;
tuntapDecenter.Version.Add();
tuntapDecenter.DataVersion.Add();
}));
}
}

View File

@@ -1,5 +1,5 @@
v1.6.3
2024-12-12 17:37:53
2024-12-13 15:52:27
1. 优化UI显示网络计算IP数
2. 修复内网穿透不停止直接删除导致的无法再次添加的问题
3. 优化网卡的端口转发