aboutsummaryrefslogtreecommitdiffstats
path: root/main/gdnsd
diff options
context:
space:
mode:
Diffstat (limited to 'main/gdnsd')
-rw-r--r--main/gdnsd/APKBUILD4
-rw-r--r--main/gdnsd/geoip-autodc.patch192
2 files changed, 181 insertions, 15 deletions
diff --git a/main/gdnsd/APKBUILD b/main/gdnsd/APKBUILD
index 8cd799f4c2..cba1c3859d 100644
--- a/main/gdnsd/APKBUILD
+++ b/main/gdnsd/APKBUILD
@@ -2,7 +2,7 @@
# Maintainer: Timo Teräs <timo.teras@iki.fi>
pkgname=gdnsd
pkgver=1.6.8
-pkgrel=0
+pkgrel=1
pkgdesc="Geographic Authoritative DNS server"
url="https://github.com/blblack/gdnsd/"
arch="all"
@@ -50,7 +50,7 @@ package() {
}
md5sums="6271506577e6b4fd7bcd36a8bf434e6a gdnsd-1.6.8.tar.xz
-7955bf52d394862512ae6c000c8b6242 geoip-autodc.patch
+02eb668b6cad54552568a35985f44a09 geoip-autodc.patch
7fb697653b8295322e53492f9051e831 geoip-speedup.patch
4c8ff14e377fb8f1854b68b7bf9be282 0001-preliminary-djbdns-support.patch
00f2838e0908effaaa2f6e6a1699f25b gdnsd.initd"
diff --git a/main/gdnsd/geoip-autodc.patch b/main/gdnsd/geoip-autodc.patch
index ec88491a15..ae313ef38e 100644
--- a/main/gdnsd/geoip-autodc.patch
+++ b/main/gdnsd/geoip-autodc.patch
@@ -1,25 +1,64 @@
-From: Timo TerĂs <timo.teras@iki.fi>
+From 8f172f642d4aa3a30f5a356a4611f66227e74681 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Timo=20Ter=C3=A4s?= <timo.teras@iki.fi>
+Date: Tue, 21 Aug 2012 16:45:45 +0300
+Subject: [PATCH] plugin_geoip: allow datacenters to be omitted from
+ auto_dc_coords
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
-plugin_geoip: allow datacenters to be omitted from auto_dc_coords
-
-sometimes we might need a datacenter to be accessible only via
-overrides of map (via specific territory) or via nets (only
-specific nets). this makes those datacenters to be sorted always
-last.
+Those datacenters will be never returned automatically. They are
+available only from specific territories (map overrides) or subnets
+(net overrides).
-http://code.google.com/p/gdnsd/issues/detail?id=17
+Signed-off-by: Timo Teräs <timo.teras@iki.fi>
+---
+ plugins/meta/libgdmaps/gdmaps.c | 46 +++++++++++++++-----------
+ plugins/meta/libgdmaps/t/Makefile.am | 3 +-
+ plugins/meta/libgdmaps/t/t14_missingcoords.c | 42 +++++++++++++++++++++++
+ plugins/meta/libgdmaps/t/t14_missingcoords.cfg | 29 ++++++++++++++++
+ 4 files changed, 100 insertions(+), 20 deletions(-)
+ create mode 100644 plugins/meta/libgdmaps/t/t14_missingcoords.c
+ create mode 100644 plugins/meta/libgdmaps/t/t14_missingcoords.cfg
diff --git a/plugins/meta/libgdmaps/gdmaps.c b/plugins/meta/libgdmaps/gdmaps.c
-index b49bfa5..9d20351 100644
+index be23d9b..b367e6f 100644
--- a/plugins/meta/libgdmaps/gdmaps.c
+++ b/plugins/meta/libgdmaps/gdmaps.c
-@@ -180,13 +180,13 @@ static dcinfo_t* dcinfo_new(const vscf_data_t* dc_cfg, const vscf_data_t* dc_aut
+@@ -148,6 +148,7 @@ static dcinfo_t* dcinfo_new(const vscf_data_t* dc_cfg, const vscf_data_t* dc_aut
+ dcinfo_t* info = malloc(sizeof(dcinfo_t));
+
+ const unsigned num_dcs = vscf_array_get_len(dc_cfg);
++ unsigned num_auto = 0;
+ if(!num_dcs)
+ log_fatal("plugin_geoip: map '%s': 'datacenters' must be an array of one or more strings", map_name);
+ if(num_dcs > 254)
+@@ -164,34 +165,26 @@ static dcinfo_t* dcinfo_new(const vscf_data_t* dc_cfg, const vscf_data_t* dc_aut
+ log_fatal("plugin_geoip: map '%s': datacenter name 'auto' is illegal", map_name);
+ }
+
+- if(dc_auto_limit_cfg) {
+- unsigned long auto_limit_ul;
+- if(!vscf_is_simple(dc_auto_limit_cfg) || !vscf_simple_get_as_ulong(dc_auto_limit_cfg, &auto_limit_ul))
+- log_fatal("plugin_geoip: map '%s': auto_dc_limit must be a single unsigned integer value", map_name);
+- if(auto_limit_ul > num_dcs || !auto_limit_ul)
+- auto_limit_ul = num_dcs;
+- info->auto_limit = auto_limit_ul;
+- }
+- else {
+- info->auto_limit = (num_dcs > 3) ? 3 : num_dcs;
+- }
+-
+ if(dc_auto_cfg) {
if(!vscf_is_hash(dc_auto_cfg))
log_fatal("plugin_geoip: map '%s': auto_dc_coords must be a key-value hash", map_name);
- const unsigned num_auto = vscf_hash_get_len(dc_auto_cfg);
+- const unsigned num_auto = vscf_hash_get_len(dc_auto_cfg);
- if(num_auto != num_dcs)
- log_fatal("plugin_geoip: map '%s': auto_dc_coords hash must contain one entry for each datacenter in 'datacenters'", map_name);
- info->coords = malloc(num_auto * 2 * sizeof(double));
++ num_auto = vscf_hash_get_len(dc_auto_cfg);
++ if (info->auto_limit > num_auto)
++ info->auto_limit = num_auto;
+ info->coords = malloc(num_dcs * 2 * sizeof(double));
+ for(unsigned i = 0; i < 2*num_dcs; i++)
+ info->coords[i] = NAN;
@@ -31,15 +70,142 @@ index b49bfa5..9d20351 100644
if(!strcmp(dcname, info->names[dcidx]))
break;
}
-@@ -438,7 +438,10 @@ static unsigned dclists_city_auto_map(dclists_t* lists, const char* map_name, co
+- if(dcidx == info->num_dcs)
++ if(dcidx == num_dcs)
+ log_fatal("plugin_geoip: map '%s': auto_dc_coords key '%s' not matched from 'datacenters' list", map_name, dcname);
++ if(!isnan(info->coords[(dcidx*2)]))
++ log_fatal("plugin_geoip: map '%s': auto_dc_coords key '%s' defined twice", map_name, dcname);
+ const vscf_data_t* coord_cfg = vscf_hash_get_data_byindex(dc_auto_cfg, i);
+ const vscf_data_t* lat_cfg;
+ const vscf_data_t* lon_cfg;
+@@ -216,6 +209,18 @@ static dcinfo_t* dcinfo_new(const vscf_data_t* dc_cfg, const vscf_data_t* dc_aut
+ info->coords = NULL;
+ }
+
++ if(dc_auto_limit_cfg) {
++ unsigned long auto_limit_ul;
++ if(!vscf_is_simple(dc_auto_limit_cfg) || !vscf_simple_get_as_ulong(dc_auto_limit_cfg, &auto_limit_ul))
++ log_fatal("plugin_geoip: map '%s': auto_dc_limit must be a single unsigned integer value", map_name);
++ if(auto_limit_ul > num_auto || !auto_limit_ul)
++ auto_limit_ul = num_auto;
++ info->auto_limit = auto_limit_ul;
++ }
++ else {
++ info->auto_limit = (num_auto > 3) ? 3 : num_auto;
++ }
++
+ return info;
+ }
+
+@@ -438,7 +443,10 @@ static unsigned dclists_city_auto_map(dclists_t* lists, const char* map_name, co
double dists[store_len];
for(unsigned i = 0; i < num_dcs; i++) {
const unsigned c_offs = i * 2;
- dists[i + 1] = haversine(lat_rad, lon_rad, coords[c_offs], coords[c_offs + 1]);
-+ if (coords[c_offs] != NAN)
++ if (!isnan(coords[c_offs]))
+ dists[i + 1] = haversine(lat_rad, lon_rad, coords[c_offs], coords[c_offs + 1]);
+ else
+ dists[i + 1] = +INFINITY;
}
// Given the relatively small num_dcs of most configs,
+diff --git a/plugins/meta/libgdmaps/t/Makefile.am b/plugins/meta/libgdmaps/t/Makefile.am
+index f83592f..e9d26ce 100644
+--- a/plugins/meta/libgdmaps/t/Makefile.am
++++ b/plugins/meta/libgdmaps/t/Makefile.am
+@@ -41,7 +41,8 @@ TESTLIST = \
+ t10_def \
+ t11_def2 \
+ t12_defnone \
+- t13_castatdef
++ t13_castatdef \
++ t14_missingcoords
+
+ check_PROGRAMS = $(TESTLIST:=.bin)
+
+diff --git a/plugins/meta/libgdmaps/t/t14_missingcoords.c b/plugins/meta/libgdmaps/t/t14_missingcoords.c
+new file mode 100644
+index 0000000..9329ee3
+--- /dev/null
++++ b/plugins/meta/libgdmaps/t/t14_missingcoords.c
+@@ -0,0 +1,42 @@
++/* Copyright © 2012 Brandon L Black <blblack@gmail.com>
++ *
++ * This file is part of gdnsd-plugin-geoip.
++ *
++ * gdnsd-plugin-geoip 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.
++ *
++ * gdnsd-plugin-geoip 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 gdnsd. If not, see <http://www.gnu.org/licenses/>.
++ *
++ */
++
++// Unit test for gdmaps
++
++#include "config.h"
++#include <gdnsd-log.h>
++#include "gdmaps_test.h"
++
++int main(int argc, char* argv[]) {
++ if(argc != 2)
++ log_fatal("root directory must be set on commandline");
++
++ gdmaps_t* gdmaps = gdmaps_test_init(argv[1]);
++ unsigned tnum = 0;
++ //datacenters => [ us, ie, sg, tr, br ]
++ gdmaps_test_lookup_check(tnum++, gdmaps, "my_prod_map", "137.138.144.168", "\2\1\5\3", 16); // Geneva
++ gdmaps_test_lookup_check(tnum++, gdmaps, "my_prod_map", "69.58.186.119", "\1\2\5\3", 16); // US East Coast
++ gdmaps_test_lookup_check(tnum++, gdmaps, "my_prod_map", "117.53.170.202", "\3\5\1\2", 20); // Australia
++ gdmaps_test_lookup_check(tnum++, gdmaps, "my_prod_map", "133.11.114.194", "\2\4", 8); // JP, horrible custom 'map' entry
++ gdmaps_test_lookup_check(tnum++, gdmaps, "my_prod_map", "10.0.0.44", "\4\2", 24); // Custom 'nets' entry
++ gdmaps_test_lookup_check(tnum++, gdmaps, "my_prod_map", "10.0.1.44", "", 24); // Custom 'nets' entry, empty
++ gdmaps_test_lookup_check(tnum++, gdmaps, "my_prod_map", "192.168.1.1", "\1\2\3\4\5", 16); // meta-default, no loc
++ gdmaps_destroy(gdmaps);
++}
++
+diff --git a/plugins/meta/libgdmaps/t/t14_missingcoords.cfg b/plugins/meta/libgdmaps/t/t14_missingcoords.cfg
+new file mode 100644
+index 0000000..8c57cdd
+--- /dev/null
++++ b/plugins/meta/libgdmaps/t/t14_missingcoords.cfg
+@@ -0,0 +1,29 @@
++options => { debug => true }
++plugins => {
++ geoip => {
++ maps => {
++ # bringing it all together: city-auto w/ 5 dcs,
++ # dual GeoIP inputs, custom maps, custom nets
++ # testing with one datacenter not used in auto coords
++ my_prod_map => {
++ geoip_db => GeoLiteCityv6-20111210.dat,
++ geoip_db_v4_overlay => GeoLiteCity-20111210.dat,
++ datacenters => [ us, ie, sg, tr, br ]
++ auto_dc_limit => 5,
++ auto_dc_coords => {
++ us = [ 38.9, -77 ]
++ ie = [ 53.3, -6.3 ]
++ sg = [ 1.3, 103.9 ]
++ br = [ -22.9, -43.2 ]
++ }
++ map => {
++ AS => { JP => [ ie, tr ] }
++ }
++ nets => {
++ 10.0.1.0/24 => [ ]
++ 10.0.0.0/24 => [ tr, ie ]
++ }
++ }
++ }
++ }
++}
+--
+1.7.12
+