mirror of
https://github.com/FastTunnel/FastTunnel.git
synced 2025-02-08 02:39:29 +08:00
使用OptionsMonitor监听配置文件
This commit is contained in:
parent
f0067a61b1
commit
e3ce510943
|
@ -3,5 +3,6 @@
|
|||
<PropertyGroup>
|
||||
<Controller_SelectedScaffolderID>ApiControllerEmptyScaffolder</Controller_SelectedScaffolderID>
|
||||
<Controller_SelectedScaffolderCategoryPath>root/Common/Api</Controller_SelectedScaffolderCategoryPath>
|
||||
<ActiveDebugProfile>IIS Express</ActiveDebugProfile>
|
||||
</PropertyGroup>
|
||||
</Project>
|
|
@ -6,13 +6,7 @@
|
|||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.0-preview.4.21253.7" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="6.0.0-preview.4.21253.7" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="6.0.0-preview.4.21253.7" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0-preview.4.21253.7" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0-preview.4.21253.7" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="6.0.0-preview.4.21253.7" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.0-preview.4.21253.7" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="5.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="5.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Log4Net.AspNetCore" Version="5.0.3" />
|
||||
</ItemGroup>
|
||||
|
|
|
@ -17,7 +17,7 @@ namespace FastTunnel.Client
|
|||
.ConfigureServices((hostContext, services) =>
|
||||
{
|
||||
// -------------------FastTunnel START------------------
|
||||
services.AddFastTunnelClient();
|
||||
services.AddFastTunnelClient(hostContext.Configuration.GetSection("ClientSettings"));
|
||||
// -------------------FastTunnel EDN--------------------
|
||||
})
|
||||
.ConfigureLogging((HostBuilderContext context, ILoggingBuilder logging) =>
|
||||
|
|
|
@ -14,6 +14,7 @@ using FastTunnel.Core.Handlers.Client;
|
|||
using Microsoft.Extensions.Configuration;
|
||||
using FastTunnel.Core.Server;
|
||||
using FastTunnel.Core.Sockets;
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
namespace FastTunnel.Core.Client
|
||||
{
|
||||
|
@ -35,7 +36,7 @@ namespace FastTunnel.Core.Client
|
|||
ClientHeartHandler _clientHeartHandler;
|
||||
Func<Socket> lastLogin;
|
||||
Message<LogInMassage> loginMsg;
|
||||
protected readonly IConfiguration _configuration;
|
||||
protected readonly IOptionsMonitor<DefaultClientConfig> _configuration;
|
||||
|
||||
public SuiDaoServer Server { get; protected set; }
|
||||
|
||||
|
@ -43,7 +44,7 @@ namespace FastTunnel.Core.Client
|
|||
ILogger<FastTunnelClient> logger,
|
||||
HttpRequestHandler newCustomerHandler,
|
||||
NewSSHHandler newSSHHandler, LogHandler logHandler,
|
||||
IConfiguration configuration,
|
||||
IOptionsMonitor<DefaultClientConfig> configuration,
|
||||
ClientHeartHandler clientHeartHandler)
|
||||
{
|
||||
_logger = logger;
|
||||
|
@ -130,8 +131,7 @@ namespace FastTunnel.Core.Client
|
|||
|
||||
protected virtual Socket login()
|
||||
{
|
||||
var ClientConfig = _configuration.Get<AppSettings>().ClientSettings;
|
||||
Server = ClientConfig.Server;
|
||||
Server = _configuration.CurrentValue.Server;
|
||||
|
||||
DnsSocket _client = null;
|
||||
_logger.LogInformation($"正在连接服务端 {Server.ServerAddr}:{Server.ServerPort}");
|
||||
|
@ -158,8 +158,8 @@ namespace FastTunnel.Core.Client
|
|||
MessageType = MessageType.C_LogIn,
|
||||
Content = new LogInMassage
|
||||
{
|
||||
Webs = ClientConfig.Webs,
|
||||
SSH = ClientConfig.SSH,
|
||||
Webs = _configuration.CurrentValue.Webs,
|
||||
SSH = _configuration.CurrentValue.SSH,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@ using FastTunnel.Core.Dispatchers;
|
|||
using System.Threading.Tasks;
|
||||
using System.Threading;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
namespace FastTunnel.Core.Client
|
||||
{
|
||||
|
@ -27,38 +28,28 @@ namespace FastTunnel.Core.Client
|
|||
public ConcurrentDictionary<int, SSHInfo<SSHHandlerArg>> SSHList { get; private set; }
|
||||
= new ConcurrentDictionary<int, SSHInfo<SSHHandlerArg>>();
|
||||
|
||||
public readonly IServerConfig ServerSettings;
|
||||
readonly ILogger _logger;
|
||||
readonly ClientListenerV2 clientListener;
|
||||
readonly HttpListenerV2 http_listener;
|
||||
public readonly IOptionsMonitor<DefaultServerConfig> serverOption;
|
||||
|
||||
public FastTunnelServer(ILogger<FastTunnelServer> logger, IConfiguration configuration)
|
||||
public FastTunnelServer(ILogger<FastTunnelServer> logger, IOptionsMonitor<DefaultServerConfig> serverSettings)
|
||||
{
|
||||
_logger = logger;
|
||||
ServerSettings = configuration.Get<AppSettings>().ServerSettings;
|
||||
serverOption = serverSettings;
|
||||
|
||||
clientListener = new ClientListenerV2(this, ServerSettings.BindAddr, ServerSettings.BindPort, _logger);
|
||||
http_listener = new HttpListenerV2(ServerSettings.BindAddr, ServerSettings.WebProxyPort, _logger);
|
||||
clientListener = new ClientListenerV2(this, "0.0.0.0", serverOption.CurrentValue.BindPort, _logger);
|
||||
http_listener = new HttpListenerV2("0.0.0.0", serverOption.CurrentValue.WebProxyPort, _logger);
|
||||
}
|
||||
|
||||
public void Run()
|
||||
{
|
||||
_logger.LogInformation("===== FastTunnel Server Starting =====");
|
||||
|
||||
checkSettins();
|
||||
|
||||
listenClient();
|
||||
listenHttp();
|
||||
}
|
||||
|
||||
private void checkSettins()
|
||||
{
|
||||
if (string.IsNullOrEmpty(ServerSettings.WebDomain))
|
||||
{
|
||||
throw new Exception("[WebDomain] 配置不能为空");
|
||||
}
|
||||
}
|
||||
|
||||
private void listenClient()
|
||||
{
|
||||
clientListener.Start();
|
||||
|
@ -66,7 +57,7 @@ namespace FastTunnel.Core.Client
|
|||
|
||||
private void listenHttp()
|
||||
{
|
||||
http_listener.Start(new HttpDispatcherV2(this, _logger, ServerSettings));
|
||||
http_listener.Start(new HttpDispatcherV2(this, _logger, serverOption));
|
||||
}
|
||||
|
||||
public void Stop()
|
||||
|
|
|
@ -1,15 +0,0 @@
|
|||
using FastTunnel.Core.Config;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FastTunnel.Core.Config
|
||||
{
|
||||
public class AppSettings
|
||||
{
|
||||
public DefaultServerConfig ServerSettings { get; set; }
|
||||
|
||||
public DefaultClientConfig ClientSettings { get; set; }
|
||||
}
|
||||
}
|
|
@ -7,10 +7,6 @@ namespace FastTunnel.Core.Config
|
|||
{
|
||||
public class DefaultServerConfig : IServerConfig
|
||||
{
|
||||
[Required]
|
||||
public string BindAddr { get; set; }
|
||||
|
||||
[Required]
|
||||
public int BindPort { get; set; }
|
||||
|
||||
public string WebDomain { get; set; }
|
||||
|
|
|
@ -6,8 +6,6 @@ namespace FastTunnel.Core.Config
|
|||
{
|
||||
public interface IServerConfig
|
||||
{
|
||||
string BindAddr { get; set; }
|
||||
|
||||
int BindPort { get; set; }
|
||||
|
||||
#region Web相关配置
|
||||
|
|
|
@ -13,19 +13,20 @@ using System.Net.Http;
|
|||
using System.IO;
|
||||
using FastTunnel.Core.Server;
|
||||
using System.Diagnostics;
|
||||
using Microsoft.Extensions.Options;
|
||||
|
||||
namespace FastTunnel.Core.Dispatchers
|
||||
{
|
||||
public class HttpDispatcherV2 : IListenerDispatcher
|
||||
{
|
||||
readonly ILogger _logger;
|
||||
readonly IServerConfig _serverSettings;
|
||||
readonly IOptionsMonitor<DefaultServerConfig> _serverOption;
|
||||
readonly FastTunnelServer _fastTunnelServer;
|
||||
|
||||
public HttpDispatcherV2(FastTunnelServer fastTunnelServer, ILogger logger, IServerConfig serverSettings)
|
||||
public HttpDispatcherV2(FastTunnelServer fastTunnelServer, ILogger logger, IOptionsMonitor<DefaultServerConfig> serverSettings)
|
||||
{
|
||||
_logger = logger;
|
||||
_serverSettings = serverSettings;
|
||||
_serverOption = serverSettings;
|
||||
_fastTunnelServer = fastTunnelServer;
|
||||
}
|
||||
|
||||
|
@ -44,9 +45,9 @@ namespace FastTunnel.Core.Dispatchers
|
|||
var endpoint = token.Socket.RemoteEndPoint as System.Net.IPEndPoint;
|
||||
_logger.LogInformation($"Receive HTTP Request {endpoint.Address}:{endpoint.Port}");
|
||||
|
||||
if (_serverSettings.WebAllowAccessIps != null)
|
||||
if (_serverOption.CurrentValue.WebAllowAccessIps != null)
|
||||
{
|
||||
if (!_serverSettings.WebAllowAccessIps.Contains(endpoint.Address.ToString()))
|
||||
if (!_serverOption.CurrentValue.WebAllowAccessIps.Contains(endpoint.Address.ToString()))
|
||||
{
|
||||
HandlerHostNotAccess(token.Socket);
|
||||
return;
|
||||
|
|
|
@ -34,16 +34,10 @@
|
|||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.0-preview.4.21253.7" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="6.0.0-preview.4.21253.7" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0-preview.4.21253.7" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="5.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="6.0.0-preview.4.21253.7" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="6.0.0-preview.4.21253.7" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="6.0.0-preview.4.21253.7" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0-preview.4.21253.7" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="6.0.0-preview.6.21352.12" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="5.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="5.0.0" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
||||
<PackageReference Include="System.Private.ServiceModel" Version="4.8.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
@ -75,12 +75,12 @@ namespace FastTunnel.Core.Handlers
|
|||
hasTunnel = true;
|
||||
foreach (var item in requet.Webs)
|
||||
{
|
||||
var hostName = $"{item.SubDomain}.{server.ServerSettings.WebDomain}".Trim();
|
||||
var hostName = $"{item.SubDomain}.{server.serverOption.CurrentValue.WebDomain}".Trim();
|
||||
var info = new WebInfo { Socket = client, WebConfig = item };
|
||||
|
||||
_logger.LogDebug($"new domain '{hostName}'");
|
||||
server.WebList.AddOrUpdate(hostName, info, (key, oldInfo) => { return info; });
|
||||
sb.Append($" HTTP | http://{hostName}{(server.ServerSettings.WebHasNginxProxy ? string.Empty : ":" + server.ServerSettings.WebProxyPort)} => {item.LocalIp}:{item.LocalPort}");
|
||||
sb.Append($" HTTP | http://{hostName}{(server.serverOption.CurrentValue.WebHasNginxProxy ? string.Empty : ":" + server.serverOption.CurrentValue.WebProxyPort)} => {item.LocalIp}:{item.LocalPort}");
|
||||
sb.Append(Environment.NewLine);
|
||||
if (item.WWW != null)
|
||||
{
|
||||
|
@ -90,7 +90,7 @@ namespace FastTunnel.Core.Handlers
|
|||
_logger.LogInformation($"WWW {www}");
|
||||
|
||||
server.WebList.AddOrUpdate(www, info, (key, oldInfo) => { return info; });
|
||||
sb.Append($" HTTP | http://{www}{(server.ServerSettings.WebHasNginxProxy ? string.Empty : ":" + server.ServerSettings.WebProxyPort)} => {item.LocalIp}:{item.LocalPort}");
|
||||
sb.Append($" HTTP | http://{www}{(server.serverOption.CurrentValue.WebHasNginxProxy ? string.Empty : ":" + server.serverOption.CurrentValue.WebProxyPort)} => {item.LocalIp}:{item.LocalPort}");
|
||||
sb.Append(Environment.NewLine);
|
||||
}
|
||||
}
|
||||
|
@ -106,13 +106,13 @@ namespace FastTunnel.Core.Handlers
|
|||
{
|
||||
try
|
||||
{
|
||||
if (item.RemotePort.Equals(server.ServerSettings.BindPort))
|
||||
if (item.RemotePort.Equals(server.serverOption.CurrentValue.BindPort))
|
||||
{
|
||||
_logger.LogError($"RemotePort can not be same with BindPort: {item.RemotePort}");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (item.RemotePort.Equals(server.ServerSettings.WebProxyPort))
|
||||
if (item.RemotePort.Equals(server.serverOption.CurrentValue.WebProxyPort))
|
||||
{
|
||||
_logger.LogError($"RemotePort can not be same with ProxyPort_HTTP: {item.RemotePort}");
|
||||
continue;
|
||||
|
@ -134,7 +134,7 @@ namespace FastTunnel.Core.Handlers
|
|||
server.SSHList.TryAdd(item.RemotePort, new SSHInfo<SSHHandlerArg> { Listener = ls, Socket = client, SSHConfig = item });
|
||||
_logger.LogDebug($"SSH proxy success: {item.RemotePort} => {item.LocalIp}:{item.LocalPort}");
|
||||
|
||||
sb.Append($" TCP | {server.ServerSettings.WebDomain}:{item.RemotePort} => {item.LocalIp}:{item.LocalPort}");
|
||||
sb.Append($" TCP | {server.serverOption.CurrentValue.WebDomain}:{item.RemotePort} => {item.LocalIp}:{item.LocalPort}");
|
||||
sb.Append(Environment.NewLine);
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
|
|
@ -70,32 +70,33 @@ namespace FastTunnel.Core.Listener
|
|||
return false;
|
||||
}
|
||||
|
||||
IClientMessageHandler handler = null;
|
||||
switch (msg.MessageType)
|
||||
{
|
||||
case MessageType.C_LogIn: // 登录
|
||||
handler = _loginHandler;
|
||||
break;
|
||||
case MessageType.Heart: // 心跳
|
||||
handler = _heartHandler;
|
||||
break;
|
||||
case MessageType.C_SwapMsg: // 交换数据
|
||||
handler = _swapMsgHandler;
|
||||
break;
|
||||
default:
|
||||
throw new Exception($"未知的通讯指令 {msg.MessageType}");
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
IClientMessageHandler handler = null;
|
||||
switch (msg.MessageType)
|
||||
{
|
||||
case MessageType.C_LogIn: // 登录
|
||||
handler = _loginHandler;
|
||||
break;
|
||||
case MessageType.Heart: // 心跳
|
||||
handler = _heartHandler;
|
||||
break;
|
||||
case MessageType.C_SwapMsg: // 交换数据
|
||||
handler = _swapMsgHandler;
|
||||
break;
|
||||
default:
|
||||
throw new Exception($"未知的通讯指令 {msg.MessageType}");
|
||||
}
|
||||
|
||||
handler.HandlerMsg(this._fastTunnelServer, token.Socket, msg);
|
||||
return handler.NeedRecive;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, $"处理客户端消息失败:msg={msg.ToJson()}");
|
||||
_logger.LogError(ex, $"处理客户端消息失败:msg={msg?.ToJson()}");
|
||||
token.Socket.Close();
|
||||
return false;
|
||||
}
|
||||
|
||||
return handler.NeedRecive;
|
||||
}
|
||||
|
||||
public void Stop()
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
using FastTunnel.Core.Client;
|
||||
using FastTunnel.Core.Config;
|
||||
using FastTunnel.Core.Filters;
|
||||
using FastTunnel.Core.Handlers.Client;
|
||||
using FastTunnel.Core.Services;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
namespace FastTunnel.Core.Extensions
|
||||
|
@ -12,8 +14,10 @@ namespace FastTunnel.Core.Extensions
|
|||
/// 添加服务端后台进程
|
||||
/// </summary>
|
||||
/// <param name="services"></param>
|
||||
public static void AddFastTunnelServer(this IServiceCollection services)
|
||||
public static void AddFastTunnelServer(this IServiceCollection services, IConfigurationSection configurationSection)
|
||||
{
|
||||
services.Configure<DefaultServerConfig>(configurationSection);
|
||||
|
||||
services.AddSingleton<IAuthenticationFilter, DefaultAuthenticationFilter>();
|
||||
services.AddSingleton<FastTunnelServer, FastTunnelServer>();
|
||||
|
||||
|
@ -24,8 +28,10 @@ namespace FastTunnel.Core.Extensions
|
|||
/// 添加客户端后台进程
|
||||
/// </summary>
|
||||
/// <param name="services"></param>
|
||||
public static void AddFastTunnelClient(this IServiceCollection services)
|
||||
public static void AddFastTunnelClient(this IServiceCollection services, IConfigurationSection configurationSection)
|
||||
{
|
||||
services.Configure<DefaultClientConfig>(configurationSection);
|
||||
|
||||
services.AddSingleton<FastTunnelClient>()
|
||||
.AddSingleton<ClientHeartHandler>()
|
||||
.AddSingleton<LogHandler>()
|
||||
|
|
|
@ -31,7 +31,7 @@ namespace FastTunnel.Server
|
|||
.ConfigureServices((hostContext, services) =>
|
||||
{
|
||||
// -------------------FastTunnel START------------------
|
||||
services.AddFastTunnelServer();
|
||||
services.AddFastTunnelServer(hostContext.Configuration.GetSection("ServerSettings"));
|
||||
// -------------------FastTunnel END--------------------
|
||||
})
|
||||
.ConfigureWebHostDefaults(webBuilder =>
|
||||
|
|
|
@ -9,8 +9,6 @@
|
|||
},
|
||||
"AllowedHosts": "*",
|
||||
"ServerSettings": {
|
||||
// 潼泭華硊
|
||||
"BindAddr": "0.0.0.0",
|
||||
// ¼àÌý¶Ë¿Ú
|
||||
"BindPort": 1271,
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user