ó
ß8Yc           @   sÖ  d  d l  Z  d  d l Z d  d l Z d  d l Z d Z d Z d Z d Z d Z d Z	 d Z
 d Z d Z d	 Z d
 Z d Z d Z d Z d Z d Z d Z e Z d d, d     YZ d   Z d d- d     YZ d d. d     YZ d   Z d   Z d   Z d   Z d   Z d   Z  d   Z! d   Z" d   Z# d    Z$ d!   Z% d"   Z& d#   Z' d$   Z( d%   Z) d&   Z* d'   Z+ e, d( k rŅe- Z d) GHe+ e. e j/  d k r³e j/ d p¶d* e e  Z0 e j1 d+  n  d S(/   i’’’’Ni   i   i   i   i’   i   i   i
   i   i   i   i   i   i!   t   DNSQueryHeaderc           B   s2   e  Z d  Z d   Z d   Z d   Z d   Z RS(   s   !HBBHHHHc         C   sy   d |  _  d |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d |  _	 d |  _
 d |  _ d |  _ d  S(   Ni    (   t   dns_idt   dns_rdt   dns_tct   dns_aat
   dns_opcodet   dns_qrt	   dns_rcodet   dns_zt   dns_rat   dns_qdcountt   dns_ancountt   dns_nscountt   dns_arcount(   t   self(    (    s"   /usr/share/authconfig/dnsclient.pyt   __init__/   s    												c      	   C   s   t  j t j |  j |  j d @|  j d @d >B|  j d @d >B|  j d @d >B|  j	 d @d >B|  j
 d @|  j d @d >B|  j d @d >B|  j |  j |  j |  j  S(   Ni   i   i   i   i   i   (   t   structt   packR    t   FORMATR   R   R   R   R   R   R   R   R	   R
   R   R   R   (   R   (    (    s"   /usr/share/authconfig/dnsclient.pyR   >   s    7c         C   sŹ   t  j t j | d |  j   ! \ |  _ } } |  _ |  _ |  _ |  _	 | d @|  _
 | d ?d @|  _ | d ?d @|  _ | d ?d @|  _ | d ?d @|  _ | d @|  _ | d ?d @|  _ | d ?d @|  _ d  S(   Ni    i   i   i   i   i   i   (   R   t   unpackR    R   t   sizeR   R
   R   R   R   R   R   R   R   R   R   R   R	   (   R   t   datat   byte1t   byte2(    (    s"   /usr/share/authconfig/dnsclient.pyR   N   s    Fc         C   s   t  j t j  S(   N(   R   t   calcsizeR    R   (   R   (    (    s"   /usr/share/authconfig/dnsclient.pyR   Z   s    (   t   __name__t
   __module__R   R   R   R   R   (    (    (    s"   /usr/share/authconfig/dnsclient.pyR    -   s
   			c         C   s   t    } | j |   | S(   N(   R    R   (   R   t   header(    (    s"   /usr/share/authconfig/dnsclient.pyt   unpackQueryHeader]   s    	t	   DNSResultc           B   sA   e  Z d  Z d Z d   Z d   Z d   Z d   Z d   Z RS(   s   !HHIHs   !HHc         C   s:   d |  _  d |  _ d |  _ d |  _ d |  _ d  |  _ d  S(   Nt    i    (   t   dns_namet   dns_typet	   dns_classt   dns_ttlt   dns_rlengtht   Nonet   rdata(   R   (    (    s"   /usr/share/authconfig/dnsclient.pyR   e   s    					c         C   s>   t  j t j | d |  j   ! \ |  _ |  _ |  _ |  _ d  S(   Ni    (	   R   R   R   R   R   R    R!   R"   R#   (   R   R   (    (    s"   /usr/share/authconfig/dnsclient.pyR   m   s    c         C   s2   t  j t j | d |  j   ! \ |  _ |  _ d  S(   Ni    (   R   R   R   t   QFORMATt   qsizeR    R!   (   R   R   (    (    s"   /usr/share/authconfig/dnsclient.pyt   qunpackq   s    c         C   s   t  j t j  S(   N(   R   R   R   R   (   R   (    (    s"   /usr/share/authconfig/dnsclient.pyR   t   s    c         C   s   t  j t j  S(   N(   R   R   R   R&   (   R   (    (    s"   /usr/share/authconfig/dnsclient.pyR'   w   s    (	   R   R   R   R&   R   R   R(   R   R'   (    (    (    s"   /usr/share/authconfig/dnsclient.pyR   b   s   				t   DNSRDatac           B   s   e  Z d    Z RS(   c         C   s   d  S(   N(    (   R   (    (    s"   /usr/share/authconfig/dnsclient.pyR   {   s    (   R   R   R   (    (    (    s"   /usr/share/authconfig/dnsclient.pyR)   z   s   c         C   sD   d } |  j  d  }  x( |  D]  } | t t |   | 7} q W| S(   NR   t   .(   t   splitt   chrt   len(   t   namet   outt   part(    (    s"   /usr/share/authconfig/dnsclient.pyt   dnsNameToLabel°   s
    c         C   s°   t    } d | _ d | _ d | _ d | _ d | _ t |   } | sL d S| j   | } | t | d ? 7} | t | d @ 7} | t | d ? 7} | t | d @ 7} | S(   Ni    i   R   i   i’   (	   R    R   R   R   R   R
   R1   R   R,   (   t   queryt   qclasst   qtypeR   t   qlabelR/   (    (    s"   /usr/share/authconfig/dnsclient.pyt   dnsFormatQuery·   s    						c         C   s  |  s
 d	 Sd } |  } d } d } yŌ xĶ t | d  rō t | d  d @r | t | d  d @d >t | d  } | r | d 7} n  d } q( n  | | d t | d  d !d 7} | rŁ | t | d  d 7} n  | t | d  d } q( WWn t k
 r
d
 SX|  | | | f S(   NR   i   i    iĄ   i?   i   i   R*   (   R   N(   R   N(   R$   t   ordt
   IndexError(   t   labelt   baset   updatet   restt   outputt   skip(    (    s"   /usr/share/authconfig/dnsclient.pyt   dnsParseLabelĢ   s*    *# c         C   sæ   t    } t |   d k  r( d | _ d  St |  d  d >t |  d  d >Bt |  d  d >Bt |  d  d >B| _ t r» d	 t |  d  t |  d  t |  d  t |  d  f GHn  | S(
   Ni   i    i   i   i   i   i   i   s   A = %d.%d.%d.%d.(   R)   R-   t   addressR$   R7   t   DEBUG_DNSCLIENT(   R   R:   R%   (    (    s"   /usr/share/authconfig/dnsclient.pyt	   dnsParseAę   s    		M@c         C   s]   t  |   d k  r d St |  d  } t  |   | d k  r@ d S|  | d |  d | d !f S(   Ni   R   i    (   R   N(   R   N(   R-   R$   R7   (   R   t   tlen(    (    s"   /usr/share/authconfig/dnsclient.pyt   dnsParseTextņ   s    c         C   s:   t    } t |  |  \ } | _ t r6 d | j GHn  | S(   Ns   NS DNAME = "%s".(   R)   R?   t   nsdnameRA   (   R   R:   R%   R<   (    (    s"   /usr/share/authconfig/dnsclient.pyt
   dnsParseNSś   s
    	c         C   s:   t    } t |  |  \ } | _ t r6 d | j GHn  | S(   Ns   CNAME = "%s".(   R)   R?   t   cnameRA   (   R   R:   R%   R<   (    (    s"   /usr/share/authconfig/dnsclient.pyt   dnsParseCNAME  s
    	c         C   s"  t    } d } t |  |  \ } | _ | j d  k r: d  St | |  \ } | _ | j d  k re d  St |  t j |  k  r d  St j | | t j |    \ | _	 | _
 | _ | _ | _ t rd | j GHd | j GHd | j	 GHd | j
 GHd | j GHd | j GHd | j GHn  | S(	   Ns   !IIIIIs   SOA(mname) = "%s".s   SOA(rname) = "%s".s   SOA(serial) = %d.s   SOA(refresh) = %d.s   SOA(retry) = %d.s   SOA(expire) = %d.s   SOA(minimum) = %d.(   R)   R?   t   mnameR$   t   rnameR-   R   R   R   t   serialt   refresht   retryt   expiret   minimumRA   (   R   R:   R%   t   formatR<   (    (    s"   /usr/share/authconfig/dnsclient.pyt   dnsParseSOA  s(    	=c         C   s   d  S(   N(   R$   (   R   R:   (    (    s"   /usr/share/authconfig/dnsclient.pyt   dnsParseNULL"  s    c         C   s   d  S(   N(   R$   (   R   R:   (    (    s"   /usr/share/authconfig/dnsclient.pyt   dnsParseWKS&  s    c         C   sa   t    } t |   \ } | _ | r< t |  \ } | _ n  t r] d | j GHd | j GHn  | S(   Ns   HINFO(cpu) = "%s".s   HINFO(os) = "%s".(   R)   RD   t   cput   osRA   (   R   R:   R%   R<   (    (    s"   /usr/share/authconfig/dnsclient.pyt   dnsParseHINFO)  s    	c         C   s   t    } t |   d k  r d  St |  d  d >t |  d  B| _ t |  d |  \ } | _ t r d | j GHd | j GHn  | S(   Ni   i    i   i   s   MX(exchanger) = "%s".s   MX(preference) = %d.(   R)   R-   R$   R7   t
   preferenceR?   t   exchangeRA   (   R   R:   R%   R<   (    (    s"   /usr/share/authconfig/dnsclient.pyt
   dnsParseMX3  s    	%c         C   s7   t    } t |   \ } | _ t r3 d | j GHn  | S(   Ns   TXT = "%s".(   R)   RD   R   RA   (   R   R:   R%   R<   (    (    s"   /usr/share/authconfig/dnsclient.pyt   dnsParseTXT>  s
    	c         C   s:   t    } t |  |  \ } | _ t r6 d | j GHn  d  S(   Ns   PTR = "%s".(   R)   R?   t   ptrdnameRA   (   R   R:   R%   R<   (    (    s"   /usr/share/authconfig/dnsclient.pyt   dnsParsePTRE  s    	c         C   sµ   t    } d } t j |  } t |   | k  r4 d  St j | |  |   \ | _ | _ | _ t	 |  | |  \ } | _
 t r± d | j
 GHd | j GHd | j GHd | j GHn  | S(   Ns   !HHHs   SRV(server) = "%s".s   SRV(weight) = %d.s   SRV(priority) = %d.s   SRV(port) = %d.(   R)   R   R   R-   R$   R   t   priorityt   weightt   portR?   t   serverRA   (   R   R:   R%   RP   t   flenR<   (    (    s"   /usr/share/authconfig/dnsclient.pyt   dnsParseSRVK  s    	(c         C   sĘ  y t  |   } Wn t j k
 r' g  SX| j d k r; g  S| j d k rN g  S|  | j   } g  } x© t | j  D] } | s g  St   } t	 | |   \ } } | d  k r² g  St |  | j   k  rĪ g  S| j |  | | j   } t rt d | | j | j f GHqt qt Wxt | j | j | j  D]~} t	 | |   \ } } | d  k rYg  St   } | | _ t |  | j   k  rg  S| j |  | | j   } t rŃd | | j | j | j | j f GHn  t |  | j k  rųt rōd GHn  g  Si t t 6t t 6t t 6t t 6t  t! 6t" t# 6t$ t% 6t& t' 6t( t) 6t* t+ 6t, t- 6} | j | k rrt rd | j GHqn  | | j | | j  |   | _. | | j } | | g 7} q.W| sĀ| g } n  | S(   Ni   i    s(   Queried for '%s', class = %d, type = %d.s4   Answer %d for '%s', class = %d, type = %d, ttl = %d.s   Answer too short.s#   Don't know how to parse RR type %d!(/   R   R   t   errorR   R   R   t   xrangeR
   R   R?   R$   R-   R'   R(   RA   R!   R    R   R   R   R   R   R"   R#   RB   t   DNS_T_ARF   t   DNS_T_NSRH   t   DNS_T_CNAMERQ   t	   DNS_T_SOARR   t
   DNS_T_NULLRS   t	   DNS_T_WKSR\   t	   DNS_T_PTRRV   t   DNS_T_HINFORY   t   DNS_T_MXRZ   t	   DNS_T_TXTRb   t	   DNS_T_SRVR%   (   t   resultsR   R<   t   rrlistt   it   rrR9   t   fmap(    (    s"   /usr/share/authconfig/dnsclient.pyt   dnsParseResults[  sr    	$		
 c         C   s?   t  |  | |  } | s g  St j |  } | s5 g  St |  S(   N(   R6   t   acutilt   res_sendRu   (   R2   R3   R4   t   qdatat   answer(    (    s"   /usr/share/authconfig/dnsclient.pyR2   ®  s    t   __main__s   Sending query.s   devserv.devel.redhat.com.i    (    (    (    (2   R   t   sockett   sysRv   t   DNS_C_INt   DNS_C_CSt   DNS_C_CHAOSt   DNS_C_HSt	   DNS_C_ANYRe   Rf   Rg   Rh   Ri   Rj   Rk   Rl   Rm   Rn   Ro   t	   DNS_T_ANYt   FalseRA   R    R   R   R)   R1   R6   R?   RB   RD   RF   RH   RQ   RR   RS   RV   RY   RZ   R\   Rb   Ru   R2   R   t   TrueR-   t   argvRs   t   exit(    (    (    s"   /usr/share/authconfig/dnsclient.pyt   <module>   s`   0	6											
					S		(