
    Eqg-                     n   d Z ddlZddlZddlmZmZmZmZmZ ddl	Z
ddlZ
ddlZ
ddlZ
ddlZ
ddlZ
ddlZ
ddlZ
ddlZ
 G d de
j        j                  Ze
j        j        Ze
j        j        Ze
j        j        Ze
j        j        Ze
j        j        Ze
j        j        Z G d de
j        j                  ZdS )zDNS Versioned Zones.    N)CallableDequeOptionalSetUnionc                       e Zd ZdZdS )UseTransactionz-To alter a versioned zone, use a transaction.N)__name__
__module____qualname____doc__     ?/var/www/html/env/lib/python3.11/site-packages/dns/versioned.pyr	   r	      s        7777r   r	   c                       e Zd Zg dZeZej        j        ddfde	e
ej        j        ef                  dej        j        dede	ed ege	e         f                  f fdZ	 d'd	e	e         d
e	e         defdZd(dedefdZd Zd Zd Zde	e         ddfdZde	ed ege	e         f                  ddfdZd Zd Zd Zd Zd Z d Z!	 d(de
ej        j        ef         dedej"        j        f fdZ#de
ej        j        ef         ddfd Z$ej%        j&        dfde
ej        j        ef         d!e
ej%        j'        ef         d"e
ej%        j'        ef         dedej(        j)        f
 fd#Z*ej%        j&        dfde
ej        j        ef         d!e
ej%        j'        ef         d"e
ej%        j'        ef         dede	ej(        j)                 f
 fd$Z+ej%        j&        fde
ej        j        ef         d!e
ej%        j'        ef         d"e
ej%        j'        ef         ddfd%Z,de
ej        j        ef         dej(        j)        ddfd&Z- xZ.S ))Zone)	_versions_versions_lock
_write_txn_write_waiters_write_event_pruning_policy_readersTNoriginrdclass
relativizepruning_policyc                    t                                          |||           t          j                    | _        t          j                    | _        || j        | _	        n|| _	        d| _
        d| _        t          j                    | _        t                      | _        |                     dt!          | d          |           dS )a  Initialize a versioned zone object.

        *origin* is the origin of the zone.  It may be a ``dns.name.Name``,
        a ``str``, or ``None``.  If ``None``, then the zone's origin will
        be set by the first ``$ORIGIN`` line in a zone file.

        *rdclass*, an ``int``, the zone's rdata class; the default is class IN.

        *relativize*, a ``bool``, determine's whether domain names are
        relativized to the zone's origin.  The default is ``True``.

        *pruning policy*, a function taking a ``Zone`` and a ``Version`` and returning
        a ``bool``, or ``None``.  Should the version be pruned?  If ``None``,
        the default policy, which retains one version is used.
        NT)replacement)super__init__collectionsdequer   	threadingLock_version_lock_default_pruning_policyr   r   r   r   setr   _commit_version_unlockedWritableVersion)selfr   r   r   r   	__class__s        r   r!   zZone.__init__.   s    , 	*555)4):)<)<&^--!#'#?D  #1D 157;6A6G6I6I*-%%%%/$D9996	
 	
 	
 	
 	
