From e8eba76ea788202ec56c39217fa016578ab68d91 Mon Sep 17 00:00:00 2001 From: Shreyas Zare Date: Fri, 14 May 2021 18:59:02 +0530 Subject: [PATCH] GeoDistanceApp: updated code to load max mind database only once. --- Apps/GeoDistanceApp/Address.cs | 23 ++------ Apps/GeoDistanceApp/CNAME.cs | 23 ++------ Apps/GeoDistanceApp/MaxMind.cs | 99 ++++++++++++++++++++++++++++++++++ 3 files changed, 109 insertions(+), 36 deletions(-) create mode 100644 Apps/GeoDistanceApp/MaxMind.cs diff --git a/Apps/GeoDistanceApp/Address.cs b/Apps/GeoDistanceApp/Address.cs index 8425ab8e..b24b0d1c 100644 --- a/Apps/GeoDistanceApp/Address.cs +++ b/Apps/GeoDistanceApp/Address.cs @@ -18,13 +18,11 @@ along with this program. If not, see . */ using DnsApplicationCommon; -using MaxMind.GeoIP2; using MaxMind.GeoIP2.Model; using MaxMind.GeoIP2.Responses; using Newtonsoft.Json; using System; using System.Collections.Generic; -using System.IO; using System.Net; using System.Net.Sockets; using System.Threading.Tasks; @@ -38,7 +36,7 @@ namespace GeoDistance { #region variables - DatabaseReader _mmCityReader; + MaxMind _maxMind; #endregion @@ -53,8 +51,8 @@ namespace GeoDistance if (disposing) { - if (_mmCityReader != null) - _mmCityReader.Dispose(); + if (_maxMind is not null) + _maxMind.Dispose(); } _disposed = true; @@ -86,18 +84,7 @@ namespace GeoDistance public Task InitializeAsync(IDnsServer dnsServer, string config) { - if (_mmCityReader == null) - { - string mmFile = Path.Combine(dnsServer.ApplicationFolder, "GeoIP2-City.mmdb"); - - if (!File.Exists(mmFile)) - mmFile = Path.Combine(dnsServer.ApplicationFolder, "GeoLite2-City.mmdb"); - - if (!File.Exists(mmFile)) - throw new FileNotFoundException("MaxMind City file is missing!"); - - _mmCityReader = new DatabaseReader(mmFile); - } + _maxMind = MaxMind.Create(dnsServer); return Task.CompletedTask; } @@ -111,7 +98,7 @@ namespace GeoDistance case DnsResourceRecordType.AAAA: Location location = null; - if (_mmCityReader.TryCity(remoteEP.Address, out CityResponse response)) + if (_maxMind.DatabaseReader.TryCity(remoteEP.Address, out CityResponse response)) location = response.Location; dynamic jsonAppRecordData = JsonConvert.DeserializeObject(appRecordData); diff --git a/Apps/GeoDistanceApp/CNAME.cs b/Apps/GeoDistanceApp/CNAME.cs index 778a8952..dd55c0fa 100644 --- a/Apps/GeoDistanceApp/CNAME.cs +++ b/Apps/GeoDistanceApp/CNAME.cs @@ -18,13 +18,11 @@ along with this program. If not, see . */ using DnsApplicationCommon; -using MaxMind.GeoIP2; using MaxMind.GeoIP2.Model; 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; @@ -36,7 +34,7 @@ namespace GeoDistance { #region variables - DatabaseReader _mmCityReader; + MaxMind _maxMind; #endregion @@ -51,8 +49,8 @@ namespace GeoDistance if (disposing) { - if (_mmCityReader != null) - _mmCityReader.Dispose(); + if (_maxMind is not null) + _maxMind.Dispose(); } _disposed = true; @@ -84,18 +82,7 @@ namespace GeoDistance public Task InitializeAsync(IDnsServer dnsServer, string config) { - if (_mmCityReader == null) - { - string mmFile = Path.Combine(dnsServer.ApplicationFolder, "GeoIP2-City.mmdb"); - - if (!File.Exists(mmFile)) - mmFile = Path.Combine(dnsServer.ApplicationFolder, "GeoLite2-City.mmdb"); - - if (!File.Exists(mmFile)) - throw new FileNotFoundException("MaxMind City file is missing!"); - - _mmCityReader = new DatabaseReader(mmFile); - } + _maxMind = MaxMind.Create(dnsServer); return Task.CompletedTask; } @@ -104,7 +91,7 @@ namespace GeoDistance { Location location = null; - if (_mmCityReader.TryCity(remoteEP.Address, out CityResponse response)) + if (_maxMind.DatabaseReader.TryCity(remoteEP.Address, out CityResponse response)) location = response.Location; dynamic jsonAppRecordData = JsonConvert.DeserializeObject(appRecordData); diff --git a/Apps/GeoDistanceApp/MaxMind.cs b/Apps/GeoDistanceApp/MaxMind.cs new file mode 100644 index 00000000..fb86a45d --- /dev/null +++ b/Apps/GeoDistanceApp/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 GeoDistance +{ + class MaxMind : IDisposable + { + #region variables + + static MaxMind _maxMind; + + readonly DatabaseReader _mmCityReader; + + #endregion + + #region constructor + + private MaxMind(IDnsServer dnsServer) + { + string mmFile = Path.Combine(dnsServer.ApplicationFolder, "GeoIP2-City.mmdb"); + + if (!File.Exists(mmFile)) + mmFile = Path.Combine(dnsServer.ApplicationFolder, "GeoLite2-City.mmdb"); + + if (!File.Exists(mmFile)) + throw new FileNotFoundException("MaxMind City file is missing!"); + + _mmCityReader = new DatabaseReader(mmFile); + } + + #endregion + + #region IDisposable + + bool _disposed; + + protected virtual void Dispose(bool disposing) + { + if (_disposed) + return; + + if (disposing) + { + if (_mmCityReader is not null) + _mmCityReader.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 _mmCityReader; } } + + #endregion + } +}