o
    ¯bÁ  ã                   @   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g d¢g d¢g d¢g d¢gZg d¢g d¢g d¢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ÚpÚ53zThe port on which to listen)úresolv-confNNz6Override location of resolv.conf (implies --recursive))ú
hosts-fileNNz!Perform lookups with a hosts file)ÚcacheÚczEnable record caching)Ú	recursiveÚrzPerform recursive lookups)ÚverboseÚvzLog verboselyr
   )Ú
optActionsNc                 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   ó*   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   ó   zOptions.opt_pyzonec                 C   r!   )z6Specify the filename of a BIND9 syntax zone definitionr"   N)r#   r$   r%   r   r&   r   r'   r(   r   r   r    Úopt_bindzone8   r+   zOptions.opt_bindzonec                 C   s¦   |  dd¡}t|ƒdkrt d¡‚|d   d¡}t|ƒdkr&|d tjf}n zt|d ƒ}W n ty?   t d|d ›�¡‚w |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   ÚPORTÚintÚ
ValueErrorr   r'   )r   Ú	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   s  | d rd| d< g | _ g | _| jD ]}z| j t |¡¡ W q ty0   t ¡  t	 
d| ¡‚w | jD ]}z| j t |¡¡ W q4 tyS   t ¡  t	 
d| ¡‚w | jD ]}tjj|Ž }| j  |¡ | j | j d  ¡ ¡ qWzt| d ƒ| d< W d S  ty�   t	 
d | d ¡¡‚w )Nr   Tr   zInvalid syntax in éÿÿÿÿr   zInvalid port: {!r})ÚsvcsÚzonesr   r'   r   ÚPySourceAuthorityÚ	ExceptionÚ	tracebackÚ	print_excr   r&   r   ÚBindAuthorityr   r   ÚSecondaryAuthorityServiceÚfromServerAddressAndDomainsÚgetAuthorityr4   r5   Úformat)r   ÚfÚsvcr   r   r    ÚpostOptionsV   s6   
þ
þ
ÿzOptions.postOptions)Ú__name__Ú
__module__Ú__qualname__ÚoptParametersÚoptFlagsr   ÚCompletionsÚCompleteNetInterfacesÚcompDatar=   r   r   r*   r,   r9   r:   rI   r   r   r   r    r	      s*    ÷ý
ÿr	   c                 C   s€   ddl m}m}m} g g }}| d r| |j| d d�¡ | d r-| |j| d d�¡ | d r<| |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   )Ú
resolvconf)Útwisted.namesr   rR   rS   r'   ÚCacheResolverÚResolverÚcreateResolver)Úconfigr   rR   rS   ÚcaÚclr   r   r    Ú_buildResolversr   s   
r]   c           
      C   s’   t | ƒ\}}t | j||| d ¡}t |¡}d|_t ¡ }t	j
|ft	j|ffD ]\}}|| d || d d�}| |¡ q'| jD ]}	|	 |¡ q?|S )Nr   r   r   r
   )r
   )r]   r   ÚDNSServerFactoryr=   r   ÚDNSDatagramProtocolÚnoisyr   ÚMultiServicer   Ú	TCPServerÚ	UDPServerÚsetServiceParentr<   )
rZ   r[   r\   rG   r   ÚretÚklassÚargÚsrH   r   r   r    ÚmakeService‰   s   

ri   )Ú__doc__r#   r@   Útwisted.applicationr   r   rV   r   r   r   r   Útwisted.pythonr   r	   r]   ri   r   r   r   r    Ú<module>   s   a