代码整理

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 System.Collections.Generic;
using Microsoft.CodeAnalysis.Text; using Microsoft.CodeAnalysis.Text;
using System.Text; using System.Text;
using System;
using System.Diagnostics;
namespace linker.gen 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="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="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="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) public void Initialize(IncrementalGeneratorInitializationContext context)
@@ -33,7 +32,7 @@ namespace linker.gen
context.RegisterSourceOutput(compilations, (sourceProductionContext, compilation) => context.RegisterSourceOutput(compilations, (sourceProductionContext, compilation) =>
{ {
foreach (GeneratorInfo info in generators) foreach (GeneratorInfo info in generators)
{ {

View File

@@ -54,7 +54,7 @@ namespace linker.tunnel.transport
private byte[] authBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.ttl"); private byte[] authBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.ttl");
private byte[] endBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.end"); private byte[] endBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.end");
public TransportTcpP2PNAT() public TransportTcpP2PNAT()
{ {
} }
@@ -174,7 +174,10 @@ namespace linker.tunnel.transport
if (state.SSL) if (state.SSL)
{ {
sslStream = new SslStream(new NetworkStream(socket, false), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null); 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 return new TunnelConnectionTcp

View File

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

View File

@@ -1,69 +1,20 @@
using linker.config; using linker.config;
using linker.libs; using linker.libs;
using linker.plugins.client;
using linker.plugins.decenter;
using linker.plugins.messenger;
using MemoryPack;
namespace linker.plugins.access namespace linker.plugins.access
{ {
public sealed class AccessTransfer : IDecenter public sealed class AccessTransfer
{ {
public string Name => "access"; public ClientApiAccess Access => fileConfig.Data.Client.Access;
public VersionManager DataVersion { get; } = new VersionManager();
public VersionManager Version { get; } = new VersionManager(); public Action OnChanged { get; set; } = () => { };
private Dictionary<string, ClientApiAccess> accesss = new Dictionary<string, ClientApiAccess>();
private readonly FileConfig fileConfig; private readonly FileConfig fileConfig;
private readonly IMessengerSender sender; public AccessTransfer(FileConfig fileConfig)
private readonly ClientSignInState clientSignInState;
private readonly ClientConfigTransfer clientConfigTransfer;
public AccessTransfer(FileConfig fileConfig, IMessengerSender sender, ClientSignInState clientSignInState, ClientConfigTransfer clientConfigTransfer)
{ {
this.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>
/// 设置权限 /// 设置权限
/// </summary> /// </summary>
@@ -73,16 +24,13 @@ namespace linker.plugins.access
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Debug($"from {info.FromMachineId} set access to {info.Access},my access {(ulong)fileConfig.Data.Client.Access}"); LoggerHelper.Instance.Debug($"from {info.FromMachineId} set access to {info.Access},my access {(ulong)fileConfig.Data.Client.Access}");
//我的权限删掉它的权限==0说明它至少拥有我的全部权限我是它的子集它有权管我 if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
if (accesss.TryGetValue(info.FromMachineId, out ClientApiAccess access) && (~access & fileConfig.Data.Client.Access) == 0) LoggerHelper.Instance.Debug($"from {info.FromMachineId} set access to {info.Access} success");
{ fileConfig.Data.Client.Access = (ClientApiAccess)info.Access;
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) fileConfig.Data.Update();
LoggerHelper.Instance.Debug($"from {info.FromMachineId} set access to {info.Access} success"); OnChanged();
fileConfig.Data.Client.Access = (ClientApiAccess)info.Access;
fileConfig.Data.Update();
}
DataVersion.Add();
} }
/// <summary> /// <summary>
/// 合并权限 /// 合并权限
/// </summary> /// </summary>

View File

@@ -17,18 +17,14 @@ namespace linker.plugins.client
public sealed class ClientSignInTransfer public sealed class ClientSignInTransfer
{ {
private readonly ClientSignInState clientSignInState; private readonly ClientSignInState clientSignInState;
private readonly RunningConfig runningConfig;
private readonly FileConfig config;
private readonly IMessengerSender messengerSender; private readonly IMessengerSender messengerSender;
private readonly IMessengerResolver messengerResolver; private readonly IMessengerResolver messengerResolver;
private readonly SignInArgsTransfer signInArgsTransfer; private readonly SignInArgsTransfer signInArgsTransfer;
private readonly ClientConfigTransfer clientConfigTransfer; 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.clientSignInState = clientSignInState;
this.runningConfig = runningConfig;
this.config = config;
this.messengerSender = messengerSender; this.messengerSender = messengerSender;
this.messengerResolver = messengerResolver; this.messengerResolver = messengerResolver;
this.signInArgsTransfer = signInArgsTransfer; 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.args;
using linker.plugins.signin.messenger; using linker.plugins.signin.messenger;
using linker.config;
namespace linker.plugins.client namespace linker.plugins.client
{ {
@@ -9,11 +8,9 @@ namespace linker.plugins.client
/// </summary> /// </summary>
public sealed class SignInArgsGroupPasswordClient : ISignInArgs public sealed class SignInArgsGroupPasswordClient : ISignInArgs
{ {
private readonly FileConfig fileConfig;
private readonly ClientConfigTransfer clientConfigTransfer; private readonly ClientConfigTransfer clientConfigTransfer;
public SignInArgsGroupPasswordClient(FileConfig fileConfig, ClientConfigTransfer clientConfigTransfer) public SignInArgsGroupPasswordClient( ClientConfigTransfer clientConfigTransfer)
{ {
this.fileConfig = fileConfig;
this.clientConfigTransfer = clientConfigTransfer; this.clientConfigTransfer = clientConfigTransfer;
} }
public async Task<string> Invoke(string host, Dictionary<string, string> args) public async Task<string> Invoke(string host, Dictionary<string, string> args)
@@ -35,10 +32,8 @@ namespace linker.plugins.client
/// </summary> /// </summary>
public sealed class SignInArgsGroupPasswordServer : ISignInArgs public sealed class SignInArgsGroupPasswordServer : ISignInArgs
{ {
private readonly FileConfig fileConfig; public SignInArgsGroupPasswordServer()
public SignInArgsGroupPasswordServer(FileConfig fileConfig)
{ {
this.fileConfig = fileConfig;
} }
public async Task<string> Invoke(string host, Dictionary<string, string> args) public async Task<string> Invoke(string host, Dictionary<string, string> args)
{ {

View File

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

View File

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

View File

@@ -22,19 +22,19 @@ namespace linker.plugins.forward
private readonly ForwardProxy forwardProxy; private readonly ForwardProxy forwardProxy;
private readonly IMessengerSender messengerSender; private readonly IMessengerSender messengerSender;
private readonly ClientSignInState clientSignInState; private readonly ClientSignInState clientSignInState;
private readonly FileConfig config;
private readonly AccessTransfer accessTransfer; private readonly AccessTransfer accessTransfer;
private readonly ClientConfigTransfer clientConfigTransfer; 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.forwardTransfer = forwardTransfer;
this.forwardProxy = forwardProxy; this.forwardProxy = forwardProxy;
this.messengerSender = messengerSender; this.messengerSender = messengerSender;
this.clientSignInState = clientSignInState; this.clientSignInState = clientSignInState;
this.config = config;
this.accessTransfer = accessTransfer; this.accessTransfer = accessTransfer;
this.clientConfigTransfer = clientConfigTransfer; this.clientConfigTransfer = clientConfigTransfer;
this.forwardDecenter = forwardDecenter;
} }
public ConnectionListInfo Connections(ApiControllerParamsInfo param) public ConnectionListInfo Connections(ApiControllerParamsInfo param)
@@ -64,16 +64,16 @@ namespace linker.plugins.forward
public void Refresh(ApiControllerParamsInfo param) public void Refresh(ApiControllerParamsInfo param)
{ {
forwardTransfer.RefreshConfig(); forwardDecenter.Refresh();
} }
public ForwardListInfo GetCount(ApiControllerParamsInfo param) public ForwardListInfo GetCount(ApiControllerParamsInfo param)
{ {
ulong hashCode = ulong.Parse(param.Content); 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 return new ForwardListInfo
{ {
List = forwardTransfer.GetCount(), List = forwardDecenter.CountDic,
HashCode = version 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<ForwardClientMessenger>();
serviceCollection.AddSingleton<ForwardDecenter>();
} }
public void AddServer(ServiceCollection serviceCollection, FileConfig config) public void AddServer(ServiceCollection serviceCollection, FileConfig config)

View File

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

View File

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

View File

@@ -12,6 +12,7 @@ namespace linker.plugins.pcp
public sealed class PcpConfigTransfer : IDecenter public sealed class PcpConfigTransfer : IDecenter
{ {
public string Name => "pcp"; public string Name => "pcp";
public VersionManager SyncVersion { get; } = new VersionManager();
public VersionManager DataVersion { get; } = new VersionManager(); public VersionManager DataVersion { get; } = new VersionManager();
private ConcurrentDictionary<string, List<string>> history = new ConcurrentDictionary<string, List<string>>(); private ConcurrentDictionary<string, List<string>> history = new ConcurrentDictionary<string, List<string>>();
@@ -27,7 +28,7 @@ namespace linker.plugins.pcp
this.clientSignInState = clientSignInState; this.clientSignInState = clientSignInState;
this.clientConfigTransfer = clientConfigTransfer; this.clientConfigTransfer = clientConfigTransfer;
clientSignInState.NetworkEnabledHandle += (times) => DataVersion.Add(); clientSignInState.NetworkEnabledHandle += (times) => SyncVersion.Add();
} }
public void AddHistory(ITunnelConnection connection) public void AddHistory(ITunnelConnection connection)
@@ -36,7 +37,7 @@ namespace linker.plugins.pcp
{ {
runningConfig.Data.TunnelHistory.History.Add(connection.RemoteMachineId); runningConfig.Data.TunnelHistory.History.Add(connection.RemoteMachineId);
runningConfig.Data.Update(); runningConfig.Data.Update();
DataVersion.Add(); SyncVersion.Add();
} }
} }
public List<string> GetNodes(string fromMachineId, string toMachineId) 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; using MemoryPack;
namespace linker.plugins.relay.client namespace linker.plugins.relay.client
@@ -8,11 +7,9 @@ namespace linker.plugins.relay.client
{ {
public string Name => "RelaySecretKey"; public string Name => "RelaySecretKey";
private readonly FileConfig fileConfig;
private readonly RelayClientConfigTransfer relayClientConfigTransfer; private readonly RelayClientConfigTransfer relayClientConfigTransfer;
public RelaConfigSyncSecretKey(FileConfig fileConfig, RelayClientConfigTransfer relayClientConfigTransfer) public RelaConfigSyncSecretKey(RelayClientConfigTransfer relayClientConfigTransfer)
{ {
this.fileConfig = fileConfig;
this.relayClientConfigTransfer = relayClientConfigTransfer; this.relayClientConfigTransfer = relayClientConfigTransfer;
} }
public Memory<byte> GetData() 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.api;
using linker.libs.extends; using linker.libs.extends;
using linker.plugins.capi; using linker.plugins.capi;
@@ -11,16 +10,12 @@ namespace linker.plugins.relay.client
/// </summary> /// </summary>
public sealed class RelayApiController : IApiClientController public sealed class RelayApiController : IApiClientController
{ {
private readonly FileConfig config;
private readonly RunningConfig runningConfig;
private readonly RelayTestTransfer relayTestTransfer; private readonly RelayTestTransfer relayTestTransfer;
private readonly RelayTransfer relayTransfer; private readonly RelayTransfer relayTransfer;
private readonly RelayClientConfigTransfer relayClientConfigTransfer; 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.relayTestTransfer = relayTestTransfer;
this.relayTransfer = relayTransfer; this.relayTransfer = relayTransfer;
this.relayClientConfigTransfer = relayClientConfigTransfer; this.relayClientConfigTransfer = relayClientConfigTransfer;

View File

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

View File

@@ -14,5 +14,18 @@ namespace linker.plugins.relay.server
{ {
this.config = config; 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; this.serverConfigTransfer = serverConfigTransfer;
limitTotal.SetLimit((uint)Math.Ceiling((relayServerConfigTransfer.Node.MaxBandwidthTotal * 1024 * 1024) / 8.0)); limitTotal.SetLimit((uint)Math.Ceiling((relayServerConfigTransfer.Node.MaxBandwidthTotal * 1024 * 1024) / 8.0));
ResetBytes();
cryptoNode = CryptoFactory.CreateSymmetric(relayServerConfigTransfer.Node.MasterSecretKey); cryptoNode = CryptoFactory.CreateSymmetric(relayServerConfigTransfer.Node.MasterSecretKey);
cryptoMaster = CryptoFactory.CreateSymmetric(relayServerConfigTransfer.Master.SecretKey); cryptoMaster = CryptoFactory.CreateSymmetric(relayServerConfigTransfer.Master.SecretKey);
ReportTask(); ReportTask();
} }
public async ValueTask<RelayCache> TryGetRelayCache(string key, string nodeid) public async ValueTask<RelayCache> TryGetRelayCache(string key, string nodeid)
@@ -143,8 +141,8 @@ namespace linker.plugins.relay.server
} }
if (relayServerConfigTransfer.Node.MaxGbTotalLastBytes >= length) if (relayServerConfigTransfer.Node.MaxGbTotalLastBytes >= length)
relayServerConfigTransfer.Node.MaxGbTotalLastBytes -= length; relayServerConfigTransfer.SetMaxGbTotalLastBytes(relayServerConfigTransfer.Node.MaxGbTotalLastBytes - length);
else relayServerConfigTransfer.Node.MaxGbTotalLastBytes = 0; else relayServerConfigTransfer.SetMaxGbTotalLastBytes(0);
return relayServerConfigTransfer.Node.MaxGbTotalLastBytes > 0; return relayServerConfigTransfer.Node.MaxGbTotalLastBytes > 0;
} }
@@ -179,21 +177,20 @@ namespace linker.plugins.relay.server
{ {
if (relayServerConfigTransfer.Node.MaxGbTotalMonth != DateTime.Now.Month) if (relayServerConfigTransfer.Node.MaxGbTotalMonth != DateTime.Now.Month)
{ {
relayServerConfigTransfer.Node.MaxGbTotalMonth = DateTime.Now.Month; relayServerConfigTransfer.SetMaxGbTotalMonth(DateTime.Now.Month);
relayServerConfigTransfer.Node.MaxGbTotalLastBytes = (ulong)(relayServerConfigTransfer.Node.MaxGbTotal * 1024 * 1024 * 1024); relayServerConfigTransfer.SetMaxGbTotalLastBytes((ulong)(relayServerConfigTransfer.Node.MaxGbTotal * 1024 * 1024 * 1024));
fileConfig.Data.Update();
} }
relayServerConfigTransfer.Update();
} }
private void ReportTask() private void ReportTask()
{ {
TimerHelper.SetInterval(async () => TimerHelper.SetInterval(async () =>
{ {
ResetBytes(); ResetBytes();
IEnumerable<RelayNodeInfo> nodes = new List<RelayNodeInfo> IEnumerable<RelayNodeInfo> nodes = new List<RelayNodeInfo>
{ {
//默认报告给自己,作为本服务器的一个默认中继节点
new RelayNodeInfo{ new RelayNodeInfo{
Id = RelayNodeInfo.MASTER_NODE_ID, Id = RelayNodeInfo.MASTER_NODE_ID,
Host = new IPEndPoint(IPAddress.Any,serverConfigTransfer.Port).ToString(), Host = new IPEndPoint(IPAddress.Any,serverConfigTransfer.Port).ToString(),
@@ -208,6 +205,7 @@ namespace linker.plugins.relay.server
Name = "default", Name = "default",
Public = false Public = false
}, },
//配置的中继节点
relayServerConfigTransfer.Node relayServerConfigTransfer.Node
}.Where(c => string.IsNullOrWhiteSpace(c.MasterHost) == false && string.IsNullOrWhiteSpace(c.MasterSecretKey) == false) }.Where(c => string.IsNullOrWhiteSpace(c.MasterHost) == false && string.IsNullOrWhiteSpace(c.MasterSecretKey) == false)
.Where(c => string.IsNullOrWhiteSpace(c.Name) == false && string.IsNullOrWhiteSpace(c.Id) == 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; 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); IPEndPoint endPoint = await NetworkHelper.GetEndPointAsync(node.Host, serverConfigTransfer.Port) ?? new IPEndPoint(IPAddress.Any, serverConfigTransfer.Port);
RelayNodeReportInfo relayNodeReportInfo = new RelayNodeReportInfo RelayNodeReportInfo relayNodeReportInfo = new RelayNodeReportInfo
{ {
Id = node.Id, Id = node.Id,
@@ -253,12 +250,8 @@ namespace linker.plugins.relay.server
{ {
} }
} }
return true; return true;
}, () => 5000); }, () => 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 SForwardTransfer forwardTransfer;
private readonly IMessengerSender messengerSender; private readonly IMessengerSender messengerSender;
private readonly ClientSignInState clientSignInState; private readonly ClientSignInState clientSignInState;
private readonly FileConfig config;
private readonly AccessTransfer accessTransfer; private readonly AccessTransfer accessTransfer;
private readonly ClientConfigTransfer clientConfigTransfer; 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.forwardTransfer = forwardTransfer;
this.messengerSender = messengerSender; this.messengerSender = messengerSender;
this.clientSignInState = clientSignInState; this.clientSignInState = clientSignInState;
this.config = config;
this.accessTransfer = accessTransfer; this.accessTransfer = accessTransfer;
this.clientConfigTransfer = clientConfigTransfer; this.clientConfigTransfer = clientConfigTransfer;
this.sForwardDecenter = sForwardDecenter;
} }
/// <summary> /// <summary>
@@ -53,7 +53,7 @@ namespace linker.plugins.sforward
public void Refresh(ApiControllerParamsInfo param) public void Refresh(ApiControllerParamsInfo param)
{ {
forwardTransfer.RefreshConfig(); sForwardDecenter.Refresh();
} }
/// <summary> /// <summary>
/// 获取数量 /// 获取数量
@@ -63,11 +63,11 @@ namespace linker.plugins.sforward
public SForwardListInfo GetCount(ApiControllerParamsInfo param) public SForwardListInfo GetCount(ApiControllerParamsInfo param)
{ {
ulong hashCode = ulong.Parse(param.Content); 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 return new SForwardListInfo
{ {
List = forwardTransfer.GetCount(), List = sForwardDecenter.CountDic,
HashCode = version HashCode = version
}; };
} }

View File

@@ -1,5 +1,4 @@
using linker.config; using linker.plugins.config;
using linker.plugins.config;
using MemoryPack; using MemoryPack;
namespace linker.plugins.sforward 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 linker.config;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace linker.plugins.sforward namespace linker.plugins.sforward
{ {

View File

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

View File

@@ -9,20 +9,15 @@ using linker.libs.extends;
using linker.plugins.client; using linker.plugins.client;
using linker.plugins.messenger; using linker.plugins.messenger;
using linker.config; using linker.config;
using System.Collections.Concurrent;
using linker.plugins.decenter;
namespace linker.plugins.sforward 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 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 FileConfig fileConfig;
private readonly RunningConfig running; private readonly RunningConfig running;
@@ -31,11 +26,8 @@ namespace linker.plugins.sforward
private readonly ClientConfigTransfer clientConfigTransfer; private readonly ClientConfigTransfer clientConfigTransfer;
private readonly NumberSpaceUInt32 ns = new NumberSpaceUInt32(); private readonly NumberSpaceUInt32 ns = new NumberSpaceUInt32();
private readonly ConcurrentDictionary<string, int> countDic = new ConcurrentDictionary<string, int>();
private readonly OperatingManager operatingManager = new OperatingManager(); private readonly OperatingManager operatingManager = new OperatingManager();
public SForwardTransfer(FileConfig fileConfig, RunningConfig running, ClientSignInState clientSignInState, IMessengerSender messengerSender, ClientConfigTransfer clientConfigTransfer) public SForwardTransfer(FileConfig fileConfig, RunningConfig running, ClientSignInState clientSignInState, IMessengerSender messengerSender, ClientConfigTransfer clientConfigTransfer)
{ {
this.fileConfig = fileConfig; this.fileConfig = fileConfig;
@@ -47,37 +39,7 @@ namespace linker.plugins.sforward
clientSignInState.NetworkFirstEnabledHandle += () => Start(); 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) public void SetSecretKey(string key)
{ {
fileConfig.Data.Client.SForward.SecretKey = key; fileConfig.Data.Client.SForward.SecretKey = key;
@@ -101,7 +63,7 @@ namespace linker.plugins.sforward
} }
} }
DataVersion.Add(); OnChanged();
} }
private void Start(SForwardInfo forwardInfo) private void Start(SForwardInfo forwardInfo)
{ {
@@ -147,7 +109,7 @@ namespace linker.plugins.sforward
LoggerHelper.Instance.Error(ex); LoggerHelper.Instance.Error(ex);
} }
Version.Add(); OnChanged();
} }
private void Stop(SForwardInfo forwardInfo) private void Stop(SForwardInfo forwardInfo)
{ {
@@ -184,7 +146,7 @@ namespace linker.plugins.sforward
{ {
LoggerHelper.Instance.Error(ex); LoggerHelper.Instance.Error(ex);
} }
Version.Add(); OnChanged();
} }
public List<SForwardInfo> Get() public List<SForwardInfo> Get()
@@ -278,7 +240,7 @@ namespace linker.plugins.sforward
forward.LocalMsg = item.Item2; forward.LocalMsg = item.Item2;
} }
} }
Version.Add(); OnChanged();
} }
catch (Exception) 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 IMessengerSender messengerSender;
private readonly Socks5ConfigTransfer socks5ConfigTransfer; private readonly Socks5ConfigTransfer socks5ConfigTransfer;
private readonly ClientSignInState clientSignInState; private readonly ClientSignInState clientSignInState;
private readonly FileConfig config;
private readonly TunnelProxy tunnelProxy; private readonly TunnelProxy tunnelProxy;
private readonly RunningConfig runningConfig;
private readonly AccessTransfer accessTransfer; private readonly AccessTransfer accessTransfer;
private readonly ClientConfigTransfer clientConfigTransfer; 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.messengerSender = messengerSender;
this.socks5ConfigTransfer = socks5ConfigTransfer; this.socks5ConfigTransfer = socks5ConfigTransfer;
this.clientSignInState = clientSignInState; this.clientSignInState = clientSignInState;
this.config = config;
this.tunnelProxy = tunnelProxy; this.tunnelProxy = tunnelProxy;
this.runningConfig = runningConfig;
this.accessTransfer = accessTransfer; this.accessTransfer = accessTransfer;
this.clientConfigTransfer = clientConfigTransfer; this.clientConfigTransfer = clientConfigTransfer;
this.socks5Decenter = socks5Decenter;
} }
public ConnectionListInfo Connections(ApiControllerParamsInfo param) public ConnectionListInfo Connections(ApiControllerParamsInfo param)
@@ -65,11 +63,11 @@ namespace linker.plugins.socks5
public Socks5ListInfo Get(ApiControllerParamsInfo param) public Socks5ListInfo Get(ApiControllerParamsInfo param)
{ {
ulong hashCode = ulong.Parse(param.Content); 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 return new Socks5ListInfo
{ {
List = socks5ConfigTransfer.Infos, List = socks5Decenter.Infos,
HashCode = version HashCode = version
}; };
} }
@@ -81,7 +79,7 @@ namespace linker.plugins.socks5
/// <param name="param"></param> /// <param name="param"></param>
public void Refresh(ApiControllerParamsInfo param) public void Refresh(ApiControllerParamsInfo param)
{ {
socks5ConfigTransfer.RefreshConfig(); socks5Decenter.Refresh();
} }
/// <summary> /// <summary>

View File

@@ -1,133 +1,31 @@
using linker.client.config; using linker.client.config;
using linker.config; using linker.config;
using linker.libs; 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.socks5.config;
using linker.plugins.decenter;
using linker.plugins.tunnel;
using linker.plugins.tuntap;
namespace linker.plugins.socks5 namespace linker.plugins.socks5
{ {
public sealed class Socks5ConfigTransfer : IDecenter public sealed class Socks5ConfigTransfer
{ {
public string Name => "socks5"; public List<Socks5LanInfo> Lans=> runningConfig.Data.Socks5.Lans;
public VersionManager DataVersion { get; } = new VersionManager(); 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 FileConfig config;
private readonly RunningConfig runningConfig; private readonly RunningConfig runningConfig;
private readonly TunnelProxy tunnelProxy; 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); 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.config = config;
this.runningConfig = runningConfig; this.runningConfig = runningConfig;
this.tunnelProxy = tunnelProxy; 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(); 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> /// <summary>
/// 重启 /// 重启
/// </summary> /// </summary>
@@ -137,8 +35,7 @@ namespace linker.plugins.socks5
tunnelProxy.Start(runningConfig.Data.Socks5.Port); tunnelProxy.Start(runningConfig.Data.Socks5.Port);
runningConfig.Data.Socks5.Running = tunnelProxy.Running; runningConfig.Data.Socks5.Running = tunnelProxy.Running;
runningConfig.Data.Update(); runningConfig.Data.Update();
GetData(); OnChanged();
DataVersion.Add();
} }
/// <summary> /// <summary>
/// 网卡 /// 网卡
@@ -148,17 +45,9 @@ namespace linker.plugins.socks5
tunnelProxy.Stop(); tunnelProxy.Stop();
runningConfig.Data.Socks5.Running = tunnelProxy.Running; runningConfig.Data.Socks5.Running = tunnelProxy.Running;
runningConfig.Data.Update(); runningConfig.Data.Update();
GetData(); OnChanged();
DataVersion.Add();
} }
/// <summary>
/// 刷新信息,把自己的配置发给别人,顺便把别人的信息带回来
/// </summary>
public void RefreshConfig()
{
DataVersion.Add();
}
/// <summary> /// <summary>
/// 更新本机信息 /// 更新本机信息
/// </summary> /// </summary>
@@ -180,88 +69,8 @@ namespace linker.plugins.socks5
{ {
Retstart(); Retstart();
} }
GetData(); OnChanged();
DataVersion.Add();
}); });
} }
/// <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 linker.plugins.socks5.config;
using System.Text; using System.Text;
using linker.plugins.relay.client; using linker.plugins.relay.client;
using linker.client.config;
using linker.plugins.pcp; using linker.plugins.pcp;
namespace linker.plugins.socks5 namespace linker.plugins.socks5

