DNS query against a specific server.

M

Michel Albert

Hi,

``socket.gethostbyname`` sends the DNS resolution query to the DNS server specified by the OS. Is there an easy way to send a query to a *different* server?

I see that twisted.names allows you to do this, but, having all of twisted as dependency to my project when all I need to do is a simple DNS query seems a bit extreme. I also found pydns, but that looks fairly outdated and unmaintained.

Is there not an actively maintained lightweight solution? If not, I will go with twisted.


Cheers,
Mich.
 
M

Michel Albert

Hi,

``socket.gethostbyname`` sends the DNS resolution query to the DNS server specified by the OS. Is there an easy way to send a query to a *different* server?

I see that twisted.names allows you to do this, but, having all of twisted as dependency to my project when all I need to do is a simple DNS queryseems a bit extreme. I also found pydns, but that looks fairly outdated and unmaintained.

Is there not an actively maintained lightweight solution? If not, I will go with twisted.




--



It isn't pure python, but you would be pretty much guaranteed a maintained solution if you use the name server lookup in your OS. Something like:



import subprocess

nsl_reslt = subprocess.Popen(['nslookup', '<insert name nere>' ],stderr = subprocess.PIPE, stdout = subprocess.PIPE).communicate()[0]





Hope this helps,

Bill

Hmm... I had this option in mind, but opening a subprocess for something assmall as this seemed a bit error-prone. If something on the system changes, nslookup replaced by dig or nslookup output changes for example your application will bug out.

Granted, the chance of this happening is slim, but using a fixed-version dependency in your setup script gives you a much safer solution IMO.

I know I may be splitting hairs. Any of the mentioned solutions are fine. But I am curious to see if something like this is not yet implemented in a more standard way. I was surprised to see that ``gethostbyname`` does not take an optional parameter for this task.
 
E

Ervin Hegedüs

Hello,

Hi,

``socket.gethostbyname`` sends the DNS resolution query to the DNS server specified by the OS. Is there an easy way to send a query to a *different* server?

I see that twisted.names allows you to do this, but, having all of twisted as dependency to my project when all I need to do is a simple DNS query seems a bit extreme. I also found pydns, but that looks fairly outdated and unmaintained.

Is there not an actively maintained lightweight solution? If not, I will go with twisted.

there is a dns modul for Python (I don't know is it part of
standard Python library or not), on most Linux distribution you
can find it, eg. in Debian it's called python-dnspython.

It can handle different nameserver, than OS knows - here is a
sample code:


import dns.resolver

r = dns.resolver.Resolver()
r.namerservers = ['127.0.0.1']
# or any other IP, in my case I'm using PDNS, which have two
# parts: a recursor and a resolver; recursor allows requests only
# on localhost

mxservers = r.query("python.org", 'MX').response




hth,


a.
 
C

Chris Angelico

I know I may be splitting hairs. Any of the mentioned solutions are fine.But I am curious to see if something like this is not yet implemented in amore standard way. I was surprised to see that ``gethostbyname`` does not take an optional parameter for this task.

gethostbyname is a simple function with not much flexibility. (You
can't, for instance, look up a TXT record.) For anything more complex,
you want a proper DNS implementation.

There are a few Python DNS modules. It means adding another
dependency, but perhaps not as large as twisted. And of course, you
could always manually send UDP packets and listen for responses, but
that seems a little unnecessary :)

ChrisA
 
M

Michel Albert

Hello,



Hi,

``socket.gethostbyname`` sends the DNS resolution query to the DNS server specified by the OS. Is there an easy way to send a query to a *different* server?

I see that twisted.names allows you to do this, but, having all of twisted as dependency to my project when all I need to do is a simple DNS queryseems a bit extreme. I also found pydns, but that looks fairly outdated and unmaintained.

Is there not an actively maintained lightweight solution? If not, I will go with twisted.



there is a dns modul for Python (I don't know is it part of

standard Python library or not), on most Linux distribution you

can find it, eg. in Debian it's called python-dnspython.



It can handle different nameserver, than OS knows - here is a

sample code:





import dns.resolver



r = dns.resolver.Resolver()

r.namerservers = ['127.0.0.1']

# or any other IP, in my case I'm using PDNS, which have two

# parts: a recursor and a resolver; recursor allows requests only

# on localhost



mxservers = r.query("python.org", 'MX').response









hth,





a.


Indeed, this looks much nicer than both twisted or pydns. I think I'll go with that one. Thanks a lot!
 
G

Gisle Vanem

Chris Angelico said:
There are a few Python DNS modules. It means adding another
dependency, but perhaps not as large as twisted. And of course, you
could always manually send UDP packets and listen for responses, but
that seems a little unnecessary :)

Then there is pycares; "a Python module which provides an interface to
c-ares.... c-ares is a C library that performs DNS requests and name resolves
asynchronously.". I have good experience wih C-ares and it can set
specific nameservers. Ref:
https://pypi.python.org/pypi/pycares/0.3.0

--gv
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,994
Messages
2,570,223
Members
46,812
Latest member
GracielaWa

Latest Threads

Top