r   idserialreturnc                    ||t          d          | j        5  |:d }t          | j                  D ]}|j        |k    r|} n|t          d          n|| j        rt          j        j	        }n| j
        J | j
        }d }t          | j                  D ]_}|j                            |          }|rA|                    | j        t          j        j                  }|r|d         j        |k    r|} n`|t          d          n| j        d         }t%          | d|          }| j                            |           |cd d d            S # 1 swxY w Y   d S )Nz!cannot specify both id and serialzversion not foundr   zserial not foundF)
ValueErrorr&   reversedr   r-   KeyErrorr   dnsnameemptyr   nodesgetget_rdatasetr   	rdatatypeSOAr.   Transactionr   add)	r+   r-   r.   versionvonamenrdstxns	            r   readerzZone.readerS   s    >f0@AAA 	 	~!$.11  Atrzz"# " ?"#6777 ##? (HNEE;222 KE!$.11 " "AE**A "nnT\3=;LMM "3q6=F#:#:&'G!E?"#5666 # .,dE733CMc""";	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   D)EEEFr   c                    d }	 | j         5  | j        6|| j        k    r+t          | |d          | _        d | _        	 d d d            nYt	          j                    }| j                            |           d d d            n# 1 swxY w Y   |                                 | j        	                                 | j        S )NT)make_immutable)
r&   r   r   r=   r$   Eventr   appendwait_setup_version)r+   r   events      r   writerzZone.writerw   s+   *	# 2 2
 ?*u8I/I/I '2k$' ' 'DO )-D%!2 2 2 2 2 2 2( "))#**5111+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2R JJLLLU*	X 	&&(((s   2B	-BB	Bc                     t          | j                  dk    r9| j                                        | _        | j                                         d S d S )Nr   )lenr   popleftr   r(   )r+   s    r   !_maybe_wakeup_one_waiter_unlockedz&Zone._maybe_wakeup_one_waiter_unlocked   sR    t"##a'' $ 3 ; ; = =D!!##### ('r   c                     dS )NTr   )r+   zoner?   s      r   r'   zZone._default_pruning_policy   s    tr   c                    t          | j                  dk    sJ t          | j                  dk    rt          d | j        D                       }n| j        d         j        }| j        d         j        |k     rs|                     | | j        d                   rV| j                                         | j        d         j        |k     r%|                     | | j        d                   Pd S d S d S d S )Nr   c              3   .   K   | ]}|j         j        V  d S N)r?   r-   ).0rD   s     r   	<genexpr>z0Zone._prune_versions_unlocked.<locals>.<genexpr>   s&      EES[^EEEEEEr   r1   )rO   r   r   minr-   r   rP   )r+   
least_kepts     r   _prune_versions_unlockedzZone._prune_versions_unlocked   s    4>""Q&&&& t}!!EEt}EEEEEJJ+.JnQ"Z//D4H4H$.#5
 5
/ N""$$$ nQ"Z//D4H4H$.#5
 5
/////////r   max_versionsc                 v    dk     rt          d          d }nfd}|                     |           dS )zYSet a pruning policy that retains up to the specified number
        of versions
        N   zmax versions must be at least 1c                     dS )NFr   )rS   _s     r   policyz%Zone.set_max_versions.<locals>.policy   s    ur   c                 4    t          | j                  k    S rV   )rO   r   )rS   r`   r\   s     r   ra   z%Zone.set_max_versions.<locals>.policy   s    4>**\99r   )r2   set_pruning_policy)r+   r\   ra   s    ` r   set_max_versionszZone.set_max_versions   ss     #q(8(8>???   
: : : : : 	'''''r   ra   c                     || j         }| j        5  || _        |                                  ddd           dS # 1 swxY w Y   dS )a  Set the pruning policy for the zone.

        The *policy* function takes a `Version` and returns `True` if
        the version should be pruned, and `False` otherwise.  `None`
        may also be specified for policy, in which case the default policy
        is used.

        Pruning checking proceeds from the least version and the first
        time the function returns `False`, the checking stops.  I.e. the
        retained versions are always a consecutive sequence.
        N)r'   r&   r   r[   )r+   ra   s     r   rc   zZone.set_pruning_policy   s     >1F 	, 	,#)D ))+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,s   :>>c                     | j         5  | j                            |           |                                  d d d            d S # 1 swxY w Y   d S rV   )r&   r   remover[   r+   rD   s     r   	_end_readzZone._end_read   s     	, 	,M  %%%))+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,s   /AAAc                 V    | j         |k    sJ d | _         |                                  d S rV   )r   rQ   rh   s     r   _end_write_unlockedzZone._end_write_unlocked   s4    #%%%%..00000r   c                 p    | j         5  |                     |           d d d            d S # 1 swxY w Y   d S rV   )r&   rk   rh   s     r   
_end_writezZone._end_write   s     	* 	*$$S)))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s   +//c                     | j                             |           |                                  |j        | _        | j        || _        ||                     |           d S d S rV   )r   rI   r[   r8   r   rk   r+   rD   r?   r   s       r   r)   zZone._commit_version_unlocked   sh    g&&&%%''']
; DK?$$S))))) ?r   c                 t    | j         5  |                     |||           d d d            d S # 1 swxY w Y   d S rV   )r&   r)   ro   s       r   _commit_versionzZone._commit_version  s     	@ 	@))#w???	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@s   -11c                 f    t          | j                  dk    r| j        d         j        dz   }nd}|S )Nr   r1   r^   )rO   r   r-   )r+   r-   s     r   _get_next_version_idzZone._get_next_version_id  s7    t~""#&*BBB	r   r6   createc                 X    |rt           t                                          |          S rV   )r	   r    	find_node)r+   r6   rt   r,   s      r   rv   zZone.find_node  s+      	!  ww  &&&r   c                     t           rV   r	   )r+   r6   s     r   delete_nodezZone.delete_node  s    r   rdtypecoversc                     |rt           t                                          |||          }t          j                            |          S rV   )r	   r    find_rdatasetr5   rdatasetImmutableRdatasetr+   r6   rz   r{   rt   r~   r,   s         r   r}   zZone.find_rdataset  sD      	!  77((vv>>|--h777r   c                     |rt           t                                          |||          }|t          j                            |          S d S rV   )r	   r    r:   r5   r~   r   r   s         r   r:   zZone.get_rdataset$  sO      	!  77''ff==<11(;;;4r   c                     t           rV   rx   )r+   r6   rz   r{   s       r   delete_rdatasetzZone.delete_rdataset3  s
     r   c                     t           rV   rx   )r+   r6   r   s      r   replace_rdatasetzZone.replace_rdataset;  s
     r   )NN)F)/r
   r   r   	__slots__Nodenode_factoryr5   
rdataclassINr   r   r6   Namestr
RdataClassboolr   Versionr!   intr=   rE   rM   rQ   r'   r[   rd   rc   ri   rk   rm   r)   rq   rs   noderv   ry   r;   NONE	RdataTyper~   Rdatasetr}   r:   r   r   __classcell__)r,   s   @r   r   r   !   st         I L
 .1^->PT#
 #
sx}c123#
 *#
 	#

 !67*;Xd^*K!LM#
 #
 #
 #
 #
 #
L AE" "3-"08"	" " " "H/ /$ /; / / / /b$ $ $  
% % %$(Xc] (t ( ( ( ($,x(98D>(IJK,	, , , ,(, , ,
1 1 1
* * ** * *@ @ @   ?D' '#(-,-'7;'	' ' ' ' ' 'chmS&8 9 d     7:m6H
8 
8CHM3&'
8 cm-s23
8 cm-s23	
8
 
8 
	
8 
8 
8 
8 
8 
8  7:m6H CHM3&' cm-s23 cm-s23	
  
#,'	(     & 7:m6H	 CHM3&' cm-s23 cm-s23	
 
   #(-,-<?L<Q	       r   r   ) r   r"   r$   typingr   r   r   r   r   dns.exceptionr5   dns.immutabledns.namedns.nodedns.rdataclassdns.rdatasetdns.rdatatypedns.rdtypes.ANY.SOAdns.zone	exceptionDNSExceptionr	   rS   VersionedNoder   ImmutableVersionedNodeImmutableNoder   r*   ImmutableVersionr=   r   r   r   r   <module>r      sb             8 8 8 8 8 8 8 8 8 8 8 8 8 8                           8 8 8 8 8S]/ 8 8 8
 x/
(
(*8, h"] ] ] ] ]38= ] ] ] ] ]r   