home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_1688 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  15.4 KB  |  594 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (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.edns = -1
  200.         self.ednsflags = 0
  201.         self.payload = 0
  202.         self.cache = None
  203.  
  204.     
  205.     def read_resolv_conf(self, f):
  206.         if isinstance(f, str) or isinstance(f, unicode):
  207.             
  208.             try:
  209.                 f = open(f, 'r')
  210.             except IOError:
  211.                 self.nameservers = [
  212.                     '127.0.0.1']
  213.                 return None
  214.  
  215.             want_close = True
  216.         else:
  217.             want_close = False
  218.         
  219.         try:
  220.             for l in f:
  221.                 if len(l) == 0 and l[0] == '#' or l[0] == ';':
  222.                     continue
  223.                 
  224.                 tokens = l.split()
  225.                 if len(tokens) == 0:
  226.                     continue
  227.                 
  228.                 if tokens[0] == 'nameserver':
  229.                     self.nameservers.append(tokens[1])
  230.                     continue
  231.                 if tokens[0] == 'domain':
  232.                     self.domain = dns.name.from_text(tokens[1])
  233.                     continue
  234.                 if tokens[0] == 'search':
  235.                     for suffix in tokens[1:]:
  236.                         self.search.append(dns.name.from_text(suffix))
  237.                     
  238.         finally:
  239.             if want_close:
  240.                 f.close()
  241.             
  242.  
  243.         if len(self.nameservers) == 0:
  244.             self.nameservers.append('127.0.0.1')
  245.         
  246.  
  247.     
  248.     def _determine_split_char(self, entry):
  249.         if entry.find(' ') >= 0:
  250.             split_char = ' '
  251.         elif entry.find(',') >= 0:
  252.             split_char = ','
  253.         else:
  254.             split_char = ' '
  255.         return split_char
  256.  
  257.     
  258.     def _config_win32_nameservers(self, nameservers):
  259.         nameservers = str(nameservers)
  260.         split_char = self._determine_split_char(nameservers)
  261.         ns_list = nameservers.split(split_char)
  262.         for ns in ns_list:
  263.             if ns not in self.nameservers:
  264.                 self.nameservers.append(ns)
  265.                 continue
  266.         
  267.  
  268.     
  269.     def _config_win32_domain(self, domain):
  270.         self.domain = dns.name.from_text(str(domain))
  271.  
  272.     
  273.     def _config_win32_search(self, search):
  274.         search = str(search)
  275.         split_char = self._determine_split_char(search)
  276.         search_list = search.split(split_char)
  277.         for s in search_list:
  278.             if s not in self.search:
  279.                 self.search.append(dns.name.from_text(s))
  280.                 continue
  281.         
  282.  
  283.     
  284.     def _config_win32_fromkey(self, key):
  285.         
  286.         try:
  287.             (servers, rtype) = _winreg.QueryValueEx(key, 'NameServer')
  288.         except WindowsError:
  289.             servers = None
  290.  
  291.         if servers:
  292.             self._config_win32_nameservers(servers)
  293.             
  294.             try:
  295.                 (dom, rtype) = _winreg.QueryValueEx(key, 'Domain')
  296.                 if dom:
  297.                     self._config_win32_domain(servers)
  298.             except WindowsError:
  299.                 pass
  300.             except:
  301.                 None<EXCEPTION MATCH>WindowsError
  302.             
  303.  
  304.         None<EXCEPTION MATCH>WindowsError
  305.         
  306.         try:
  307.             (servers, rtype) = _winreg.QueryValueEx(key, 'DhcpNameServer')
  308.         except WindowsError:
  309.             servers = None
  310.  
  311.         if servers:
  312.             self._config_win32_nameservers(servers)
  313.             
  314.             try:
  315.                 (dom, rtype) = _winreg.QueryValueEx(key, 'DhcpDomain')
  316.                 if dom:
  317.                     self._config_win32_domain(servers)
  318.             except WindowsError:
  319.                 pass
  320.             except:
  321.                 None<EXCEPTION MATCH>WindowsError
  322.             
  323.  
  324.         None<EXCEPTION MATCH>WindowsError
  325.         
  326.         try:
  327.             (search, rtype) = _winreg.QueryValueEx(key, 'SearchList')
  328.         except WindowsError:
  329.             search = None
  330.  
  331.         if search:
  332.             self._config_win32_search(search)
  333.         
  334.  
  335.     
  336.     def read_registry(self):
  337.         lm = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE)
  338.         want_scan = False
  339.         
  340.         try:
  341.             tcp_params = _winreg.OpenKey(lm, 'SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters')
  342.             want_scan = True
  343.         except EnvironmentError:
  344.             tcp_params = _winreg.OpenKey(lm, 'SYSTEM\\CurrentControlSet\\Services\\VxD\\MSTCP')
  345.         
  346.  
  347.         
  348.         try:
  349.             self._config_win32_fromkey(tcp_params)
  350.         finally:
  351.             tcp_params.Close()
  352.  
  353.         if want_scan:
  354.             interfaces = _winreg.OpenKey(lm, 'SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces')
  355.             
  356.             try:
  357.                 i = 0
  358.                 while True:
  359.                     
  360.                     try:
  361.                         guid = _winreg.EnumKey(interfaces, i)
  362.                         i += 1
  363.                         key = _winreg.OpenKey(interfaces, guid)
  364.                         if not self._win32_is_nic_enabled(lm, guid, key):
  365.                             continue
  366.                         
  367.                         
  368.                         try:
  369.                             self._config_win32_fromkey(key)
  370.                         finally:
  371.                             key.Close()
  372.  
  373.                     continue
  374.                     except EnvironmentError:
  375.                         break
  376.                         continue
  377.                     
  378.  
  379.                     None<EXCEPTION MATCH>EnvironmentError
  380.             finally:
  381.                 interfaces.Close()
  382.  
  383.         lm.Close()
  384.  
  385.     
  386.     def _win32_is_nic_enabled(self, lm, guid, interface_key):
  387.         
  388.         try:
  389.             connection_key = _winreg.OpenKey(lm, 'SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection' % guid)
  390.             
  391.             try:
  392.                 (pnp_id, ttype) = _winreg.QueryValueEx(connection_key, 'PnpInstanceID')
  393.                 if ttype != _winreg.REG_SZ:
  394.                     raise ValueError
  395.                 ttype != _winreg.REG_SZ
  396.                 device_key = _winreg.OpenKey(lm, 'SYSTEM\\CurrentControlSet\\Enum\\%s' % pnp_id)
  397.                 
  398.                 try:
  399.                     (flags, ttype) = _winreg.QueryValueEx(device_key, 'ConfigFlags')
  400.                     if ttype != _winreg.REG_DWORD:
  401.                         raise ValueError
  402.                     ttype != _winreg.REG_DWORD
  403.                     return not (flags & 1)
  404.                 finally:
  405.                     device_key.Close()
  406.  
  407.             finally:
  408.                 connection_key.Close()
  409.  
  410.         except (EnvironmentError, ValueError):
  411.             
  412.             try:
  413.                 (nte, ttype) = _winreg.QueryValueEx(interface_key, 'NTEContextList')
  414.                 return nte is not None
  415.             except WindowsError:
  416.                 return False
  417.             
  418.  
  419.             None<EXCEPTION MATCH>WindowsError
  420.  
  421.  
  422.     
  423.     def _compute_timeout(self, start):
  424.         now = time.time()
  425.         if now < start:
  426.             if start - now > 1:
  427.                 raise Timeout
  428.             start - now > 1
  429.             now = start
  430.         
  431.         duration = now - start
  432.         if duration >= self.lifetime:
  433.             raise Timeout
  434.         duration >= self.lifetime
  435.         return min(self.lifetime - duration, self.timeout)
  436.  
  437.     
  438.     def query(self, qname, rdtype = dns.rdatatype.A, rdclass = dns.rdataclass.IN, tcp = False):
  439.         if isinstance(qname, (str, unicode)):
  440.             qname = dns.name.from_text(qname, None)
  441.         
  442.         if isinstance(rdtype, str):
  443.             rdtype = dns.rdatatype.from_text(rdtype)
  444.         
  445.         if isinstance(rdclass, str):
  446.             rdclass = dns.rdataclass.from_text(rdclass)
  447.         
  448.         qnames_to_try = []
  449.         if qname.is_absolute():
  450.             qnames_to_try.append(qname)
  451.         elif len(qname) > 1:
  452.             qnames_to_try.append(qname.concatenate(dns.name.root))
  453.         
  454.         if self.search:
  455.             for suffix in self.search:
  456.                 qnames_to_try.append(qname.concatenate(suffix))
  457.             
  458.         else:
  459.             qnames_to_try.append(qname.concatenate(self.domain))
  460.         all_nxdomain = True
  461.         start = time.time()
  462.         for qname in qnames_to_try:
  463.             if self.cache:
  464.                 answer = self.cache.get((qname, rdtype, rdclass))
  465.                 if answer:
  466.                     return answer
  467.             
  468.             request = dns.message.make_query(qname, rdtype, rdclass)
  469.             if self.keyname is not None:
  470.                 request.use_tsig(self.keyring, self.keyname)
  471.             
  472.             request.use_edns(self.edns, self.ednsflags, self.payload)
  473.             response = None
  474.             nameservers = self.nameservers[:]
  475.             backoff = 0.1
  476.             while response is None:
  477.                 if len(nameservers) == 0:
  478.                     raise NoNameservers
  479.                 len(nameservers) == 0
  480.                 for nameserver in nameservers[:]:
  481.                     timeout = self._compute_timeout(start)
  482.                     
  483.                     try:
  484.                         if tcp:
  485.                             response = dns.query.tcp(request, nameserver, timeout, self.port)
  486.                         else:
  487.                             response = dns.query.udp(request, nameserver, timeout, self.port)
  488.                     except (socket.error, dns.exception.Timeout):
  489.                         response = None
  490.                         continue
  491.                     except dns.query.UnexpectedSource:
  492.                         response = None
  493.                         continue
  494.                     except dns.exception.FormError:
  495.                         nameservers.remove(nameserver)
  496.                         response = None
  497.                         continue
  498.  
  499.                     rcode = response.rcode()
  500.                     if rcode == dns.rcode.NOERROR or rcode == dns.rcode.NXDOMAIN:
  501.                         break
  502.                     
  503.                     if rcode != dns.rcode.SERVFAIL:
  504.                         nameservers.remove(nameserver)
  505.                     
  506.                     response = None
  507.                 
  508.                 if response is not None:
  509.                     break
  510.                 
  511.                 if len(nameservers) > 0:
  512.                     timeout = self._compute_timeout(start)
  513.                     sleep_time = min(timeout, backoff)
  514.                     backoff *= 2
  515.                     time.sleep(sleep_time)
  516.                     continue
  517.             if response.rcode() == dns.rcode.NXDOMAIN:
  518.                 continue
  519.             
  520.             all_nxdomain = False
  521.         
  522.         if all_nxdomain:
  523.             raise NXDOMAIN
  524.         all_nxdomain
  525.         answer = Answer(qname, rdtype, rdclass, response)
  526.         if self.cache:
  527.             self.cache.put((qname, rdtype, rdclass), answer)
  528.         
  529.         return answer
  530.  
  531.     
  532.     def use_tsig(self, keyring, keyname = None):
  533.         self.keyring = keyring
  534.         if keyname is None:
  535.             self.keyname = self.keyring.keys()[0]
  536.         else:
  537.             self.keyname = keyname
  538.  
  539.     
  540.     def use_edns(self, edns, ednsflags, payload):
  541.         if edns is None:
  542.             edns = -1
  543.         
  544.         self.edns = edns
  545.         self.ednsflags = ednsflags
  546.         self.payload = payload
  547.  
  548.  
  549. default_resolver = None
  550.  
  551. def get_default_resolver():
  552.     global default_resolver
  553.     if default_resolver is None:
  554.         default_resolver = Resolver()
  555.     
  556.     return default_resolver
  557.  
  558.  
  559. def query(qname, rdtype = dns.rdatatype.A, rdclass = dns.rdataclass.IN, tcp = False):
  560.     return get_default_resolver().query(qname, rdtype, rdclass, tcp)
  561.  
  562.  
  563. def zone_for_name(name, rdclass = dns.rdataclass.IN, tcp = False, resolver = None):
  564.     if isinstance(name, (str, unicode)):
  565.         name = dns.name.from_text(name, dns.name.root)
  566.     
  567.     if resolver is None:
  568.         resolver = get_default_resolver()
  569.     
  570.     if not name.is_absolute():
  571.         raise NotAbsolute, name
  572.     name.is_absolute()
  573.     while None:
  574.         
  575.         try:
  576.             answer = resolver.query(name, dns.rdatatype.SOA, rdclass, tcp)
  577.             return name
  578.         continue
  579.         except (dns.resolver.NXDOMAIN, dns.resolver.NoAnswer):
  580.             
  581.             try:
  582.                 name = name.parent()
  583.             except dns.name.NoParent:
  584.                 raise NoRootSOA
  585.             except:
  586.                 None<EXCEPTION MATCH>dns.name.NoParent
  587.             
  588.  
  589.             None<EXCEPTION MATCH>dns.name.NoParent
  590.         
  591.  
  592.         return None
  593.  
  594.