diff --git a/DnsServerCore/Dns/Applications/DnsApplicationManager.cs b/DnsServerCore/Dns/Applications/DnsApplicationManager.cs index 9a41409c..1d8b784c 100644 --- a/DnsServerCore/Dns/Applications/DnsApplicationManager.cs +++ b/DnsServerCore/Dns/Applications/DnsApplicationManager.cs @@ -17,6 +17,7 @@ along with this program. If not, see . */ +using DnsApplicationCommon; using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -37,6 +38,10 @@ namespace DnsServerCore.Dns.Applications readonly ConcurrentDictionary _applications = new ConcurrentDictionary(); + IReadOnlyList _dnsRequestControllers = Array.Empty(); + IReadOnlyList _dnsAuthoritativeRequestHandlers = Array.Empty(); + IReadOnlyList _dnsLoggers = Array.Empty(); + #endregion #region constructor @@ -80,7 +85,7 @@ namespace DnsServerCore.Dns.Applications #region private - private async Task LoadApplicationAsync(string applicationFolder) + private async Task LoadApplicationAsync(string applicationFolder, bool refreshAppObjectList) { string appName = Path.GetFileName(applicationFolder); @@ -92,6 +97,9 @@ namespace DnsServerCore.Dns.Applications if (!_applications.TryAdd(application.AppName, application)) throw new DnsServerException("DNS application already exists: " + application.AppName); + + if (refreshAppObjectList) + RefreshAppObjectLists(); } catch { @@ -100,14 +108,38 @@ namespace DnsServerCore.Dns.Applications } } - public void UnloadApplication(string appName) + private void UnloadApplication(string appName) { if (!_applications.TryRemove(appName, out DnsApplication existingApp)) throw new DnsServerException("DNS application does not exists: " + appName); + RefreshAppObjectLists(); + existingApp.Dispose(); } + private void RefreshAppObjectLists() + { + List dnsRequestControllers = new List(1); + List dnsAuthoritativeRequestHandlers = new List(1); + List dnsLoggers = new List(1); + + foreach (KeyValuePair application in _applications) + { + foreach (KeyValuePair controller in application.Value.DnsRequestControllers) + dnsRequestControllers.Add(controller.Value); + + foreach (KeyValuePair handler in application.Value.DnsAuthoritativeRequestHandlers) + dnsAuthoritativeRequestHandlers.Add(handler.Value); + + foreach (KeyValuePair logger in application.Value.DnsLoggers) + dnsLoggers.Add(logger.Value); + } + + _dnsRequestControllers = dnsRequestControllers; + _dnsAuthoritativeRequestHandlers = dnsAuthoritativeRequestHandlers; + _dnsLoggers = dnsLoggers; + } #endregion @@ -130,6 +162,9 @@ namespace DnsServerCore.Dns.Applications } _applications.Clear(); + _dnsRequestControllers = Array.Empty(); + _dnsAuthoritativeRequestHandlers = Array.Empty(); + _dnsLoggers = Array.Empty(); } public void LoadAllApplications() @@ -142,7 +177,8 @@ namespace DnsServerCore.Dns.Applications { try { - await LoadApplicationAsync(applicationFolder); + await LoadApplicationAsync(applicationFolder, false); + RefreshAppObjectLists(); LogManager log = _dnsServer.LogManager; if (log != null) @@ -174,7 +210,7 @@ namespace DnsServerCore.Dns.Applications { appZip.ExtractToDirectory(applicationFolder, true); - await LoadApplicationAsync(applicationFolder); + await LoadApplicationAsync(applicationFolder, true); } catch { @@ -214,14 +250,18 @@ namespace DnsServerCore.Dns.Applications entry.ExtractToFile(filePath, true); } - await LoadApplicationAsync(applicationFolder); + await LoadApplicationAsync(applicationFolder, true); } } public void UninstallApplication(string appName) { if (_applications.TryRemove(appName, out DnsApplication app)) + { + RefreshAppObjectLists(); + app.Dispose(); + } if (Directory.Exists(app.DnsServer.ApplicationFolder)) Directory.Delete(app.DnsServer.ApplicationFolder, true); @@ -234,6 +274,15 @@ namespace DnsServerCore.Dns.Applications public IReadOnlyDictionary Applications { get { return _applications; } } + public IReadOnlyList DnsRequestControllers + { get { return _dnsRequestControllers; } } + + public IReadOnlyList DnsAuthoritativeRequestHandlers + { get { return _dnsAuthoritativeRequestHandlers; } } + + public IReadOnlyList DnsLoggers + { get { return _dnsLoggers; } } + #endregion } }