From 946aa4fb978c4cc4c10f2d62cd52e4b186ed6dc0 Mon Sep 17 00:00:00 2001 From: Shreyas Zare Date: Sat, 11 Sep 2021 13:10:03 +0530 Subject: [PATCH] DnsApplication: implemented new dns app interfaces. --- .../Dns/Applications/DnsApplication.cs | 118 +++++++++++++++--- 1 file changed, 101 insertions(+), 17 deletions(-) diff --git a/DnsServerCore/Dns/Applications/DnsApplication.cs b/DnsServerCore/Dns/Applications/DnsApplication.cs index 7fee8ae3..e186aa27 100644 --- a/DnsServerCore/Dns/Applications/DnsApplication.cs +++ b/DnsServerCore/Dns/Applications/DnsApplication.cs @@ -33,10 +33,13 @@ namespace DnsServerCore.Dns.Applications readonly IDnsServer _dnsServer; readonly string _appName; - readonly DnsApplicationAssemblyLoadContext _appContext = new DnsApplicationAssemblyLoadContext(); + readonly DnsApplicationAssemblyLoadContext _appContext; readonly Version _version; - readonly Dictionary _dnsRequestHandlers; + readonly IReadOnlyDictionary _dnsAppRecordRequestHandlers; + readonly IReadOnlyDictionary _dnsRequestControllers; + readonly IReadOnlyDictionary _dnsAuthoritativeRequestHandlers; + readonly IReadOnlyDictionary _dnsLoggers; #endregion @@ -47,9 +50,20 @@ namespace DnsServerCore.Dns.Applications _dnsServer = dnsServer; _appName = appName; + _appContext = new DnsApplicationAssemblyLoadContext(_dnsServer.ApplicationFolder); + //load DLLs and handlers - Dictionary dnsRequestHandlers = new Dictionary(); - Type dnsRequestHandlerInterface = typeof(IDnsApplicationRequestHandler); + Dictionary dnsAppRecordRequestHandlers = new Dictionary(2); + Type dnsAppRecordRequestHandlerInterface = typeof(IDnsAppRecordRequestHandler); + + Dictionary dnsRequestControllers = new Dictionary(1); + Type dnsRequestControllerInterface = typeof(IDnsRequestController); + + Dictionary dnsAuthoritativeRequestHandlers = new Dictionary(1); + Type dnsRequestHandlersInterface = typeof(IDnsAuthoritativeRequestHandler); + + Dictionary dnsLoggers = new Dictionary(1); + Type dnsLoggerInterface = typeof(IDnsLogger); Assembly[] loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies(); @@ -115,22 +129,49 @@ namespace DnsServerCore.Dns.Applications { foreach (Type interfaceType in classType.GetInterfaces()) { - if (interfaceType == dnsRequestHandlerInterface) + if (interfaceType == dnsAppRecordRequestHandlerInterface) { - IDnsApplicationRequestHandler handler = Activator.CreateInstance(classType) as IDnsApplicationRequestHandler; - dnsRequestHandlers.TryAdd(classType.FullName, handler); + IDnsAppRecordRequestHandler handler = Activator.CreateInstance(classType) as IDnsAppRecordRequestHandler; + dnsAppRecordRequestHandlers.TryAdd(classType.FullName, handler); - if (_version == null) + if (_version is null) + _version = assembly.GetName().Version; + } + else if (interfaceType == dnsRequestControllerInterface) + { + IDnsRequestController controller = Activator.CreateInstance(classType) as IDnsRequestController; + dnsRequestControllers.TryAdd(classType.FullName, controller); + + if (_version is null) + _version = assembly.GetName().Version; + } + else if (interfaceType == dnsRequestHandlersInterface) + { + IDnsAuthoritativeRequestHandler handler = Activator.CreateInstance(classType) as IDnsAuthoritativeRequestHandler; + dnsAuthoritativeRequestHandlers.TryAdd(classType.FullName, handler); + + if (_version is null) + _version = assembly.GetName().Version; + } + else if (interfaceType == dnsLoggerInterface) + { + IDnsLogger logger = Activator.CreateInstance(classType) as IDnsLogger; + dnsLoggers.TryAdd(classType.FullName, logger); + + if (_version is null) _version = assembly.GetName().Version; } } } } - if (_version == null) + if (_version is null) _version = new Version(1, 0); - _dnsRequestHandlers = dnsRequestHandlers; + _dnsAppRecordRequestHandlers = dnsAppRecordRequestHandlers; + _dnsRequestControllers = dnsRequestControllers; + _dnsAuthoritativeRequestHandlers = dnsAuthoritativeRequestHandlers; + _dnsLoggers = dnsLoggers; } #endregion @@ -146,12 +187,28 @@ namespace DnsServerCore.Dns.Applications if (disposing) { - if (_dnsRequestHandlers != null) + if (_dnsAppRecordRequestHandlers is not null) { - foreach (KeyValuePair handler in _dnsRequestHandlers) + foreach (KeyValuePair handler in _dnsAppRecordRequestHandlers) handler.Value.Dispose(); + } - _dnsRequestHandlers.Clear(); + if (_dnsRequestControllers is not null) + { + foreach (KeyValuePair controller in _dnsRequestControllers) + controller.Value.Dispose(); + } + + if (_dnsAuthoritativeRequestHandlers is not null) + { + foreach (KeyValuePair handler in _dnsAuthoritativeRequestHandlers) + handler.Value.Dispose(); + } + + if (_dnsLoggers is not null) + { + foreach (KeyValuePair logger in _dnsLoggers) + logger.Value.Dispose(); } if (_appContext != null) @@ -174,8 +231,17 @@ namespace DnsServerCore.Dns.Applications { string config = await GetConfigAsync(); - foreach (KeyValuePair handler in _dnsRequestHandlers) + foreach (KeyValuePair handler in _dnsAppRecordRequestHandlers) await handler.Value.InitializeAsync(_dnsServer, config); + + foreach (KeyValuePair controller in _dnsRequestControllers) + await controller.Value.InitializeAsync(_dnsServer, config); + + foreach (KeyValuePair handler in _dnsAuthoritativeRequestHandlers) + await handler.Value.InitializeAsync(_dnsServer, config); + + foreach (KeyValuePair logger in _dnsLoggers) + await logger.Value.InitializeAsync(_dnsServer, config); } #endregion @@ -196,9 +262,18 @@ namespace DnsServerCore.Dns.Applications { string configFile = Path.Combine(_dnsServer.ApplicationFolder, "dnsApp.config"); - foreach (KeyValuePair handler in _dnsRequestHandlers) + foreach (KeyValuePair handler in _dnsAppRecordRequestHandlers) await handler.Value.InitializeAsync(_dnsServer, config); + foreach (KeyValuePair controller in _dnsRequestControllers) + await controller.Value.InitializeAsync(_dnsServer, config); + + foreach (KeyValuePair handler in _dnsAuthoritativeRequestHandlers) + await handler.Value.InitializeAsync(_dnsServer, config); + + foreach (KeyValuePair logger in _dnsLoggers) + await logger.Value.InitializeAsync(_dnsServer, config); + if (string.IsNullOrEmpty(config)) File.Delete(configFile); else @@ -218,8 +293,17 @@ namespace DnsServerCore.Dns.Applications public Version Version { get { return _version; } } - public IReadOnlyDictionary DnsRequestHandlers - { get { return _dnsRequestHandlers; } } + public IReadOnlyDictionary DnsAppRecordRequestHandlers + { get { return _dnsAppRecordRequestHandlers; } } + + public IReadOnlyDictionary DnsRequestControllers + { get { return _dnsRequestControllers; } } + + public IReadOnlyDictionary DnsAuthoritativeRequestHandlers + { get { return _dnsAuthoritativeRequestHandlers; } } + + public IReadOnlyDictionary DnsLoggers + { get { return _dnsLoggers; } } #endregion }