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

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. from __future__ import generators
  5. import errno
  6. import select
  7. import socket
  8. import struct
  9. import sys
  10. import time
  11. import dns.exception as dns
  12. import dns.inet as dns
  13. import dns.name as dns
  14. import dns.message as dns
  15. import dns.rdataclass as dns
  16. import dns.rdatatype as dns
  17.  
  18. class UnexpectedSource(dns.exception.DNSException):
  19.     pass
  20.  
  21.  
  22. class BadResponse(dns.exception.FormError):
  23.     pass
  24.  
  25.  
  26. def _compute_expiration(timeout):
  27.     if timeout is None:
  28.         return None
  29.     return time.time() + timeout
  30.  
  31.  
  32. def _wait_for(ir, iw, ix, expiration):
  33.     done = False
  34.     check_count = 0
  35.     while not done:
  36.         check_count += 1
  37.         if check_count > 5000:
  38.             print >>sys.stderr, 'DNS LOOP? dns.query._wait_for has run %d times' % check_count
  39.         
  40.         if expiration is None:
  41.             timeout = None
  42.         else:
  43.             timeout = expiration - time.time()
  44.             if timeout <= 0:
  45.                 raise dns.exception.Timeout
  46.             timeout <= 0
  47.         
  48.         try:
  49.             if timeout is None:
  50.                 (r, w, x) = select.select(ir, iw, ix)
  51.             else:
  52.                 (r, w, x) = select.select(ir, iw, ix, timeout)
  53.         except select.error:
  54.             e = None
  55.             if e.args[0] != errno.EINTR:
  56.                 raise e
  57.             e.args[0] != errno.EINTR
  58.  
  59.         done = True
  60.         if len(r) == 0 and len(w) == 0 and len(x) == 0:
  61.             raise dns.exception.Timeout
  62.         len(x) == 0
  63.  
  64.  
  65. def _wait_for_readable(s, expiration):
  66.     _wait_for([
  67.         s], [], [
  68.         s], expiration)
  69.  
  70.  
  71. def _wait_for_writable(s, expiration):
  72.     _wait_for([], [
  73.         s], [
  74.         s], expiration)
  75.  
  76.  
  77. def _addresses_equal(af, a1, a2):
  78.     n1 = dns.inet.inet_pton(af, a1[0])
  79.     n2 = dns.inet.inet_pton(af, a2[0])
  80.     if n1 == n2:
  81.         pass
  82.     return a1[1:] == a2[1:]
  83.  
  84.  
  85. def udp(q, where, timeout = None, port = 53, af = None, source = None, source_port = 0, ignore_unexpected = False, one_rr_per_rrset = False):
  86.     wire = q.to_wire()
  87.     if af is None:
  88.         
  89.         try:
  90.             af = dns.inet.af_for_address(where)
  91.         af = dns.inet.AF_INET
  92.  
  93.     
  94.     if af == dns.inet.AF_INET:
  95.         destination = (where, port)
  96.         if source is not None:
  97.             source = (source, source_port)
  98.         
  99.     elif af == dns.inet.AF_INET6:
  100.         destination = (where, port, 0, 0)
  101.         if source is not None:
  102.             source = (source, source_port, 0, 0)
  103.         
  104.     
  105.     s = socket.socket(af, socket.SOCK_DGRAM, 0)
  106.     
  107.     try:
  108.         expiration = _compute_expiration(timeout)
  109.         s.setblocking(0)
  110.         if source is not None:
  111.             s.bind(source)
  112.         
  113.         _wait_for_writable(s, expiration)
  114.         s.sendto(wire, destination)
  115.         check_count = 0
  116.         while None:
  117.             check_count += 1
  118.             if check_count > 5000:
  119.                 print >>sys.stderr, 'DNS LOOP? dns.query.udp loop has run %d times' % check_count
  120.             
  121.             (wire, from_address) = s.recvfrom(65535)
  122.             if (_addresses_equal(af, from_address, destination) or dns.inet.is_multicast(where)) and from_address[1:] == destination[1:]:
  123.                 break
  124.             
  125.             if not ignore_unexpected:
  126.                 raise UnexpectedSource('got a response from %s instead of %s' % (from_address, destination))
  127.             ignore_unexpected
  128.         s.close()
  129.         r = dns.message.from_wire(wire, keyring = q.keyring, request_mac = q.mac, one_rr_per_rrset = one_rr_per_rrset)
  130.         if not q.is_response(r):
  131.             raise BadResponse
  132.         q.is_response(r)
  133.         return r
  134.  
  135.  
  136.  
  137. def _net_read(sock, count, expiration):
  138.     s = ''
  139.     check_count = 0
  140.     while count > 0:
  141.         check_count += 1
  142.         if check_count > 5000:
  143.             print >>sys.stderr, 'DNS LOOP? dns.query._net_read loop has run %d times' % check_count
  144.         
  145.         _wait_for_readable(sock, expiration)
  146.         n = sock.recv(count)
  147.         if n == '':
  148.             raise EOFError
  149.         n == ''
  150.         count = count - len(n)
  151.         s = s + n
  152.     return s
  153.  
  154.  
  155. def _net_write(sock, data, expiration):
  156.     current = 0
  157.     l = len(data)
  158.     check_count = 0
  159.     while current < l:
  160.         check_count += 1
  161.         if check_count > 5000:
  162.             print >>sys.stderr, 'DNS LOOP? dns.query._net_write loop has run %d times' % check_count
  163.         
  164.         _wait_for_writable(sock, expiration)
  165.         current += sock.send(data[current:])
  166.  
  167.  
  168. def _connect(s, address):
  169.     
  170.     try:
  171.         s.connect(address)
  172.     except socket.error:
  173.         (ty, v) = sys.exc_info()[:2]
  174.         if v[0] != errno.EINPROGRESS and v[0] != errno.EWOULDBLOCK and v[0] != errno.EALREADY:
  175.             raise v
  176.         v[0] != errno.EALREADY
  177.  
  178.  
  179.  
  180. def tcp(q, where, timeout = None, port = 53, af = None, source = None, source_port = 0, one_rr_per_rrset = False):
  181.     wire = q.to_wire()
  182.     if af is None:
  183.         
  184.         try:
  185.             af = dns.inet.af_for_address(where)
  186.         af = dns.inet.AF_INET
  187.  
  188.     
  189.     if af == dns.inet.AF_INET:
  190.         destination = (where, port)
  191.         if source is not None:
  192.             source = (source, source_port)
  193.         
  194.     elif af == dns.inet.AF_INET6:
  195.         destination = (where, port, 0, 0)
  196.         if source is not None:
  197.             source = (source, source_port, 0, 0)
  198.         
  199.     
  200.     s = socket.socket(af, socket.SOCK_STREAM, 0)
  201.     
  202.     try:
  203.         expiration = _compute_expiration(timeout)
  204.         s.setblocking(0)
  205.         if source is not None:
  206.             s.bind(source)
  207.         
  208.         _connect(s, destination)
  209.         l = len(wire)
  210.         tcpmsg = struct.pack('!H', l) + wire
  211.         _net_write(s, tcpmsg, expiration)
  212.         ldata = _net_read(s, 2, expiration)
  213.         (l,) = struct.unpack('!H', ldata)
  214.         wire = _net_read(s, l, expiration)
  215.     finally:
  216.         s.close()
  217.  
  218.     r = dns.message.from_wire(wire, keyring = q.keyring, request_mac = q.mac, one_rr_per_rrset = one_rr_per_rrset)
  219.     if not q.is_response(r):
  220.         raise BadResponse
  221.     q.is_response(r)
  222.     return r
  223.  
  224.  
  225. def xfr(where, zone, rdtype = dns.rdatatype.AXFR, rdclass = dns.rdataclass.IN, timeout = None, port = 53, keyring = None, keyname = None, relativize = True, af = None, lifetime = None, source = None, source_port = 0, serial = 0, use_udp = False, keyalgorithm = dns.tsig.default_algorithm):
  226.     if isinstance(zone, (str, unicode)):
  227.         zone = dns.name.from_text(zone)
  228.     
  229.     if isinstance(rdtype, str):
  230.         rdtype = dns.rdatatype.from_text(rdtype)
  231.     
  232.     q = dns.message.make_query(zone, rdtype, rdclass)
  233.     if rdtype == dns.rdatatype.IXFR:
  234.         rrset = dns.rrset.from_text(zone, 0, 'IN', 'SOA', '. . %u 0 0 0 0' % serial)
  235.         q.authority.append(rrset)
  236.     
  237.     if keyring is not None:
  238.         q.use_tsig(keyring, keyname, algorithm = keyalgorithm)
  239.     
  240.     wire = q.to_wire()
  241.     if af is None:
  242.         
  243.         try:
  244.             af = dns.inet.af_for_address(where)
  245.         af = dns.inet.AF_INET
  246.  
  247.     
  248.     if af == dns.inet.AF_INET:
  249.         destination = (where, port)
  250.         if source is not None:
  251.             source = (source, source_port)
  252.         
  253.     elif af == dns.inet.AF_INET6:
  254.         destination = (where, port, 0, 0)
  255.         if source is not None:
  256.             source = (source, source_port, 0, 0)
  257.         
  258.     
  259.     if use_udp:
  260.         if rdtype != dns.rdatatype.IXFR:
  261.             raise ValueError('cannot do a UDP AXFR')
  262.         rdtype != dns.rdatatype.IXFR
  263.         s = socket.socket(af, socket.SOCK_DGRAM, 0)
  264.     else:
  265.         s = socket.socket(af, socket.SOCK_STREAM, 0)
  266.     s.setblocking(0)
  267.     if source is not None:
  268.         s.bind(source)
  269.     
  270.     expiration = _compute_expiration(lifetime)
  271.     _connect(s, destination)
  272.     l = len(wire)
  273.     if use_udp:
  274.         _wait_for_writable(s, expiration)
  275.         s.send(wire)
  276.     else:
  277.         tcpmsg = struct.pack('!H', l) + wire
  278.         _net_write(s, tcpmsg, expiration)
  279.     done = False
  280.     soa_rrset = None
  281.     soa_count = 0
  282.     if relativize:
  283.         origin = zone
  284.         oname = dns.name.empty
  285.     else:
  286.         origin = None
  287.         oname = zone
  288.     tsig_ctx = None
  289.     first = True
  290.     while not done:
  291.         mexpiration = _compute_expiration(timeout)
  292.         if mexpiration is None or mexpiration > expiration:
  293.             mexpiration = expiration
  294.         
  295.         if use_udp:
  296.             _wait_for_readable(s, expiration)
  297.             (wire, from_address) = s.recvfrom(65535)
  298.         else:
  299.             ldata = _net_read(s, 2, mexpiration)
  300.             (l,) = struct.unpack('!H', ldata)
  301.             wire = _net_read(s, l, mexpiration)
  302.         r = dns.message.from_wire(wire, keyring = q.keyring, request_mac = q.mac, xfr = True, origin = origin, tsig_ctx = tsig_ctx, multi = True, first = first, one_rr_per_rrset = rdtype == dns.rdatatype.IXFR)
  303.         tsig_ctx = r.tsig_ctx
  304.         first = False
  305.         answer_index = 0
  306.         delete_mode = False
  307.         expecting_SOA = False
  308.         if soa_rrset is None:
  309.             if not (r.answer) or r.answer[0].name != oname:
  310.                 raise dns.exception.FormError
  311.             r.answer[0].name != oname
  312.             rrset = r.answer[0]
  313.             if rrset.rdtype != dns.rdatatype.SOA:
  314.                 raise dns.exception.FormError('first RRset is not an SOA')
  315.             rrset.rdtype != dns.rdatatype.SOA
  316.             answer_index = 1
  317.             soa_rrset = rrset.copy()
  318.             if rdtype == dns.rdatatype.IXFR:
  319.                 if soa_rrset[0].serial == serial:
  320.                     done = True
  321.                 else:
  322.                     expecting_SOA = True
  323.             
  324.         
  325.         for rrset in r.answer[answer_index:]:
  326.             if done:
  327.                 raise dns.exception.FormError('answers after final SOA')
  328.             done
  329.             if rrset.rdtype == dns.rdatatype.SOA and rrset.name == oname:
  330.                 if expecting_SOA:
  331.                     if rrset[0].serial != serial:
  332.                         raise dns.exception.FormError('IXFR base serial mismatch')
  333.                     rrset[0].serial != serial
  334.                     expecting_SOA = False
  335.                 elif rdtype == dns.rdatatype.IXFR:
  336.                     delete_mode = not delete_mode
  337.                 
  338.                 if rrset == soa_rrset and not delete_mode:
  339.                     done = True
  340.                 
  341.             not delete_mode
  342.             if expecting_SOA:
  343.                 rdtype = dns.rdatatype.AXFR
  344.                 expecting_SOA = False
  345.                 continue
  346.         
  347.         if done and q.keyring and not (r.had_tsig):
  348.             raise dns.exception.FormError('missing TSIG')
  349.         not (r.had_tsig)
  350.         yield r
  351.     s.close()
  352.  
  353.