From cfa6d1801025a8fb5c470f91baf482c5bed9f47d Mon Sep 17 00:00:00 2001 From: snltty <1069410172@qq.com> Date: Sun, 14 Jul 2024 14:45:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- linker.doc.web | 1 + linker.tunnel/TunnelTransfer.cs | 21 +- linker.tunnel/transport/ITunnelTransport.cs | 37 ++- linker.web/src/apis/config.js | 9 + linker.web/src/apis/signin.js | 7 +- linker.web/src/components/install/Client.vue | 133 ++++++++++ linker.web/src/components/install/Common.vue | 52 ++++ linker.web/src/components/install/Index.vue | 237 +++++------------- linker.web/src/components/install/Server.vue | 172 +++++++++++++ linker.web/src/components/status/Api.vue | 9 +- linker.web/src/provide.js | 3 +- linker.web/src/views/devices/DeviceEdit.vue | 2 +- linker.web/src/views/devices/devices.js | 5 +- linker/Program.cs | 2 +- linker/client/ClientSignInTransfer.cs | 170 +++++++------ linker/client/ClientStartup.cs | 8 +- linker/client/args/SignInArgsTransfer.cs | 2 +- linker/client/config/Config.cs | 2 +- linker/client/config/RunningConfig.cs | 3 + linker/client/config/RunningConfigTransfer.cs | 45 +++- linker/config/Config.cs | 39 ++- linker/plugins/capi/ApiClientServer.cs | 4 +- linker/plugins/capi/CApiStartup.cs | 8 +- linker/plugins/capi/config/Config.cs | 15 ++ linker/plugins/config/ConfigApiController.cs | 89 +++++++ linker/plugins/config/ConfigStartup.cs | 37 +++ linker/plugins/firewall/FireWallStartup.cs | 8 +- linker/plugins/forward/ForwardStartup.cs | 8 +- linker/plugins/forward/config/Config.cs | 35 ++- linker/plugins/forward/proxy/ForwardProxy.cs | 13 +- linker/plugins/logger/LoggerController.cs | 4 +- linker/plugins/logger/LoggerStartup.cs | 8 +- linker/plugins/relay/RelayApiController.cs | 4 +- linker/plugins/relay/RelayStartup.cs | 8 +- linker/plugins/relay/config/Config.cs | 36 +++ .../plugins/relay/messenger/RelayMessenger.cs | 4 +- .../relay/transport/TransportSelfHost.cs | 2 +- linker/plugins/sforward/SForwardStartup.cs | 10 +- linker/plugins/sforward/config/Config.cs | 54 +++- .../sforward/messenger/SForwardMessenger.cs | 4 +- .../plugins/sforward/validator/Validator.cs | 4 +- linker/plugins/signIn/SignInApiController.cs | 90 ++----- linker/plugins/signIn/SignInStartup.cs | 8 +- .../signIn/messenger/SignInMessenger.cs | 14 +- .../signIn/messenger/SignInMessengerIds.cs | 4 +- linker/plugins/tunnel/TunnelAdapter.cs | 4 +- linker/plugins/tunnel/TunnelApiController.cs | 13 +- linker/plugins/tunnel/TunnelConfigTransfer.cs | 16 +- linker/plugins/tunnel/TunnelStartup.cs | 8 +- linker/plugins/tunnel/config/Config.cs | 17 +- .../tunnel/messenger/TunnelMessenger.cs | 8 +- linker/plugins/tuntap/TuntapApiController.cs | 4 +- linker/plugins/tuntap/TuntapStartup.cs | 8 +- linker/plugins/tuntap/TuntapTransfer.cs | 4 +- linker/plugins/tuntap/config/config.cs | 12 + linker/plugins/tuntap/proxy/TuntapProxy.cs | 11 +- linker/plugins/updater/UpdaterStartup.cs | 8 +- linker/serializes/SerializeStartup.cs | 8 +- linker/server/IConnection.cs | 2 +- linker/server/ServerStartup.cs | 13 +- linker/startup/IStartup.cs | 8 +- linker/startup/StartupTransfer.cs | 8 +- linker/store/StoreStartup.cs | 10 +- 63 files changed, 1088 insertions(+), 504 deletions(-) create mode 160000 linker.doc.web create mode 100644 linker.web/src/apis/config.js create mode 100644 linker.web/src/components/install/Client.vue create mode 100644 linker.web/src/components/install/Common.vue create mode 100644 linker.web/src/components/install/Server.vue create mode 100644 linker/plugins/config/ConfigApiController.cs create mode 100644 linker/plugins/config/ConfigStartup.cs diff --git a/linker.doc.web b/linker.doc.web new file mode 160000 index 00000000..1207b6c0 --- /dev/null +++ b/linker.doc.web @@ -0,0 +1 @@ +Subproject commit 1207b6c05adaf4ca658eece3fc8be89167263b22 diff --git a/linker.tunnel/TunnelTransfer.cs b/linker.tunnel/TunnelTransfer.cs index 8d959461..74443f9d 100644 --- a/linker.tunnel/TunnelTransfer.cs +++ b/linker.tunnel/TunnelTransfer.cs @@ -119,7 +119,6 @@ namespace linker.tunnel public async Task ConnectAsync(string remoteMachineId, string transactionId) { if (connectingDic.TryAdd(remoteMachineId, true) == false) return null; - if (IsBackground(remoteMachineId, transactionId)) return null; try { @@ -394,15 +393,23 @@ namespace linker.tunnel private ConcurrentDictionary backgroundDic = new ConcurrentDictionary(); - public void StartBackground(string remoteMachineId, string transactionId) + /// + /// 开始后台打洞 + /// + /// + /// + public void StartBackground(string remoteMachineId, string transactionId,int times = 10) { - if (IsBackground(remoteMachineId, transactionId)) return; - AddBackground(remoteMachineId, transactionId); + if (AddBackground(remoteMachineId, transactionId) == false) + { + LoggerHelper.Instance.Error($"tunnel background {remoteMachineId}@{transactionId} already exists"); + return; + } Task.Run(async () => { try { - for (int i = 0; i < 10; i++) + for (int i = 0; i < times; i++) { await Task.Delay(3000); @@ -423,9 +430,9 @@ namespace linker.tunnel }); } - private void AddBackground(string remoteMachineId, string transactionId) + private bool AddBackground(string remoteMachineId, string transactionId) { - backgroundDic.TryAdd(GetBackgroundKey(remoteMachineId, transactionId), true); + return backgroundDic.TryAdd(GetBackgroundKey(remoteMachineId, transactionId), true); } private void RemoveBackground(string remoteMachineId, string transactionId) { diff --git a/linker.tunnel/transport/ITunnelTransport.cs b/linker.tunnel/transport/ITunnelTransport.cs index 4edde1fc..b70009fb 100644 --- a/linker.tunnel/transport/ITunnelTransport.cs +++ b/linker.tunnel/transport/ITunnelTransport.cs @@ -115,16 +115,41 @@ namespace linker.tunnel.transport public sealed partial class TunnelTransportItemInfo { + /// + /// 协议名称 + /// public string Name { get; set; } + /// + /// 协议描述 + /// public string Label { get; set; } + /// + /// 协议 + /// public string ProtocolType { get; set; } - + /// + /// 是否禁用 + /// public bool Disabled { get; set; } = false; + /// + /// 是否反向打洞 + /// public bool Reverse { get; set; } = true; + /// + /// 是否允许修改反向打洞状态 + /// public bool DisableReverse { get; set; } = false; + /// + /// 是否开启ssl + /// public bool SSL { get; set; } = true; + /// + /// 是否允许修改ssl配置 + /// public bool DisableSSL { get; set; } = false; - + /// + /// 缓冲区大小 + /// public byte BufferSize { get; set; } = 4; } public sealed class TunnelTransportItemInfoEqualityComparer : IEqualityComparer @@ -171,9 +196,13 @@ namespace linker.tunnel.transport /// 需要加密 /// public bool SSL { get; set; } - + /// + /// 缓冲区 + /// public byte BufferSize { get; set; } = 3; - + /// + /// 目标ip列表 + /// public List RemoteEndPoints { get; set; } } diff --git a/linker.web/src/apis/config.js b/linker.web/src/apis/config.js new file mode 100644 index 00000000..1f91e0cf --- /dev/null +++ b/linker.web/src/apis/config.js @@ -0,0 +1,9 @@ +import { sendWebsocketMsg } from './request' + +export const getConfig = () => { + return sendWebsocketMsg('configclient/get'); +} + +export const install = (data) => { + return sendWebsocketMsg('configclient/install', data); +} \ No newline at end of file diff --git a/linker.web/src/apis/signin.js b/linker.web/src/apis/signin.js index 9e786323..81a18189 100644 --- a/linker.web/src/apis/signin.js +++ b/linker.web/src/apis/signin.js @@ -1,8 +1,6 @@ import { sendWebsocketMsg } from './request' -export const getConfig = () => { - return sendWebsocketMsg('signInclient/config'); -} + export const setSignIn = (data) => { return sendWebsocketMsg('signInclient/set', data); } @@ -26,6 +24,3 @@ export const signInDel = (machineId) => { export const setSignInName = (data) => { return sendWebsocketMsg('signInclient/setname', data); } -export const install = (data) => { - return sendWebsocketMsg('signInclient/install', data); -} \ No newline at end of file diff --git a/linker.web/src/components/install/Client.vue b/linker.web/src/components/install/Client.vue new file mode 100644 index 00000000..7f048cfd --- /dev/null +++ b/linker.web/src/components/install/Client.vue @@ -0,0 +1,133 @@ + + + \ No newline at end of file diff --git a/linker.web/src/components/install/Common.vue b/linker.web/src/components/install/Common.vue new file mode 100644 index 00000000..9d676050 --- /dev/null +++ b/linker.web/src/components/install/Common.vue @@ -0,0 +1,52 @@ + + + + + \ No newline at end of file diff --git a/linker.web/src/components/install/Index.vue b/linker.web/src/components/install/Index.vue index b74a1e53..940496de 100644 --- a/linker.web/src/components/install/Index.vue +++ b/linker.web/src/components/install/Index.vue @@ -2,215 +2,94 @@
-
- - +
+ + +
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ + - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ + + + + + +
完成保存后,请重启软件
+
+
+
-
\ No newline at end of file diff --git a/linker.web/src/components/install/Server.vue b/linker.web/src/components/install/Server.vue new file mode 100644 index 00000000..5de1b300 --- /dev/null +++ b/linker.web/src/components/install/Server.vue @@ -0,0 +1,172 @@ + + + \ No newline at end of file diff --git a/linker.web/src/components/status/Api.vue b/linker.web/src/components/status/Api.vue index dd0d324c..e9e5356c 100644 --- a/linker.web/src/components/status/Api.vue +++ b/linker.web/src/components/status/Api.vue @@ -29,7 +29,8 @@ import {useRoute,useRouter} from 'vue-router' import {injectGlobalData} from '../../provide' import { computed, onMounted, reactive } from 'vue'; import { initWebsocket, subWebsocketState,closeWebsocket } from '../../apis/request' -import { getConfig,getSignInfo } from '../../apis/signin' +import { getSignInfo } from '../../apis/signin' +import { getConfig } from '../../apis/config' import {Tools} from '@element-plus/icons-vue' export default { components:{Tools}, @@ -49,16 +50,13 @@ export default { const state = reactive({ api:queryCache.api, psd:queryCache.psd, - groupid:globalData.value.groupid || queryCache.groupid, showPort: false }); const showPort = computed(() => globalData.value.connected == false && state.showPort); const handleConnect = () => { - globalData.value.groupid = state.groupid; queryCache.api = state.api; queryCache.psd = state.psd; - queryCache.groupid = state.groupid; localStorage.setItem('api-cache',JSON.stringify(queryCache)); closeWebsocket(); @@ -69,7 +67,6 @@ export default { window.location.reload(); } const handleShow = ()=>{ - //state.showPort = true; closeWebsocket(); initWebsocket(`ws://${window.location.hostname}:12345`,state.psd); } @@ -78,6 +75,7 @@ export default { getConfig().then((res)=>{ globalData.value.config.Common = res.Common; globalData.value.config.Client = res.Client; + globalData.value.config.Server = res.Server; globalData.value.config.Running = res.Running; globalData.value.configed = true; setTimeout(()=>{ @@ -114,7 +112,6 @@ export default { router.isReady().then(()=>{ state.api = route.query.api ?`${window.location.hostname}:${route.query.api}` : state.api; state.psd = route.query.psd || state.psd; - state.groupid = route.query.groupid || state.groupid; handleConnect(); }); }); diff --git a/linker.web/src/provide.js b/linker.web/src/provide.js index 550655f5..bec63287 100644 --- a/linker.web/src/provide.js +++ b/linker.web/src/provide.js @@ -9,10 +9,9 @@ export const provideGlobalData = () => { connected: false, updateFlag: false, height: 0, - config: { Common: {}, Client: {}, Running: {} }, + config: { Common: {}, Client: {}, Server: {}, Running: {} }, configed: false, signin: { Connected: false, Connecting: false, Version: 'v1.0.0.0' }, - groupid: '', bufferSize: ['1KB', '2KB', '4KB', '8KB', '16KB', '32KB', '64KB', '128KB', '256KB', '512KB', '1024KB'] }); subWebsocketState((state) => { diff --git a/linker.web/src/views/devices/DeviceEdit.vue b/linker.web/src/views/devices/DeviceEdit.vue index 1c894fd4..6ce44e57 100644 --- a/linker.web/src/views/devices/DeviceEdit.vue +++ b/linker.web/src/views/devices/DeviceEdit.vue @@ -3,7 +3,7 @@
-
这将会关闭程序,如果以服务启动,稍后会自动启动,否则你需要手动重新运行
+
修改后最好能重启一次客户端
diff --git a/linker.web/src/views/devices/devices.js b/linker.web/src/views/devices/devices.js index e9ac8e3b..a4907761 100644 --- a/linker.web/src/views/devices/devices.js +++ b/linker.web/src/views/devices/devices.js @@ -10,8 +10,7 @@ export const provideDevices = () => { timer: 0, page: { Request: { - Page: 1, Size: +(localStorage.getItem('ps') || '10'), - GroupId: globalData.value.groupid, Name: '', Ids: [] + Page: 1, Size: +(localStorage.getItem('ps') || '10'), Name: '', Ids: [] }, Count: 0, List: [] @@ -21,7 +20,6 @@ export const provideDevices = () => { deviceInfo: null }); const _getSignList = () => { - devices.page.Request.GroupId = globalData.value.groupid; getSignInList(devices.page.Request).then((res) => { devices.page.Request = res.Request; devices.page.Count = res.Count; @@ -37,7 +35,6 @@ export const provideDevices = () => { } const _getSignList1 = () => { if (globalData.value.connected) { - devices.page.Request.GroupId = globalData.value.groupid; getSignInList(devices.page.Request).then((res) => { for (let j in res.List) { const item = devices.page.List.filter(c => c.MachineId == res.List[j].MachineId)[0]; diff --git a/linker/Program.cs b/linker/Program.cs index 0afe1275..49b36d52 100644 --- a/linker/Program.cs +++ b/linker/Program.cs @@ -19,7 +19,7 @@ namespace linker Init(); //初始化配置文件 - ConfigWrap config = new ConfigWrap(); + FileConfig config = new FileConfig(); LoggerHelper.Instance.Warning($"current version : {config.Data.Version}"); diff --git a/linker/client/ClientSignInTransfer.cs b/linker/client/ClientSignInTransfer.cs index 9792905b..395c7311 100644 --- a/linker/client/ClientSignInTransfer.cs +++ b/linker/client/ClientSignInTransfer.cs @@ -18,7 +18,7 @@ namespace linker.client { private readonly ClientSignInState clientSignInState; private readonly RunningConfig runningConfig; - private readonly ConfigWrap config; + private readonly FileConfig config; private readonly TcpServer tcpServer; private readonly MessengerSender messengerSender; private readonly SignInArgsTransfer signInArgsTransfer; @@ -26,7 +26,7 @@ namespace linker.client private string configKey = "signServers"; - public ClientSignInTransfer(ClientSignInState clientSignInState, RunningConfig runningConfig, ConfigWrap config, TcpServer tcpServer, MessengerSender messengerSender, SignInArgsTransfer signInArgsTransfer, RunningConfigTransfer runningConfigTransfer) + public ClientSignInTransfer(ClientSignInState clientSignInState, RunningConfig runningConfig, FileConfig config, TcpServer tcpServer, MessengerSender messengerSender, SignInArgsTransfer signInArgsTransfer, RunningConfigTransfer runningConfigTransfer) { this.clientSignInState = clientSignInState; this.runningConfig = runningConfig; @@ -121,89 +121,6 @@ namespace linker.client BooleanHelper.CompareExchange(ref clientSignInState.connecting, false, true); } } - /// - /// 登出 - /// - public void SignOut() - { - if (clientSignInState.Connected) - clientSignInState.Connection.Disponse(5); - } - - /// - /// 修改客户端名称 - /// - /// - public void UpdateName(string newName) - { - string name = config.Data.Client.Name; - - if (name != newName) - { - config.Data.Client.Name = newName; - config.Save(); - - SignOut(); - _ = SignIn(); - } - - - } - /// - /// 修改客户端名称和分组编号 - /// - /// - /// - public void UpdateName(string newName, string newGroupid) - { - string name = config.Data.Client.Name; - string gid = config.Data.Client.GroupId; - - if (name != newName || gid != newGroupid) - { - config.Data.Client.Name = newName; - config.Data.Client.GroupId = newGroupid; - config.Save(); - SignOut(); - _ = SignIn(); - } - } - - /// - /// 修改信标服务器列表 - /// - /// - public async Task UpdateServers(ClientServerInfo[] servers) - { - await SetServers(servers); - runningConfigTransfer.IncrementVersion(configKey); - SyncServers(); - } - private void SetServers(Memory data) - { - _ = SetServers(MemoryPackSerializer.Deserialize(data.Span)); - } - private async Task SetServers(ClientServerInfo[] servers) - { - string server = config.Data.Client.Server; - runningConfig.Data.Client.Servers = servers; - if (runningConfig.Data.Client.Servers.Length > 0) - { - config.Data.Client.Server = runningConfig.Data.Client.Servers.FirstOrDefault().Host; - } - runningConfig.Data.Update(); - if (server != config.Data.Client.Server) - { - SignOut(); - await SignIn(); - } - } - private void SyncServers() - { - runningConfigTransfer.Sync(configKey, MemoryPackSerializer.Serialize(runningConfig.Data.Client.Servers)); - } - - /// /// 连接到信标服务器 /// @@ -252,7 +169,6 @@ namespace linker.client clientSignInState.Connection?.Disponse(6); return false; } - /// /// 获取服务器版本 /// @@ -273,5 +189,87 @@ namespace linker.client clientSignInState.Version = "v1.0.0.0"; } } + /// + /// 登出 + /// + public void SignOut() + { + if (clientSignInState.Connected) + clientSignInState.Connection.Disponse(5); + } + + /// + /// 修改客户端名称 + /// + /// + public void SetName(string newName) + { + string name = config.Data.Client.Name; + + if (name != newName) + { + config.Data.Client.Name = newName; + config.Save(); + + SignOut(); + _ = SignIn(); + } + + + } + /// + /// 修改客户端名称和分组编号 + /// + /// + /// + public void Set(string newName, string newGroupid) + { + string name = config.Data.Client.Name; + string gid = config.Data.Client.GroupId; + + if (name != newName || gid != newGroupid) + { + config.Data.Client.Name = newName; + config.Data.Client.GroupId = newGroupid; + config.Save(); + SignOut(); + _ = SignIn(); + } + } + + /// + /// 修改信标服务器列表 + /// + /// + public async Task SetServers(ClientServerInfo[] servers) + { + await SetServersReSignin(servers); + runningConfigTransfer.IncrementVersion(configKey); + SyncServers(); + } + private void SetServers(Memory data) + { + _ = SetServersReSignin(MemoryPackSerializer.Deserialize(data.Span)); + } + private async Task SetServersReSignin(ClientServerInfo[] servers) + { + string server = config.Data.Client.Server; + runningConfig.Data.Client.Servers = servers; + if (runningConfig.Data.Client.Servers.Length > 0) + { + config.Data.Client.Server = runningConfig.Data.Client.Servers.FirstOrDefault().Host; + } + runningConfig.Data.Update(); + if (server != config.Data.Client.Server) + { + SignOut(); + await SignIn(); + } + } + private void SyncServers() + { + runningConfigTransfer.Sync(configKey, MemoryPackSerializer.Serialize(runningConfig.Data.Client.Servers)); + } + } } diff --git a/linker/client/ClientStartup.cs b/linker/client/ClientStartup.cs index 0ce5ef36..4c227968 100644 --- a/linker/client/ClientStartup.cs +++ b/linker/client/ClientStartup.cs @@ -20,7 +20,7 @@ namespace linker.client public string[] Dependent => new string[] { "firewall", "signin", "serialize" }; public StartupLoadType LoadType => StartupLoadType.Normal; - public void AddClient(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddClient(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); @@ -34,7 +34,7 @@ namespace linker.client } - public void UseClient(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseClient(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { LoggerHelper.Instance.Info($"start client"); @@ -44,11 +44,11 @@ namespace linker.client } - public void AddServer(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { serviceCollection.AddSingleton(); } - public void UseServer(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseServer(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { } } diff --git a/linker/client/args/SignInArgsTransfer.cs b/linker/client/args/SignInArgsTransfer.cs index eb1950b5..36eaf10e 100644 --- a/linker/client/args/SignInArgsTransfer.cs +++ b/linker/client/args/SignInArgsTransfer.cs @@ -9,7 +9,7 @@ namespace linker.client.args { private List startups; - public SignInArgsTransfer(ServiceProvider serviceProvider, ConfigWrap config) + public SignInArgsTransfer(ServiceProvider serviceProvider, FileConfig config) { var types = ReflectionHelper.GetInterfaceSchieves(typeof(ISignInArgs)); startups = types.Select(c => serviceProvider.GetService(c) as ISignInArgs).Where(c=>c != null).ToList(); diff --git a/linker/client/config/Config.cs b/linker/client/config/Config.cs index 5b182f2f..4606251d 100644 --- a/linker/client/config/Config.cs +++ b/linker/client/config/Config.cs @@ -67,7 +67,7 @@ namespace linker.config } } #if DEBUG - private string groupid = string.Empty;//"snltty"; + private string groupid = "snltty"; #else private string groupid = string.Empty; #endif diff --git a/linker/client/config/RunningConfig.cs b/linker/client/config/RunningConfig.cs index 7a7ea26e..4df814d6 100644 --- a/linker/client/config/RunningConfig.cs +++ b/linker/client/config/RunningConfig.cs @@ -5,6 +5,9 @@ using System.Text.Json.Serialization; namespace linker.client.config { + /// + /// 运行时配置 + /// public sealed class RunningConfig { private readonly ILiteCollection liteCollection; diff --git a/linker/client/config/RunningConfigTransfer.cs b/linker/client/config/RunningConfigTransfer.cs index 69fa2ce6..c2f0497d 100644 --- a/linker/client/config/RunningConfigTransfer.cs +++ b/linker/client/config/RunningConfigTransfer.cs @@ -8,17 +8,31 @@ namespace linker.client.config { public sealed partial class RunningConfigInfo { + /// + /// 同步配置的版本记录 + /// public Dictionary Versions { get; set; } = new Dictionary(); } [MemoryPackable] public sealed partial class ConfigVersionInfo { + /// + /// 配置key + /// public string Key { get; set; } + /// + /// 配置版本 + /// public ulong Version { get; set; } + /// + /// 配置数据 + /// public Memory Data { get; set; } } - + /// + /// 配置同步 + /// public sealed class RunningConfigTransfer { private ConcurrentDictionary>> setters = new ConcurrentDictionary>>(); @@ -33,15 +47,30 @@ namespace linker.client.config this.sender = sender; this.clientSignInState = clientSignInState; } + /// + /// 设置配置 + /// + /// + /// public void Setter(string key, Action> callback) { setters.TryAdd(key, callback); } + /// + /// 获取配置 + /// + /// + /// public void Getter(string key, Func> callback) { getters.TryAdd(key, callback); } + /// + /// 输入配置 + /// + /// + /// public Memory InputConfig(ConfigVersionInfo info) { ulong version = GetVersion(info.Key); @@ -66,6 +95,11 @@ namespace linker.client.config private object syncLockObj = new(); + /// + /// 同步配置 + /// + /// + /// public void Sync(string key, Memory data) { ulong version = GetVersion(key); @@ -106,11 +140,20 @@ namespace linker.client.config } return version; } + /// + /// 更新版本 + /// + /// + /// public void UpdateVersion(string key, ulong version) { runningConfig.Data.Versions[key] = version; runningConfig.Data.Update(); } + /// + /// 版本+1 + /// + /// public void IncrementVersion(string key) { ulong version = GetVersion(key); diff --git a/linker/config/Config.cs b/linker/config/Config.cs index fd3ce296..9caa64ec 100644 --- a/linker/config/Config.cs +++ b/linker/config/Config.cs @@ -1,11 +1,12 @@ using linker.libs; using linker.libs.extends; +using LiteDB; using System.Reflection; using System.Text.Json.Serialization; namespace linker.config { - public sealed class ConfigWrap + public sealed class FileConfig { private SemaphoreSlim slim = new SemaphoreSlim(1); private string configPath = "./configs/"; @@ -14,11 +15,12 @@ namespace linker.config public ConfigInfo Data { get; private set; } = new ConfigInfo(); - public ConfigWrap() + public FileConfig() { Init(); Load(); Save(); + SaveTask(); } private void Init() @@ -46,7 +48,6 @@ namespace linker.config }); } } - private void Load() { slim.Wait(); @@ -78,8 +79,7 @@ namespace linker.config } } - - public void Save() + private void Save() { slim.Wait(); try @@ -106,7 +106,21 @@ namespace linker.config } } - + private void SaveTask() + { + Task.Run(async () => + { + while (true) + { + while (Data.Updated > 0) + { + Save(); + Data.Updated--; + } + await Task.Delay(1000).ConfigureAwait(false); + } + }); + } } public sealed class FileReadWrite @@ -129,16 +143,29 @@ namespace linker.config public string Version { get; set; } = $"v{Assembly.GetEntryAssembly().GetName().Version}"; [JsonIgnore] public bool Elevated { get; set; } + + + [JsonIgnore, BsonIgnore] + public uint Updated { get; set; } = 1; + + public void Update() + { + Updated++; + } } public sealed partial class ConfigCommonInfo { public string[] Modes { get; set; } = new string[] { "client", "server" }; + + #if DEBUG private LoggerTypes loggerType { get; set; } = LoggerTypes.DEBUG; + public bool Install { get; set; } = true; #else private LoggerTypes loggerType { get; set; } = LoggerTypes.WARNING; + public bool Install { get; set; } = false; #endif [JsonIgnore] diff --git a/linker/plugins/capi/ApiClientServer.cs b/linker/plugins/capi/ApiClientServer.cs index b1766ad0..a125b295 100644 --- a/linker/plugins/capi/ApiClientServer.cs +++ b/linker/plugins/capi/ApiClientServer.cs @@ -13,9 +13,9 @@ namespace linker.plugins.capi public sealed class ApiClientServer : ApiServer, IApiClientServer { private readonly ServiceProvider serviceProvider; - private readonly ConfigWrap config; + private readonly FileConfig config; - public ApiClientServer(ServiceProvider serviceProvider, ConfigWrap config) + public ApiClientServer(ServiceProvider serviceProvider, FileConfig config) { this.serviceProvider = serviceProvider; this.config = config; diff --git a/linker/plugins/capi/CApiStartup.cs b/linker/plugins/capi/CApiStartup.cs index 1f5c7a3b..c3909b4a 100644 --- a/linker/plugins/capi/CApiStartup.cs +++ b/linker/plugins/capi/CApiStartup.cs @@ -15,13 +15,13 @@ namespace linker.plugins.capi public string[] Dependent => new string[] {}; public StartupLoadType LoadType => StartupLoadType.Normal; - public void AddClient(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddClient(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); } - public void UseClient(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseClient(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { if (config.Data.Client.CApi.ApiPort > 0) { @@ -42,11 +42,11 @@ namespace linker.plugins.capi } - public void AddServer(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { } - public void UseServer(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseServer(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { } } diff --git a/linker/plugins/capi/config/Config.cs b/linker/plugins/capi/config/Config.cs index c5b37787..0a418d46 100644 --- a/linker/plugins/capi/config/Config.cs +++ b/linker/plugins/capi/config/Config.cs @@ -4,15 +4,30 @@ namespace linker.config { public partial class ConfigClientInfo { + /// + /// 客户端管理接口配置 + /// public CApiConfigClientInfo CApi { get; set; } = new CApiConfigClientInfo(); } public sealed class CApiConfigClientInfo { + /// + /// 管理接口端口 + /// public int ApiPort { get; set; } = 1803; + /// + /// 管理接口密码 + /// public string ApiPassword { get; set; } = Helper.GlobalString; + /// + /// 网站端口 + /// public int WebPort { get; set; } = 1804; + /// + /// 网站根目录 + /// public string WebRoot { get; set; } = "./web/"; } } diff --git a/linker/plugins/config/ConfigApiController.cs b/linker/plugins/config/ConfigApiController.cs new file mode 100644 index 00000000..7d5ca337 --- /dev/null +++ b/linker/plugins/config/ConfigApiController.cs @@ -0,0 +1,89 @@ +using linker.config; +using linker.libs.api; +using linker.libs.extends; +using linker.client.capi; +using linker.client.config; + +namespace linker.plugins.config +{ + public sealed class ConfigClientApiController : IApiClientController + { + private readonly RunningConfig runningConfig; + private readonly FileConfig config; + + public ConfigClientApiController(RunningConfig runningConfig, FileConfig config) + { + this.runningConfig = runningConfig; + this.config = config; + + } + + public object Get(ApiControllerParamsInfo param) + { + return new { Common = config.Data.Common, Client = config.Data.Client, Server = config.Data.Server, Running = runningConfig.Data }; + } + + public bool Install(ApiControllerParamsInfo param) + { + ConfigInstallInfo info = param.Content.DeJson(); + + if (info.Common.Modes.Contains("client")) + { + config.Data.Client.Name = info.Client.Name; + config.Data.Client.GroupId = info.Client.GroupId; + config.Data.Client.CApi.WebPort = info.Client.Web; + config.Data.Client.CApi.ApiPort = info.Client.Api; + config.Data.Client.CApi.ApiPassword = info.Client.Password; + } + if (info.Common.Modes.Contains("server")) + { + config.Data.Server.ServicePort = info.Server.ServicePort; + config.Data.Server.Relay.SecretKey = info.Server.Relay.SecretKey; + config.Data.Server.SForward.SecretKey = info.Server.SForward.SecretKey; + config.Data.Server.SForward.WebPort = info.Server.SForward.WebPort; + config.Data.Server.SForward.TunnelPortRange = info.Server.SForward.TunnelPortRange; + } + + config.Data.Common.Modes = info.Common.Modes; + config.Data.Common.Install = true; + config.Save(); + return true; + } + } + + public sealed class ConfigInstallInfo + { + public ConfigInstallClientInfo Client { get; set; } = new ConfigInstallClientInfo(); + public ConfigInstallServerInfo Server { get; set; } = new ConfigInstallServerInfo(); + public ConfigInstallCommonInfo Common { get; set; } = new ConfigInstallCommonInfo(); + } + public sealed class ConfigInstallClientInfo + { + public string Name { get; set; } + public string GroupId { get; set; } + public int Api { get; set; } + public int Web { get; set; } + public string Password { get; set; } + } + public sealed class ConfigInstallServerInfo + { + public int ServicePort { get; set; } + public ConfigInstallServerRelayInfo Relay { get; set; } + public ConfigInstallServerSForwardInfo SForward { get; set; } + } + public sealed class ConfigInstallServerRelayInfo + { + public string SecretKey { get; set; } + } + public sealed class ConfigInstallServerSForwardInfo + { + public string SecretKey { get; set; } + public int WebPort { get; set; } + public int[] TunnelPortRange { get; set; } + } + + public sealed class ConfigInstallCommonInfo + { + public string[] Modes { get; set; } + } +} diff --git a/linker/plugins/config/ConfigStartup.cs b/linker/plugins/config/ConfigStartup.cs new file mode 100644 index 00000000..0351c433 --- /dev/null +++ b/linker/plugins/config/ConfigStartup.cs @@ -0,0 +1,37 @@ +using linker.config; +using linker.startup; +using Microsoft.Extensions.DependencyInjection; +using System.Reflection; + +namespace linker.plugins.config +{ + public sealed class ConfigStartup : IStartup + { + public string Name => "config"; + + public bool Required => true; + + public StartupLevel Level => StartupLevel.Normal; + + public string[] Dependent => Array.Empty(); + + public StartupLoadType LoadType => StartupLoadType.Normal; + + public void AddClient(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) + { + serviceCollection.AddSingleton(); + } + + public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) + { + } + + public void UseClient(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) + { + } + + public void UseServer(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) + { + } + } +} diff --git a/linker/plugins/firewall/FireWallStartup.cs b/linker/plugins/firewall/FireWallStartup.cs index 7a90b30a..517fe82b 100644 --- a/linker/plugins/firewall/FireWallStartup.cs +++ b/linker/plugins/firewall/FireWallStartup.cs @@ -13,7 +13,7 @@ namespace linker.plugins.firewall public string[] Dependent => new string[] { }; public StartupLoadType LoadType => StartupLoadType.Dependent; - public void AddClient(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddClient(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { #if DEBUG #else @@ -21,15 +21,15 @@ namespace linker.plugins.firewall #endif } - public void AddServer(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { } - public void UseClient(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseClient(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { } - public void UseServer(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseServer(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { } } diff --git a/linker/plugins/forward/ForwardStartup.cs b/linker/plugins/forward/ForwardStartup.cs index 6a406b47..2c29ca2b 100644 --- a/linker/plugins/forward/ForwardStartup.cs +++ b/linker/plugins/forward/ForwardStartup.cs @@ -17,7 +17,7 @@ namespace linker.plugins.forward public StartupLoadType LoadType => StartupLoadType.Normal; - public void AddClient(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddClient(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); @@ -27,17 +27,17 @@ namespace linker.plugins.forward } - public void AddServer(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { serviceCollection.AddSingleton(); } - public void UseClient(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseClient(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { ForwardTransfer forwardTransfer = serviceProvider.GetService(); } - public void UseServer(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseServer(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { } } diff --git a/linker/plugins/forward/config/Config.cs b/linker/plugins/forward/config/Config.cs index 53efa1a4..1ee725c3 100644 --- a/linker/plugins/forward/config/Config.cs +++ b/linker/plugins/forward/config/Config.cs @@ -7,23 +7,54 @@ namespace linker.client.config { public sealed partial class RunningConfigInfo { + /// + /// 端口转发配置 + /// public List Forwards { get; set; } = new List(); } + /// + /// 端口转发配置 + /// public sealed class ForwardInfo { public uint Id { get; set; } + /// + /// 名称 + /// public string Name { get; set; } + /// + /// 目标设备 + /// public string MachineId { get; set; } - + /// + /// 本地绑定IP + /// public IPAddress BindIPAddress { get; set; } = IPAddress.Any; + /// + /// 本地监听端口 + /// public int Port { get; set; } + /// + /// 目标设备服务 + /// public IPEndPoint TargetEP { get; set; } + /// + /// 已启动 + /// public bool Started { get; set; } - + /// + /// 缓冲区 + /// public byte BufferSize { get; set; } = 3; + /// + /// 本地监听错误信息 + /// public string Msg { get; set; } + /// + /// 目标服务错误信息 + /// public string TargetMsg { get; set; } [JsonIgnore, BsonIgnore] diff --git a/linker/plugins/forward/proxy/ForwardProxy.cs b/linker/plugins/forward/proxy/ForwardProxy.cs index 1af2e349..1f11c807 100644 --- a/linker/plugins/forward/proxy/ForwardProxy.cs +++ b/linker/plugins/forward/proxy/ForwardProxy.cs @@ -12,7 +12,7 @@ namespace linker.plugins.forward.proxy { public sealed class ForwardProxy : TunnelProxy { - private readonly ConfigWrap config; + private readonly FileConfig config; private readonly TunnelTransfer tunnelTransfer; private readonly RelayTransfer relayTransfer; @@ -20,7 +20,7 @@ namespace linker.plugins.forward.proxy private readonly ConcurrentDictionary connections = new ConcurrentDictionary(); private readonly ConcurrentDictionary locks = new ConcurrentDictionary(); - public ForwardProxy(ConfigWrap config, TunnelTransfer tunnelTransfer, RelayTransfer relayTransfer) + public ForwardProxy(FileConfig config, TunnelTransfer tunnelTransfer, RelayTransfer relayTransfer) { this.config = config; this.tunnelTransfer = tunnelTransfer; @@ -36,6 +36,10 @@ namespace linker.plugins.forward.proxy if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Warning($"TryAdd {connection.GetHashCode()} {connection.TransactionId} {connection.ToJson()}"); + if (connections.TryGetValue(connection.RemoteMachineId, out ITunnelConnection connectionOld)) + { + connectionOld?.Dispose(); + } //把隧道对象添加到缓存,方便下次直接获取 connections.AddOrUpdate(connection.RemoteMachineId, connection, (a, b) => connection); BindConnectionReceive(connection); @@ -113,12 +117,13 @@ namespace linker.plugins.forward.proxy if (connection == null) { if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"forward relay to {machineId}"); - //转入后台打洞 - tunnelTransfer.StartBackground(machineId, "forward"); + //尝试中继 connection = await relayTransfer.ConnectAsync(config.Data.Client.Id, machineId, "forward").ConfigureAwait(false); if (connection != null) { + //转入后台打洞 + tunnelTransfer.StartBackground(machineId, "forward"); if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"forward relay to {machineId} success"); } } diff --git a/linker/plugins/logger/LoggerController.cs b/linker/plugins/logger/LoggerController.cs index b6c7f462..17997187 100644 --- a/linker/plugins/logger/LoggerController.cs +++ b/linker/plugins/logger/LoggerController.cs @@ -10,8 +10,8 @@ namespace linker.plugins.logger { private readonly List loggers = new List(); - private readonly ConfigWrap config; - public LoggerClientApiController(ConfigWrap config) + private readonly FileConfig config; + public LoggerClientApiController(FileConfig config) { this.config = config; LoggerHelper.Instance.OnLogger += (LoggerModel logger) => diff --git a/linker/plugins/logger/LoggerStartup.cs b/linker/plugins/logger/LoggerStartup.cs index 8be8eb94..8f69f564 100644 --- a/linker/plugins/logger/LoggerStartup.cs +++ b/linker/plugins/logger/LoggerStartup.cs @@ -17,22 +17,22 @@ namespace linker.plugins.logger public StartupLoadType LoadType => StartupLoadType.Normal; - public void AddClient(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddClient(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { serviceCollection.AddSingleton(); } - public void AddServer(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { } - public void UseClient(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseClient(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { LoggerClientApiController logger = serviceProvider.GetService(); } - public void UseServer(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseServer(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { } } diff --git a/linker/plugins/relay/RelayApiController.cs b/linker/plugins/relay/RelayApiController.cs index cd9446c1..beff547c 100644 --- a/linker/plugins/relay/RelayApiController.cs +++ b/linker/plugins/relay/RelayApiController.cs @@ -14,12 +14,12 @@ namespace linker.plugins.relay /// public sealed class RelayApiController : IApiClientController { - private readonly ConfigWrap config; + private readonly FileConfig config; private readonly RelayTransfer relayTransfer; private readonly ClientSignInState clientSignInState; private readonly MessengerSender messengerSender; - public RelayApiController(ConfigWrap config, RelayTransfer relayTransfer, ClientSignInState clientSignInState, MessengerSender messengerSender) + public RelayApiController(FileConfig config, RelayTransfer relayTransfer, ClientSignInState clientSignInState, MessengerSender messengerSender) { this.config = config; this.relayTransfer = relayTransfer; diff --git a/linker/plugins/relay/RelayStartup.cs b/linker/plugins/relay/RelayStartup.cs index ed72237b..adf1f28d 100644 --- a/linker/plugins/relay/RelayStartup.cs +++ b/linker/plugins/relay/RelayStartup.cs @@ -21,7 +21,7 @@ namespace linker.plugins.relay public StartupLoadType LoadType => StartupLoadType.Normal; - public void AddClient(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddClient(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); @@ -30,18 +30,18 @@ namespace linker.plugins.relay } - public void AddServer(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { serviceCollection.AddSingleton(); } - public void UseClient(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseClient(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { RelayTransfer relayTransfer = serviceProvider.GetService(); relayTransfer.Load(assemblies); } - public void UseServer(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseServer(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { } } diff --git a/linker/plugins/relay/config/Config.cs b/linker/plugins/relay/config/Config.cs index cd389401..cfa6016f 100644 --- a/linker/plugins/relay/config/Config.cs +++ b/linker/plugins/relay/config/Config.cs @@ -8,12 +8,18 @@ namespace linker.client.config { public sealed partial class RunningConfigInfo { + /// + /// 中继配置 + /// public RelayRunningInfo Relay { get; set; } = new RelayRunningInfo(); } public sealed class RelayRunningInfo { public ObjectId Id { get; set; } + /// + /// 中继服务器列表 + /// public RelayServerInfo[] Servers { get; set; } = Array.Empty(); } } @@ -23,23 +29,53 @@ namespace linker.config { public partial class ConfigServerInfo { + /// + /// 中继配置 + /// public RelayConfigServerInfo Relay { get; set; } = new RelayConfigServerInfo(); } public sealed class RelayConfigServerInfo { + /// + /// 中继密钥 + /// public string SecretKey { get; set; } = Guid.NewGuid().ToString().ToUpper(); + /// + /// 缓冲区 + /// public byte BufferSize { get; set; } = 3; } + /// + /// 中继服务器 + /// [MemoryPackable] public sealed partial class RelayServerInfo { + /// + /// 名称 + /// public string Name { get; set; } = string.Empty; + /// + /// 中继服务器类别 + /// public RelayType RelayType { get; set; } = RelayType.Linker; + /// + /// 密钥 + /// public string SecretKey { get; set; } = "snltty"; + /// + /// 服务器地址 + /// public string Host { get; set; } = string.Empty; + /// + /// 禁用 + /// public bool Disabled { get; set; } + /// + /// 开启ssl + /// public bool SSL { get; set; } = true; } diff --git a/linker/plugins/relay/messenger/RelayMessenger.cs b/linker/plugins/relay/messenger/RelayMessenger.cs index 9c6ecf3b..7ca8db8e 100644 --- a/linker/plugins/relay/messenger/RelayMessenger.cs +++ b/linker/plugins/relay/messenger/RelayMessenger.cs @@ -39,14 +39,14 @@ namespace linker.plugins.relay.messenger /// public sealed class RelayServerMessenger : IMessenger { - private readonly ConfigWrap config; + private readonly FileConfig config; private readonly MessengerSender messengerSender; private readonly SignCaching signCaching; private readonly ConcurrentDictionary dic = new ConcurrentDictionary(); private ulong flowingId = 0; - public RelayServerMessenger(ConfigWrap config, MessengerSender messengerSender, SignCaching signCaching) + public RelayServerMessenger(FileConfig config, MessengerSender messengerSender, SignCaching signCaching) { this.config = config; this.messengerSender = messengerSender; diff --git a/linker/plugins/relay/transport/TransportSelfHost.cs b/linker/plugins/relay/transport/TransportSelfHost.cs index 1451bcf9..44d454e6 100644 --- a/linker/plugins/relay/transport/TransportSelfHost.cs +++ b/linker/plugins/relay/transport/TransportSelfHost.cs @@ -26,7 +26,7 @@ namespace linker.plugins.relay.transport private X509Certificate2 certificate; - public TransportSelfHost(TcpServer tcpServer, MessengerSender messengerSender, ConfigWrap config) + public TransportSelfHost(TcpServer tcpServer, MessengerSender messengerSender, FileConfig config) { this.tcpServer = tcpServer; this.messengerSender = messengerSender; diff --git a/linker/plugins/sforward/SForwardStartup.cs b/linker/plugins/sforward/SForwardStartup.cs index 503e5e48..cf5016e0 100644 --- a/linker/plugins/sforward/SForwardStartup.cs +++ b/linker/plugins/sforward/SForwardStartup.cs @@ -22,7 +22,7 @@ namespace linker.plugins.sforward public StartupLoadType LoadType => StartupLoadType.Normal; - public void AddClient(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddClient(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { Add(serviceCollection, config, assemblies); serviceCollection.AddSingleton(); @@ -30,7 +30,7 @@ namespace linker.plugins.sforward serviceCollection.AddSingleton(); } - public void AddServer(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { Add(serviceCollection, config, assemblies); serviceCollection.AddSingleton(); @@ -40,7 +40,7 @@ namespace linker.plugins.sforward } bool added = false; - private void Add(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + private void Add(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { if (added == false) { @@ -49,12 +49,12 @@ namespace linker.plugins.sforward } } - public void UseClient(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseClient(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { SForwardTransfer forwardTransfer = serviceProvider.GetService(); } - public void UseServer(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseServer(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { SForwardProxy sForwardProxy = serviceProvider.GetService(); if (config.Data.Server.SForward.WebPort > 0) diff --git a/linker/plugins/sforward/config/Config.cs b/linker/plugins/sforward/config/Config.cs index 9a7a7744..d7ae2bab 100644 --- a/linker/plugins/sforward/config/Config.cs +++ b/linker/plugins/sforward/config/Config.cs @@ -8,24 +8,53 @@ namespace linker.client.config { public sealed partial class RunningConfigInfo { + /// + /// 服务器穿透密钥 + /// public string SForwardSecretKey { get; set; } = "snltty"; + /// + /// 服务器穿透列表 + /// public List SForwards { get; set; } =new List(); } public sealed class SForwardInfo { + /// + /// 穿透id + /// public uint Id { get; set; } + /// + /// 名称 + /// public string Name { get; set; } - + /// + /// 域名 + /// public string Domain { get; set; } + /// + /// 端口, + /// public int RemotePort { get; set; } - + /// + /// 缓冲区 + /// public byte BufferSize { get; set; } = 3; - + /// + /// 本地服务 + /// public IPEndPoint LocalEP { get; set; } - + /// + /// 已启动 + /// public bool Started { get; set; } + /// + /// 服务器错误信息 + /// public string Msg { get; set; } + /// + /// 本地错误信息 + /// public string LocalMsg { get; set; } [JsonIgnore, BsonIgnore] @@ -38,14 +67,29 @@ namespace linker.config { public partial class ConfigServerInfo { + /// + /// 服务器穿透配置 + /// public SForwardConfigServerInfo SForward { get; set; } = new SForwardConfigServerInfo(); } public sealed class SForwardConfigServerInfo { + /// + /// 密钥 + /// public string SecretKey { get; set; } = Guid.NewGuid().ToString().ToUpper(); + /// + /// 缓冲区 + /// public byte BufferSize { get; set; } = 3; + /// + /// web端口 + /// public int WebPort { get; set; } + /// + /// 开放端口范围 + /// public int[] TunnelPortRange { get; set; } = new int[] { 10000, 60000 }; } @@ -67,7 +111,6 @@ namespace linker.plugins.sforward.config { public bool Success { get; set; } public string Message { get; set; } - public byte BufferSize { get; set; } } @@ -78,7 +121,6 @@ namespace linker.plugins.sforward.config public ulong Id { get; set; } public string Domain { get; set; } public int RemotePort { get; set; } - public byte BufferSize { get; set; } = 3; } } diff --git a/linker/plugins/sforward/messenger/SForwardMessenger.cs b/linker/plugins/sforward/messenger/SForwardMessenger.cs index 848c1b9f..fba9040a 100644 --- a/linker/plugins/sforward/messenger/SForwardMessenger.cs +++ b/linker/plugins/sforward/messenger/SForwardMessenger.cs @@ -19,10 +19,10 @@ namespace linker.plugins.sforward.messenger private readonly ISForwardServerCahing sForwardServerCahing; private readonly MessengerSender sender; private readonly SignCaching signCaching; - private readonly ConfigWrap configWrap; + private readonly FileConfig configWrap; private readonly IValidator validator; - public SForwardServerMessenger(SForwardProxy proxy, ISForwardServerCahing sForwardServerCahing, MessengerSender sender, SignCaching signCaching, ConfigWrap configWrap, IValidator validator) + public SForwardServerMessenger(SForwardProxy proxy, ISForwardServerCahing sForwardServerCahing, MessengerSender sender, SignCaching signCaching, FileConfig configWrap, IValidator validator) { this.proxy = proxy; proxy.WebConnect = WebConnect; diff --git a/linker/plugins/sforward/validator/Validator.cs b/linker/plugins/sforward/validator/Validator.cs index 649d8eb7..3bd7af7f 100644 --- a/linker/plugins/sforward/validator/Validator.cs +++ b/linker/plugins/sforward/validator/Validator.cs @@ -6,8 +6,8 @@ namespace linker.plugins.sforward.validator { public sealed class Validator : IValidator { - private readonly ConfigWrap config; - public Validator(ConfigWrap config) + private readonly FileConfig config; + public Validator(FileConfig config) { this.config = config; } diff --git a/linker/plugins/signIn/SignInApiController.cs b/linker/plugins/signIn/SignInApiController.cs index b0a46628..19ca7ba4 100644 --- a/linker/plugins/signIn/SignInApiController.cs +++ b/linker/plugins/signIn/SignInApiController.cs @@ -6,23 +6,18 @@ using linker.client; using linker.server; using MemoryPack; using linker.client.capi; -using linker.client.config; -using System.Diagnostics; -using linker.libs; namespace linker.plugins.signin { public sealed class SignInClientApiController : IApiClientController { - private readonly RunningConfig runningConfig; - private readonly ConfigWrap config; + private readonly FileConfig config; private readonly ClientSignInState clientSignInState; private readonly ClientSignInTransfer clientSignInTransfer; private readonly MessengerSender messengerSender; - public SignInClientApiController(RunningConfig runningConfig, ConfigWrap config, ClientSignInState clientSignInState, ClientSignInTransfer clientSignInTransfer, MessengerSender messengerSender) + public SignInClientApiController(FileConfig config, ClientSignInState clientSignInState, ClientSignInTransfer clientSignInTransfer, MessengerSender messengerSender) { - this.runningConfig = runningConfig; this.config = config; this.clientSignInState = clientSignInState; this.clientSignInTransfer = clientSignInTransfer; @@ -30,22 +25,38 @@ namespace linker.plugins.signin } - public object Config(ApiControllerParamsInfo param) - { - return new { Common = config.Data.Common, Client = config.Data.Client, Running = runningConfig.Data }; - } public void Set(ApiControllerParamsInfo param) { ConfigSetInfo info = param.Content.DeJson(); - clientSignInTransfer.UpdateName(info.Name, info.GroupId); + clientSignInTransfer.Set(info.Name, info.GroupId); + } + public async Task SeName(ApiControllerParamsInfo param) + { + ConfigSetNameInfo info = param.Content.DeJson(); + + if (info.Id == config.Data.Client.Id) + { + clientSignInTransfer.SetName(info.NewName); + } + else + { + await messengerSender.SendOnly(new MessageRequestWrap + { + Connection = clientSignInState.Connection, + MessengerId = (ushort)SignInMessengerIds.SetNameForward, + Payload = MemoryPackSerializer.Serialize(info) + }).ConfigureAwait(false); + } + return true; } public async Task SetServers(ApiControllerParamsInfo param) { ClientServerInfo[] servers = param.Content.DeJson(); - await clientSignInTransfer.UpdateServers(servers); + await clientSignInTransfer.SetServers(servers); return true; } + public ClientSignInState Info(ApiControllerParamsInfo param) { return clientSignInState; @@ -90,50 +101,6 @@ namespace linker.plugins.signin return new SignInIdsResponseInfo { }; } - public async Task SetName(ApiControllerParamsInfo param) - { - ConfigSetNameInfo info = param.Content.DeJson(); - - - await messengerSender.SendOnly(new MessageRequestWrap - { - Connection = clientSignInState.Connection, - MessengerId = (ushort)SignInMessengerIds.NameForward, - Payload = MemoryPackSerializer.Serialize(info) - }).ConfigureAwait(false); - if (info.Id == config.Data.Client.Id) - { - clientSignInTransfer.UpdateName(info.NewName); - } - return true; - } - - public bool Install(ApiControllerParamsInfo param) - { - ConfigInstallInfo info = param.Content.DeJson(); - - config.Data.Client.Name = info.Name; - config.Data.Client.GroupId = info.GroupId; - config.Data.Client.CApi.WebPort = info.Web; - config.Data.Client.CApi.ApiPort = info.Api; - config.Data.Client.CApi.ApiPassword = info.Password; - config.Data.Common.Modes = new string[] { "client" }; - config.Save(); - - if (info.Restart) - { - try - { - CommandHelper.Execute(Process.GetCurrentProcess().MainModule.FileName, string.Empty); - Environment.Exit(0); - } - catch (Exception) - { - } - } - - return true; - } } [MemoryPackable] @@ -149,13 +116,4 @@ namespace linker.plugins.signin public string GroupId { get; set; } } - public sealed class ConfigInstallInfo - { - public string Name { get; set; } - public string GroupId { get; set; } - public int Api { get; set; } - public int Web { get; set; } - public string Password { get; set; } - public bool Restart { get; set; } - } } diff --git a/linker/plugins/signIn/SignInStartup.cs b/linker/plugins/signIn/SignInStartup.cs index 6e587586..e40fd9c7 100644 --- a/linker/plugins/signIn/SignInStartup.cs +++ b/linker/plugins/signIn/SignInStartup.cs @@ -18,23 +18,23 @@ namespace linker.plugins.signin public StartupLoadType LoadType => StartupLoadType.Normal; - public void AddClient(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddClient(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); } - public void AddServer(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); } - public void UseClient(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseClient(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { } - public void UseServer(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseServer(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { } } diff --git a/linker/plugins/signIn/messenger/SignInMessenger.cs b/linker/plugins/signIn/messenger/SignInMessenger.cs index d3bca969..63332829 100644 --- a/linker/plugins/signIn/messenger/SignInMessenger.cs +++ b/linker/plugins/signIn/messenger/SignInMessenger.cs @@ -9,16 +9,16 @@ namespace linker.plugins.signin.messenger public sealed class SignInClientMessenger : IMessenger { private readonly ClientSignInTransfer clientSignInTransfer; - public SignInClientMessenger(ConfigWrap config, ClientSignInTransfer clientSignInTransfer) + public SignInClientMessenger(FileConfig config, ClientSignInTransfer clientSignInTransfer) { this.clientSignInTransfer = clientSignInTransfer; } - [MessengerId((ushort)SignInMessengerIds.Name)] + [MessengerId((ushort)SignInMessengerIds.SetName)] public void Name(IConnection connection) { ConfigSetNameInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); - clientSignInTransfer.UpdateName(info.NewName); + clientSignInTransfer.SetName(info.NewName); } } @@ -26,10 +26,10 @@ namespace linker.plugins.signin.messenger public sealed class SignInServerMessenger : IMessenger { private readonly SignCaching signCaching; - private readonly ConfigWrap config; + private readonly FileConfig config; private readonly MessengerSender messengerSender; - public SignInServerMessenger(SignCaching signCaching, ConfigWrap config, MessengerSender messengerSender) + public SignInServerMessenger(SignCaching signCaching, FileConfig config, MessengerSender messengerSender) { this.signCaching = signCaching; this.config = config; @@ -82,7 +82,7 @@ namespace linker.plugins.signin.messenger } } - [MessengerId((ushort)SignInMessengerIds.NameForward)] + [MessengerId((ushort)SignInMessengerIds.SetNameForward)] public async Task NameForward(IConnection connection) { ConfigSetNameInfo info = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); @@ -93,7 +93,7 @@ namespace linker.plugins.signin.messenger await messengerSender.SendOnly(new MessageRequestWrap { Connection = cache.Connection, - MessengerId = (ushort)SignInMessengerIds.Name, + MessengerId = (ushort)SignInMessengerIds.SetName, Payload = connection.ReceiveRequestWrap.Payload, }).ConfigureAwait(false); } diff --git a/linker/plugins/signIn/messenger/SignInMessengerIds.cs b/linker/plugins/signIn/messenger/SignInMessengerIds.cs index bcd64f76..f3946506 100644 --- a/linker/plugins/signIn/messenger/SignInMessengerIds.cs +++ b/linker/plugins/signIn/messenger/SignInMessengerIds.cs @@ -6,8 +6,8 @@ List = 1, Delete = 2, - Name = 3, - NameForward = 4, + SetName = 3, + SetNameForward = 4, Version = 7, diff --git a/linker/plugins/tunnel/TunnelAdapter.cs b/linker/plugins/tunnel/TunnelAdapter.cs index 0991c2cc..8d55a197 100644 --- a/linker/plugins/tunnel/TunnelAdapter.cs +++ b/linker/plugins/tunnel/TunnelAdapter.cs @@ -22,14 +22,14 @@ namespace linker.plugins.tunnel private readonly ClientSignInState clientSignInState; private readonly MessengerSender messengerSender; - private readonly ConfigWrap config; + private readonly FileConfig config; private readonly RunningConfig running; private readonly RunningConfigTransfer runningConfigTransfer; private string wanPortConfigKey = "tunnelWanPortProtocols"; private string transportConfigKey = "tunnelTransports"; - public TunnelAdapter(ClientSignInState clientSignInState, MessengerSender messengerSender, ConfigWrap config, RunningConfig running, RunningConfigTransfer runningConfigTransfer) + public TunnelAdapter(ClientSignInState clientSignInState, MessengerSender messengerSender, FileConfig config, RunningConfig running, RunningConfigTransfer runningConfigTransfer) { this.clientSignInState = clientSignInState; this.messengerSender = messengerSender; diff --git a/linker/plugins/tunnel/TunnelApiController.cs b/linker/plugins/tunnel/TunnelApiController.cs index c9769afc..baad11b7 100644 --- a/linker/plugins/tunnel/TunnelApiController.cs +++ b/linker/plugins/tunnel/TunnelApiController.cs @@ -19,14 +19,14 @@ namespace linker.plugins.tunnel /// public sealed class TunnelApiController : IApiClientController { - private readonly ConfigWrap config; + private readonly FileConfig config; private readonly TunnelWanPortTransfer compactTransfer; private readonly ClientSignInState clientSignInState; private readonly MessengerSender messengerSender; private readonly TunnelConfigTransfer tunnelConfigTransfer; private readonly ITunnelAdapter tunnelMessengerAdapter; - public TunnelApiController(ConfigWrap config, TunnelWanPortTransfer compactTransfer, ClientSignInState clientSignInState, MessengerSender messengerSender, TunnelConfigTransfer tunnelConfigTransfer, ITunnelAdapter tunnelMessengerAdapter) + public TunnelApiController(FileConfig config, TunnelWanPortTransfer compactTransfer, ClientSignInState clientSignInState, MessengerSender messengerSender, TunnelConfigTransfer tunnelConfigTransfer, ITunnelAdapter tunnelMessengerAdapter) { this.config = config; this.compactTransfer = compactTransfer; @@ -92,11 +92,11 @@ namespace linker.plugins.tunnel /// public async Task SetRouteLevel(ApiControllerParamsInfo param) { - TunnelTransportRouteLevelInfo tunnelTransportConfigWrapInfo = param.Content.DeJson(); + TunnelTransportRouteLevelInfo tunnelTransportFileConfigInfo = param.Content.DeJson(); - if (tunnelTransportConfigWrapInfo.MachineId == config.Data.Client.Id) + if (tunnelTransportFileConfigInfo.MachineId == config.Data.Client.Id) { - tunnelConfigTransfer.OnLocalRouteLevel(tunnelTransportConfigWrapInfo); + tunnelConfigTransfer.OnLocalRouteLevel(tunnelTransportFileConfigInfo); } else { @@ -104,7 +104,7 @@ namespace linker.plugins.tunnel { Connection = clientSignInState.Connection, MessengerId = (ushort)TunnelMessengerIds.RouteLevelForward, - Payload = MemoryPackSerializer.Serialize(tunnelTransportConfigWrapInfo) + Payload = MemoryPackSerializer.Serialize(tunnelTransportFileConfigInfo) }).ConfigureAwait(false); } @@ -141,7 +141,6 @@ namespace linker.plugins.tunnel tunnelConfigTransfer.SettExcludeIPs(info); } - public sealed class TunnelListInfo { public ConcurrentDictionary List { get; set; } diff --git a/linker/plugins/tunnel/TunnelConfigTransfer.cs b/linker/plugins/tunnel/TunnelConfigTransfer.cs index 44785aa3..1cd79726 100644 --- a/linker/plugins/tunnel/TunnelConfigTransfer.cs +++ b/linker/plugins/tunnel/TunnelConfigTransfer.cs @@ -12,7 +12,7 @@ namespace linker.plugins.tunnel { public sealed class TunnelConfigTransfer { - private readonly ConfigWrap config; + private readonly FileConfig config; private readonly RunningConfig running; private readonly ClientSignInState clientSignInState; private readonly MessengerSender messengerSender; @@ -26,7 +26,7 @@ namespace linker.plugins.tunnel private ConcurrentDictionary configs = new ConcurrentDictionary(); public ConcurrentDictionary Config => configs; - public TunnelConfigTransfer(ConfigWrap config, RunningConfig running, ClientSignInState clientSignInState, MessengerSender messengerSender, RunningConfigTransfer runningConfigTransfer, ITunnelAdapter tunnelAdapter) + public TunnelConfigTransfer(FileConfig config, RunningConfig running, ClientSignInState clientSignInState, MessengerSender messengerSender, RunningConfigTransfer runningConfigTransfer, ITunnelAdapter tunnelAdapter) { this.config = config; this.running = running; @@ -90,21 +90,21 @@ namespace linker.plugins.tunnel /// /// 修改自己的网关层级信息 /// - /// - public void OnLocalRouteLevel(TunnelTransportRouteLevelInfo tunnelTransportConfigWrapInfo) + /// + public void OnLocalRouteLevel(TunnelTransportRouteLevelInfo tunnelTransportFileConfigInfo) { - running.Data.Tunnel.RouteLevelPlus = tunnelTransportConfigWrapInfo.RouteLevelPlus; + running.Data.Tunnel.RouteLevelPlus = tunnelTransportFileConfigInfo.RouteLevelPlus; running.Data.Update(); GetRemoveRouteLevel(); } /// /// 收到别人发给我的修改我的信息 /// - /// + /// /// - public TunnelTransportRouteLevelInfo OnRemoteRouteLevel(TunnelTransportRouteLevelInfo tunnelTransportConfigWrapInfo) + public TunnelTransportRouteLevelInfo OnRemoteRouteLevel(TunnelTransportRouteLevelInfo tunnelTransportFileConfigInfo) { - configs.AddOrUpdate(tunnelTransportConfigWrapInfo.MachineId, tunnelTransportConfigWrapInfo, (a, b) => tunnelTransportConfigWrapInfo); + configs.AddOrUpdate(tunnelTransportFileConfigInfo.MachineId, tunnelTransportFileConfigInfo, (a, b) => tunnelTransportFileConfigInfo); Interlocked.Increment(ref version); return GetLocalRouteLevel(); } diff --git a/linker/plugins/tunnel/TunnelStartup.cs b/linker/plugins/tunnel/TunnelStartup.cs index fd4caa46..da18b148 100644 --- a/linker/plugins/tunnel/TunnelStartup.cs +++ b/linker/plugins/tunnel/TunnelStartup.cs @@ -27,7 +27,7 @@ namespace linker.plugins.tunnel public StartupLoadType LoadType => StartupLoadType.Normal; - public void AddClient(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddClient(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { //序列化扩展 MemoryPackFormatterProvider.Register(new TunnelWanPortInfoFormatter()); @@ -66,7 +66,7 @@ namespace linker.plugins.tunnel } - public void AddServer(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { MemoryPackFormatterProvider.Register(new TunnelWanPortInfoFormatter()); MemoryPackFormatterProvider.Register(new TunnelTransportWanPortInfoFormatter()); @@ -77,7 +77,7 @@ namespace linker.plugins.tunnel serviceCollection.AddSingleton(); } - public void UseClient(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseClient(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { ITunnelAdapter tunnelAdapter = serviceProvider.GetService(); @@ -95,7 +95,7 @@ namespace linker.plugins.tunnel TunnelConfigTransfer tunnelConfigTransfer = serviceProvider.GetService(); } - public void UseServer(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseServer(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { } diff --git a/linker/plugins/tunnel/config/Config.cs b/linker/plugins/tunnel/config/Config.cs index 02acf2de..7ebc460c 100644 --- a/linker/plugins/tunnel/config/Config.cs +++ b/linker/plugins/tunnel/config/Config.cs @@ -6,24 +6,37 @@ using MemoryPack; using System.Net; using System.Text.Json.Serialization; using linker.tunnel.adapter; -using System.Net.Sockets; namespace linker.client.config { public sealed partial class RunningConfigInfo { + /// + /// 打洞配置 + /// public TunnelRunningInfo Tunnel { get; set; } = new TunnelRunningInfo(); } public sealed class TunnelRunningInfo { public ObjectId Id { get; set; } + /// + /// 外网端口服务器列表 + /// public List Servers { get; set; } = new List(); + /// + /// 附加的网关层级 + /// public int RouteLevelPlus { get; set; } = 0; - + /// + /// 打洞排除IP列表 + /// public ExcludeIPItem[] ExcludeIPs { get; set; } = Array.Empty(); + /// + /// 打洞协议列表 + /// public List Transports { get; set; } = new List(); } diff --git a/linker/plugins/tunnel/messenger/TunnelMessenger.cs b/linker/plugins/tunnel/messenger/TunnelMessenger.cs index 265f5299..e7e29fe3 100644 --- a/linker/plugins/tunnel/messenger/TunnelMessenger.cs +++ b/linker/plugins/tunnel/messenger/TunnelMessenger.cs @@ -68,15 +68,15 @@ namespace linker.plugins.tunnel.messenger [MessengerId((ushort)TunnelMessengerIds.RouteLevel)] public void RouteLevel(IConnection connection) { - TunnelTransportRouteLevelInfo tunnelTransportConfigWrapInfo = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); - tunnelConfigTransfer.OnLocalRouteLevel(tunnelTransportConfigWrapInfo); + TunnelTransportRouteLevelInfo tunnelTransportFileConfigInfo = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + tunnelConfigTransfer.OnLocalRouteLevel(tunnelTransportFileConfigInfo); } [MessengerId((ushort)TunnelMessengerIds.Config)] public void Config(IConnection connection) { - TunnelTransportRouteLevelInfo tunnelTransportConfigWrapInfo = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); - TunnelTransportRouteLevelInfo result = tunnelConfigTransfer.OnRemoteRouteLevel(tunnelTransportConfigWrapInfo); + TunnelTransportRouteLevelInfo tunnelTransportFileConfigInfo = MemoryPackSerializer.Deserialize(connection.ReceiveRequestWrap.Payload.Span); + TunnelTransportRouteLevelInfo result = tunnelConfigTransfer.OnRemoteRouteLevel(tunnelTransportFileConfigInfo); connection.Write(MemoryPackSerializer.Serialize(result)); } diff --git a/linker/plugins/tuntap/TuntapApiController.cs b/linker/plugins/tuntap/TuntapApiController.cs index bd9f8aa0..9bfc5ae3 100644 --- a/linker/plugins/tuntap/TuntapApiController.cs +++ b/linker/plugins/tuntap/TuntapApiController.cs @@ -19,10 +19,10 @@ namespace linker.plugins.tuntap private readonly MessengerSender messengerSender; private readonly TuntapTransfer tuntapTransfer; private readonly ClientSignInState clientSignInState; - private readonly ConfigWrap config; + private readonly FileConfig config; private readonly TuntapProxy tuntapProxy; - public TuntapClientApiController(MessengerSender messengerSender, TuntapTransfer tuntapTransfer, ClientSignInState clientSignInState, ConfigWrap config, TuntapProxy tuntapProxy) + public TuntapClientApiController(MessengerSender messengerSender, TuntapTransfer tuntapTransfer, ClientSignInState clientSignInState, FileConfig config, TuntapProxy tuntapProxy) { this.messengerSender = messengerSender; this.tuntapTransfer = tuntapTransfer; diff --git a/linker/plugins/tuntap/TuntapStartup.cs b/linker/plugins/tuntap/TuntapStartup.cs index ff5f0ed4..fc85379b 100644 --- a/linker/plugins/tuntap/TuntapStartup.cs +++ b/linker/plugins/tuntap/TuntapStartup.cs @@ -21,7 +21,7 @@ namespace linker.plugins.tuntap public StartupLoadType LoadType => StartupLoadType.Normal; - public void AddClient(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddClient(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { //不同平台下的虚拟网卡 if (OperatingSystem.IsWindows()) serviceCollection.AddSingleton(); @@ -35,18 +35,18 @@ namespace linker.plugins.tuntap serviceCollection.AddSingleton(); } - public void AddServer(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { serviceCollection.AddSingleton(); } - public void UseClient(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseClient(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { TuntapProxy tuntapProxy = serviceProvider.GetService(); TuntapTransfer tuntapTransfer = serviceProvider.GetService(); } - public void UseServer(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseServer(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { } } diff --git a/linker/plugins/tuntap/TuntapTransfer.cs b/linker/plugins/tuntap/TuntapTransfer.cs index 714e27b1..5c5fbbb3 100644 --- a/linker/plugins/tuntap/TuntapTransfer.cs +++ b/linker/plugins/tuntap/TuntapTransfer.cs @@ -21,7 +21,7 @@ namespace linker.plugins.tuntap private readonly MessengerSender messengerSender; private readonly ClientSignInState clientSignInState; private readonly ITuntapVea tuntapVea; - private readonly ConfigWrap config; + private readonly FileConfig config; private readonly TuntapProxy tuntapProxy; private readonly RunningConfig runningConfig; @@ -34,7 +34,7 @@ namespace linker.plugins.tuntap private bool starting = false; public TuntapStatus Status => tuntapVea.Running ? TuntapStatus.Running : (starting ? TuntapStatus.Starting : TuntapStatus.Normal); - public TuntapTransfer(MessengerSender messengerSender, ClientSignInState clientSignInState, ITuntapVea tuntapVea, ConfigWrap config, TuntapProxy tuntapProxy, RunningConfig runningConfig) + public TuntapTransfer(MessengerSender messengerSender, ClientSignInState clientSignInState, ITuntapVea tuntapVea, FileConfig config, TuntapProxy tuntapProxy, RunningConfig runningConfig) { this.messengerSender = messengerSender; this.clientSignInState = clientSignInState; diff --git a/linker/plugins/tuntap/config/config.cs b/linker/plugins/tuntap/config/config.cs index cde70063..f8211340 100644 --- a/linker/plugins/tuntap/config/config.cs +++ b/linker/plugins/tuntap/config/config.cs @@ -20,13 +20,22 @@ namespace linker.plugins.tuntap.config } public uint IpInt { get; private set; } + /// + /// 缓冲区大小 + /// public byte BufferSize { get; set; } = 3; /// /// 局域网IP列表 /// public IPAddress[] LanIPs { get; set; } = Array.Empty(); + /// + /// 局域网掩码列表,与IP列表一一对应 + /// public int[] Masks { get; set; } = Array.Empty(); + /// + /// 是否在运行中 + /// public bool Running { get; set; } } } @@ -36,6 +45,9 @@ namespace linker.client.config { public sealed partial class RunningConfigInfo { + /// + /// 虚拟网卡配置 + /// public TuntapConfigInfo Tuntap { get; set; } = new TuntapConfigInfo(); } } \ No newline at end of file diff --git a/linker/plugins/tuntap/proxy/TuntapProxy.cs b/linker/plugins/tuntap/proxy/TuntapProxy.cs index f13195e7..bd84f942 100644 --- a/linker/plugins/tuntap/proxy/TuntapProxy.cs +++ b/linker/plugins/tuntap/proxy/TuntapProxy.cs @@ -20,7 +20,7 @@ namespace linker.plugins.tuntap.proxy private readonly TunnelTransfer tunnelTransfer; private readonly RelayTransfer relayTransfer; private readonly RunningConfig runningConfig; - private readonly ConfigWrap config; + private readonly FileConfig config; private IPEndPoint proxyEP; public override IPAddress UdpBindAdress { get; set; } @@ -30,7 +30,7 @@ namespace linker.plugins.tuntap.proxy private readonly ConcurrentDictionary connections = new ConcurrentDictionary(); private readonly ConcurrentDictionary dicLocks = new ConcurrentDictionary(); - public TuntapProxy(TunnelTransfer tunnelTransfer, RelayTransfer relayTransfer, RunningConfig runningConfig, ConfigWrap config) + public TuntapProxy(TunnelTransfer tunnelTransfer, RelayTransfer relayTransfer, RunningConfig runningConfig, FileConfig config) { this.tunnelTransfer = tunnelTransfer; this.relayTransfer = relayTransfer; @@ -60,6 +60,10 @@ namespace linker.plugins.tuntap.proxy { if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Warning($"tuntap add connection {connection.GetHashCode()} {connection.ToJson()}"); + if(connections.TryGetValue(connection.RemoteMachineId,out ITunnelConnection connectionOld)) + { + connectionOld?.Dispose(); + } connections.AddOrUpdate(connection.RemoteMachineId, connection, (a, b) => connection); BindConnectionReceive(connection); } @@ -245,7 +249,6 @@ namespace linker.plugins.tuntap.proxy try { - if (connections.TryGetValue(machineId, out connection) && connection.Connected) { return connection; @@ -262,10 +265,10 @@ namespace linker.plugins.tuntap.proxy { if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"tuntap relay to {machineId}"); - tunnelTransfer.StartBackground(machineId, "tuntap"); connection = await relayTransfer.ConnectAsync(config.Data.Client.Id, machineId, "tuntap").ConfigureAwait(false); if (connection != null) { + tunnelTransfer.StartBackground(machineId, "tuntap"); if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG) LoggerHelper.Instance.Debug($"tuntap relay success,{connection.ToString()}"); } } diff --git a/linker/plugins/updater/UpdaterStartup.cs b/linker/plugins/updater/UpdaterStartup.cs index 83638ebe..3da7e03c 100644 --- a/linker/plugins/updater/UpdaterStartup.cs +++ b/linker/plugins/updater/UpdaterStartup.cs @@ -19,15 +19,15 @@ namespace linker.plugins.updater public StartupLoadType LoadType => StartupLoadType.Normal; - public void AddClient(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddClient(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { } - public void AddServer(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { } - public void UseClient(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseClient(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { foreach (var item in Process.GetProcessesByName("linker.updater")) { @@ -36,7 +36,7 @@ namespace linker.plugins.updater //CommandHelper.Execute(); } - public void UseServer(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseServer(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { } } diff --git a/linker/serializes/SerializeStartup.cs b/linker/serializes/SerializeStartup.cs index 40c22058..e79c227d 100644 --- a/linker/serializes/SerializeStartup.cs +++ b/linker/serializes/SerializeStartup.cs @@ -17,24 +17,24 @@ namespace linker.serializes public string[] Dependent => Array.Empty(); public StartupLoadType LoadType => StartupLoadType.Normal; - public void AddClient(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddClient(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { MemoryPackFormatterProvider.Register(new IPEndPointFormatter()); MemoryPackFormatterProvider.Register(new IPAddressFormatter()); } - public void AddServer(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { MemoryPackFormatterProvider.Register(new IPEndPointFormatter()); MemoryPackFormatterProvider.Register(new IPAddressFormatter()); } - public void UseClient(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseClient(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { } - public void UseServer(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseServer(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { } } diff --git a/linker/server/IConnection.cs b/linker/server/IConnection.cs index f380874b..97447b0f 100644 --- a/linker/server/IConnection.cs +++ b/linker/server/IConnection.cs @@ -16,7 +16,7 @@ namespace linker.server public interface IConnection { /// - /// 连接id + /// 连接id,存的应该是客户端id /// public string Id { get; set; } /// diff --git a/linker/server/ServerStartup.cs b/linker/server/ServerStartup.cs index 6e037f89..5f7e1b57 100644 --- a/linker/server/ServerStartup.cs +++ b/linker/server/ServerStartup.cs @@ -17,14 +17,14 @@ namespace linker.server public string[] Dependent => new string[] { "serialize", "firewall", "signin" }; public StartupLoadType LoadType => StartupLoadType.Normal; - public void AddClient(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddClient(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); } - public void AddServer(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); @@ -34,7 +34,7 @@ namespace linker.server private bool loaded = false; - public void UseClient(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseClient(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { if (loaded == false) { @@ -44,7 +44,7 @@ namespace linker.server } } - public void UseServer(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseServer(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { if (loaded == false) { @@ -59,7 +59,10 @@ namespace linker.server //服务 TcpServer tcpServer = serviceProvider.GetService(); tcpServer.Init(config.Data.Server.Certificate, config.Data.Server.Password); - tcpServer.Start(config.Data.Server.ServicePort); + if(config.Data.Server.ServicePort > 0) + { + tcpServer.Start(config.Data.Server.ServicePort); + } } catch (Exception ex) { diff --git a/linker/startup/IStartup.cs b/linker/startup/IStartup.cs index cc1353bf..3617670c 100644 --- a/linker/startup/IStartup.cs +++ b/linker/startup/IStartup.cs @@ -27,11 +27,11 @@ namespace linker.startup /// public StartupLoadType LoadType { get; } - public void AddClient(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies); - public void UseClient(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies); + public void AddClient(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies); + public void UseClient(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies); - public void AddServer(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies); - public void UseServer(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies); + public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies); + public void UseServer(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies); } public enum StartupLoadType diff --git a/linker/startup/StartupTransfer.cs b/linker/startup/StartupTransfer.cs index f6002c90..fa48fda5 100644 --- a/linker/startup/StartupTransfer.cs +++ b/linker/startup/StartupTransfer.cs @@ -13,7 +13,7 @@ namespace linker.startup /// /// /// - public static void Init(ConfigWrap config, Assembly[] assemblies) + public static void Init(FileConfig config, Assembly[] assemblies) { var types = ReflectionHelper.GetInterfaceSchieves(assemblies, typeof(IStartup)); List temps = types.Select(c => Activator.CreateInstance(c) as IStartup).OrderByDescending(c => c.Level).ToList(); @@ -41,7 +41,7 @@ namespace linker.startup /// /// /// - private static void LoadPlugins(ConfigWrap config, List temps) + private static void LoadPlugins(FileConfig config, List temps) { //只要哪些 if (config.Data.Common.IncludePlugins.Length > 0) @@ -84,7 +84,7 @@ namespace linker.startup /// /// /// - public static void Add(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public static void Add(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { foreach (var startup in startups) { @@ -101,7 +101,7 @@ namespace linker.startup /// /// /// - public static void Use(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public static void Use(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { foreach (var startup in startups) { diff --git a/linker/store/StoreStartup.cs b/linker/store/StoreStartup.cs index 00a99052..a8451391 100644 --- a/linker/store/StoreStartup.cs +++ b/linker/store/StoreStartup.cs @@ -17,17 +17,17 @@ namespace linker.store public StartupLoadType LoadType => StartupLoadType.Normal; bool loaded = false; - public void AddClient(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddClient(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { Add(serviceCollection, config, assemblies); } - public void AddServer(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + public void AddServer(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { Add(serviceCollection, config, assemblies); } - private void Add(ServiceCollection serviceCollection, ConfigWrap config, Assembly[] assemblies) + private void Add(ServiceCollection serviceCollection, FileConfig config, Assembly[] assemblies) { if (loaded == false) { @@ -36,11 +36,11 @@ namespace linker.store } } - public void UseClient(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseClient(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { } - public void UseServer(ServiceProvider serviceProvider, ConfigWrap config, Assembly[] assemblies) + public void UseServer(ServiceProvider serviceProvider, FileConfig config, Assembly[] assemblies) { } }