mirror of
https://github.com/snltty/linker.git
synced 2025-12-18 09:26:44 +08:00
重构中继
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
v1.9.6
|
||||
2025-11-30 17:05:07
|
||||
2025-12-01 17:42:29
|
||||
1. 一些累计更新,一些BUG修复
|
||||
2. 优化客户端数据同步,减少服务器流量
|
||||
3. 去除cdkey,改为发电解锁中继速度
|
||||
|
||||
@@ -9,8 +9,8 @@ slug: /p2p/relay
|
||||
|
||||
:::tip[说明]
|
||||
|
||||
1. 如果你自建信标服务器,填写你服务器的管理密钥和管理密码,则可以管理服务器的中继cdkey,发布cdkey给别人使用
|
||||
2. 如果你使用别人的服务器,你没有密钥可以不填写,则需要使用别人服务器的公开中继节点,或使用他提供的cdkey
|
||||
1. 如果你自建信标服务器,填写你服务器的管理密钥和管理密码
|
||||
2. 如果你使用别人的服务器,你没有密钥可以不填写
|
||||
3. `按喜好调整好即可,往后的所有通信都是自动的,无需其它操作`
|
||||
:::
|
||||
|
||||
@@ -19,56 +19,39 @@ slug: /p2p/relay
|
||||
:::tip[说明]
|
||||
|
||||
1. 如果你有多个服务器,希望将这些服务器作为一个中继节点
|
||||
2. 在主服务器外的其它服务器部署一个服务端
|
||||
3. 然后 `configs/server.json` 中(`Relay->Distributed`)下修改配置
|
||||
2. 在主服务器外的其它服务器部署一个服务端,然后
|
||||
- 可以打开`configs/server.json`,将`Relay->ShareKey`中的内容复制到主服务中节点列表处导入
|
||||
- 也可以留意程序运行时类似`build relay share key : xxx`的输出,复制内容主服务中节点列表处导入
|
||||
3. 默认配置就是可用的,但是也可以对中继配置进行一些修改,在`configs/server.json->Relay` 下修改配置
|
||||
|
||||
```json
|
||||
//中继
|
||||
"Relay": {
|
||||
//多节点
|
||||
"Distributed": {
|
||||
//作为节点时
|
||||
"Node": {
|
||||
//节点Id
|
||||
"Id": "279DBACF-6F0B-46D4-9BA9-902EB6824849",
|
||||
//节点名称
|
||||
"Name": "default",
|
||||
//节点地址 域名/IP:端口 或 域名/IP,当只填写域名/IP时,默认使用 ServicePort
|
||||
"Host": "0.0.0.0:1802",
|
||||
//节点最大连接数
|
||||
"MaxConnection": 0,
|
||||
//节点连接最大带宽
|
||||
"MaxBandwidth": 0,
|
||||
//节点最大总带宽
|
||||
"MaxBandwidthTotal": 0,
|
||||
//节点最大流量
|
||||
"MaxGbTotal": 0,
|
||||
//节点剩余流量
|
||||
"MaxGbTotalLastBytes": 0,
|
||||
//当前月份,月份变化时重置剩余流量
|
||||
"MaxGbTotalMonth": 0,
|
||||
//节点是否公开
|
||||
"Public": false,
|
||||
//主机地址
|
||||
"MasterHost": "127.0.0.1:1802",
|
||||
//主机密钥
|
||||
"MasterSecretKey": "snltty",
|
||||
//随便url,管理页面展示时点击跳转
|
||||
"Url": "https://linker-doc.snltty.com",
|
||||
//支持TCP
|
||||
"AllowTcp": true,
|
||||
//支持UDP
|
||||
"AllowUdp": false,
|
||||
//与主机同步版本
|
||||
"Sync2Server": false,
|
||||
//主机备用地址,默认不填即可
|
||||
"MasterHosts": []
|
||||
},
|
||||
//作为主机时
|
||||
"Master": {
|
||||
"SecretKey": "snltty"
|
||||
}
|
||||
}
|
||||
//分享key,自动生成,【无需修改】
|
||||
"ShareKey": "",
|
||||
//管理密钥,自动生成,第一个导入此中继的信标服务可以修改本中继节点配置,【无需修改】
|
||||
"MasterKey": "d763f00a21cd1e0a71e7d833ed2a4e51",
|
||||
//如果你修改了DataEachMonth的值,则修改为0,等待程序启动后计算剩余流量
|
||||
"DataMonth": 0,
|
||||
//域名,可以不填
|
||||
"Domain": "",
|
||||
//节点id,自动生成,,【无需修改】
|
||||
"NodeId": "111FF038-C0D6-422C-9076-B8A47A81F1C0",
|
||||
//节点名称
|
||||
"Name": "default",
|
||||
//节点协议,1为TCP,2为UDP,3为TCP+UDP
|
||||
"Protocol": 1,
|
||||
//最大连接数,0为不限制
|
||||
"Connections": 0,
|
||||
//带宽限制,0为不限制
|
||||
"Bandwidth": 0,
|
||||
//月流量,0为不限制
|
||||
"DataEachMonth": 0,
|
||||
//剩余流量,自动生成,【无需修改】
|
||||
"DataRemain": 0,
|
||||
//跳转地址,可以填写你喜欢的地址,在节点列表中点击节点名称跳转到此地址
|
||||
"Url": "https://linker.snltty.com",
|
||||
//节点图标,可以填写你喜欢的图标,在节点列表中展示
|
||||
"Logo": "https://linker.snltty.com/img/logo.png"
|
||||
}
|
||||
```
|
||||
:::
|
||||
@@ -1,6 +1,7 @@
|
||||
using linker.libs;
|
||||
using linker.libs.extends;
|
||||
using linker.libs.web;
|
||||
using linker.messenger.relay.messenger;
|
||||
using linker.messenger.relay.server;
|
||||
using linker.messenger.signin;
|
||||
using linker.messenger.sync;
|
||||
@@ -14,20 +15,25 @@ namespace linker.messenger.relay.client
|
||||
{
|
||||
private readonly RelayClientTestTransfer relayTestTransfer;
|
||||
private readonly IRelayClientStore relayClientStore;
|
||||
private readonly IMessengerSender messengerSender;
|
||||
private readonly ISerializer serializer;
|
||||
private readonly ISignInClientStore signInClientStore;
|
||||
private readonly SyncTreansfer syncTreansfer;
|
||||
private readonly TunnelTransfer tunnelTransfer;
|
||||
private readonly SignInClientState signInClientState;
|
||||
|
||||
|
||||
public RelayApiController(RelayClientTestTransfer relayTestTransfer, IRelayClientStore relayClientStore, IMessengerSender messengerSender, ISerializer serializer,
|
||||
ISignInClientStore signInClientStore, SyncTreansfer syncTreansfer, TunnelTransfer tunnelTransfer)
|
||||
ISignInClientStore signInClientStore, SyncTreansfer syncTreansfer, TunnelTransfer tunnelTransfer, SignInClientState signInClientState)
|
||||
{
|
||||
this.relayTestTransfer = relayTestTransfer;
|
||||
this.relayClientStore = relayClientStore;
|
||||
this.messengerSender = messengerSender;
|
||||
this.serializer = serializer;
|
||||
this.signInClientStore = signInClientStore;
|
||||
this.syncTreansfer = syncTreansfer;
|
||||
this.tunnelTransfer = tunnelTransfer;
|
||||
this.signInClientState = signInClientState;
|
||||
}
|
||||
|
||||
public List<RelayServerNodeStoreInfo> Subscribe(ApiControllerParamsInfo param)
|
||||
@@ -35,6 +41,13 @@ namespace linker.messenger.relay.client
|
||||
relayTestTransfer.Subscribe();
|
||||
return relayTestTransfer.Nodes;
|
||||
}
|
||||
public bool Connect(ApiControllerParamsInfo param)
|
||||
{
|
||||
RelayConnectInfo relayConnectInfo = param.Content.DeJson<RelayConnectInfo>();
|
||||
_ = tunnelTransfer.ConnectAsync(relayConnectInfo.ToMachineId, relayConnectInfo.TransactionId, TunnelProtocolType.Udp,
|
||||
new RelayInfo { NodeId = relayConnectInfo.NodeId }.ToJson(), transportNames: ["TcpRelay"]);
|
||||
return true;
|
||||
}
|
||||
|
||||
public KeyValueInfo<string, TunnelProtocolType> GetDefault(ApiControllerParamsInfo param)
|
||||
{
|
||||
@@ -51,14 +64,36 @@ namespace linker.messenger.relay.client
|
||||
}
|
||||
}
|
||||
|
||||
public bool Connect(ApiControllerParamsInfo param)
|
||||
{
|
||||
RelayConnectInfo relayConnectInfo = param.Content.DeJson<RelayConnectInfo>();
|
||||
_ = tunnelTransfer.ConnectAsync(relayConnectInfo.ToMachineId, relayConnectInfo.TransactionId, TunnelProtocolType.Udp,
|
||||
new RelayInfo { NodeId = relayConnectInfo.NodeId }.ToJson(), transportNames: ["TcpRelay"]);
|
||||
return true;
|
||||
}
|
||||
|
||||
public async Task<string> Share(ApiControllerParamsInfo param)
|
||||
{
|
||||
var resp = await messengerSender.SendReply(new MessageRequestWrap
|
||||
{
|
||||
Connection = signInClientState.Connection,
|
||||
MessengerId = (ushort)RelayMessengerIds.Share,
|
||||
});
|
||||
return resp.Code == MessageResponeCodes.OK ? serializer.Deserialize<string>(resp.Data.Span) : $"network error:{resp.Code}";
|
||||
}
|
||||
public async Task<string> Import(ApiControllerParamsInfo param)
|
||||
{
|
||||
var resp = await messengerSender.SendReply(new MessageRequestWrap
|
||||
{
|
||||
Connection = signInClientState.Connection,
|
||||
MessengerId = (ushort)RelayMessengerIds.Import,
|
||||
Payload = serializer.Serialize(param.Content)
|
||||
});
|
||||
return resp.Code == MessageResponeCodes.OK ? serializer.Deserialize<string>(resp.Data.Span) : $"network error:{resp.Code}";
|
||||
}
|
||||
public async Task<string> Remove(ApiControllerParamsInfo param)
|
||||
{
|
||||
var resp = await messengerSender.SendReply(new MessageRequestWrap
|
||||
{
|
||||
Connection = signInClientState.Connection,
|
||||
MessengerId = (ushort)RelayMessengerIds.Remove,
|
||||
Payload = serializer.Serialize(int.Parse(param.Content))
|
||||
});
|
||||
return resp.Code == MessageResponeCodes.OK ? serializer.Deserialize<string>(resp.Data.Span) : $"network error:{resp.Code}";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -31,7 +31,8 @@ namespace linker.messenger.relay.messenger
|
||||
private readonly RelayServerNodeReportTransfer relayServerNodeReportTransfer;
|
||||
|
||||
public RelayServerMessenger(SignInServerCaching signCaching, ISerializer serializer, RelayServerValidatorTransfer relayValidatorTransfer,
|
||||
RelayServerReportResolver relayServerReportResolver, RelayServerMasterTransfer relayServerMasterTransfer, RelayServerNodeReportTransfer relayServerNodeReportTransfer)
|
||||
RelayServerReportResolver relayServerReportResolver, RelayServerMasterTransfer relayServerMasterTransfer,
|
||||
RelayServerNodeReportTransfer relayServerNodeReportTransfer)
|
||||
{
|
||||
this.signCaching = signCaching;
|
||||
this.relayValidatorTransfer = relayValidatorTransfer;
|
||||
@@ -122,6 +123,46 @@ namespace linker.messenger.relay.messenger
|
||||
}
|
||||
|
||||
|
||||
[MessengerId((ushort)RelayMessengerIds.Share)]
|
||||
public async Task Share(IConnection connection)
|
||||
{
|
||||
if (signCaching.TryGet(connection.Id, out SignCacheInfo from) == false || from.Super == false)
|
||||
{
|
||||
connection.Write(serializer.Serialize("need super key"));
|
||||
return;
|
||||
}
|
||||
connection.Write(serializer.Serialize(relayServerNodeReportTransfer.Config.ShareKey));
|
||||
}
|
||||
[MessengerId((ushort)RelayMessengerIds.Import)]
|
||||
public async Task Import(IConnection connection)
|
||||
{
|
||||
string sharekey = serializer.Deserialize<string>(connection.ReceiveRequestWrap.Payload.Span);
|
||||
|
||||
if (signCaching.TryGet(connection.Id, out SignCacheInfo from) == false || from.Super == false)
|
||||
{
|
||||
connection.Write(serializer.Serialize("need super key"));
|
||||
return;
|
||||
}
|
||||
|
||||
string result = await relayServerNodeReportTransfer.Import(sharekey).ConfigureAwait(false);
|
||||
connection.Write(serializer.Serialize(result));
|
||||
}
|
||||
[MessengerId((ushort)RelayMessengerIds.Remove)]
|
||||
public async Task Remove(IConnection connection)
|
||||
{
|
||||
int id = serializer.Deserialize<int>(connection.ReceiveRequestWrap.Payload.Span);
|
||||
if (signCaching.TryGet(connection.Id, out SignCacheInfo from) == false || from.Super == false)
|
||||
{
|
||||
connection.Write(serializer.Serialize("need super key"));
|
||||
return;
|
||||
}
|
||||
|
||||
bool result = await relayServerNodeReportTransfer.Remove(id).ConfigureAwait(false);
|
||||
connection.Write(serializer.Serialize(result ? string.Empty : "remove fail"));
|
||||
}
|
||||
|
||||
|
||||
|
||||
[MessengerId((ushort)RelayMessengerIds.NodeReport)]
|
||||
public async Task NodeReport(IConnection connection)
|
||||
{
|
||||
|
||||
@@ -14,6 +14,11 @@
|
||||
SignIn = 2134,
|
||||
Report = 2135,
|
||||
|
||||
Share = 2136,
|
||||
Import = 2137,
|
||||
Remove = 2138,
|
||||
|
||||
|
||||
Max = 2199
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,6 +32,7 @@ namespace linker.messenger.relay.server
|
||||
public void SetDataRemain(long value);
|
||||
|
||||
public void SetShareKey(string shareKey);
|
||||
public void SetMasterKey(string masterKey);
|
||||
|
||||
/// <summary>
|
||||
/// 提交保存
|
||||
@@ -44,11 +45,11 @@ namespace linker.messenger.relay.server
|
||||
private string nodeId = Guid.NewGuid().ToString().ToUpper();
|
||||
public string NodeId { get => nodeId; set { nodeId = value.SubStr(0, 36); } }
|
||||
|
||||
private string name = Dns.GetHostName().SubStr(0, 32);
|
||||
private string name = "default";
|
||||
public string Name { get => name; set { name = value.SubStr(0, 32); } }
|
||||
|
||||
public TunnelProtocolType Protocol { get; set; } = TunnelProtocolType.Tcp;
|
||||
public int Connections { get; set; } = 1000;
|
||||
public int Connections { get; set; }
|
||||
public int Bandwidth { get; set; }
|
||||
public int DataEachMonth { get; set; }
|
||||
public long DataRemain { get; set; }
|
||||
@@ -60,12 +61,14 @@ namespace linker.messenger.relay.server
|
||||
public sealed class RelayServerConfigInfo : RelayServerNodeInfo
|
||||
{
|
||||
public string ShareKey { get; set; } = string.Empty;
|
||||
public string MasterKey { get; set; } = string.Empty;
|
||||
public int DataMonth { get; set; }
|
||||
public string Domain { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
public class RelayServerNodeReportInfo : RelayServerNodeInfo
|
||||
{
|
||||
public string MasterKey { get; set; } = string.Empty;
|
||||
public string Version { get; set; } = string.Empty;
|
||||
public int ConnectionsRatio { get; set; }
|
||||
public double BandwidthRatio { get; set; }
|
||||
@@ -79,12 +82,14 @@ namespace linker.messenger.relay.server
|
||||
|
||||
public string Host { get; set; } = string.Empty;
|
||||
|
||||
public int BandwidthEachConnection { get; set; } = 50;
|
||||
public int BandwidthEach { get; set; } = 50;
|
||||
public bool Public { get; set; }
|
||||
|
||||
public long LastTicks { get; set; }
|
||||
|
||||
public int Delay { get; set; }
|
||||
|
||||
public bool Manageable { get; set; }
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
public Task<RelayServerNodeStoreInfo> GetByNodeId(string nodeId);
|
||||
public Task<bool> Add(RelayServerNodeStoreInfo info);
|
||||
public Task<bool> Report(RelayServerNodeReportInfo info);
|
||||
public Task<bool> Delete(int id);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -11,7 +11,8 @@ namespace linker.messenger.relay.server
|
||||
private readonly IRelayServerCaching relayCaching;
|
||||
private readonly IRelayServerWhiteListStore relayServerWhiteListStore;
|
||||
private readonly RelayServerConnectionTransfer relayServerConnectionTransfer;
|
||||
public RelayServerMasterTransfer(IRelayServerCaching relayCaching, IRelayServerWhiteListStore relayServerWhiteListStore, RelayServerConnectionTransfer relayServerConnectionTransfer)
|
||||
public RelayServerMasterTransfer(IRelayServerCaching relayCaching, IRelayServerWhiteListStore relayServerWhiteListStore,
|
||||
RelayServerConnectionTransfer relayServerConnectionTransfer)
|
||||
{
|
||||
this.relayCaching = relayCaching;
|
||||
this.relayServerWhiteListStore = relayServerWhiteListStore;
|
||||
|
||||
@@ -14,6 +14,7 @@ namespace linker.messenger.relay.server
|
||||
private int connectionNum = 0;
|
||||
private ulong bytes = 0;
|
||||
private ulong lastBytes = 0;
|
||||
private string md5 = string.Empty;
|
||||
|
||||
private readonly ICrypto crypto = CryptoFactory.CreateSymmetric(Helper.GlobalString);
|
||||
|
||||
@@ -38,6 +39,8 @@ namespace linker.messenger.relay.server
|
||||
this.relayServerWhiteListStore = relayServerWhiteListStore;
|
||||
this.messengerResolver = messengerResolver;
|
||||
|
||||
md5 = Config.NodeId.Md5();
|
||||
|
||||
_ = ReportTask();
|
||||
SignInTask();
|
||||
|
||||
@@ -67,7 +70,7 @@ namespace linker.messenger.relay.server
|
||||
}
|
||||
public async Task<bool> Report(RelayServerNodeReportInfo info)
|
||||
{
|
||||
if (relayServerConnectionTransfer.TryGet(ConnectionSideType.Node, info.NodeId, out IConnection connection) == false) return false;
|
||||
if (relayServerConnectionTransfer.TryGet(ConnectionSideType.Node, info.NodeId, out _) == false) return false;
|
||||
|
||||
return await relayServerNodeStore.Report(info).ConfigureAwait(false);
|
||||
}
|
||||
@@ -80,16 +83,51 @@ namespace linker.messenger.relay.server
|
||||
|
||||
connection.Id = serverId;
|
||||
relayServerConnectionTransfer.TryAdd(ConnectionSideType.Master, connection.Id, connection);
|
||||
|
||||
//未被配置,或默认配置的,设它为管理端
|
||||
if (string.IsNullOrWhiteSpace(Config.MasterKey) || md5 == Config.MasterKey)
|
||||
{
|
||||
relayServerConfigStore.SetMasterKey(serverId.Md5());
|
||||
relayServerConfigStore.Confirm();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public async Task<string> Import(string shareKey)
|
||||
{
|
||||
try
|
||||
{
|
||||
RelayServerNodeShareInfo info = serializer.Deserialize<RelayServerNodeShareInfo>(crypto.Decode(Convert.FromBase64String(shareKey)).Span);
|
||||
|
||||
bool result = await relayServerNodeStore.Add(new RelayServerNodeStoreInfo
|
||||
{
|
||||
NodeId = info.NodeId,
|
||||
Host = info.Host,
|
||||
Name = info.Name,
|
||||
LastTicks = Environment.TickCount64
|
||||
}).ConfigureAwait(false);
|
||||
if (result == false)
|
||||
{
|
||||
return "node already exists";
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return ex.Message;
|
||||
}
|
||||
return string.Empty;
|
||||
}
|
||||
public async Task<bool> Remove(int id)
|
||||
{
|
||||
return await relayServerNodeStore.Delete(id).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
public async Task<List<RelayServerNodeStoreInfo>> GetNodes(bool validated, string userid, string machineId)
|
||||
{
|
||||
var nodes = (await relayServerWhiteListStore.GetNodes(userid, machineId)).Where(c => c.Bandwidth >= 0).SelectMany(c => c.Nodes);
|
||||
|
||||
var result = (await relayServerNodeStore.GetAll())
|
||||
.Where(c => Environment.TickCount64 - c.LastTicks < 15000)
|
||||
.Where(c => validated || Environment.TickCount64 - c.LastTicks < 15000)
|
||||
.Where(c =>
|
||||
{
|
||||
return validated || nodes.Contains(c.NodeId) || nodes.Contains("*")
|
||||
@@ -100,7 +138,7 @@ namespace linker.messenger.relay.server
|
||||
return result.OrderByDescending(x => x.Connections == 0 ? int.MaxValue : x.Connections)
|
||||
.ThenBy(x => x.ConnectionsRatio)
|
||||
.ThenBy(x => x.BandwidthRatio)
|
||||
.ThenByDescending(x => x.BandwidthEachConnection == 0 ? int.MaxValue : x.BandwidthEachConnection)
|
||||
.ThenByDescending(x => x.BandwidthEach == 0 ? int.MaxValue : x.BandwidthEach)
|
||||
.ThenByDescending(x => x.Bandwidth == 0 ? int.MaxValue : x.Bandwidth)
|
||||
.ThenByDescending(x => x.DataEachMonth == 0 ? int.MaxValue : x.DataEachMonth)
|
||||
.ThenByDescending(x => x.DataRemain == 0 ? long.MaxValue : x.DataRemain)
|
||||
@@ -116,7 +154,7 @@ namespace linker.messenger.relay.server
|
||||
return result.OrderByDescending(x => x.Connections == 0 ? int.MaxValue : x.Connections)
|
||||
.ThenBy(x => x.ConnectionsRatio)
|
||||
.ThenBy(x => x.BandwidthRatio)
|
||||
.ThenByDescending(x => x.BandwidthEachConnection == 0 ? int.MaxValue : x.BandwidthEachConnection)
|
||||
.ThenByDescending(x => x.BandwidthEach == 0 ? int.MaxValue : x.BandwidthEach)
|
||||
.ThenByDescending(x => x.Bandwidth == 0 ? int.MaxValue : x.Bandwidth)
|
||||
.ThenByDescending(x => x.DataEachMonth == 0 ? int.MaxValue : x.DataEachMonth)
|
||||
.ThenByDescending(x => x.DataRemain == 0 ? long.MaxValue : x.DataRemain)
|
||||
@@ -130,8 +168,8 @@ namespace linker.messenger.relay.server
|
||||
{
|
||||
await relayServerNodeStore.Add(new RelayServerNodeStoreInfo
|
||||
{
|
||||
NodeId = Config.NodeId,
|
||||
Name = Config.Name,
|
||||
NodeId = relayServerConfigStore.Config.NodeId,
|
||||
Name = "default",
|
||||
Host = $"{IPAddress.Loopback}:{relayServerConfigStore.ServicePort}"
|
||||
}).ConfigureAwait(false);
|
||||
|
||||
@@ -240,7 +278,7 @@ namespace linker.messenger.relay.server
|
||||
}).ConfigureAwait(false);
|
||||
if (resp.Code == MessageResponeCodes.OK && resp.Data.Span.SequenceEqual(Helper.TrueArray))
|
||||
{
|
||||
Console.WriteLine($"relay sign in to node {c.NodeId} success");
|
||||
LoggerHelper.Instance.Debug($"relay sign in to node {c.NodeId} success");
|
||||
relayServerConnectionTransfer.TryAdd(ConnectionSideType.Node, c.NodeId, connection);
|
||||
}
|
||||
else
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace linker.messenger.relay.webapi
|
||||
Version = c.Version,
|
||||
|
||||
BandwidthMaxMbps = c.Bandwidth,
|
||||
BandwidthConnMbps = c.BandwidthEachConnection,
|
||||
BandwidthConnMbps = c.BandwidthEach,
|
||||
BandwidthCurrentMbps = c.BandwidthRatio,
|
||||
|
||||
BandwidthGbMonth = c.DataEachMonth,
|
||||
|
||||
@@ -242,6 +242,8 @@ namespace linker.messenger.serializer.memorypack
|
||||
[MemoryPackInclude]
|
||||
string Logo => info.Logo;
|
||||
[MemoryPackInclude]
|
||||
string MasterKey => info.MasterKey;
|
||||
[MemoryPackInclude]
|
||||
string Version => info.Version;
|
||||
[MemoryPackInclude]
|
||||
int ConnectionsRatio => info.ConnectionsRatio;
|
||||
@@ -252,7 +254,7 @@ namespace linker.messenger.serializer.memorypack
|
||||
|
||||
[MemoryPackConstructor]
|
||||
SerializableRelayServerNodeReportInfo(string nodeId, string name, TunnelProtocolType protocol, int connections, int bandwidth, int dataEachMonth,
|
||||
long dataRemain, string url, string logo, string version, int connectionsRatio, double bandwidthRatio, IPEndPoint[] masters)
|
||||
long dataRemain, string url, string logo, string masterKey, string version, int connectionsRatio, double bandwidthRatio, IPEndPoint[] masters)
|
||||
{
|
||||
var info = new RelayServerNodeReportInfo
|
||||
{
|
||||
@@ -265,6 +267,7 @@ namespace linker.messenger.serializer.memorypack
|
||||
DataRemain = dataRemain,
|
||||
Url = url,
|
||||
Logo = logo,
|
||||
MasterKey = masterKey,
|
||||
Version = version,
|
||||
ConnectionsRatio = connectionsRatio,
|
||||
BandwidthRatio = bandwidthRatio,
|
||||
@@ -311,6 +314,7 @@ namespace linker.messenger.serializer.memorypack
|
||||
value.DataRemain = reader.ReadValue<long>();
|
||||
value.Url = reader.ReadValue<string>();
|
||||
value.Logo = reader.ReadValue<string>();
|
||||
value.MasterKey = reader.ReadValue<string>();
|
||||
value.Version = reader.ReadValue<string>();
|
||||
value.ConnectionsRatio = reader.ReadValue<int>();
|
||||
value.BandwidthRatio = reader.ReadValue<double>();
|
||||
@@ -344,7 +348,10 @@ namespace linker.messenger.serializer.memorypack
|
||||
[MemoryPackInclude]
|
||||
string Logo => info.Logo;
|
||||
[MemoryPackInclude]
|
||||
string MasterKey => info.MasterKey;
|
||||
[MemoryPackInclude]
|
||||
string Version => info.Version;
|
||||
|
||||
[MemoryPackInclude]
|
||||
int ConnectionsRatio => info.ConnectionsRatio;
|
||||
[MemoryPackInclude]
|
||||
@@ -358,17 +365,19 @@ namespace linker.messenger.serializer.memorypack
|
||||
[MemoryPackInclude]
|
||||
string Host => info.Host;
|
||||
[MemoryPackInclude]
|
||||
int BandwidthEachConnection => info.BandwidthEachConnection;
|
||||
int BandwidthEachConnection => info.BandwidthEach;
|
||||
[MemoryPackInclude]
|
||||
bool Public => info.Public;
|
||||
[MemoryPackInclude]
|
||||
long LastTicks => info.LastTicks;
|
||||
|
||||
[MemoryPackInclude]
|
||||
bool Manageable => info.Manageable;
|
||||
|
||||
[MemoryPackConstructor]
|
||||
SerializableRelayServerNodeStoreInfo(string nodeId, string name, TunnelProtocolType protocol, int connections, int bandwidth, int dataEachMonth,
|
||||
long dataRemain, string url, string logo, string version, int connectionsRatio, double bandwidthRatio, IPEndPoint[] servers,
|
||||
int id, string host, int bandwidthEachConnection, bool Public, long lastTicks)
|
||||
long dataRemain, string url, string logo, string masterKey, string version, int connectionsRatio, double bandwidthRatio, IPEndPoint[] servers,
|
||||
int id, string host, int bandwidthEachConnection, bool Public, long lastTicks, bool manageable)
|
||||
{
|
||||
var info = new RelayServerNodeStoreInfo
|
||||
{
|
||||
@@ -381,15 +390,17 @@ namespace linker.messenger.serializer.memorypack
|
||||
DataRemain = dataRemain,
|
||||
Url = url,
|
||||
Logo = logo,
|
||||
MasterKey = masterKey,
|
||||
Version = version,
|
||||
ConnectionsRatio = connectionsRatio,
|
||||
BandwidthRatio = bandwidthRatio,
|
||||
Masters = servers,
|
||||
Id = id,
|
||||
Host = host,
|
||||
BandwidthEachConnection = bandwidthEachConnection,
|
||||
BandwidthEach = bandwidthEachConnection,
|
||||
Public = Public,
|
||||
LastTicks = lastTicks
|
||||
LastTicks = lastTicks,
|
||||
Manageable = manageable
|
||||
};
|
||||
this.info = info;
|
||||
}
|
||||
@@ -432,15 +443,17 @@ namespace linker.messenger.serializer.memorypack
|
||||
value.DataRemain = reader.ReadValue<long>();
|
||||
value.Url = reader.ReadValue<string>();
|
||||
value.Logo = reader.ReadValue<string>();
|
||||
value.MasterKey = reader.ReadValue<string>();
|
||||
value.Version = reader.ReadValue<string>();
|
||||
value.ConnectionsRatio = reader.ReadValue<int>();
|
||||
value.BandwidthRatio = reader.ReadValue<double>();
|
||||
value.Masters = reader.ReadValue<IPEndPoint[]>();
|
||||
value.Id = reader.ReadValue<int>();
|
||||
value.Host = reader.ReadValue<string>();
|
||||
value.BandwidthEachConnection = reader.ReadValue<int>();
|
||||
value.BandwidthEach = reader.ReadValue<int>();
|
||||
value.Public = reader.ReadValue<bool>();
|
||||
value.LastTicks = reader.ReadValue<long>();
|
||||
value.Manageable = reader.ReadValue<bool>();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -463,9 +476,9 @@ namespace linker.messenger.serializer.memorypack
|
||||
{
|
||||
var info = new RelayServerNodeShareInfo
|
||||
{
|
||||
NodeId= nodeId,
|
||||
Host= host,
|
||||
Name= name
|
||||
NodeId = nodeId,
|
||||
Host = host,
|
||||
Name = name
|
||||
};
|
||||
this.info = info;
|
||||
}
|
||||
|
||||
@@ -7,8 +7,6 @@ namespace linker.messenger.store.file.relay
|
||||
public int ServicePort => config.Data.Server.ServicePort;
|
||||
public RelayServerConfigInfo Config => config.Data.Server.Relay;
|
||||
|
||||
|
||||
|
||||
private readonly FileConfig config;
|
||||
public RelayServerConfigStore(FileConfig config)
|
||||
{
|
||||
@@ -38,5 +36,10 @@ namespace linker.messenger.store.file.relay
|
||||
{
|
||||
config.Data.Server.Relay.ShareKey = shareKey;
|
||||
}
|
||||
|
||||
public void SetMasterKey(string masterKey)
|
||||
{
|
||||
config.Data.Server.Relay.MasterKey = masterKey;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using linker.messenger.relay.server;
|
||||
using linker.libs.extends;
|
||||
using linker.messenger.relay.server;
|
||||
using LiteDB;
|
||||
|
||||
namespace linker.messenger.store.file.relay
|
||||
@@ -7,9 +8,11 @@ namespace linker.messenger.store.file.relay
|
||||
{
|
||||
private readonly ILiteCollection<RelayServerNodeStoreInfo> liteCollection;
|
||||
|
||||
public RelayServerNodeStore(Storefactory storefactory)
|
||||
private string md5 = string.Empty;
|
||||
public RelayServerNodeStore(Storefactory storefactory, IRelayServerConfigStore relayServerConfigStore)
|
||||
{
|
||||
liteCollection = storefactory.GetCollection<RelayServerNodeStoreInfo>("relay_server_master");
|
||||
md5 = relayServerConfigStore.Config.NodeId.Md5();
|
||||
}
|
||||
|
||||
public async Task<bool> Add(RelayServerNodeStoreInfo info)
|
||||
@@ -22,6 +25,11 @@ namespace linker.messenger.store.file.relay
|
||||
return await Task.FromResult(true).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
public async Task<bool> Delete(int id)
|
||||
{
|
||||
return await Task.FromResult(liteCollection.Delete(id)).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
public async Task<List<RelayServerNodeStoreInfo>> GetAll()
|
||||
{
|
||||
return await Task.FromResult(liteCollection.FindAll().ToList()).ConfigureAwait(false);
|
||||
@@ -48,6 +56,10 @@ namespace linker.messenger.store.file.relay
|
||||
DataRemain = info.DataRemain,
|
||||
Name = info.Name,
|
||||
Protocol = info.Protocol,
|
||||
MasterKey = info.MasterKey,
|
||||
Masters = info.Masters,
|
||||
//是我初始化的,可以管理
|
||||
Manageable = info.MasterKey == md5
|
||||
}, c => c.NodeId == info.NodeId);
|
||||
|
||||
return await Task.FromResult(length > 0).ConfigureAwait(false); ;
|
||||
|
||||
Reference in New Issue
Block a user