]> granicus.if.org Git - pdns/commitdiff
Add netmask overrides feature
authorAki Tuomi <cmouse@desteem.org>
Sun, 15 Nov 2015 15:35:44 +0000 (17:35 +0200)
committerAki Tuomi <cmouse@cmouse.fi>
Tue, 17 Nov 2015 20:57:55 +0000 (22:57 +0200)
modules/geoipbackend/geoipbackend.cc

index 7ef41bb441ecd8048df39a493d97fcd284c06b3f..9e0396121064d41194956a3c207da10f533d6594 100644 (file)
@@ -13,7 +13,7 @@ public:
   int id;
   DNSName domain;
   int ttl;
-  map<DNSName, string> services;
+  map<DNSName, NetmaskTree<string> > services;
   map<DNSName, vector<DNSResourceRecord> > records;
 };
 
@@ -127,7 +127,24 @@ void GeoIPBackend::initialize() {
     }
 
     for(YAML::const_iterator service = domain["services"].begin(); service != domain["services"].end(); service++) {
-      dom.services[DNSName(service->first.as<string>())] = service->second.as<string>();
+      NetmaskTree<string> nmt;
+
+      // if it's an another map, we need to iterate it again, otherwise we just add two root entries.
+      if (service->second.IsMap()) {
+        for(YAML::const_iterator net = service->second.begin(); net != service->second.end(); net++) {
+          if (net->first.as<string>() == "default") {
+            nmt[Netmask("0.0.0.0/0")] = net->second.as<string>();
+            nmt[Netmask("::/0")] = net->second.as<string>();
+          } else {
+            nmt[Netmask(net->first.as<string>())] = net->second.as<string>();
+          }
+        }
+      } else {
+        nmt[Netmask("0.0.0.0/0")] = service->second.as<string>();
+        nmt[Netmask("::/0")] = service->second.as<string>();
+      }
+
+      dom.services[DNSName(service->first.as<string>())].swap(nmt);
     }
 
     // rectify the zone, first static records
@@ -236,11 +253,15 @@ void GeoIPBackend::lookup(const QType &qtype, const DNSName& qdomain, DNSPacket
     v6 = pkt_p->getRealRemote().isIpv6();
   }
 
-
   auto target = dom.services.find(search);
   if (target == dom.services.end()) return; // no hit
-  string format = target->second;
-  
+
+  const NetmaskTree<string>::node_type* node = target->second.lookup(ComboAddress(ip));
+  if (node == NULL) return; // no hit, again.
+
+  string format = node->second;
+  gl.netmask = node->first.getBits();
+
   format = format2str(format, ip, v6, &gl);
 
   // see if the record can be found
@@ -284,7 +305,6 @@ string GeoIPBackend::queryGeoIP(const string &ip, bool v6, GeoIPQueryAttribute a
   GeoIPRegion *gir = NULL;
   GeoIPRecord *gir2 = NULL;
   int id;
-  gl->netmask = 0;
 
   if (v6 && s_gi6) {
     if (attribute == Afi) {