U
    
W[                     @   s   d Z ddlZddlZddlmZ ddlmZ ddlmZm	Z	 ddlm
Z
 ddl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)usage)dns)internetservice)server)	authority)	secondaryc                   @   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   3/usr/lib/python3/dist-packages/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_pyzone1   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_bindzone7   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 f 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 %rN)
splitlenr   r#   r   ZPORTint
ValueErrorr   r$   )r   Z	ip_domainargsZ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   qzt| d | d< W n* tk
r0   t	
d| d f 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   )r   fsvcr   r   r   postOptionsW   s0    


zOptions.postOptions)__name__
__module____qualname__ZoptParametersZoptFlagsr   ZCompletionsZCompleteNetInterfacesZcompDatar6   r   r   r'   r(   r2   r3   r<   r   r   r   r   r	      s,   


	
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   )clientr   hostsr   r   )r   r   )filer   r   )Z
resolvconf)twisted.namesr@   r   rA   r$   ZCacheResolverZResolverZcreateResolver)configr@   r   rA   caclr   r   r   _buildResolverss   s    
rG   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
   )rG   r   ZDNSServerFactoryr6   r   ZDNSDatagramProtocolZnoisyr   ZMultiServicer   Z	TCPServerZ	UDPServerZsetServiceParentr5   )
rD   rE   rF   r:   r   Zretklassargsr;   r   r   r   makeService   s    

rK   )__doc__r    r8   Ztwisted.pythonr   rC   r   Ztwisted.applicationr   r   r   r   r   r	   rG   rK   r   r   r   r   <module>   s   `