We’re using unbound internally for DNS resolution. It works smoothly and allows for some DNS tricks when you want to implement some split-brain trickery, but not a complete split-brain deployment. The other day we needed to send out conditional replies based on the IP address of the querying machine. Unbound comes with a python module but it has some of the weirdest, unhelpful documentation ever. I am not alone in believing this.
It is very hard to figure out the source IP address of a DNS query using the unbound python library. My first pointer on how to do so was on ServerFault. I have uploaded my own version of an operate function at pastebin. The code in question that you need to consider is:
# Find out source IP address rl = qstate.mesh_info.reply_list while (rl): if rl.query_reply: q = rl.query_reply break rl = rl.next # Careful with this conditional try: addr = q.addr except NameError: addr = None
The try … except handling is needed because I found out that sometimes the q.addr may not be defined and thus further down the line you may be bitten by an abnormal exit of your script.
Update: two friends have suggested that I change the while loop with a more Pythonic list comprehension:
q = next((x for x in qstate.mesh_info.reply_list if x.query_reply), None) try: addr = q.query_reply.addr except NameError: addr = None
One of them actually has a pretty cool pastebin about it.