U
    2ÜŸj¿  ã                   @   sn   d Z ddlZddlZddlmZmZ ddlmZmZm	Z	m
Z
 ddlmZ G dd„ dejƒZdd	„ Zd
d„ ZdS )z
Domain Name Server
é    N)ÚinternetÚservice)Ú	authorityÚdnsÚ	secondaryÚserver)Úusagec                   @   s    e Zd Zddddgddddgd	d
d
dgdd
d
dggZdddgdddgdddggZejde ¡ id�Zd
Z	d
Z
dd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd
S )$ÚOptionsÚ	interfaceÚiÚ zThe interface to which to bindÚportÚpZ53zThe port on which to listenúresolv-confNz6Override location of resolv.conf (implies --recursive)ú
hosts-filez!Perform lookups with a hosts fileÚcacheÚczEnable record cachingÚ	recursiveÚrzPerform recursive lookupsÚverboseÚvzLog verbosely)Z
optActionsc                 C   s*   t j | ¡ d| d< g | _g | _g | _d S )Nr   r   )r   r	   Ú__init__Ú	bindfilesÚ	zonefilesÚsecondaries©Úself© r   ú5/tmp/pip-unpacked-wheel-4b529toj/twisted/names/tap.pyr   +   s
    zOptions.__init__c                 C   s*   t j |¡st |d ¡‚| j |¡ dS )z7Specify the filename of a Python syntax zone definitionú: No such fileN)ÚosÚpathÚexistsr   Ú
UsageErrorr   Úappend©r   Úfilenamer   r   r   Ú
opt_pyzone2   s    zOptions.opt_pyzonec                 C   s*   t j |¡st |d ¡‚| j |¡ dS )z6Specify the filename of a BIND9 syntax zone definitionr   N)r    r!   r"   r   r#   r   r$   r%   r   r   r   Úopt_bindzone8   s    zOptions.opt_bindzonec                 C   s¬   |  dd¡}t|ƒdkr"t d¡‚|d   d¡}t|ƒdkrL|d tjf}nFzt|d ƒ}W n( tk
r„   t d|d ›�¡‚Y nX |d |f}| j 	||d gf¡ dS )	zwAct as secondary for the specified domain, performing
        zone transfers from the specified IP (IP/domain)
        ú/é   é   z-Argument must be of the form IP[:port]/domainr   ú:z$Specify an integer port number, not N)
ÚsplitÚlenr   r#   r   ZPORTÚintÚ
ValueErrorr   r$   )r   Z	ip_domainÚargsÚaddressr   r   r   r   Úopt_secondary>   s    
ÿ
zOptions.opt_secondaryc                 C   s   | d  d7  < dS )zIncrement verbosity levelr   r*   Nr   r   r   r   r   Úopt_verboseR   s    zOptions.opt_verbosec              	   C   s6  | d rd| d< g | _ g | _| jD ]F}z| j t |¡¡ W q" tk
rf   t ¡  t	 
d| ¡‚Y q"X q"| jD ]F}z| j t |¡¡ W qp tk
r´   t ¡  t	 
d| ¡‚Y qpX qp| jD ]2}tjj|Ž }| j  |¡ | j | j d  ¡ ¡ q¾zt| d ƒ| d< W n* tk
�r0   t	 
d | d ¡¡‚Y nX d S )Nr   Tr   zInvalid syntax in éÿÿÿÿr   zInvalid port: {!r})ÚsvcsÚzonesr   r$   r   ZPySourceAuthorityÚ	ExceptionÚ	tracebackÚ	print_excr   r#   r   ZBindAuthorityr   r   ZSecondaryAuthorityServiceZfromServerAddressAndDomainsZgetAuthorityr/   r0   Úformat)r   ÚfÚsvcr   r   r   ÚpostOptionsV   s0    


zOptions.postOptions)Ú__name__Ú
__module__Ú__qualname__ZoptParametersZoptFlagsr   ZCompletionsZCompleteNetInterfacesZcompDatar7   r   r   r'   r(   r3   r4   r>   r   r   r   r   r	      s0   

ü
÷ý
ÿr	   c                 C   s€   ddl m}m}m} g g  }}| d r<| |j| d d�¡ | d rZ| |j| d d�¡ | d rx| |j| d	 d
�¡ ||fS )a%  
    Build DNS resolver instances in an order which leaves recursive
    resolving as a last resort.

    @type config: L{Options} instance
    @param config: Parsed command-line configuration

    @return: Two-item tuple of a list of cache resovers and a list of client
        resolvers
    r   )r   ÚclientÚhostsr   r   )r   r   )Úfiler   r   )Z
resolvconf)Útwisted.namesr   rB   rC   r$   ZCacheResolverÚResolverZcreateResolver)Úconfigr   rB   rC   ÚcaÚclr   r   r   Ú_buildResolversr   s    
rJ   c           
      C   s’   t | ƒ\}}t | j||| d ¡}t |¡}d|_t ¡ }t	j
|ft	j|ffD ](\}}|| d || d d�}| |¡ qN| jD ]}	|	 |¡ q~|S )Nr   r   r   r
   )r
   )rJ   r   ZDNSServerFactoryr7   r   ZDNSDatagramProtocolZnoisyr   ZMultiServicer   Ú	TCPServerÚ	UDPServerZsetServiceParentr6   )
rG   rH   rI   r<   r   ÚretÚklassÚargÚsr=   r   r   r   ÚmakeService‰   s    

rQ   )Ú__doc__r    r9   Ztwisted.applicationr   r   rE   r   r   r   r   Ztwisted.pythonr   r	   rJ   rQ   r   r   r   r   Ú<module>   s   a