View File

@@ -26,7 +26,8 @@ namespace linker.plugins.Socks5
serviceCollection.AddSingleton<Socks5ClientMessenger>(); serviceCollection.AddSingleton<Socks5ClientMessenger>();
serviceCollection.AddSingleton<Socks5ConfigTransfer>(); serviceCollection.AddSingleton<Socks5ConfigTransfer>();
serviceCollection.AddSingleton<Socks5Decenter>();
} }
public void AddServer(ServiceCollection serviceCollection, FileConfig config) public void AddServer(ServiceCollection serviceCollection, FileConfig config)

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(), new TransportUdp(),
}); });
clientSignInState.NetworkEnabledHandle += (times) => clientSignInState.NetworkEnabledHandle += (times) => RefreshPortMap();
{
RefreshPortMap();
};
tunnelConfigTransfer.OnChanged += RefreshPortMap; tunnelConfigTransfer.OnChanged += RefreshPortMap;
} }

View File

@@ -46,7 +46,7 @@ namespace linker.plugins.tunnel
public TunnelListInfo Get(ApiControllerParamsInfo param) public TunnelListInfo Get(ApiControllerParamsInfo param)
{ {
ulong hashCode = ulong.Parse(param.Content); 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 return new TunnelListInfo
{ {

View File

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

View File

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

View File

@@ -1,5 +1,7 @@
using linker.client.config; using linker.client.config;
using linker.plugins.route;
using linker.plugins.tunnel.excludeip; using linker.plugins.tunnel.excludeip;
using System.Net;
namespace linker.plugins.tuntap namespace linker.plugins.tuntap
{ {
@@ -16,4 +18,17 @@ namespace linker.plugins.tuntap
return new ExcludeIPItem[] { new ExcludeIPItem { IPAddress = tuntapConfigTransfer.IP, Mask = 32 } }; 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.libs;
using linker.plugins.client; using linker.plugins.client;
using linker.plugins.route;
using linker.plugins.tunnel; using linker.plugins.tunnel;
using linker.plugins.tuntap.config; using linker.plugins.tuntap.config;
using linker.tun; using linker.tun;
@@ -16,20 +17,18 @@ namespace linker.plugins.tuntap
private readonly TuntapConfigTransfer tuntapConfigTransfer; private readonly TuntapConfigTransfer tuntapConfigTransfer;
private readonly TuntapDecenter tuntapDecenter; private readonly TuntapDecenter tuntapDecenter;
private readonly TuntapProxy tuntapProxy; private readonly TuntapProxy tuntapProxy;
private readonly ClientSignInState clientSignInState;
private readonly TunnelConfigTransfer tunnelConfigTransfer;
private readonly ClientConfigTransfer clientConfigTransfer; private readonly ClientConfigTransfer clientConfigTransfer;
private readonly RouteExcludeIPTransfer routeExcludeIPTransfer;
public TuntapAdapter(TuntapTransfer tuntapTransfer, TuntapConfigTransfer tuntapConfigTransfer, TuntapDecenter tuntapDecenter, TuntapProxy tuntapProxy, 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.tuntapTransfer = tuntapTransfer;
this.tuntapConfigTransfer = tuntapConfigTransfer; this.tuntapConfigTransfer = tuntapConfigTransfer;
this.tuntapDecenter = tuntapDecenter; this.tuntapDecenter = tuntapDecenter;
this.tuntapProxy = tuntapProxy; this.tuntapProxy = tuntapProxy;
this.clientSignInState = clientSignInState;
this.tunnelConfigTransfer = tunnelConfigTransfer;
this.clientConfigTransfer = clientConfigTransfer; this.clientConfigTransfer = clientConfigTransfer;
this.routeExcludeIPTransfer = routeExcludeIPTransfer;
//初始化网卡 //初始化网卡
tuntapTransfer.Init(tuntapConfigTransfer.DeviceName, this); tuntapTransfer.Init(tuntapConfigTransfer.DeviceName, this);
@@ -169,17 +168,7 @@ namespace linker.plugins.tuntap
private List<TuntapVeaLanIPAddressList> ParseIPs(List<TuntapInfo> infos) private List<TuntapVeaLanIPAddressList> ParseIPs(List<TuntapInfo> infos)
{ {
//排除的IP //排除的IP
uint[] excludeIps =//本机局域网IP uint[] excludeIps = routeExcludeIPTransfer.Get().Select(NetworkHelper.IP2Value) .ToArray();
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();
HashSet<uint> hashSet = new HashSet<uint>(); HashSet<uint> hashSet = new HashSet<uint>();
return infos return infos

View File

@@ -76,7 +76,7 @@ namespace linker.plugins.tuntap
public TuntabListInfo Get(ApiControllerParamsInfo param) public TuntabListInfo Get(ApiControllerParamsInfo param)
{ {
ulong hashCode = ulong.Parse(param.Content); 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 return new TuntabListInfo
{ {

View File

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

View File

@@ -61,7 +61,7 @@ namespace linker.plugins.tuntap
using Ping ping = new Ping(); using Ping ping = new Ping();
PingReply pingReply = await ping.SendPingAsync(c.IP, 500); PingReply pingReply = await ping.SendPingAsync(c.IP, 500);
c.Delay = pingReply.Status == IPStatus.Success ? (int)pingReply.RoundtripTime : -1; 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 v1.6.3
2024-12-12 17:37:53 2024-12-13 15:52:27
1. 优化UI显示网络计算IP数 1. 优化UI显示网络计算IP数
2. 修复内网穿透不停止直接删除导致的无法再次添加的问题 2. 修复内网穿透不停止直接删除导致的无法再次添加的问题
3. 优化网卡的端口转发 3. 优化网卡的端口转发