a Me-@sdZddlZddlZddlmZmZmZmZmZddl Z ddl Z ddl Z ddl Z ddlZ ddlZ ddlZ ddlZ ddlZ Gddde jjZe jjZe jjZe jjZe jjZe jjZe jjZGddde jjZdS)zDNS Versioned Zones.N)CallableDequeOptionalSetUnionc@seZdZdZdS)UseTransactionz-To alter a versioned zone, use a transaction.N)__name__ __module__ __qualname____doc__r r 1/usr/lib/python3.9/site-packages/dns/versioned.pyrsrc sXeZdZgdZeZejjddfe e ej j e fejjee edege efdfdd Zd7e ee eeddd Zd8eed d d ZddZddZddZe eddddZe edege efddddZddZddZddZd d!Zd"d#Z d$d%Z!d9e ej j e feej"jd&fd'd( Z#e ej j e fdd)d*d+Z$ej%j&d fe ej j e fe ej%j'e fe ej%j'e feej(j)d,fd-d. Z*ej%j&d fe ej j e fe ej%j'e fe ej%j'e fee ej(j)d,fd/d0 Z+ej%j&fe ej j e fe ej%j'e fe ej%j'e fdd1d2d3Z,e ej j e fej(j)dd4d5d6Z-Z.S):Zone) _versionsZ_versions_lock _write_txn_write_waiters _write_event_pruning_policy_readersTN)originrdclass relativizepruning_policycstt|||t|_t|_|dur6|j|_ n||_ d|_ d|_ t|_ t |_|dt|dd|dS)aInitialize 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__ collectionsdequer threadingLock _version_lock_default_pruning_policyrrrrsetr_commit_version_unlockedWritableVersion)selfrrrr __class__r r r.s    z Zone.__init__)idserialreturnc Cs:|dur|durtd|j|durbd}t|jD]}|j|kr8|}qPq8|durtdn|dur|jrztjj }n|j dusJ|j }d}t|jD]@}|j |}|r| |jtjj}|r|dj|kr|}qq|durtdn |jd}t|d|}|j||WdS1s,0YdS)Nz!cannot specify both id and serialzversion not foundrzserial not foundF) ValueErrorr reversedrr(KeyErrorrdnsnameemptyrnodesget get_rdatasetr rdatatypeZSOAr) Transactionradd) r%r(r)versionvZonamenZrdstxnr r r readerSs<         z Zone.readerF)rr*cCsd}|j\|jdurD||jkrDt||dd|_d|_Wdqt}|j|Wdn1sl0Y|q|j |jS)NT)Zmake_immutable) r rrr6rEventrappendwaitZ_setup_version)r%rZeventr r r writerws*  z Zone.writercCs(t|jdkr$|j|_|jdS)Nr)lenrpopleftrr")r%r r r !_maybe_wakeup_one_waiter_unlockeds z&Zone._maybe_wakeup_one_waiter_unlockedcCsdS)NTr )r%zoner8r r r r!szZone._default_pruning_policycCstt|jdksJt|jdkr6tdd|jD}n |jdj}|jdj|krp|||jdrp|jqBdS)Nrcss|]}|jjVqdSN)r8r().0r;r r r z0Zone._prune_versions_unlocked..r+)rArrminr(rrB)r%Z least_keptr r r _prune_versions_unlockeds  zZone._prune_versions_unlocked) max_versionsr*csDdurdkrtddur*dd}n fdd}||dS)zYSet a pruning policy that retains up to the specified number of versions Nzmax versions must be at least 1cSsdS)NFr rD_r r r policysz%Zone.set_max_versions..policycst|jkSrE)rArrMrKr r rOs)r,set_pruning_policy)r%rKrOr rPr set_max_versionss   zZone.set_max_versions)rOr*cCsF|dur|j}|j||_|Wdn1s80YdS)aSet 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 rrJ)r%rOr r r rQs zZone.set_pruning_policycCs>|j$|j||Wdn1s00YdSrE)r rremoverJr%r;r r r _end_reads zZone._end_readcCs |j|ksJd|_|dSrE)rrCrTr r r _end_write_unlockedszZone._end_write_unlockedcCs4|j||Wdn1s&0YdSrE)r rVrTr r r _end_writeszZone._end_writecCsB|j|||j|_|jdur,||_|dur>||dSrE)rr>rJr2rrVr%r;r8rr r r r#s  zZone._commit_version_unlockedcCs8|j||||Wdn1s*0YdSrE)r r#rXr r r _commit_versionszZone._commit_versioncCs(t|jdkr |jdjd}nd}|S)Nrr+rL)rArr()r%r(r r r _get_next_version_idszZone._get_next_version_id)r0creater*cs|rtt|SrE)rr find_node)r%r0r[r&r r r\szZone.find_node)r0r*cCstdSrEr)r%r0r r r delete_nodeszZone.delete_node)r0rdtypecoversr[r*cs$|rtt|||}tj|SrE)rr find_rdatasetr/rdatasetImmutableRdatasetr%r0r_r`r[rbr&r r raszZone.find_rdatasetcs4|rtt|||}|dur,tj|SdSdSrE)rrr4r/rbrcrdr&r r r4$s  zZone.get_rdataset)r0r_r`r*cCstdSrEr])r%r0r_r`r r r delete_rdataset3szZone.delete_rdataset)r0rr*cCstdSrEr])r%r0rr r r replace_rdataset;szZone.replace_rdataset)NN)F)F)/rr r __slots__NodeZ node_factoryr/Z rdataclassINrrr0NamestrZ RdataClassboolrVersionrintr6r<r@rCr!rJrRrQrUrVrWr#rYrZZnoder\r^r5ZNONEZ RdataTyperbZRdatasetrar4rerf __classcell__r r r&r r!s &  $1    r) r rrtypingrrrrrZ dns.exceptionr/Z dns.immutableZdns.nameZdns.nodeZdns.rdataclassZ dns.rdatasetZ dns.rdatatypeZdns.rdtypes.ANY.SOAZdns.zone exceptionZ DNSExceptionrrDZ VersionedNoderhZImmutableVersionedNodeZ ImmutableNodermr$ZImmutableVersionr6rr r r r s(