From: Aki Tuomi Date: Sun, 11 Jun 2017 16:47:30 +0000 (+0300) Subject: lua-auth4: Move prequery to new lua framework X-Git-Tag: dnsdist-1.3.0~186^2~5 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7c99293def54c02e36e520d5c8d34228ef6317cf;p=pdns lua-auth4: Move prequery to new lua framework This changes how prequery gets called --- diff --git a/pdns/lua-auth.cc b/pdns/lua-auth.cc index 67563e103..55bf4bfe0 100644 --- a/pdns/lua-auth.cc +++ b/pdns/lua-auth.cc @@ -32,11 +32,6 @@ AuthLua::AuthLua(const std::string &fname) // empty } -DNSPacket* AuthLua::prequery(DNSPacket *p) -{ - return 0; -} - #else @@ -207,47 +202,4 @@ void AuthLua::registerLuaDNSPacket(void) { } #endif -DNSPacket* AuthLua::prequery(DNSPacket *p) -{ - lua_getglobal(d_lua,"prequery"); - if(!lua_isfunction(d_lua, -1)) { - // cerr<<"No such function 'prequery'\n"; - lua_pop(d_lua, 1); - return 0; - } - - DNSPacket *r=0; - // allocate a fresh packet and prefill the question - r=p->replyPacket(); - - // wrap it - LuaDNSPacket* lua_dp = (LuaDNSPacket *)lua_newuserdata(d_lua, sizeof(LuaDNSPacket)); - lua_dp->d_p=r; - - // make it of the right type - luaL_getmetatable(d_lua, "LuaDNSPacket"); - lua_setmetatable(d_lua, -2); - - if(lua_pcall(d_lua, 1, 1, 0)) { // error - string error=string("lua error in prequery: ")+lua_tostring(d_lua, -1); - theL()<& out) { return false; } +DNSPacket *AuthLua4::prequery(DNSPacket *q) { return NULL; } + AuthLua4::~AuthLua4() { } #else @@ -46,7 +48,7 @@ void AuthLua4::postPrepareContext() { d_lw->registerFunction("getRealRemote", [](DNSPacket &p) { return p.getRealRemote(); }); d_lw->registerFunction("getLocal", [](DNSPacket &p) { return p.getLocal(); }); d_lw->registerFunction("getRemotePort", [](DNSPacket &p) { return p.getRemotePort(); }); - + d_lw->registerFunction()>("getQuestion", [](DNSPacket &p) { return std::make_tuple(p.qdomain.toString(), static_cast(p.qtype.getCode())); }); d_lw->registerFunction("setA", [](DNSPacket &p, bool a) { return p.setA(a); }); d_lw->registerFunction("setID", [](DNSPacket &p, unsigned int id) { return p.setID(static_cast(id)); }); d_lw->registerFunction("setRA", [](DNSPacket &p, bool ra) { return p.setRA(ra); }); @@ -91,6 +93,7 @@ void AuthLua4::postPrepareContext() { void AuthLua4::postLoad() { d_update_policy = d_lw->readVariable>("updatepolicy").get_value_or(0); d_axfr_filter = d_lw->readVariable>("axfrfilter").get_value_or(0); + d_prequery = d_lw->readVariable>("prequery").get_value_or(0); } @@ -146,6 +149,16 @@ bool AuthLua4::updatePolicy(const DNSName &qname, QType qtype, const DNSName &zo return d_update_policy(upq); } +DNSPacket *AuthLua4::prequery(DNSPacket *q) { + if (d_prequery == NULL) return NULL; + + DNSPacket *r = q->replyPacket(); + if (d_prequery(r)) + return r; + delete r; + return NULL; +} + AuthLua4::~AuthLua4() { } #endif diff --git a/pdns/lua-auth4.hh b/pdns/lua-auth4.hh index f5178cffa..46cc0deb8 100644 --- a/pdns/lua-auth4.hh +++ b/pdns/lua-auth4.hh @@ -15,6 +15,7 @@ public: AuthLua4(); bool updatePolicy(const DNSName &qname, QType qtype, const DNSName &zonename, DNSPacket *packet); bool axfrfilter(const ComboAddress&, const DNSName&, const DNSResourceRecord&, std::vector&); + DNSPacket *prequery(DNSPacket *p); ~AuthLua4(); // this is so unique_ptr works with an incomplete type protected: @@ -33,7 +34,9 @@ private: typedef std::function luacall_update_policy_t; typedef std::function > > >(const ComboAddress&, const DNSName&, const DNSResourceRecord&)> luacall_axfr_filter_t; + typedef std::function luacall_prequery_t; luacall_update_policy_t d_update_policy; luacall_axfr_filter_t d_axfr_filter; + luacall_prequery_t d_prequery; }; diff --git a/pdns/packethandler.cc b/pdns/packethandler.cc index 427c1fb19..2d4451f30 100644 --- a/pdns/packethandler.cc +++ b/pdns/packethandler.cc @@ -71,7 +71,8 @@ PacketHandler::PacketHandler():B(s_programname), d_dk(&B) } else { - d_pdl = std::unique_ptr(new AuthLua(fname)); + d_pdl = std::unique_ptr(new AuthLua4()); + d_pdl->loadFile(fname); } fname = ::arg()["lua-dnsupdate-policy-script"]; if (fname.empty()) diff --git a/pdns/packethandler.hh b/pdns/packethandler.hh index b2dcd3fd0..6c76445a5 100644 --- a/pdns/packethandler.hh +++ b/pdns/packethandler.hh @@ -110,7 +110,7 @@ private: bool d_doIPv6AdditionalProcessing; bool d_doDNAME; bool d_doExpandALIAS; - std::unique_ptr d_pdl; + std::unique_ptr d_pdl; std::unique_ptr d_update_policy_lua; UeberBackend B; // every thread an own instance diff --git a/pdns/slavecommunicator.cc b/pdns/slavecommunicator.cc index 4b6da4dbf..5adb41098 100644 --- a/pdns/slavecommunicator.cc +++ b/pdns/slavecommunicator.cc @@ -342,7 +342,8 @@ void CommunicatorClass::suck(const DNSName &domain, const string &remote) } if(!script.empty()){ try { - pdl.reset(new AuthLua4(script)); + pdl.reset(new AuthLua4()); + pdl->loadFile(script); L<