mirror of
https://github.com/snltty/linker.git
synced 2025-10-09 02:50:12 +08:00
153 lines
5.1 KiB
C#
153 lines
5.1 KiB
C#
using linker.libs.api;
|
|
using linker.plugins.tuntap.messenger;
|
|
using MemoryPack;
|
|
using linker.libs.extends;
|
|
using System.Collections.Concurrent;
|
|
using linker.config;
|
|
using linker.tunnel.connection;
|
|
using linker.plugins.tuntap.proxy;
|
|
using linker.plugins.client;
|
|
using linker.plugins.capi;
|
|
using linker.plugins.messenger;
|
|
using linker.plugins.tuntap.config;
|
|
|
|
namespace linker.plugins.tuntap
|
|
{
|
|
public sealed class TuntapClientApiController : IApiClientController
|
|
{
|
|
private readonly MessengerSender messengerSender;
|
|
private readonly TuntapTransfer tuntapTransfer;
|
|
private readonly ClientSignInState clientSignInState;
|
|
private readonly FileConfig config;
|
|
private readonly TuntapProxy tuntapProxy;
|
|
|
|
public TuntapClientApiController(MessengerSender messengerSender, TuntapTransfer tuntapTransfer, ClientSignInState clientSignInState, FileConfig config, TuntapProxy tuntapProxy)
|
|
{
|
|
this.messengerSender = messengerSender;
|
|
this.tuntapTransfer = tuntapTransfer;
|
|
this.clientSignInState = clientSignInState;
|
|
this.config = config;
|
|
this.tuntapProxy = tuntapProxy;
|
|
}
|
|
|
|
public ConcurrentDictionary<string, ITunnelConnection> Connections(ApiControllerParamsInfo param)
|
|
{
|
|
return tuntapProxy.GetConnections();
|
|
}
|
|
public void RemoveConnection(ApiControllerParamsInfo param)
|
|
{
|
|
tuntapProxy.RemoveConnection(param.Content);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取所有客户端的网卡信息
|
|
/// </summary>
|
|
/// <param name="param"></param>
|
|
/// <returns></returns>
|
|
public TuntabListInfo Get(ApiControllerParamsInfo param)
|
|
{
|
|
ulong hashCode = ulong.Parse(param.Content);
|
|
if (tuntapTransfer.Version.Eq(hashCode, out ulong version))
|
|
{
|
|
return new TuntabListInfo
|
|
{
|
|
List = tuntapTransfer.Infos,
|
|
HashCode = version
|
|
};
|
|
}
|
|
return new TuntabListInfo { HashCode = version };
|
|
}
|
|
/// <summary>
|
|
/// 刷新网卡信息
|
|
/// </summary>
|
|
/// <param name="param"></param>
|
|
public void Refresh(ApiControllerParamsInfo param)
|
|
{
|
|
tuntapTransfer.RefreshConfig();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 运行网卡
|
|
/// </summary>
|
|
/// <param name="param"></param>
|
|
/// <returns></returns>
|
|
public async Task<bool> Run(ApiControllerParamsInfo param)
|
|
{
|
|
//运行自己的
|
|
if (param.Content == config.Data.Client.Id)
|
|
{
|
|
tuntapTransfer.Shutdown();
|
|
tuntapTransfer.Setup();
|
|
}
|
|
else
|
|
{
|
|
//运行别人的
|
|
await messengerSender.SendOnly(new MessageRequestWrap
|
|
{
|
|
Connection = clientSignInState.Connection,
|
|
MessengerId = (ushort)TuntapMessengerIds.RunForward,
|
|
Payload = MemoryPackSerializer.Serialize(param.Content)
|
|
}).ConfigureAwait(false);
|
|
}
|
|
return true;
|
|
}
|
|
/// <summary>
|
|
/// 停止网卡
|
|
/// </summary>
|
|
/// <param name="param"></param>
|
|
/// <returns></returns>
|
|
public async Task<bool> Stop(ApiControllerParamsInfo param)
|
|
{
|
|
//停止自己的
|
|
if (param.Content == config.Data.Client.Id)
|
|
{
|
|
tuntapTransfer.Shutdown();
|
|
}
|
|
else
|
|
{
|
|
//停止别人的
|
|
await messengerSender.SendOnly(new MessageRequestWrap
|
|
{
|
|
Connection = clientSignInState.Connection,
|
|
MessengerId = (ushort)TuntapMessengerIds.StopForward,
|
|
Payload = MemoryPackSerializer.Serialize(param.Content)
|
|
}).ConfigureAwait(false);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 更新网卡信息
|
|
/// </summary>
|
|
/// <param name="param"></param>
|
|
/// <returns></returns>
|
|
public async Task<bool> Update(ApiControllerParamsInfo param)
|
|
{
|
|
TuntapInfo info = param.Content.DeJson<TuntapInfo>();
|
|
//更新自己的
|
|
if (info.MachineId == config.Data.Client.Id)
|
|
{
|
|
tuntapTransfer.UpdateConfig(info);
|
|
}
|
|
else
|
|
{
|
|
//更新别人的
|
|
await messengerSender.SendOnly(new MessageRequestWrap
|
|
{
|
|
Connection = clientSignInState.Connection,
|
|
MessengerId = (ushort)TuntapMessengerIds.UpdateForward,
|
|
Payload = MemoryPackSerializer.Serialize(info)
|
|
}).ConfigureAwait(false);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
public sealed class TuntabListInfo
|
|
{
|
|
public ConcurrentDictionary<string, TuntapInfo> List { get; set; }
|
|
public ulong HashCode { get; set; }
|
|
}
|
|
}
|
|
}
|