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