From fccd8dd5fbefc69d5362bfe3d769a4a5ca080dd4 Mon Sep 17 00:00:00 2001 From: Shreyas Zare Date: Sat, 26 Aug 2023 12:34:52 +0530 Subject: [PATCH] DnsWebService: updated web service code to revert listening to old end point if new endpoint fails to bind. --- DnsServerCore/DnsWebService.cs | 70 ++++++++++++++++++++++++---------- 1 file changed, 49 insertions(+), 21 deletions(-) diff --git a/DnsServerCore/DnsWebService.cs b/DnsServerCore/DnsWebService.cs index de3a459b..0ea005b5 100644 --- a/DnsServerCore/DnsWebService.cs +++ b/DnsServerCore/DnsWebService.cs @@ -222,35 +222,63 @@ namespace DnsServerCore #region web service - internal async Task TryStartWebServiceAsync() + internal async Task TryStartWebServiceAsync(IReadOnlyList oldWebServiceLocalAddresses = null, int oldWebServiceHttpPort = 0, int oldWebServiceTlsPort = 0) { try { _webServiceLocalAddresses = DnsServer.GetValidKestralLocalAddresses(_webServiceLocalAddresses); - await StartWebServiceAsync(false); + + await StartWebServiceAsync(_webServiceLocalAddresses, _webServiceHttpPort, _webServiceTlsPort, false); + return; } catch (Exception ex) { _log.Write("Web Service failed to start: " + ex.ToString()); - _log.Write("Attempting to start Web Service on ANY (0.0.0.0) fallback address..."); + } + + if (oldWebServiceLocalAddresses is not null) + { + _log.Write("Attempting to revert Web Service end point changes ..."); try { - _webServiceLocalAddresses = new IPAddress[] { IPAddress.Any }; - await StartWebServiceAsync(false); + _webServiceLocalAddresses = DnsServer.GetValidKestralLocalAddresses(oldWebServiceLocalAddresses); + _webServiceHttpPort = oldWebServiceHttpPort; + _webServiceTlsPort = oldWebServiceTlsPort; + + await StartWebServiceAsync(_webServiceLocalAddresses, _webServiceHttpPort, _webServiceTlsPort, false); + + SaveConfigFile(); //save reverted changes + return; } catch (Exception ex2) { _log.Write("Web Service failed to start: " + ex2.ToString()); - _log.Write("Attempting to start Web Service on loopback (127.0.0.1) fallback address..."); - - _webServiceLocalAddresses = new IPAddress[] { IPAddress.Loopback }; - await StartWebServiceAsync(true); } } + + _log.Write("Attempting to start Web Service on ANY (0.0.0.0) fallback address..."); + + try + { + _webServiceLocalAddresses = new IPAddress[] { IPAddress.Any }; + + await StartWebServiceAsync(_webServiceLocalAddresses, _webServiceHttpPort, _webServiceTlsPort, false); + return; + } + catch (Exception ex3) + { + _log.Write("Web Service failed to start: " + ex3.ToString()); + } + + _log.Write("Attempting to start Web Service on loopback (127.0.0.1) fallback address..."); + + _webServiceLocalAddresses = new IPAddress[] { IPAddress.Loopback }; + + await StartWebServiceAsync(_webServiceLocalAddresses, _webServiceHttpPort, _webServiceTlsPort, true); } - private async Task StartWebServiceAsync(bool safeMode) + private async Task StartWebServiceAsync(IReadOnlyList webServiceLocalAddresses, int webServiceHttpPort, int webServiceTlsPort, bool safeMode) { WebApplicationBuilder builder = WebApplication.CreateBuilder(); @@ -269,15 +297,15 @@ namespace DnsServerCore builder.WebHost.ConfigureKestrel(delegate (WebHostBuilderContext context, KestrelServerOptions serverOptions) { //http - foreach (IPAddress webServiceLocalAddress in _webServiceLocalAddresses) - serverOptions.Listen(webServiceLocalAddress, _webServiceHttpPort); + foreach (IPAddress webServiceLocalAddress in webServiceLocalAddresses) + serverOptions.Listen(webServiceLocalAddress, webServiceHttpPort); //https if (!safeMode && _webServiceEnableTls && (_webServiceCertificateCollection is not null)) { - foreach (IPAddress webServiceLocalAddress in _webServiceLocalAddresses) + foreach (IPAddress webServiceLocalAddress in webServiceLocalAddresses) { - serverOptions.Listen(webServiceLocalAddress, _webServiceTlsPort, delegate (ListenOptions listenOptions) + serverOptions.Listen(webServiceLocalAddress, webServiceTlsPort, delegate (ListenOptions listenOptions) { listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3; listenOptions.UseHttps(delegate (SslStream stream, SslClientHelloInfo clientHelloInfo, object state, CancellationToken cancellationToken) @@ -321,24 +349,24 @@ namespace DnsServerCore { await _webService.StartAsync(); - foreach (IPAddress webServiceLocalAddress in _webServiceLocalAddresses) + foreach (IPAddress webServiceLocalAddress in webServiceLocalAddresses) { - _log?.Write(new IPEndPoint(webServiceLocalAddress, _webServiceHttpPort), "Http", "Web Service was bound successfully."); + _log?.Write(new IPEndPoint(webServiceLocalAddress, webServiceHttpPort), "Http", "Web Service was bound successfully."); if (!safeMode && _webServiceEnableTls && (_webServiceCertificateCollection is not null)) - _log?.Write(new IPEndPoint(webServiceLocalAddress, _webServiceHttpPort), "Https", "Web Service was bound successfully."); + _log?.Write(new IPEndPoint(webServiceLocalAddress, webServiceTlsPort), "Https", "Web Service was bound successfully."); } } catch { await StopWebServiceAsync(); - foreach (IPAddress webServiceLocalAddress in _webServiceLocalAddresses) + foreach (IPAddress webServiceLocalAddress in webServiceLocalAddresses) { - _log?.Write(new IPEndPoint(webServiceLocalAddress, _webServiceHttpPort), "Http", "Web Service failed to bind."); + _log?.Write(new IPEndPoint(webServiceLocalAddress, webServiceHttpPort), "Http", "Web Service failed to bind."); if (!safeMode && _webServiceEnableTls && (_webServiceCertificateCollection is not null)) - _log?.Write(new IPEndPoint(webServiceLocalAddress, _webServiceHttpPort), "Https", "Web Service failed to bind."); + _log?.Write(new IPEndPoint(webServiceLocalAddress, webServiceTlsPort), "Https", "Web Service failed to bind."); } throw; @@ -2411,7 +2439,7 @@ namespace DnsServerCore } catch (Exception ex) { - _log.Write(ex); + _log.Write("Failed to fully load DNS Cache from disk\r\n" + ex.ToString()); } }); }