Bug 4200 - More documentation needed on Pythonmod inplace_callback functions
More documentation needed on Pythonmod inplace_callback functions
Status: NEW
Product: unbound
Classification: Unclassified
Component: server
1.8.1
x86_64 FreeBSD
: P5 enhancement
Assigned To: unbound team
Depends on:
Blocks:
  Show dependency treegraph
 
Reported: 2018-10-30 09:35 CET by Michael
Modified: 2018-10-30 09:56 CET (History)
2 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Michael 2018-10-30 09:35:44 CET
Hello,
As I mentioned previously on https://www.nlnetlabs.nl/bugs-script/show_bug.cgi?id=4140 we need to change answer on specific rules.
I figured out, that after first reply, the answer is cached, and the only way to catch it - inplace callback functions. I am happy with new comm_reply parameter in callback functions, but still I can't figure out how to change RRSets in answer message. I can't read them even through reply_info* rep struct. Looks like i should pack somehow answer and pass it through regional* region struct, but there are no methods or functions for that.
Could you point me to some documentation/source code or example on how to change reply message(totally replace) while in inplace_*_callback?
I've tried the following approach:
def inplace_cache_callback(qinfo, qstate, rep, rcode, edns, opt_list_out, region, **kwargs):
	comm_reply = kwargs['repinfo']
	if comm_reply:
		addr = comm_reply.addr
		port = comm_reply.port
		addr_family = comm_reply.family
		if "10.137.130.142" in addr:
			makeReply(qstate)
	else:
		rl = qstate.mesh_info.reply_list
		counter=0
		while (rl):
			if rl.query_reply:
				q = rl.query_reply
				counter +=1
				if "10.137.130.142" in q.addr:
					makeReply(qstate)
			rl = rl.next
		log_info("python: total count {}".format(counter))
	return True

def makeReply(qstate):
	msg = DNSMessage(qstate.qinfo.qname_str, RR_TYPE_A, RR_CLASS_IN, PKT_QR | PKT_RA | PKT_AA)
	#append RR
	if (qstate.qinfo.qtype == RR_TYPE_A) or (qstate.qinfo.qtype == RR_TYPE_ANY):
		log_info("message generated and modified")
		msg.answer.append("%s 0 IN A 31.128.159.46" % qstate.qinfo.qname_str)
	#set qstate.return_msg
	if not msg.set_return_msg(qstate):
		return True


This code doesn't work for me, should it?