From db59368ca98372fa6cf8492028ae51797df44bd6 Mon Sep 17 00:00:00 2001 From: Shreyas Zare Date: Fri, 14 May 2021 18:57:49 +0530 Subject: [PATCH] GeoCountryApp: updated code to load max mind database only once. --- Apps/GeoCountryApp/Address.cs | 23 ++------ Apps/GeoCountryApp/CNAME.cs | 23 ++------ Apps/GeoCountryApp/MaxMind.cs | 99 +++++++++++++++++++++++++++++++++++ 3 files changed, 109 insertions(+), 36 deletions(-) create mode 100644 Apps/GeoCountryApp/MaxMind.cs diff --git a/Apps/GeoCountryApp/Address.cs b/Apps/GeoCountryApp/Address.cs index 32b08ee3..f1e35286 100644 --- a/Apps/GeoCountryApp/Address.cs +++ b/Apps/GeoCountryApp/Address.cs @@ -18,11 +18,9 @@ along with this program. If not, see . */ using DnsApplicationCommon; -using MaxMind.GeoIP2; using MaxMind.GeoIP2.Responses; using Newtonsoft.Json; using System.Collections.Generic; -using System.IO; using System.Net; using System.Net.Sockets; using System.Threading.Tasks; @@ -36,7 +34,7 @@ namespace GeoCountry { #region variables - DatabaseReader _mmCountryReader; + MaxMind _maxMind; #endregion @@ -51,8 +49,8 @@ namespace GeoCountry if (disposing) { - if (_mmCountryReader != null) - _mmCountryReader.Dispose(); + if (_maxMind is not null) + _maxMind.Dispose(); } _disposed = true; @@ -69,18 +67,7 @@ namespace GeoCountry public Task InitializeAsync(IDnsServer dnsServer, string config) { - if (_mmCountryReader == null) - { - string mmFile = Path.Combine(dnsServer.ApplicationFolder, "GeoIP2-Country.mmdb"); - - if (!File.Exists(mmFile)) - mmFile = Path.Combine(dnsServer.ApplicationFolder, "GeoLite2-Country.mmdb"); - - if (!File.Exists(mmFile)) - throw new FileNotFoundException("MaxMind Country file is missing!"); - - _mmCountryReader = new DatabaseReader(mmFile); - } + _maxMind = MaxMind.Create(dnsServer); return Task.CompletedTask; } @@ -95,7 +82,7 @@ namespace GeoCountry dynamic jsonAppRecordData = JsonConvert.DeserializeObject(appRecordData); dynamic jsonCountry; - if (_mmCountryReader.TryCountry(remoteEP.Address, out CountryResponse response)) + if (_maxMind.DatabaseReader.TryCountry(remoteEP.Address, out CountryResponse response)) { jsonCountry = jsonAppRecordData[response.Country.IsoCode]; if (jsonCountry == null) diff --git a/Apps/GeoCountryApp/CNAME.cs b/Apps/GeoCountryApp/CNAME.cs index ebd7480a..3fb35aaf 100644 --- a/Apps/GeoCountryApp/CNAME.cs +++ b/Apps/GeoCountryApp/CNAME.cs @@ -18,12 +18,10 @@ along with this program. If not, see . */ using DnsApplicationCommon; -using MaxMind.GeoIP2; using MaxMind.GeoIP2.Responses; using Newtonsoft.Json; using System; using System.Collections.Generic; -using System.IO; using System.Net; using System.Threading.Tasks; using TechnitiumLibrary.Net.Dns; @@ -35,7 +33,7 @@ namespace GeoCountry { #region variables - DatabaseReader _mmCountryReader; + MaxMind _maxMind; #endregion @@ -50,8 +48,8 @@ namespace GeoCountry if (disposing) { - if (_mmCountryReader != null) - _mmCountryReader.Dispose(); + if (_maxMind is not null) + _maxMind.Dispose(); } _disposed = true; @@ -68,18 +66,7 @@ namespace GeoCountry public Task InitializeAsync(IDnsServer dnsServer, string config) { - if (_mmCountryReader == null) - { - string mmFile = Path.Combine(dnsServer.ApplicationFolder, "GeoIP2-Country.mmdb"); - - if (!File.Exists(mmFile)) - mmFile = Path.Combine(dnsServer.ApplicationFolder, "GeoLite2-Country.mmdb"); - - if (!File.Exists(mmFile)) - throw new FileNotFoundException("MaxMind Country file is missing!"); - - _mmCountryReader = new DatabaseReader(mmFile); - } + _maxMind = MaxMind.Create(dnsServer); return Task.CompletedTask; } @@ -89,7 +76,7 @@ namespace GeoCountry dynamic jsonAppRecordData = JsonConvert.DeserializeObject(appRecordData); dynamic jsonCountry; - if (_mmCountryReader.TryCountry(remoteEP.Address, out CountryResponse response)) + if (_maxMind.DatabaseReader.TryCountry(remoteEP.Address, out CountryResponse response)) { jsonCountry = jsonAppRecordData[response.Country.IsoCode]; if (jsonCountry == null) diff --git a/Apps/GeoCountryApp/MaxMind.cs b/Apps/GeoCountryApp/MaxMind.cs new file mode 100644 index 00000000..74038e7f --- /dev/null +++ b/Apps/GeoCountryApp/MaxMind.cs @@ -0,0 +1,99 @@ +/* +Technitium DNS Server +Copyright (C) 2021 Shreyas Zare (shreyas@technitium.com) + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +*/ + +using DnsApplicationCommon; +using MaxMind.GeoIP2; +using System; +using System.IO; + +namespace GeoCountry +{ + class MaxMind : IDisposable + { + #region variables + + static MaxMind _maxMind; + + readonly DatabaseReader _mmCountryReader; + + #endregion + + #region constructor + + private MaxMind(IDnsServer dnsServer) + { + string mmFile = Path.Combine(dnsServer.ApplicationFolder, "GeoIP2-Country.mmdb"); + + if (!File.Exists(mmFile)) + mmFile = Path.Combine(dnsServer.ApplicationFolder, "GeoLite2-Country.mmdb"); + + if (!File.Exists(mmFile)) + throw new FileNotFoundException("MaxMind Country file is missing!"); + + _mmCountryReader = new DatabaseReader(mmFile); + } + + #endregion + + #region IDisposable + + bool _disposed; + + protected virtual void Dispose(bool disposing) + { + if (_disposed) + return; + + if (disposing) + { + if (_mmCountryReader is not null) + _mmCountryReader.Dispose(); + } + + _disposed = true; + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + #region public + + public static MaxMind Create(IDnsServer dnsServer) + { + if (_maxMind is null) + _maxMind = new MaxMind(dnsServer); + + return _maxMind; + } + + #endregion + + #region properties + + public DatabaseReader DatabaseReader + { get { return _mmCountryReader; } } + + #endregion + } +}