
    \d                         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ej                  Zd Zd	 ZdS )
z
Domain Name Server
    N)internetservice)	authoritydns	secondaryserver)usagec                       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j                    i	          Zd
Z	d
Z
d Zd Zd Zd Zd Z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                 x    t           j                            |            d| d<   g | _        g | _        g | _        d S )Nr   r   )r	   r   __init__	bindfiles	zonefilessecondariesselfs    1lib/python3.11/site-packages/twisted/names/tap.pyr   zOptions.__init__+   s=    t$$$Y    c                     t           j                            |          st          j        |dz             | j                            |           dS )z7Specify the filename of a Python syntax zone definition: No such fileN)ospathexistsr	   
UsageErrorr   appendr!   filenames     r"   
opt_pyzonezOptions.opt_pyzone2   L    w~~h'' 	@"8.>#>???h'''''r#   c                     t           j                            |          st          j        |dz             | j                            |           dS )z6Specify the filename of a BIND9 syntax zone definitionr%   N)r&   r'   r(   r	   r)   r   r*   r+   s     r"   opt_bindzonezOptions.opt_bindzone8   r.   r#   c                    |                     dd          }t          |          dk    rt          j        d          |d                              d          }t          |          dk    r|d         t          j        f}nL	 t          |d                   }n+# t          $ r t          j        d|d                   w xY 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   s        r"   opt_secondaryzOptions.opt_secondary>   s     sA&&t99>>"#RSSSq'--$$w<<1qz38,GG71:   &I71:II   qz4(G47) 455555s   B (C c                 &    | dxx         dz  cc<   dS )zIncrement verbosity levelr   r3   N r    s    r"   opt_verbosezOptions.opt_verboseR   s    Y1r#   c                 |   | d         rd| d<   g | _         g | _        | j        D ]g}	 | j                            t	          j        |                     0# t          $ r+ t          j                     t          j
        d|z             w xY w| j        D ]g}	 | j                            t	          j        |                     0# t          $ r+ t          j                     t          j
        d|z             w xY w| j        D ]f}t          j        j        | }| j                             |           | j                            | j         d                                                    g	 t%          | d                   | d<   d S # t&          $ r. t          j
        d                    | d                             w xY 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getAuthorityr9   r:   format)r!   fsvcs      r"   postOptionszOptions.postOptionsV   s    	% $D	
 	A 	AAA
!!)"=a"@"@AAAA A A A#%%%&';a'?@@@A  	A 	AAA
!!)"9!"<"<==== A A A#%%%&';a'?@@@A ! 	< 	<A5QSTUCIS!!!Jdim88::;;;;	NtF|,,DLLL 	N 	N 	N"#7#>#>tF|#L#LMMM	Ns#   ,A5B,C5C7)F 8F;)__name__
__module____qualname__optParametersoptFlagsr	   CompletionsCompleteNetInterfacescompDatarE   r   r   r-   r0   r>   rA   rQ   r@   r#   r"   r   r      s       @@@:::	
 	
 	
 	HGG
M 	0//777)))H !u !<!<!>!>?  H EI  ( ( (( ( (6 6 6(  N N N N Nr#   r   c                 p   ddl m}m}m} g g }}| d         r/|                    |                    | d                              | d         r/|                    |                    | d                              | d         r/|                    |                    | 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   r[   r\   r*   CacheResolverResolvercreateResolver)configr   r[   r\   cacls         r"   _buildResolversrf   r   s     3222222222Bg B
		%%%fY.?%@@AAAl =
		%..f\&:.;;<<<k K
		&''6-3H'IIJJJr6Mr#   c                    t          |           \  }}t          j        | j        ||| d                   }t	          j        |          }d|_        t          j                    }t          j
        |ft          j        |ffD ]4\  }} || d         || d                   }|                    |           5| j        D ]}	|	                    |           |S )Nr   r   r   r   )r   )rf   r   DNSServerFactoryrE   r   DNSDatagramProtocolnoisyr   MultiServicer   	TCPServer	UDPServersetServiceParentrD   )
rc   rd   re   rO   r   retklassargsrP   s
             r"   makeServicers      s    V$$FBb"fY6GHHA""AAG


 
 C",a083Eq2IJ    E&.#1DEEE	3{ " "S!!!!Jr#   )__doc__r&   rH   twisted.applicationr   r   r_   r   r   r   r   twisted.pythonr	   r   rf   rs   r@   r#   r"   <module>rw      s   
  
			     1 1 1 1 1 1 1 1 ; ; ; ; ; ; ; ; ; ; ; ;            ^N ^N ^N ^N ^Nem ^N ^N ^NB  .    r#   