]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
implement exposing edns subnet in preresolve() - other hooks would require some more... 3483/head
authorbert hubert <bert.hubert@netherlabs.nl>
Mon, 29 Feb 2016 10:32:00 +0000 (11:32 +0100)
committerbert hubert <bert.hubert@netherlabs.nl>
Mon, 29 Feb 2016 10:32:00 +0000 (11:32 +0100)
pdns/ednssubnet.hh
pdns/lua-recursor4.cc
pdns/lua-recursor4.hh
pdns/powerdns-example-script.lua

index a724b4336c5f7f27bba2de7dd604269f23adcae2..08483201019a925dd99f43bdefe1f67219cca437 100644 (file)
@@ -28,8 +28,6 @@
 
 extern NetmaskGroup g_ednssubnets;
 extern SuffixMatchNode g_ednsdomains;
-
-
 struct EDNSSubnetOpts
 {
        Netmask source;
index 96440970a8e1379244f4743c62c683af583b885f..1543a7bdae4ad7005b184c9e0b4fbe9545288892 100644 (file)
@@ -5,6 +5,7 @@
 #include "syncres.hh"
 #include "namespaces.hh"
 #include "rec_channel.hh" 
+#include "ednssubnet.hh"
 #include <unordered_set>
 #if !defined(HAVE_LUA)
 
@@ -145,6 +146,23 @@ boost::optional<string>  RecursorLua4::DNSQuestion::getEDNSOption(uint16_t code)
   return boost::optional<string>();
 }
 
+boost::optional<Netmask>  RecursorLua4::DNSQuestion::getEDNSSubnet()
+{
+
+  if(ednsOptions) {
+    for(const auto& o : *ednsOptions) {
+      if(o.first==8) {
+        EDNSSubnetOpts eso;
+        if(getEDNSSubnetOptsFromString(o.second, &eso))
+          return eso.source;
+        else 
+          break;
+      }
+    }
+  }
+  return boost::optional<Netmask>();
+}
+
 
 vector<pair<int, DNSRecord> > RecursorLua4::DNSQuestion::getRecords()
 {
@@ -256,6 +274,10 @@ RecursorLua4::RecursorLua4(const std::string& fname)
       return ComboAddress::addressOnlyEqual()(lhs, rhs);
     });
   
+
+  d_lw->registerFunction<ComboAddress(Netmask::*)()>("getNetwork", [](const Netmask& nm) { return nm.getNetwork(); } ); // const reference makes this necessary
+  d_lw->registerFunction("toString", &Netmask::toString);
+
   d_lw->writeFunction("newNMG", []() { return NetmaskGroup(); });
   d_lw->registerFunction<void(NetmaskGroup::*)(const std::string&mask)>("addMask", [](NetmaskGroup&nmg, const std::string& mask)
                         {
@@ -282,6 +304,7 @@ RecursorLua4::RecursorLua4(const std::string& fname)
   d_lw->registerMember("udpCallback", &DNSQuestion::udpCallback);
   d_lw->registerFunction("getEDNSOptions", &DNSQuestion::getEDNSOptions);
   d_lw->registerFunction("getEDNSOption", &DNSQuestion::getEDNSOption);
+  d_lw->registerFunction("getEDNSSubnet", &DNSQuestion::getEDNSSubnet);
   d_lw->registerMember("name", &DNSRecord::d_name);
   d_lw->registerMember("type", &DNSRecord::d_type);
   d_lw->registerMember("ttl", &DNSRecord::d_ttl);
index 94c8d052a398c4f72242d21d7458c6fbb62a02a1..12e622e84a52f91a7f64f54253adbd1bc6306777 100644 (file)
@@ -39,6 +39,7 @@ private:
     vector<pair<int,DNSRecord> > getRecords();
     vector<pair<uint16_t, string> > getEDNSOptions();
     boost::optional<string> getEDNSOption(uint16_t code);
+    boost::optional<Netmask> getEDNSSubnet();
     void setRecords(const vector<pair<int,DNSRecord> >& records);
     bool variable{false};
     
index 3374e4e4685d26f5d2d8b7586d1853d29d110495..a22c9ed0a06f1d0413ed5a5b24c290f433857c00 100644 (file)
@@ -20,6 +20,12 @@ magicMetric = getMetric("magic")
 function preresolve(dq)
        print("Got question for "..dq.qname:toString().." from "..dq.remoteaddr:toString().." to "..dq.localaddr:toString())
 
+        local ednssubnet=dq:getEDNSSubnet()
+       if(ednssubnet) then
+               print("Packet EDNS subnet source: "..ednssubnet:toString()..", "..ednssubnet:getNetwork():toString())
+        end
+                                        
+
        local a=dq:getEDNSOption(3)
        if(a) then
                print("There is an EDNS option 3 present: "..a)