Skip to content
Snippets Groups Projects
Commit 73fc05dc authored by Daniel Salzman's avatar Daniel Salzman
Browse files

Merge branch 'geoip_test' into 'master'

tests-extra: a simple GeoIP test

See merge request !937
parents 5204d97b d71a1585
No related branches found
No related tags found
1 merge request!937tests-extra: a simple GeoIP test
Pipeline #41337 passed
......@@ -61,7 +61,7 @@ check_rcode(knot, query, rcodeNoerror, "NO EDNS")
query = dns.message.make_query("dns1.example.com", "A", use_edns=True)
check_rcode(knot, query, rcodeNoerror, "NO COOKIE OPT")
# Try a query without a server cookie
# Try a query without a server cookie
cookieOpt = dns.edns.option_from_wire(cookieOpcode, clientCookie, 0, clientCookieLen)
query = dns.message.make_query("dns1.example.com", "A", use_edns=True, options=[cookieOpt])
response = check_rcode(knot, query, rcodeBadcookie, "ONLY CLIENT COOKIE")
......
File added
example.com. 3600 SOA dns1.example.com. hostmaster.example.com. 2010111227 21600 3600 604800 86400
example.com. 3600 NS dns1.example.com.
example.com. 3600 MX 10 mail.example.com.
dns1.example.com. 3600 A 192.0.2.1
dns1.example.com. 3600 AAAA 2001:db8::1
foo.example.com. 3600 A 192.0.2.4
mail.example.com. 3600 A 192.0.2.3
mail.example.com. 3600 AAAA 2001:db8::3
foo.example.com:
- geo: "AD;1"
A: 127.255.1.0
- geo: "AE;2"
A: 127.255.2.0
- geo: "AF;3"
A: 127.255.3.0
- geo: "AG;4"
A: 127.255.4.0
- geo: "AI;5"
A: 127.255.5.0
- geo: "AL;6"
A: 127.255.6.0
- geo: "AM;7"
A: 127.255.7.0
- geo: "AO;8"
A: 127.255.8.0
- geo: "AQ;9"
A: 127.255.9.0
- geo: "AR;10"
A: 127.255.10.0
- geo: "AS;11"
A: 127.255.11.0
- geo: "AT;12"
A: 127.255.12.0
- geo: "AU;13"
A: 127.255.13.0
- geo: "AW;14"
A: 127.255.14.0
- geo: "AX;15"
A: 127.255.15.0
- geo: "AZ;16"
A: 127.255.16.0
- geo: "BA;17"
A: 127.255.17.0
- geo: "BB;18"
A: 127.255.18.0
- geo: "BD;19"
A: 127.255.19.0
- geo: "BE;20"
A: 127.255.20.0
- geo: "BF;21"
A: 127.255.21.0
- geo: "BG;22"
A: 127.255.22.0
- geo: "BH;23"
A: 127.255.23.0
- geo: "BI;24"
A: 127.255.24.0
- geo: "BJ;25"
A: 127.255.25.0
- geo: "BL;26"
A: 127.255.26.0
- geo: "BM;27"
A: 127.255.27.0
- geo: "BN;28"
A: 127.255.28.0
- geo: "BO;29"
A: 127.255.29.0
- geo: "BQ;30"
A: 127.255.30.0
- geo: "BQ;31"
A: 127.255.31.0
- geo: "BR;32"
A: 127.255.32.0
- geo: "BS;33"
A: 127.255.33.0
- geo: "BT;34"
A: 127.255.34.0
- geo: "BV;35"
A: 127.255.35.0
- geo: "BW;36"
A: 127.255.36.0
- geo: "BY;37"
A: 127.255.37.0
- geo: "BZ;38"
A: 127.255.38.0
- geo: "CA;39"
A: 127.255.39.0
- geo: "CC;40"
A: 127.255.40.0
- geo: "CD;41"
A: 127.255.41.0
- geo: "CF;42"
A: 127.255.42.0
- geo: "CG;43"
A: 127.255.43.0
- geo: "CH;44"
A: 127.255.44.0
- geo: "CI;45"
A: 127.255.45.0
- geo: "CK;46"
A: 127.255.46.0
- geo: "CL;47"
A: 127.255.47.0
- geo: "CM;48"
A: 127.255.48.0
- geo: "CN;49"
A: 127.255.49.0
- geo: "CO;50"
A: 127.255.50.0
- geo: "CR;51"
A: 127.255.51.0
- geo: "CU;52"
A: 127.255.52.0
- geo: "CV;53"
A: 127.255.53.0
- geo: "CW;54"
A: 127.255.54.0
- geo: "CX;55"
A: 127.255.55.0
- geo: "CY;56"
A: 127.255.56.0
- geo: "CZ;57"
A: 127.255.57.0
- geo: "DE;58"
A: 127.255.58.0
- geo: "DJ;59"
A: 127.255.59.0
- geo: "DK;60"
A: 127.255.60.0
- geo: "DM;61"
A: 127.255.61.0
- geo: "DO;62"
A: 127.255.62.0
- geo: "DZ;63"
A: 127.255.63.0
- geo: "EC;64"
A: 127.255.64.0
- geo: "EE;65"
A: 127.255.65.0
- geo: "EG;66"
A: 127.255.66.0
- geo: "EH;67"
A: 127.255.67.0
- geo: "ER;68"
A: 127.255.68.0
- geo: "ES;69"
A: 127.255.69.0
- geo: "ET;70"
A: 127.255.70.0
- geo: "FI;71"
A: 127.255.71.0
- geo: "FJ;72"
A: 127.255.72.0
- geo: "FK;73"
A: 127.255.73.0
- geo: "FM;74"
A: 127.255.74.0
- geo: "FO;75"
A: 127.255.75.0
- geo: "FR;76"
A: 127.255.76.0
- geo: "GA;77"
A: 127.255.77.0
- geo: "GB;78"
A: 127.255.78.0
- geo: "GD;79"
A: 127.255.79.0
- geo: "GE;80"
A: 127.255.80.0
- geo: "GF;81"
A: 127.255.81.0
- geo: "GG;82"
A: 127.255.82.0
- geo: "GH;83"
A: 127.255.83.0
- geo: "GI;84"
A: 127.255.84.0
- geo: "GL;85"
A: 127.255.85.0
- geo: "GM;86"
A: 127.255.86.0
- geo: "GN;87"
A: 127.255.87.0
- geo: "GP;88"
A: 127.255.88.0
- geo: "GQ;89"
A: 127.255.89.0
- geo: "GR;90"
A: 127.255.90.0
- geo: "GS;91"
A: 127.255.91.0
- geo: "GT;92"
A: 127.255.92.0
- geo: "GU;93"
A: 127.255.93.0
- geo: "GW;94"
A: 127.255.94.0
- geo: "GY;95"
A: 127.255.95.0
- geo: "HK;96"
A: 127.255.96.0
- geo: "HM;97"
A: 127.255.97.0
- geo: "HN;98"
A: 127.255.98.0
- geo: "HR;99"
A: 127.255.99.0
- geo: "HT;100"
A: 127.255.100.0
- geo: "HU;101"
A: 127.255.101.0
- geo: "ID;102"
A: 127.255.102.0
- geo: "IE;103"
A: 127.255.103.0
- geo: "IL;104"
A: 127.255.104.0
- geo: "IM;105"
A: 127.255.105.0
- geo: "IN;106"
A: 127.255.106.0
- geo: "IO;107"
A: 127.255.107.0
- geo: "IQ;108"
A: 127.255.108.0
- geo: "IR;109"
A: 127.255.109.0
- geo: "IS;110"
A: 127.255.110.0
- geo: "IT;111"
A: 127.255.111.0
- geo: "JE;112"
A: 127.255.112.0
- geo: "JM;113"
A: 127.255.113.0
- geo: "JO;114"
A: 127.255.114.0
- geo: "JP;115"
A: 127.255.115.0
- geo: "KE;116"
A: 127.255.116.0
- geo: "KG;117"
A: 127.255.117.0
- geo: "KH;118"
A: 127.255.118.0
- geo: "KI;119"
A: 127.255.119.0
- geo: "KM;120"
A: 127.255.120.0
- geo: "KN;121"
A: 127.255.121.0
- geo: "KP;122"
A: 127.255.122.0
- geo: "KR;123"
A: 127.255.123.0
- geo: "KW;124"
A: 127.255.124.0
- geo: "KY;125"
A: 127.255.125.0
- geo: "KZ;126"
A: 127.255.126.0
- geo: "LA;127"
A: 127.255.127.0
- geo: "LB;128"
A: 127.255.128.0
- geo: "LC;129"
A: 127.255.129.0
- geo: "LI;130"
A: 127.255.130.0
- geo: "LK;131"
A: 127.255.131.0
- geo: "LR;132"
A: 127.255.132.0
- geo: "LS;133"
A: 127.255.133.0
- geo: "LT;134"
A: 127.255.134.0
- geo: "LU;135"
A: 127.255.135.0
- geo: "LV;136"
A: 127.255.136.0
- geo: "LY;137"
A: 127.255.137.0
- geo: "MA;138"
A: 127.255.138.0
- geo: "MC;139"
A: 127.255.139.0
- geo: "MD;140"
A: 127.255.140.0
- geo: "ME;141"
A: 127.255.141.0
- geo: "MF;142"
A: 127.255.142.0
- geo: "MG;143"
A: 127.255.143.0
- geo: "MH;144"
A: 127.255.144.0
- geo: "MK;145"
A: 127.255.145.0
- geo: "ML;146"
A: 127.255.146.0
- geo: "MM;147"
A: 127.255.147.0
- geo: "MN;148"
A: 127.255.148.0
- geo: "MO;149"
A: 127.255.149.0
- geo: "MP;150"
A: 127.255.150.0
- geo: "MQ;151"
A: 127.255.151.0
- geo: "MR;152"
A: 127.255.152.0
- geo: "MS;153"
A: 127.255.153.0
- geo: "MT;154"
A: 127.255.154.0
- geo: "MU;155"
A: 127.255.155.0
- geo: "MV;156"
A: 127.255.156.0
- geo: "MW;157"
A: 127.255.157.0
- geo: "MX;158"
A: 127.255.158.0
- geo: "MY;159"
A: 127.255.159.0
- geo: "MZ;160"
A: 127.255.160.0
- geo: "NA;161"
A: 127.255.161.0
- geo: "NC;162"
A: 127.255.162.0
- geo: "NE;163"
A: 127.255.163.0
- geo: "NF;164"
A: 127.255.164.0
- geo: "NG;165"
A: 127.255.165.0
- geo: "NI;166"
A: 127.255.166.0
- geo: "NL;167"
A: 127.255.167.0
- geo: "NO;168"
A: 127.255.168.0
- geo: "NP;169"
A: 127.255.169.0
- geo: "NR;170"
A: 127.255.170.0
- geo: "NU;171"
A: 127.255.171.0
- geo: "NZ;172"
A: 127.255.172.0
- geo: "OM;173"
A: 127.255.173.0
- geo: "PA;174"
A: 127.255.174.0
- geo: "PE;175"
A: 127.255.175.0
- geo: "PF;176"
A: 127.255.176.0
- geo: "PG;177"
A: 127.255.177.0
- geo: "PH;178"
A: 127.255.178.0
- geo: "PK;179"
A: 127.255.179.0
- geo: "PL;180"
A: 127.255.180.0
- geo: "PM;181"
A: 127.255.181.0
- geo: "PN;182"
A: 127.255.182.0
- geo: "PR;183"
A: 127.255.183.0
- geo: "PS;184"
A: 127.255.184.0
- geo: "PT;185"
A: 127.255.185.0
- geo: "PW;186"
A: 127.255.186.0
- geo: "PY;187"
A: 127.255.187.0
- geo: "QA;188"
A: 127.255.188.0
- geo: "RE;189"
A: 127.255.189.0
- geo: "RO;190"
A: 127.255.190.0
- geo: "RS;191"
A: 127.255.191.0
- geo: "RU;192"
A: 127.255.192.0
- geo: "RW;193"
A: 127.255.193.0
- geo: "SA;194"
A: 127.255.194.0
- geo: "SB;195"
A: 127.255.195.0
- geo: "SC;196"
A: 127.255.196.0
- geo: "SD;197"
A: 127.255.197.0
- geo: "SE;198"
A: 127.255.198.0
- geo: "SG;199"
A: 127.255.199.0
- geo: "SH;200"
A: 127.255.200.0
- geo: "SI;201"
A: 127.255.201.0
- geo: "SJ;202"
A: 127.255.202.0
- geo: "SK;203"
A: 127.255.203.0
- geo: "SL;204"
A: 127.255.204.0
- geo: "SM;205"
A: 127.255.205.0
- geo: "SN;206"
A: 127.255.206.0
- geo: "SO;207"
A: 127.255.207.0
- geo: "SR;208"
A: 127.255.208.0
- geo: "SS;209"
A: 127.255.209.0
- geo: "ST;210"
A: 127.255.210.0
- geo: "SV;211"
A: 127.255.211.0
- geo: "SX;212"
A: 127.255.212.0
- geo: "SY;213"
A: 127.255.213.0
- geo: "SZ;214"
A: 127.255.214.0
- geo: "TC;215"
A: 127.255.215.0
- geo: "TD;216"
A: 127.255.216.0
- geo: "TF;217"
A: 127.255.217.0
- geo: "TG;218"
A: 127.255.218.0
- geo: "TH;219"
A: 127.255.219.0
- geo: "TJ;220"
A: 127.255.220.0
- geo: "TK;221"
A: 127.255.221.0
- geo: "TL;222"
A: 127.255.222.0
- geo: "TM;223"
A: 127.255.223.0
- geo: "TN;224"
A: 127.255.224.0
- geo: "TO;225"
A: 127.255.225.0
- geo: "TR;226"
A: 127.255.226.0
- geo: "TT;227"
A: 127.255.227.0
- geo: "TV;228"
A: 127.255.228.0
- geo: "TW;229"
A: 127.255.229.0
- geo: "TZ;230"
A: 127.255.230.0
- geo: "UA;231"
A: 127.255.231.0
- geo: "UG;232"
A: 127.255.232.0
- geo: "UM;233"
A: 127.255.233.0
- geo: "US;234"
A: 127.255.234.0
- geo: "UY;235"
A: 127.255.235.0
- geo: "UZ;236"
A: 127.255.236.0
- geo: "VA;237"
A: 127.255.237.0
- geo: "VC;238"
A: 127.255.238.0
- geo: "VE;239"
A: 127.255.239.0
- geo: "VG;240"
A: 127.255.240.0
- geo: "VI;241"
A: 127.255.241.0
- geo: "VN;242"
A: 127.255.242.0
- geo: "VU;243"
A: 127.255.243.0
- geo: "WF;244"
A: 127.255.244.0
- geo: "WS;245"
A: 127.255.245.0
- geo: "YE;246"
A: 127.255.246.0
- geo: "YT;247"
A: 127.255.247.0
- geo: "ZA;248"
A: 127.255.248.0
- geo: "ZM;249"
A: 127.255.249.0
- geo: "ZW;250"
A: 127.255.250.0
#!/usr/bin/perl
use MaxMind::DB::Writer::Tree;
my %types = (
country => 'map',
iso_code => 'utf8_string',
city => 'map',
geoname_id => 'uint32',
);
my @iso_codes = ('AD', 'AE', 'AF', 'AG', 'AI', 'AL', 'AM', 'AO', 'AQ', 'AR', 'AS', 'AT',
'AU', 'AW', 'AX', 'AZ', 'BA', 'BB', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI',
'BJ', 'BL', 'BM', 'BN', 'BO', 'BQ', 'BQ', 'BR', 'BS', 'BT', 'BV', 'BW',
'BY', 'BZ', 'CA', 'CC', 'CD', 'CF', 'CG', 'CH', 'CI', 'CK', 'CL', 'CM',
'CN', 'CO', 'CR', 'CU', 'CV', 'CW', 'CX', 'CY', 'CZ', 'DE', 'DJ', 'DK',
'DM', 'DO', 'DZ', 'EC', 'EE', 'EG', 'EH', 'ER', 'ES', 'ET', 'FI', 'FJ',
'FK', 'FM', 'FO', 'FR', 'GA', 'GB', 'GD', 'GE', 'GF', 'GG', 'GH', 'GI',
'GL', 'GM', 'GN', 'GP', 'GQ', 'GR', 'GS', 'GT', 'GU', 'GW', 'GY', 'HK',
'HM', 'HN', 'HR', 'HT', 'HU', 'ID', 'IE', 'IL', 'IM', 'IN', 'IO', 'IQ',
'IR', 'IS', 'IT', 'JE', 'JM', 'JO', 'JP', 'KE', 'KG', 'KH', 'KI', 'KM',
'KN', 'KP', 'KR', 'KW', 'KY', 'KZ', 'LA', 'LB', 'LC', 'LI', 'LK', 'LR',
'LS', 'LT', 'LU', 'LV', 'LY', 'MA', 'MC', 'MD', 'ME', 'MF', 'MG', 'MH',
'MK', 'ML', 'MM', 'MN', 'MO', 'MP', 'MQ', 'MR', 'MS', 'MT', 'MU', 'MV',
'MW', 'MX', 'MY', 'MZ', 'NA', 'NC', 'NE', 'NF', 'NG', 'NI', 'NL', 'NO',
'NP', 'NR', 'NU', 'NZ', 'OM', 'PA', 'PE', 'PF', 'PG', 'PH', 'PK', 'PL',
'PM', 'PN', 'PR', 'PS', 'PT', 'PW', 'PY', 'QA', 'RE', 'RO', 'RS', 'RU',
'RW', 'SA', 'SB', 'SC', 'SD', 'SE', 'SG', 'SH', 'SI', 'SJ', 'SK', 'SL',
'SM', 'SN', 'SO', 'SR', 'SS', 'ST', 'SV', 'SX', 'SY', 'SZ', 'TC', 'TD',
'TF', 'TG', 'TH', 'TJ', 'TK', 'TL', 'TM', 'TN', 'TO', 'TR', 'TT', 'TV',
'TW', 'TZ', 'UA', 'UG', 'UM', 'US', 'UY', 'UZ', 'VA', 'VC', 'VE', 'VG',
'VI', 'VN', 'VU', 'WF', 'WS', 'YE', 'YT', 'ZA', 'ZM', 'ZW');
my $tree = MaxMind::DB::Writer::Tree->new(
ip_version => 6,
record_size => 24,
database_type => 'GeoIP Test Data',
languages => ['en'],
description => { en => 'Knot DNS GeoIP module test data' },
map_key_type_callback => sub { $types{ $_[0] } },
remove_reserved_networks => 0
);
$network_counter = 0;
foreach $iso_code (@iso_codes) {
$network_counter++;
$tree->insert_network(
'127.255.'.$network_counter.'.0/24',
{
country => {
iso_code => $iso_code
},
city => {
geoname_id => $network_counter
}
}
);
};
open my $fh, '>:raw', 'db.mmdb';
$tree->write_tree($fh);
#!/usr/bin/env python3
'''geoip module functionality test'''
from dnstest.test import Test
from dnstest.module import ModGeoip
from dnstest.utils import *
import random
t = Test(address=4, stress=False)
knot = t.server("knot")
zone = t.zone("example.com.", storage=".")
t.link(zone, knot)
ModGeoip.check()
mod_geoip = ModGeoip(t.data_dir + "geo.conf", "geodb", t.data_dir + "db.mmdb", ["country/iso_code", "(id)city/geoname_id"])
knot.add_module(zone, mod_geoip);
t.start()
knot.zone_wait(zone)
# Test default answer.
resp = knot.dig("foo.example.com", "A")
resp.check(rcode="NOERROR", rdata="192.0.2.4")
# Test geo-dependent answers.
for i in range(1, 1000):
random_client = "127.255." + str(random.randint(1, 250)) + ".0"
resp = knot.dig("foo.example.com", "A", source=random_client)
resp.check(rcode="NOERROR", rdata=random_client)
......@@ -319,3 +319,37 @@ class ModQueryacl(KnotModule):
conf.end()
return conf
class ModGeoip(KnotModule):
'''GeoIP module'''
mod_name = "geoip"
def __init__(self, config_file="net.conf", mode="subnet", geodb_file=None, geodb_key=None):
super().__init__()
self.config_file = config_file
self.mode = mode
self.geodb_file = geodb_file
self.geodb_key = geodb_key
def get_conf(self, conf=None):
if not conf:
conf = dnstest.config.KnotConf()
conf.begin(self.conf_name)
conf.id_item("id", self.conf_id)
conf.item_str("config-file", self.config_file)
conf.item("mode", self.mode)
if self.geodb_file:
conf.item_str("geodb-file", self.geodb_file)
if self.geodb_key:
if isinstance(self.geodb_key, list):
conf.item_list("geodb-key", self.geodb_key)
else:
conf.item("geodb-key", self.geodb_key)
conf.item("ttl", 1234)
conf.end()
return conf
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment