// empty
}
-DNSPacket* AuthLua::prequery(DNSPacket *p)
-{
- return 0;
-}
-
#else
}
#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()<<Logger::Error<<error<<endl;
-
- lua_pop(d_lua, 1);
- throw runtime_error(error);
- }
- bool res=lua_toboolean(d_lua, 1);
- lua_pop(d_lua, 1);
- if(res) {
- // prequery created our response, use it
- theL()<<Logger::Info<<"overriding query from lua prequery result"<<endl;
- return r;
- }
- else
- {
- // prequery wanted nothing to do with this question
- delete r;
- return 0;
- }
-}
-
#endif
public:
explicit AuthLua(const std::string& fname);
// ~AuthLua();
- DNSPacket* prequery(DNSPacket *p);
private:
void registerLuaDNSPacket(void);
bool AuthLua4::updatePolicy(const DNSName &qname, QType qtype, const DNSName &zonename, DNSPacket *packet) { return false; }
bool AuthLua4::axfrfilter(const ComboAddress& remote, const DNSName& zone, const DNSResourceRecord& in, vector<DNSResourceRecord>& out) { return false; }
+DNSPacket *AuthLua4::prequery(DNSPacket *q) { return NULL; }
+
AuthLua4::~AuthLua4() { }
#else
d_lw->registerFunction<DNSPacket, Netmask()>("getRealRemote", [](DNSPacket &p) { return p.getRealRemote(); });
d_lw->registerFunction<DNSPacket, ComboAddress()>("getLocal", [](DNSPacket &p) { return p.getLocal(); });
d_lw->registerFunction<DNSPacket, unsigned int()>("getRemotePort", [](DNSPacket &p) { return p.getRemotePort(); });
-
+ d_lw->registerFunction<DNSPacket, std::tuple<const std::string, unsigned int>()>("getQuestion", [](DNSPacket &p) { return std::make_tuple(p.qdomain.toString(), static_cast<unsigned int>(p.qtype.getCode())); });
d_lw->registerFunction<DNSPacket, void(bool)>("setA", [](DNSPacket &p, bool a) { return p.setA(a); });
d_lw->registerFunction<DNSPacket, void(unsigned int)>("setID", [](DNSPacket &p, unsigned int id) { return p.setID(static_cast<uint16_t>(id)); });
d_lw->registerFunction<DNSPacket, void(bool)>("setRA", [](DNSPacket &p, bool ra) { return p.setRA(ra); });
void AuthLua4::postLoad() {
d_update_policy = d_lw->readVariable<boost::optional<luacall_update_policy_t>>("updatepolicy").get_value_or(0);
d_axfr_filter = d_lw->readVariable<boost::optional<luacall_axfr_filter_t>>("axfrfilter").get_value_or(0);
+ d_prequery = d_lw->readVariable<boost::optional<luacall_prequery_t>>("prequery").get_value_or(0);
}
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
AuthLua4();
bool updatePolicy(const DNSName &qname, QType qtype, const DNSName &zonename, DNSPacket *packet);
bool axfrfilter(const ComboAddress&, const DNSName&, const DNSResourceRecord&, std::vector<DNSResourceRecord>&);
+ DNSPacket *prequery(DNSPacket *p);
~AuthLua4(); // this is so unique_ptr works with an incomplete type
protected:
typedef std::function<bool(const UpdatePolicyQuery&)> luacall_update_policy_t;
typedef std::function<std::tuple<int, std::unordered_map<int, std::unordered_map<std::string,boost::variant<unsigned int,std::string> > > >(const ComboAddress&, const DNSName&, const DNSResourceRecord&)> luacall_axfr_filter_t;
+ typedef std::function<bool(DNSPacket*)> luacall_prequery_t;
luacall_update_policy_t d_update_policy;
luacall_axfr_filter_t d_axfr_filter;
+ luacall_prequery_t d_prequery;
};
}
else
{
- d_pdl = std::unique_ptr<AuthLua>(new AuthLua(fname));
+ d_pdl = std::unique_ptr<AuthLua4>(new AuthLua4());
+ d_pdl->loadFile(fname);
}
fname = ::arg()["lua-dnsupdate-policy-script"];
if (fname.empty())
bool d_doIPv6AdditionalProcessing;
bool d_doDNAME;
bool d_doExpandALIAS;
- std::unique_ptr<AuthLua> d_pdl;
+ std::unique_ptr<AuthLua4> d_pdl;
std::unique_ptr<AuthLua4> d_update_policy_lua;
UeberBackend B; // every thread an own instance
}
if(!script.empty()){
try {
- pdl.reset(new AuthLua4(script));
+ pdl.reset(new AuthLua4());
+ pdl->loadFile(script);
L<<Logger::Info<<"Loaded Lua script '"<<script<<"' to edit the incoming AXFR of '"<<domain<<"'"<<endl;
}
catch(std::exception& e) {