]> git.ipfire.org Git - ipfire.org.git/blame - src/backend/resolver.py
Migrate to libloc
[ipfire.org.git] / src / backend / resolver.py
CommitLineData
440aba92
MT
1#!/usr/bin/python
2
3import ipaddress
4import pycares
5import tornado.gen
6import tornado.platform.caresresolver
7
8class Resolver(tornado.platform.caresresolver.CaresResolver):
9 def initialize(self, **kwargs):
10 super().initialize()
11
12 # Overwrite Channel
13 self.channel = pycares.Channel(sock_state_cb=self._sock_state_cb, **kwargs)
14
15 async def query(self, name, type=pycares.QUERY_TYPE_A):
16 # Create a new Future
17 fut = tornado.gen.Future()
18
19 # Perform the query
20 self.channel.query(name, type, lambda result, error: fut.set_result((result, error)))
21
22 # Wait for the response
23 result, error = await fut
24
25 # Handle any errors
26 if error:
27 # NXDOMAIN
28 if error == pycares.errno.ARES_ENOTFOUND:
29 return
30
31 # Ignore responses with no data
32 elif error == pycares.errno.ARES_ENODATA:
33 return
34
35 raise IOError(
36 "C-Ares returned error %s: %s while resolving %s"
37 % (error, pycares.errno.strerror(error), name)
38 )
39
40 # Return the result
41 return result