std::vector<shared_ptr<DNSRecordContent>> luaSynth(const std::string& code, const DNSName& query, const DNSName& zone, int zoneid, const DNSPacket& dnsp, uint16_t qtype)
{
- // cerr<<"Called for "<<query<<", in zone "<<zone<<" for type "<<qtype<<endl;
- // cerr<<"Code: '"<<code<<"'"<<endl;
-
AuthLua4 alua;
- //
std::vector<shared_ptr<DNSRecordContent>> ret;
lua.writeFunction("closestMagic", [&bestwho,&query]() {
vector<ComboAddress> candidates;
+ // Getting something like 192-0-2-1.192-0-2-2.198-51-100-1.example.org
for(auto l : query.getRawLabels()) {
boost::replace_all(l, "-", ".");
try {
candidates.emplace_back(l);
} catch (const PDNSException& e) {
- // we want the reason to be reported by the lua wrapper
- throw std::invalid_argument(e.reason);
+ // no need to continue as we most likely reached the end of the ip list
+ break ;
}
}
return pickclosest(bestwho, candidates).toString();
if(rec->d_type == QType::CNAME || rec->d_type == p->qtype.getCode()) {
// noCache=true;
DLOG(g_log<<"Executing Lua: '"<<rec->getCode()<<"'"<<endl);
- try {
- auto recvec=luaSynth(rec->getCode(), target, sd.qname, sd.domain_id, *p, rec->d_type);
- for(const auto& r : recvec) {
- rr.dr.d_type = rec->d_type; // might be CNAME
- rr.dr.d_content = r;
- rr.scopeMask = p->getRealRemote().getBits(); // this makes sure answer is a specific as your question
- ret->push_back(rr);
- }
- }
- catch(std::exception &e) {
- ;
+ auto recvec=luaSynth(rec->getCode(), target, sd.qname, sd.domain_id, *p, rec->d_type);
+ for(const auto& r : recvec) {
+ rr.dr.d_type = rec->d_type; // might be CNAME
+ rr.dr.d_content = r;
+ rr.scopeMask = p->getRealRemote().getBits(); // this makes sure answer is a specific as your question
+ ret->push_back(rr);
}
}
}
self.assertRcodeEqual(res, dns.rcode.NOERROR)
self.assertRRsetInAnswer(res, expected)
+ def testWildcardError(self):
+ """
+ Ensure errors coming from LUA wildcards are reported
+ """
+ query = dns.message.make_query('failure.magic.example.org', 'A')
+
+ res = self.sendUDPQuery(query)
+ self.assertRcodeEqual(res, dns.rcode.SERVFAIL)
+ self.assertAnswerEmpty(res)
+
def testClosestMagic(self):
"""
Basic closestMagic() test
"""
view() test where no netmask match
"""
- expected = dns.rrset.from_text('none.view.example.org.', 0,
- dns.rdataclass.IN, 'A')
query = dns.message.make_query('none.view.example.org', 'A')
res = self.sendUDPQuery(query)