mirror of
https://github.com/snltty/linker.git
synced 2025-10-06 17:46:59 +08:00
代码整理
This commit is contained in:
@@ -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)
|
||||
|
@@ -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
|
||||
|
@@ -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)
|
||||
{
|
||||
|
54
linker/plugins/access/AccessDecenter.cs
Normal file
54
linker/plugins/access/AccessDecenter.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
@@ -23,6 +23,7 @@ namespace linker.plugins.access
|
||||
|
||||
serviceCollection.AddSingleton<AccessClientMessenger>();
|
||||
serviceCollection.AddSingleton<AccessTransfer>();
|
||||
serviceCollection.AddSingleton<AccessDecenter>();
|
||||
}
|
||||
|
||||
public void AddServer(ServiceCollection serviceCollection, FileConfig config)
|
||||
|
@@ -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();
|
||||
}
|
||||
DataVersion.Add();
|
||||
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();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 合并权限
|
||||
/// </summary>
|
||||
|
@@ -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;
|
||||
|
18
linker/plugins/client/RouteExcludeIP.cs
Normal file
18
linker/plugins/client/RouteExcludeIP.cs
Normal 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 };
|
||||
}
|
||||
}
|
||||
}
|
@@ -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)
|
||||
{
|
||||
|
@@ -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
|
||||
{
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
||||
};
|
||||
}
|
||||
|
54
linker/plugins/forward/ForwardDecenter.cs
Normal file
54
linker/plugins/forward/ForwardDecenter.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
@@ -24,6 +24,7 @@ namespace linker.plugins.forward
|
||||
|
||||
serviceCollection.AddSingleton<ForwardClientMessenger>();
|
||||
|
||||
serviceCollection.AddSingleton<ForwardDecenter>();
|
||||
}
|
||||
|
||||
public void AddServer(ServiceCollection serviceCollection, FileConfig config)
|
||||
|
@@ -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()
|
||||
|
@@ -51,7 +51,6 @@ namespace linker.plugins.logger
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public LoggerSetParamInfo GetConfig(ApiControllerParamsInfo param)
|
||||
{
|
||||
return new LoggerSetParamInfo
|
||||
|
@@ -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)
|
||||
|
@@ -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()
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
9
linker/plugins/route/IRouteExcludeIP.cs
Normal file
9
linker/plugins/route/IRouteExcludeIP.cs
Normal file
@@ -0,0 +1,9 @@
|
||||
using System.Net;
|
||||
|
||||
namespace linker.plugins.route
|
||||
{
|
||||
public interface IRouteExcludeIP
|
||||
{
|
||||
public List<IPAddress> Get();
|
||||
}
|
||||
}
|
29
linker/plugins/route/RouteExcludeIPTransfer.cs
Normal file
29
linker/plugins/route/RouteExcludeIPTransfer.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
17
linker/plugins/route/RouteExcludeIPTypesLoader.cs
Normal file
17
linker/plugins/route/RouteExcludeIPTypesLoader.cs
Normal 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))}");
|
||||
}
|
||||
}
|
||||
}
|
40
linker/plugins/route/RouteStartup.cs
Normal file
40
linker/plugins/route/RouteStartup.cs
Normal 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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@@ -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
|
||||
};
|
||||
}
|
||||
|
@@ -1,5 +1,4 @@
|
||||
using linker.config;
|
||||
using linker.plugins.config;
|
||||
using linker.plugins.config;
|
||||
using MemoryPack;
|
||||
|
||||
namespace linker.plugins.sforward
|
||||
|
59
linker/plugins/sforward/SForwardDecenter.cs
Normal file
59
linker/plugins/sforward/SForwardDecenter.cs
Normal 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; }
|
||||
}
|
||||
}
|
@@ -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
|
||||
{
|
||||
|
@@ -30,6 +30,8 @@ namespace linker.plugins.sforward
|
||||
|
||||
serviceCollection.AddSingleton<SForwardConfigSyncSecretKey>();
|
||||
|
||||
serviceCollection.AddSingleton<SForwardDecenter>();
|
||||
|
||||
}
|
||||
|
||||
public void AddServer(ServiceCollection serviceCollection, FileConfig config)
|
||||
|
@@ -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; }
|
||||
}
|
||||
}
|
||||
|
18
linker/plugins/socks5/RouteExcludeIP.cs
Normal file
18
linker/plugins/socks5/RouteExcludeIP.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
@@ -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>
|
||||
|
@@ -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
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
199
linker/plugins/socks5/Socks5Decenter.cs
Normal file
199
linker/plugins/socks5/Socks5Decenter.cs
Normal 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
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@@ -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
|
||||
|
@@ -26,6 +26,7 @@ namespace linker.plugins.Socks5
|
||||
serviceCollection.AddSingleton<Socks5ClientMessenger>();
|
||||
|
||||
serviceCollection.AddSingleton<Socks5ConfigTransfer>();
|
||||
serviceCollection.AddSingleton<Socks5Decenter>();
|
||||
|
||||
}
|
||||
|
||||
|
20
linker/plugins/tunnel/RouteExcludeIP.cs
Normal file
20
linker/plugins/tunnel/RouteExcludeIP.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
@@ -63,10 +63,7 @@ namespace linker.plugins.tunnel
|
||||
new TransportUdp(),
|
||||
});
|
||||
|
||||
clientSignInState.NetworkEnabledHandle += (times) =>
|
||||
{
|
||||
RefreshPortMap();
|
||||
};
|
||||
clientSignInState.NetworkEnabledHandle += (times) => RefreshPortMap();
|
||||
tunnelConfigTransfer.OnChanged += RefreshPortMap;
|
||||
}
|
||||
|
||||
|
@@ -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
|
||||
{
|
||||
|
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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)
|
||||
|
@@ -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 };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
{
|
||||
|
@@ -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)
|
||||
|
@@ -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();
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,5 @@
|
||||
v1.6.3
|
||||
2024-12-12 17:37:53
|
||||
2024-12-13 15:52:27
|
||||
1. 优化UI,显示网络计算IP数
|
||||
2. 修复内网穿透不停止直接删除导致的无法再次添加的问题
|
||||
3. 优化网卡的端口转发
|
||||
|
Reference in New Issue
Block a user