home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 October / maximum-cd-2011-10.iso / DiscContents / digsby_setup.exe / lib / dns / resolver.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2011-06-22  |  13.9 KB  |  596 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. import socket
  5. import sys
  6. import time
  7. import dns.exception as dns
  8. import dns.message as dns
  9. import dns.name as dns
  10. import dns.query as dns
  11. import dns.rcode as dns
  12. import dns.rdataclass as dns
  13. import dns.rdatatype as dns
  14. if sys.platform == 'win32':
  15.     import _winreg
  16.  
  17.  
  18. class NXDOMAIN(dns.exception.DNSException):
  19.     pass
  20.  
  21. Timeout = dns.exception.Timeout
  22.  
  23. class NoAnswer(dns.exception.DNSException):
  24.     pass
  25.  
  26.  
  27. class NoNameservers(dns.exception.DNSException):
  28.     pass
  29.  
  30.  
  31. class NotAbsolute(dns.exception.DNSException):
  32.     pass
  33.  
  34.  
  35. class NoRootSOA(dns.exception.DNSException):
  36.     pass
  37.  
  38.  
  39. class Answer(object):
  40.     
  41.     def __init__(self, qname, rdtype, rdclass, response):
  42.         self.qname = qname
  43.         self.rdtype = rdtype
  44.         self.rdclass = rdclass
  45.         self.response = response
  46.         min_ttl = -1
  47.         rrset = None
  48.         for count in xrange(0, 15):
  49.             
  50.             try:
  51.                 rrset = response.find_rrset(response.answer, qname, rdclass, rdtype)
  52.                 if min_ttl == -1 or rrset.ttl < min_ttl:
  53.                     min_ttl = rrset.ttl
  54.                 
  55.             continue
  56.             except KeyError:
  57.                 if rdtype != dns.rdatatype.CNAME:
  58.                     
  59.                     try:
  60.                         crrset = response.find_rrset(response.answer, qname, rdclass, dns.rdatatype.CNAME)
  61.                         if min_ttl == -1 or crrset.ttl < min_ttl:
  62.                             min_ttl = crrset.ttl
  63.                         
  64.                         for rd in crrset:
  65.                             qname = rd.target
  66.                         
  67.                     except KeyError:
  68.                         raise NoAnswer
  69.                     except:
  70.                         None<EXCEPTION MATCH>KeyError
  71.                     
  72.  
  73.                 None<EXCEPTION MATCH>KeyError
  74.                 raise NoAnswer
  75.                 continue
  76.             
  77.  
  78.         
  79.         if rrset is None:
  80.             raise NoAnswer
  81.         rrset is None
  82.         self.rrset = rrset
  83.         self.expiration = time.time() + min_ttl
  84.  
  85.     
  86.     def __getattr__(self, attr):
  87.         if attr == 'name':
  88.             return self.rrset.name
  89.         if attr == 'ttl':
  90.             return self.rrset.ttl
  91.         if attr == 'covers':
  92.             return self.rrset.covers
  93.         if attr == 'rdclass':
  94.             return self.rrset.rdclass
  95.         if attr == 'rdtype':
  96.             return self.rrset.rdtype
  97.         raise AttributeError(attr)
  98.  
  99.     
  100.     def __len__(self):
  101.         return len(self.rrset)
  102.  
  103.     
  104.     def __iter__(self):
  105.         return iter(self.rrset)
  106.  
  107.     
  108.     def __getitem__(self, i):
  109.         return self.rrset[i]
  110.  
  111.     
  112.     def __delitem__(self, i):
  113.         del self.rrset[i]
  114.  
  115.     
  116.     def __getslice__(self, i, j):
  117.         return self.rrset[i:j]
  118.  
  119.     
  120.     def __delslice__(self, i, j):
  121.         del self.rrset[i:j]
  122.  
  123.  
  124.  
  125. class Cache(object):
  126.     
  127.     def __init__(self, cleaning_interval = 300):
  128.         self.data = { }
  129.         self.cleaning_interval = cleaning_interval
  130.         self.next_cleaning = time.time() + self.cleaning_interval
  131.  
  132.     
  133.     def maybe_clean(self):
  134.         now = time.time()
  135.         if self.next_cleaning <= now:
  136.             keys_to_delete = []
  137.             for k, v in self.data.iteritems():
  138.                 if v.expiration <= now:
  139.                     keys_to_delete.append(k)
  140.                     continue
  141.             
  142.             for k in keys_to_delete:
  143.                 del self.data[k]
  144.             
  145.             now = time.time()
  146.             self.next_cleaning = now + self.cleaning_interval
  147.         
  148.  
  149.     
  150.     def get(self, key):
  151.         self.maybe_clean()
  152.         v = self.data.get(key)
  153.         if v is None or v.expiration <= time.time():
  154.             return None
  155.         return v
  156.  
  157.     
  158.     def put(self, key, value):
  159.         self.maybe_clean()
  160.         self.data[key] = value
  161.  
  162.     
  163.     def flush(self, key = None):
  164.         if key is not None:
  165.             if self.data.has_key(key):
  166.                 del self.data[key]
  167.             
  168.         else:
  169.             self.data = { }
  170.             self.next_cleaning = time.time() + self.cleaning_interval
  171.  
  172.  
  173.  
  174. class Resolver(object):
  175.     
  176.     def __init__(self, filename = '/etc/resolv.conf', configure = True):
  177.         self.reset()
  178.         if configure:
  179.             if sys.platform == 'win32':
  180.                 self.read_registry()
  181.             elif filename:
  182.                 self.read_resolv_conf(filename)
  183.             
  184.         
  185.  
  186.     
  187.     def reset(self):
  188.         self.domain = dns.name.Name(dns.name.from_text(socket.gethostname())[1:])
  189.         if len(self.domain) == 0:
  190.             self.domain = dns.name.root
  191.         
  192.         self.nameservers = []
  193.         self.search = []
  194.         self.port = 53
  195.         self.timeout = 2
  196.         self.lifetime = 30
  197.         self.keyring = None
  198.         self.keyname = None
  199.         self.keyalgorithm = dns.tsig.default_algorithm
  200.         self.edns = -1
  201.         self.ednsflags = 0
  202.         self.payload = 0
  203.         self.cache = None
  204.  
  205.     
  206.     def read_resolv_conf(self, f):
  207.         if isinstance(f, str) or isinstance(f, unicode):
  208.             
  209.             try:
  210.                 f = open(f, 'r')
  211.             except IOError:
  212.                 self.nameservers = [
  213.                     '127.0.0.1']
  214.                 return None
  215.  
  216.             want_close = True
  217.         else:
  218.             want_close = False
  219.         
  220.         try:
  221.             for l in f:
  222.                 if len(l) == 0 and l[0] == '#' or l[0] == ';':
  223.                     continue
  224.                 
  225.                 tokens = l.split()
  226.                 if len(tokens) == 0:
  227.                     continue
  228.                 
  229.                 if tokens[0] == 'nameserver':
  230.                     self.nameservers.append(tokens[1])
  231.                     continue
  232.                 if tokens[0] == 'domain':
  233.                     self.domain = dns.name.from_text(tokens[1])
  234.                     continue
  235.                 if tokens[0] == 'search':
  236.                     for suffix in tokens[1:]:
  237.                         self.search.append(dns.name.from_text(suffix))
  238.                     
  239.         finally:
  240.             if want_close:
  241.                 f.close()
  242.             
  243.  
  244.         if len(self.nameservers) == 0:
  245.             self.nameservers.append('127.0.0.1')
  246.         
  247.  
  248.     
  249.     def _determine_split_char(self, entry):
  250.         if entry.find(' ') >= 0:
  251.             split_char = ' '
  252.         elif entry.find(',') >= 0:
  253.             split_char = ','
  254.         else:
  255.             split_char = ' '
  256.         return split_char
  257.  
  258.     
  259.     def _config_win32_nameservers(self, nameservers):
  260.         nameservers = str(nameservers)
  261.         split_char = self._determine_split_char(nameservers)
  262.         ns_list = nameservers.split(split_char)
  263.         for ns in ns_list:
  264.             if ns not in self.nameservers:
  265.                 self.nameservers.append(ns)
  266.                 continue
  267.         
  268.  
  269.     
  270.     def _config_win32_domain(self, domain):
  271.         self.domain = dns.name.from_text(str(domain))
  272.  
  273.     
  274.     def _config_win32_search(self, search):
  275.         search = str(search)
  276.         split_char = self._determine_split_char(search)
  277.         search_list = search.split(split_char)
  278.         for s in search_list:
  279.             if s not in self.search:
  280.                 self.search.append(dns.name.from_text(s))
  281.                 continue
  282.         
  283.  
  284.     
  285.     def _config_win32_fromkey(self, key):
  286.         
  287.         try:
  288.             (servers, rtype) = _winreg.QueryValueEx(key, 'NameServer')
  289.         except WindowsError:
  290.             servers = None
  291.  
  292.         if servers:
  293.             self._config_win32_nameservers(servers)
  294.             
  295.             try:
  296.                 (dom, rtype) = _winreg.QueryValueEx(key, 'Domain')
  297.                 if dom:
  298.                     self._config_win32_domain(dom)
  299.             except WindowsError:
  300.                 pass
  301.             except:
  302.                 None<EXCEPTION MATCH>WindowsError
  303.             
  304.  
  305.         None<EXCEPTION MATCH>WindowsError
  306.         
  307.         try:
  308.             (servers, rtype) = _winreg.QueryValueEx(key, 'DhcpNameServer')
  309.         except WindowsError:
  310.             servers = None
  311.  
  312.         if servers:
  313.             self._config_win32_nameservers(servers)
  314.             
  315.             try:
  316.                 (dom, rtype) = _winreg.QueryValueEx(key, 'DhcpDomain')
  317.                 if dom:
  318.                     self._config_win32_domain(dom)
  319.             except WindowsError:
  320.                 pass
  321.             except:
  322.                 None<EXCEPTION MATCH>WindowsError
  323.             
  324.  
  325.         None<EXCEPTION MATCH>WindowsError
  326.         
  327.         try:
  328.             (search, rtype) = _winreg.QueryValueEx(key, 'SearchList')
  329.         except WindowsError:
  330.             search = None
  331.  
  332.         if search:
  333.             self._config_win32_search(search)
  334.         
  335.  
  336.     
  337.     def read_registry(self):
  338.         lm = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE)
  339.         want_scan = False
  340.         
  341.         try:
  342.             tcp_params = _winreg.OpenKey(lm, 'SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters')
  343.             want_scan = True
  344.         except EnvironmentError:
  345.             tcp_params = _winreg.OpenKey(lm, 'SYSTEM\\CurrentControlSet\\Services\\VxD\\MSTCP')
  346.         
  347.  
  348.         
  349.         try:
  350.             self._config_win32_fromkey(tcp_params)
  351.         finally:
  352.             tcp_params.Close()
  353.  
  354.         if want_scan:
  355.             interfaces = _winreg.OpenKey(lm, 'SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces')
  356.             
  357.             try:
  358.                 i = 0
  359.                 while True:
  360.                     
  361.                     try:
  362.                         guid = _winreg.EnumKey(interfaces, i)
  363.                         i += 1
  364.                         key = _winreg.OpenKey(interfaces, guid)
  365.                         if not self._win32_is_nic_enabled(lm, guid, key):
  366.                             continue
  367.                         
  368.                         
  369.                         try:
  370.                             self._config_win32_fromkey(key)
  371.                         finally:
  372.                             key.Close()
  373.  
  374.                     continue
  375.                     except EnvironmentError:
  376.                         break
  377.                         continue
  378.                     
  379.  
  380.                     None<EXCEPTION MATCH>EnvironmentError
  381.             finally:
  382.                 interfaces.Close()
  383.  
  384.         lm.Close()
  385.  
  386.     
  387.     def _win32_is_nic_enabled(self, lm, guid, interface_key):
  388.         
  389.         try:
  390.             connection_key = _winreg.OpenKey(lm, 'SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection' % guid)
  391.             
  392.             try:
  393.                 (pnp_id, ttype) = _winreg.QueryValueEx(connection_key, 'PnpInstanceID')
  394.                 if ttype != _winreg.REG_SZ:
  395.                     raise ValueError
  396.                 ttype != _winreg.REG_SZ
  397.                 device_key = _winreg.OpenKey(lm, 'SYSTEM\\CurrentControlSet\\Enum\\%s' % pnp_id)
  398.                 
  399.                 try:
  400.                     (flags, ttype) = _winreg.QueryValueEx(device_key, 'ConfigFlags')
  401.                     if ttype != _winreg.REG_DWORD:
  402.                         raise ValueError
  403.                     ttype != _winreg.REG_DWORD
  404.                     return not (flags & 1)
  405.                 finally:
  406.                     device_key.Close()
  407.  
  408.             finally:
  409.                 connection_key.Close()
  410.  
  411.         except (EnvironmentError, ValueError):
  412.             
  413.             try:
  414.                 (nte, ttype) = _winreg.QueryValueEx(interface_key, 'NTEContextList')
  415.                 return nte is not None
  416.             except WindowsError:
  417.                 return False
  418.             
  419.  
  420.             None<EXCEPTION MATCH>WindowsError
  421.  
  422.  
  423.     
  424.     def _compute_timeout(self, start):
  425.         now = time.time()
  426.         if now < start:
  427.             if start - now > 1:
  428.                 raise Timeout
  429.             start - now > 1
  430.             now = start
  431.         
  432.         duration = now - start
  433.         if duration >= self.lifetime:
  434.             raise Timeout
  435.         duration >= self.lifetime
  436.         return min(self.lifetime - duration, self.timeout)
  437.  
  438.     
  439.     def query(self, qname, rdtype = dns.rdatatype.A, rdclass = dns.rdataclass.IN, tcp = False, source = None):
  440.         if isinstance(qname, (str, unicode)):
  441.             qname = dns.name.from_text(qname, None)
  442.         
  443.         if isinstance(rdtype, str):
  444.             rdtype = dns.rdatatype.from_text(rdtype)
  445.         
  446.         if isinstance(rdclass, str):
  447.             rdclass = dns.rdataclass.from_text(rdclass)
  448.         
  449.         qnames_to_try = []
  450.         if qname.is_absolute():
  451.             qnames_to_try.append(qname)
  452.         elif len(qname) > 1:
  453.             qnames_to_try.append(qname.concatenate(dns.name.root))
  454.         
  455.         if self.search:
  456.             for suffix in self.search:
  457.                 qnames_to_try.append(qname.concatenate(suffix))
  458.             
  459.         else:
  460.             qnames_to_try.append(qname.concatenate(self.domain))
  461.         all_nxdomain = True
  462.         start = time.time()
  463.         for qname in qnames_to_try:
  464.             if self.cache:
  465.                 answer = self.cache.get((qname, rdtype, rdclass))
  466.                 if answer:
  467.                     return answer
  468.             
  469.             request = dns.message.make_query(qname, rdtype, rdclass)
  470.             if self.keyname is not None:
  471.                 request.use_tsig(self.keyring, self.keyname, algorithm = self.keyalgorithm)
  472.             
  473.             request.use_edns(self.edns, self.ednsflags, self.payload)
  474.             response = None
  475.             nameservers = self.nameservers[:]
  476.             backoff = 0.1
  477.             while response is None:
  478.                 if len(nameservers) == 0:
  479.                     raise NoNameservers
  480.                 len(nameservers) == 0
  481.                 for nameserver in nameservers[:]:
  482.                     timeout = self._compute_timeout(start)
  483.                     
  484.                     try:
  485.                         if tcp:
  486.                             response = dns.query.tcp(request, nameserver, timeout, self.port, source = source)
  487.                         else:
  488.                             response = dns.query.udp(request, nameserver, timeout, self.port, source = source)
  489.                     except (socket.error, dns.exception.Timeout):
  490.                         response = None
  491.                         continue
  492.                     except dns.query.UnexpectedSource:
  493.                         response = None
  494.                         continue
  495.                     except dns.exception.FormError:
  496.                         nameservers.remove(nameserver)
  497.                         response = None
  498.                         continue
  499.  
  500.                     rcode = response.rcode()
  501.                     if rcode == dns.rcode.NOERROR or rcode == dns.rcode.NXDOMAIN:
  502.                         break
  503.                     
  504.                     if rcode != dns.rcode.SERVFAIL:
  505.                         nameservers.remove(nameserver)
  506.                     
  507.                     response = None
  508.                 
  509.                 if response is not None:
  510.                     break
  511.                 
  512.                 if len(nameservers) > 0:
  513.                     timeout = self._compute_timeout(start)
  514.                     sleep_time = min(timeout, backoff)
  515.                     backoff *= 2
  516.                     time.sleep(sleep_time)
  517.                     continue
  518.             if response.rcode() == dns.rcode.NXDOMAIN:
  519.                 continue
  520.             
  521.             all_nxdomain = False
  522.         
  523.         if all_nxdomain:
  524.             raise NXDOMAIN
  525.         all_nxdomain
  526.         answer = Answer(qname, rdtype, rdclass, response)
  527.         if self.cache:
  528.             self.cache.put((qname, rdtype, rdclass), answer)
  529.         
  530.         return answer
  531.  
  532.     
  533.     def use_tsig(self, keyring, keyname = None, algorithm = dns.tsig.default_algorithm):
  534.         self.keyring = keyring
  535.         if keyname is None:
  536.             self.keyname = self.keyring.keys()[0]
  537.         else:
  538.             self.keyname = keyname
  539.         self.keyalgorithm = algorithm
  540.  
  541.     
  542.     def use_edns(self, edns, ednsflags, payload):
  543.         if edns is None:
  544.             edns = -1
  545.         
  546.         self.edns = edns
  547.         self.ednsflags = ednsflags
  548.         self.payload = payload
  549.  
  550.  
  551. default_resolver = None
  552.  
  553. def get_default_resolver():
  554.     global default_resolver
  555.     if default_resolver is None:
  556.         default_resolver = Resolver()
  557.     
  558.     return default_resolver
  559.  
  560.  
  561. def query(qname, rdtype = dns.rdatatype.A, rdclass = dns.rdataclass.IN, tcp = False, source = None):
  562.     return get_default_resolver().query(qname, rdtype, rdclass, tcp, source)
  563.  
  564.  
  565. def zone_for_name(name, rdclass = dns.rdataclass.IN, tcp = False, resolver = None):
  566.     if isinstance(name, (str, unicode)):
  567.         name = dns.name.from_text(name, dns.name.root)
  568.     
  569.     if resolver is None:
  570.         resolver = get_default_resolver()
  571.     
  572.     if not name.is_absolute():
  573.         raise NotAbsolute(name)
  574.     name.is_absolute()
  575.     while None:
  576.         
  577.         try:
  578.             answer = resolver.query(name, dns.rdatatype.SOA, rdclass, tcp)
  579.             return name
  580.         continue
  581.         except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer):
  582.             
  583.             try:
  584.                 name = name.parent()
  585.             except dns.name.NoParent:
  586.                 raise NoRootSOA
  587.             except:
  588.                 None<EXCEPTION MATCH>dns.name.NoParent
  589.             
  590.  
  591.             None<EXCEPTION MATCH>dns.name.NoParent
  592.         
  593.  
  594.         return None
  595.  
  596.