HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //lib/python3/dist-packages/samba/tests/__pycache__/dns_aging.cpython-310.pyc
o

�/a��@sddlZddlmZddlmZddlmZmZddlmZddl	m
Z
ddlZddlmZddl
mZmZmZdd	lmZmZdd
lmZmZddlmZmZddlmZmZdd
lmZddlmZddl Z ddl!Z!ddl"m#Z#m$Z$m%Z%e �&d�Z'e�(e'�Z)e'�*e)�e�+e'�Z,e'�*e,�ee'�Z-e'�*e-�e'�.�\Z/Z0e1e0�dkr�e'�2�e�3d�e)�4�Z5e,�6e5�Z7e0dZ8e0dZ9e7�:ej;�e7�<��=�Z>dZ?dZ@dZAdZBdZCdZDdZEdd�ZFdd�ZGdd�ZHd/d d!�ZId0d"d#�ZJd$d%�ZKd&d'�ZLd(d)�ZMd*d+�ZNGd,d-�d-e�ZOeePe-d.�dS)1�N)�dsdb)�dsdb_dns)�
ndr_unpack�ndr_pack)�SamDB)�system_session)�credentials)�dns�dnsp�	dnsserver)�	TXTRecord�ARecord)�recbuf_from_string�ipv6_normalise)�SubunitOptions�TestProgram)�werror�WERRORError)�DNSTest)�c_RED�c_GREEN�
c_DARK_YELLOWz0dns_aging.py <server name> <server ip> [options]��i^[1i�B���2z
127.0.0.33�::1z
127.0.0.66z1::1cCstdt��tt�td�S)Nzldap://��url�lp�session_infor)r�	SERVER_IP�LPr�CREDS�r#r#�7/usr/lib/python3/dist-packages/samba/tests/dns_aging.py�	get_samdbKs

�r%cCstt��tt�td�S)Nr)rr!�	samdb_urlrr"r#r#r#r$�get_file_samdbRs
�r'cCst�dt�d�tt�S)Nz
ncacn_ip_tcp:z[sign])rr r!r"r#r#r#r$�get_rpc[sr(Tc
Csn|durt�}t��}||_tj|_tt|��|_	tj
|_d|_d|_
tj|_|�tjdtdddtj|�dS)Nrr�
ZoneCreate)r(r�!DNS_RPC_ZONE_CREATE_INFO_LONGHORN�pszZoneNamer
�DNS_ZONE_TYPE_PRIMARY�
dwZoneType�int�bool�fAging�DNS_DP_DOMAIN_DEFAULT�	dwDpFlags�
fDsIntegrated�
fLoadExisting�DNS_ZONE_UPDATE_UNSECURE�fAllowUpdate�DnssrvOperation2�DNS_CLIENT_VERSION_LONGHORNr �DNSSRV_TYPEID_ZONE_CREATE)�name�rpc�aging�zr#r#r$�create_zone_s&�r>c
Cs.|durt�}|�tjdt|ddtjd�dS)Nr�DeleteZoneFromDs)r(r7rr8r �DNSSRV_TYPEID_NULL)r:r;r#r#r$�delete_zonets�rAcCs,t|t�r|g}t��}t|�|_||_|S)z=Construct a txt record string list, which is a fiddly matter.)�
isinstance�strr
�string_list�len�count)�txt�s_listr#r#r$�
txt_s_list�s

rIcCst��}t|�|_|S�N)r	�
txt_recordrIrG)rG�rr#r#r$�make_txt_record�s
rMcCs<t��}|j|_|j|_|j|_|j|_|j|_|j|_|SrJ)r�DNS_RPC_RECORD�wType�dwFlags�dwSerial�dwTtlSeconds�data�dwTimeStamp)�rec�copyr#r#r$�copy_rec�srWcCs8t|t�rt|�}|tjfSd|vr|tjfS|tjfS)N�:)rB�listrMr
�DNS_TYPE_TXT�
DNS_TYPE_AAAA�
DNS_TYPE_A)rSr#r#r$�guess_wtype�s



r]csLeZdZdZeZeZeZ	�fdd�Z
�dOdd�Z�dPdd�Zd	d
�Z
�dOdd�Zejfd
d�Zdejfdd�Z�dOdd�Zdd�Z�dQdd�Zdd�Zdd�Zdd�Zdd�Zd d!�Z�dRd#d$�Zd%d&�Zd'd(�Zd)d*�Ze j!fd+d,�Z"�dOd-d.�Z#d/d0�Z$�dOd1d2�Z%e&dfd3d4�Z'�dSd6d7�Z(d8d9�Z)e*e+fd:d;�Z,d<d=�Z-d>d?�Z.d@dA�Z/dBdC�Z0dDdE�Z1dFdG�Z2dHdI�Z3dJdK�Z4dLdM�Z5dNdO�Z6dPdQ�Z7dRdS�Z8dTdU�Z9dVdW�Z:dXdY�Z;dZd[�Z<d\d]�Z=d^d_�Z>d`da�Z?dbdc�Z@ddde�ZAdfdg�ZB�dTdhdi�ZCdjdk�ZDdldm�ZEdndo�ZFdpdq�ZGdrds�ZHdtdu�ZIdvdw�ZJdxdy�ZKdzd{�ZLd|d}�ZMd~d�ZNd�d��ZOd�d��ZPd�d��ZQd�d��ZRd�d��ZSd�d��ZTd�d��ZUd�d��ZVd�d��ZWd�d��ZXd�d��ZYd�d��ZZd�d��Z[d�d��Z\d�d��Z]d�d��Z^d�d��Z_d�d��Z`d�d��Zad�d��Zbd�d��Zcd�d��Zdd�d��Zed�d��Zfd�d��Zgd�d��Zhd�d��Zid�d��Zjd�d��Zk�dTd�d��Zld�d��Zmd�d��Znd�d��Zod�dÄZpd�dńZqd�dDŽZrd�dɄZsd�d˄Zt�dUd�d̈́Zud�dτZvd�dфZwd�dӄZxd�dՄZyd�dׄZzd�dلZ{d�dۄZ|d�d݄Z}d�dۄZ|d�d݄Z}d�d�Z~d�d�Zd�d�Z�d�d�Z�d�d�Z�d�d�Z�d�d�Z�d�d�Z�d�d�Z�d�d�Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z��d�d�Z��d�d�Z��d�d�Z��d�d�Z��d�d	�Z�d�d
��d�d�Z��dU�d
�d�Z��d�d�Z��d�d�Z��d�d�Z��d�d�Z��d�d�Z��d�d�Z��d�d�Z��d�d�Z��d�d �Z��d!�d"�Z��d#�d$�Z��d%�d&�Z��d'�d(�Z��d)�d*�Z��d+�d,�Z��d-�d.�Z��d/�d0�Z��d1�d2�Z��d3�d4�Z��d5�d6�Z��d7�d8�Z��d9�d:�Z��d;�d<�Z��d=�d>�Z��d?�d@�Z��dA�dB�Z��dC�dD�Z��dE�dF�Z��dG�dH�Z��dI�dJ�Z��dK�dL�Z��dM�dN�Z��Z�S(V�TestDNSAgingzhProbe DNS aging and scavenging, using LDAP and RPC to set and test
    the timestamps behind DNS's back.c
s�t���t�|_t�|_|���dd�d|_|�	t
|j|j�z	t|j|j�Wn$tyN}z|j
dtjkr;�td|j�d��WYd}~nd}~ww|jtjd�d|j�d|j����|_dS)	N�.rrzzone z already exists)�AllowUpdate�DC=z#,CN=MicrosoftDNS,DC=DomainDNSZones,)�super�setUpr(�rpc_connr%�samdb�id�rsplit�zone�
addCleanuprAr>r�argsr�"WERR_DNS_ERROR_ZONE_ALREADY_EXISTS�print�set_zone_int_paramsr
r5�get_default_basedn�zone_dn)�self�e��	__class__r#r$rc�s"
��
�zTestDNSAging.setUpNcKs�|dur|j}|��D]8\}}t��}||_||_z|j�tjdt	|ddtj
|�WqtyC}z
|�t
|��WYd}~qd}~wwdS)z�Keyword arguments set parameters on the zone. e.g.:

            self.set_zone_int_params(Aging=1,
                                     RefreshInterval=222)

        See [MS-DNSP] 3.1.1.2.1 "DNS Zone Integer Properties" for names.
        Nr�ResetDwordProperty)rh�itemsr�DNS_RPC_NAME_AND_PARAM�dwParam�pszNodeNamerdr7r8r �DNSSRV_TYPEID_NAME_AND_PARAMr�failrC)rprh�kwargs�key�val�
name_paramrqr#r#r$rm�s,�	���z TestDNSAging.set_zone_int_paramsc
Cs�t|tj�r|}t��}||_t|tj�r|}t��}||_z|j�tjdt|j	|||�WdSt
yK}z|�d|�d��WYd}~dSd}~ww)z.Replace a DNS_RPC_RECORD or DNS_RPC_RECORD_BUFrzcould not replace record (�)N)rBrrN�DNS_RPC_RECORD_BUFrUrd�DnssrvUpdateRecord2r8r rhrrz)rpr:�old�newrUrqr#r#r$�rpc_replace�s,
� ��zTestDNSAging.rpc_replacecCsbt|t�r|g}|�|�}d}|D]}|jtjkrqdd�|jjD�}||kr.|�|�|}q|S)zTGet the TXT record on Name with value txt, asserting that there is
        only one.NcS�g|]}|�qSr#r#��.0�xr#r#r$�
<listcomp>�z6TestDNSAging.get_unique_txt_record.<locals>.<listcomp>)rBrC�ldap_get_recordsrOr
rZrS�assertIsNone)rpr:rG�recs�matchrL�txt2r#r#r$�get_unique_txt_record�s


�z"TestDNSAging.get_unique_txt_recordcCs^|dur
t|�\}}|�|�}t��}||_||_d}|D]}t�||�r,|�|�|}q|S)z7Get an A or AAAA record on name with the matching data.N)	r]r�r
�DnssrvRpcRecordrOrSr�
records_matchr�)rpr:�addr�wtyper�rUr�rLr#r#r$�get_unique_ip_records

�z!TestDNSAging.get_unique_ip_recordcCsN|�tj�}d||jf}|�||tj�}|�||g�|j|td�\}}|S)z:make a query, which might help Windows notice LDAP changes�%s.%s��host)	�make_name_packetr	�DNS_OPCODE_QUERYrh�make_name_question�
DNS_QCLASS_IN�finish_name_packet�dns_transaction_udpr )rpr:�qtype�p�fullname�qrL�rpr#r#r$�	dns_queryszTestDNSAging.dns_querycCs�|dur
t|�\}}|tjkrd}nd}d||jf}|�tj�}|�|jtjtj�}|�||g�t�	�}	||	_
||	_||	_||	_
|durMd|	_||	_nd|	_d|_|	g|_|j|td�\}
}|�|
tj�|S)N�{rr�i��rr�)r]r	r�rhr��DNS_OPCODE_UPDATEr��
DNS_QTYPE_SOAr��res_recr:�rr_type�rr_class�ttl�length�rdata�nscount�nsrecsr�r �assert_dns_rcode_equals�DNS_RCODE_OK)rpr:rSr��qclassr�r�r��urL�code�responser#r#r$�dns_update_non_text%s4
�z TestDNSAging.dns_update_non_textcCs|j|||tjd�S�N)r�)r�r	�DNS_QCLASS_NONE)rpr:rSr�r#r#r$�
dns_deleteJ�
�zTestDNSAging.dns_deletecCs|j|d|tjd�Sr�)r�r	�DNS_QCLASS_ANY)rpr:r�r#r#r$�dns_delete_typePr�zTestDNSAging.dns_delete_type�cCszt|t�r|g}|j|||j|d�}|j|td�\}}|jtj@tj	kr0t
d�t
d�t
d�|�|tj�|�
||�S)N�r�r�z

got DNS_RCODE_REFUSED
z0Are you running this in the fl2003 environment?
z6try `SELFTEST_TESTENV='fl2003dc:local' make testenv`

)rBrC�make_txt_updaterhr�r �	operationr	�	DNS_RCODE�DNS_RCODE_REFUSEDrlr�r�r�)rpr:rGr�r�r�r�r#r#r$�dns_update_recordVs
zTestDNSAging.dns_update_recordc	
Ks�t|t�r|g}t|�}t|�}|��D]
\}}t|||�qz	|�|||�Wn tyH}zdt|�vr7�|�|d|�WYd}~nd}~ww|�||�S)z�Add the record that self.dns_update_record() would add, via the
        dnsserver RPC pipe.

        As with DNS update, if the record already exists, we replace it.
        �$WERR_DNS_ERROR_RECORD_DOES_NOT_EXISTN)rBrCrru�setattrr��AssertionErrorr�)	rpr:rGr{r�rU�k�vrqr#r#r$�rpc_update_recordds
��zTestDNSAging.rpc_update_recordcCs*t|t�r|g}t|�}|�||d�dSrJ)rBrCrr�)rpr:rGr�r#r#r$�rpc_delete_txt|s
zTestDNSAging.rpc_delete_txtcCsfd|�d�}|jj|jtj|gd�d�}t|�dkr'|�d|�dt|����t|�dkr/dS|dS)	Nz(&(objectClass=dnsNode)(name=z)))�	dnsRecord�
dNSTombstonedr:)�base�scope�
expression�attrsrzexpected 0 or 1 dnsNodes for z, found r)re�searchro�ldb�
SCOPE_SUBTREErErz)rpr:�expr�nodesr#r#r$�get_one_node�s
��zTestDNSAging.get_one_nodecCs.|�|�}|durgS|�d�}dd�|D�S)Nr�cSsg|]}ttj|��qSr#)rr
r��r�rLr#r#r$r��sz1TestDNSAging.ldap_get_records.<locals>.<listcomp>)r��get)rpr:�node�recordsr#r#r$r��s


zTestDNSAging.ldap_get_recordscCs2|�|�}g}|D]
}|jtjkr|�|�q	|SrJ)r�rOr
�DNS_TYPE_TOMBSTONE�append)rpr:�all_recordsr�rLr#r#r$�ldap_get_non_tombstoned_records�s

�z,TestDNSAging.ldap_get_non_tombstoned_recordsTc	Cs&|�|�}|dur|�d|���|�d�}|durd}n|�t|�d�|ddkr.d}nd}||krG|r?|�|�d��n|�|�d	��|�|�}|r�|�t|�d�|�|djtj�|durn|�	|dj
�dS|r�|�	|dj
|d
|d
�dSdS|D]}|�|djtj�q�dS)Nzno node named r�FrrsTRUETz is tombstonedz is not tombstoned�)r�rzr��assertEqualrEr�rOr
r��assert_nttime_in_hour_rangerS�assertNotEqual)	rpr:�
tombstoned�	timestampr��dnsts�
is_tombstonedr�rLr#r#r$�assert_tombstoned�s:


���zTestDNSAging.assert_tombstonedc
Cs�d|�d|j��}tj�|j|dd�|D�d�tj�}z	|j�|�WdStjyT}z#d|jdvr5�dd	g|d
<|d�	tj
�|j�|�WYd}~dSd}~ww)Nra�,cSsg|]}t|��qSr#)rr�r#r#r$r��sz5TestDNSAging.ldap_replace_records.<locals>.<listcomp>)�dnr��LDAP_NO_SUCH_OBJECTr�top�dnsNode�objectClassr�)ror��Message�	from_dictre�FLAG_MOD_REPLACE�modify�LdbErrorrj�	set_flags�FLAG_MOD_ADD�add)rpr:r�r��msgrqr#r#r$�ldap_replace_records�s"
����z!TestDNSAging.ldap_replace_recordscKs�|�|�}t��}||_tj|_d|_d|_d|_||_	|�
�D]
\}}t|||�q t|dd��D]\}	}
t
�|
|�rC|||	<nq3|�|�|�||�|S)zThis one is not TXT specific.r��nrN)r�r
r�rO�
DNS_RANK_ZONE�rankrRrQrTrSrur��	enumeraterr�r�r�)rpr:r�rSr{r�rUr�r��irLr#r#r$�ldap_update_core�s$
�
zTestDNSAging.ldap_update_corecKs�|j|tjt|�fi|��}|�|�}d}|D]}|j|jkr q|jj|jjkr3|�|d|���|}q|�	|j
|j
d@�|�	|j|j�|�|j
|j
�|S)z�Add the record that self.dns_update_record() would add, via ldap,
        thus allowing us to set additional dnsRecord features like
        dwTimestamp.
        N�duplicate records for �)r�r
rZrIr�rOrSrCr�r�r�rR�assert_timestamps_equalrT)rpr:rGr{rUr�r�rLr#r#r$�ldap_update_records&��
�zTestDNSAging.ldap_update_recordcCs�t��}|tjkr
t|�}||_||_|�|�}t|dd��D]\}}t�	||�r/||=n
q |�
d|�d��|�||�dS)Nzrecord z
 not found)r
r�rZrIrOrSr�r�rr�rzr�)rpr:rSr�rUr�r�rLr#r#r$�ldap_delete_records

�zTestDNSAging.ldap_delete_recordc	Ks�|dur
t|�\}}|j|||fi|��}|�|�}d}|D]}t�||�r1|�|d|���|}q|�|j|jd@�|�|j|j�|�	|j
|j
�|S)Nr�r�)r]r�r�rr�r�r�r�rRrrT)	rpr:r�r�r{rUr�r�rLr#r#r$�
add_ip_record(s&��
�zTestDNSAging.add_ip_recordcCs2|�|�}|D]	}|j|7_q|�||�dSrJ)r�rTr�)rpr:�deltar�rUr#r#r$�ldap_modify_timestamps;s
z#TestDNSAging.ldap_modify_timestampscCsl|durtj}tj}|j�tjdt|j|d||dd�
\}}g}|r&|j	dkr(gS|j
D]}|�|j�q+|S)Nr)
r
�DNS_TYPE_ALLr�DNS_RPC_VIEW_AUTHORITY_DATArd�DnssrvEnumRecords2r8r rhrFrU�extendr�)rpr:�dns_type�select_flags�buflen�resr�rUr#r#r$�get_rpc_recordsAs*�
zTestDNSAging.get_rpc_recordsc
Cs�d|�d|j��}t��}tj|_||_|dur$|dddd|_n||_tj�	|j
|t|�gdd�tj�}z	|j
�
|�WdStjyi}zd|jd	vrR�d
dg|d<|j
�|�WYd}~dSd}~ww)
Nrar�i�
i��TRUE)r�r��
dnsTombstonedr�rr�r�r�)ror
r�r�rOrTrSr�r�r�rerr�r�r�rjr�)rpr:�epoch_hours�epoch_nttimer�rLr�rqr#r#r$�
dns_tombstoneWs.
����zTestDNSAging.dns_tombstoneFcCs|jtt|��d�dS)N)�Aging)rmr.r/)rp�enabler#r#r$�	set_agingv�zTestDNSAging.set_agingcCs |�|jt�|�|jt�dSrJ)�
assertGreaterrT�DNS_TIMESTAMP_1970�
assertLess�DNS_TIMESTAMP_2101�rprUr#r#r$�assert_timestamp_in_ballparkysz)TestDNSAging.assert_timestamp_in_ballparkcCs(|td�}|�||�|�||�dS)NgЈ� B)r.rr)rp�t�hour_min�hour_maxr#r#r$r�}sz(TestDNSAging.assert_nttime_in_hour_rangecCs�t|d�r|j}t|d�r|j}||}t|d�}|dkr-d|�dt|��d�}t|��|dkr>d|�d|�d�}t|��d	S)
aaAssert that a timestamp is the same or very slightly higher than a
        reference timestamp.

        Typically we expect the timestamps to be identical, unless an
        hour has clicked over since the reference was taken. However
        we allow one more hour in case it happens during a daylight
        savings transition or something.
        rT�8@rz
timestamp is � days (z hours) before referencerz hours) after referenceN��hasattrrT�absr�)rpr��	reference�diff�daysr�r#r#r$�assert_soon_after�s
	
��zTestDNSAging.assert_soon_aftercCs�t|d�r|j}t|d�r|j}||krdS||}t|d�}|dks(|dkr4d|�d|��}t|��|dkrI|�d|�d|�d	|��}t|��|�d|�dt|��d
|��}t|��)a\Just like assertEqual(), but tells us the difference, not the
        absolute values. e.g:

        self.assertEqual(a, b)
        AssertionError: 3685491 != 3685371

        self.assert_timestamps_equal(a, b)
        AssertionError: -120 (first is 5.0 days earlier than second)

        Also, we turn a record into a timestamp if we need
        rTNr"rz
timestamp z != z is r#z hours) after z hours) before r$)rp�ts1�ts2r(r)r�r#r#r$r�s 

��z$TestDNSAging.assert_timestamps_equalcCs�|�d�d}d}|�||g�}|j}|�|�|d}|j||g|d�}|�|j|�|�||g�}|�|j|�|�d�|�||g�}|�|j|�dS)NF�
timestamp-now�timestamp-eightdays��rTT)rr�rTrrr�assertGreaterEqual)rpr:�name2rU�
start_time�eight_days_agor#r#r$�(test_update_timestamps_aging_off_then_on�s 


�
z5TestDNSAging.test_update_timestamps_aging_off_then_oncCs�|�d�d}|�||g�}|j}|�|�|d}|j||g|d�}|�|jd�|�d�|j||g|d�}|�|jd�|�||g�}|�|jd�d}|�||g�}|�|j|�dS)NFr-r/r0rTr.)rr�rTrr�r�r*)rpr:rUr3r4r2r#r#r$�test_rpc_update_timestamps�s,


�

��z'TestDNSAging.test_rpc_update_timestampscGsL|�|�}g}|D]}|D]}dd�|jjD�}||kr"|�|j�q
q	|S)NcSr�r#r#r�r#r#r$r��r�z3TestDNSAging.get_txt_timestamps.<locals>.<listcomp>)r�rSrCr�rT)rpr:�txtsr��retrrL�t2r#r#r$�get_txt_timestamps�s
��zTestDNSAging.get_txt_timestampscCsXd}dg}ddg}ddg}|�d�|�||�j}|d}|d}|d}|d	}	|d
}
|||||	|
fD]"}|j|||d�|�|�||�|g�|�||�j}|�||�q5|||||	|
dd
fD]9}|j|||d�j}
|�|
|�|�||�|�|||�}|�|||g�|�||�|�||�}|�||g�qb|�||�j}|�||�|||||	|
dd
fD]-}|j|||d�|�	||�j}
|�|
|�|�||�j}|�|||�}|�|||g�q�|||||	|
ddfD]E}|j|||d�|j|||d�|j|||dd�|�	||�j}|�||d�|�||�j|�||||�}|�||||dg�q�|j||dd�|||||	|
ddfD]=}|j||dd�|j|||dd�|�	||�j}|�||d�|�||�|�||||�}|�|dd|dg��qC|�||�j}|||||	|
ddfD]F}|j||dd�|j||dd�|j|||dd�|�	||�j}|�||d�|�||�j|�||||�}|�|dd|dg��q�|j||dd�|j||dd�|�||�j}|||||	|
ddfD]/}|j|||d�|�	||�j}|�||�|�||�|�||||�}|�|dd|g��q�dS)N�test�test txtr��txt3F�r/�h�`	�]r0順�dr�i?Br�	i1�i8�
)
rr�rTrr�r:rrr*r�)rpr:�txt1r�r=�current_time�six_days_agor4�fifteen_days_ago�hundred_days_ago�thousand_days_agor��update_timestamp�
timestamp1�
timestamps�
timestamp2�
timestamp3r#r#r$�test_update_aging_disabled_2s"
��	���	�	��	
��	
��	
��z)TestDNSAging.test_update_aging_disabled_2cCs�d}dg}dg}|�d�|�||�j}|�||d�|�||�j}|�||�|�||�j}|�||�|�||�j}|�||�|�||�j}	|�|	|�|j|||d�|�||�j}	|�|	|�|�||�j}|�||�|�||�j}	|�|	|�|�	||�|j|||d�|�||�j}	|�|	|�|�||�j}|�||�|�||�j}	|dkr�|�|	|�n|�|	|�|j|||d�|j|||d�|�||�j}	|�|	|�|�||�j}|�||�|�||�j}	|�|	|�dg}
|j|||d�|j|||d�|�||
�j}|�||�|�||�j}	|�||�j}|dk�r0|�|	|�n|�|	|�|�||�|�	||
�|�||
�j}|�||�|�||�j}	|�||�j}|dk�ri|�|	|�n|�|	|�|�||�d	g}|j||d
d�|j|||d�|j||
|d�|�||�j}	|�||�j}|�||
�j}|�||�j}
|�
|	d
�|�||�|�||�|�|
|�dS)Nr;�1�2F���r0��3�4r)rr�rTrr�rrr*rrr�)rp�n_daysr:rFr�rG�
n_days_agorLrOrMr=rP�txt4�
timestamp4r#r#r$�&_test_update_aging_disabled_n_days_ago�s�


z3TestDNSAging._test_update_aging_disabled_n_days_agocC�|�d�dS�N��r\�rpr#r#r$�/test_update_aging_disabled_in_no_refresh_window&�z<TestDNSAging.test_update_aging_disabled_in_no_refresh_windowcCr]�NrUr`rar#r#r$�1test_update_aging_disabled_on_no_refresh_boundary)rcz>TestDNSAging.test_update_aging_disabled_on_no_refresh_boundarycCr]�NrEr`rar#r#r$�,test_update_aging_disabled_in_refresh_window,rcz9TestDNSAging.test_update_aging_disabled_in_refresh_windowcCr]�N�r`rar#r#r$�0test_update_aging_disabled_beyond_refresh_window/rcz=TestDNSAging.test_update_aging_disabled_beyond_refresh_windowcCr]�NrBr`rar#r#r$�0test_update_aging_disabled_in_eighteenth_century2rcz=TestDNSAging.test_update_aging_disabled_in_eighteenth_centurycCsbd}dg}dg}|�d�|�||�j}|j||dd�|�||�j}|�|d�|�||�j}|�||�|�||�j}|�||�|�||�j}|�||�|�||�j}|�||�|�||�|j||dd�|�||�j}|�|d�|�||�j}|�|d�|�||�j}|�|d�|j||dd�|j||dd�|�||�j}|�|d�dS)Nr;rRrSFrr0r)	rr�rTrr�r*r�rr)rpr:rFr�rGrMrOr#r#r$�!test_update_aging_disabled_static5s8
z.TestDNSAging.test_update_aging_disabled_staticcCs0d}dg}ddg}ddg}d}d}|�d�|�||�j}|�||�|�||�}|j}	|�|	||�|�||�j}
|�|
|	�|j|||jd�|�||�j}|�||�|�||�j}|�||�|�||�|�||�j}
|�|
||�|�||�}|�|j|
�|�||�j}|�||
�|�||�j}|�||�|�||�j}|�||�j}|�||�|�||�|d	}|d
}|j	|||d�}|�|j|�|j	|||d�}|�|j|�|�||�j}|�||�j}|�||�j}|�||�|�||�|�||�|d}|j	|||d�|�||�j}|�||�j}|�||�j}|�||�|�||�|�||�|j	|||
d�|�||�j}|�||�j}|�||�j}|�||�|�||�|�||
�|�
||�|�||�j}|�||�j}|�||�j}|�|d
�|�||�|�||
�dS)Nr;r<r�r=ip���i@���F)rhr@rAr0r?r)rr�rTrr�r�check_query_txtrhr*rr�r�)rpr:rFr�r=�minus_6�minus_8rG�	after_modrHrLrOrMr4�update2rPrJrK�recordrIr#r#r$�test_update_aging_disabledds�
��z'TestDNSAging.test_update_aging_disabledcCs�d}dg}ddg}ddg}dg}|�d�|�||�j}|d}|d}|d	}	|d
}
|j|||d�|�||�j}|�||�j}|�||�|�||�|j|||d�|�||�j}
|�|
|�|�||�j}|�||�j}|�||�j}
|�||�|�||�|�|
|�|j|||d�|�||�j}|�||�j}|�||�j}
|�||�|�||�|�|
|�|j|||	d�|j|||d�|j|||d�|�||�j}|�||�j}|�||�j}
|�||�|�||�|�|
|�|j|||	d�|�||�j}|�||�j}|�||�j}
|�||	�|�||�|�|
|�|�||�j}
|�||�j}|�||�j}|�||	�|�||�|�|
|�|j|||
d�|�||�j}
|�||�j}|�||�j}|�||	�|�||�|�|
|�|j|||d�|j|||d�|�||�j}|�||�j}|�||�j}
|�||�|�||�|�|
|�|�||�j}|�||�j}|�||�j}
|�|d�|�||�|�|
|�|j|||d�|�||�j}|�||�j}|�||�j}
|�|d�|�|d�|�|
|�|j|||d�|j||d
d�|�||�j}|�|d
�|�||�j}|�|d�|�||�j}|�||�j}|�||�j}|�||�j}
|�|d�|�||�|�|
|�|�|d�dS)Nr;r<r�r=rWTr>r/r?r@r0ri��-)	rr�rTrr�rr*r�r�)rpr:rFr�r=rZrGrHr4rIrJrMrOrPr[r#r#r$�test_update_aging_enabled�s�
z&TestDNSAging.test_update_aging_enabledcCs�d}dg}dg}|d}|�d�|�||�j}|�||�|�||�j}|�||�|�||�j}|dkr=|�||�n|�||�|�||�j}	|�|	|�|�||�j}
|�||
�|j|||d�|�||�j}|�||
�|�||�j}	|�|	|�|�||�j}|�||
�|�	||�|j|||d�|�||�j}|dkr�|�||�n|�||�|�||�j}	|�|	|�|�||�j}|dkr�|�||�n|�||	�|j|||d�|j|||d�|�||�j}
|�||
�|�||�j}	|�|	|�|�||�j}|�||	�dg}|j|||d�|j|||d�|�||�j}|�||�|�||�j}|�||�j}	|�||�|�|	|�|�	||�|�||�j}|�||�|�||�j}|�||�j}	|�||�|�|	|�d	g}
|j||d
d�|j|||d�|j|||d�|�||�j}|�||�j}	|�||�j}|�||
�j}|�|d
�|�|	|�|�||�|�|d
�|d}|�	||
�|j|||d�|j|||d�|j|||d�|�||�j}|�||�|�||
�j}|�||�j}	|�||�j}|�||�j}|�||�|�|	|�|�||�|�|d
�|j||
|d�|�||
�j}|�||�|�||�j}|�||
�j}|�|d
�|�||�dS)Nr;rRrSrTTrUr0rVrWrr)
rr�rTrr�rrr*rr)rprXr:rFr�rrGrYrMrO�timestamp1_br=rPrZr[�
longer_agor#r#r$�%_test_update_aging_enabled_n_days_ago]s�
z2TestDNSAging._test_update_aging_enabled_n_days_agocCr]r^�rxrar#r#r$�.test_update_aging_enabled_in_no_refresh_window�rcz;TestDNSAging.test_update_aging_enabled_in_no_refresh_windowcCr]rdryrar#r#r$�0test_update_aging_enabled_on_no_refresh_boundary�rcz=TestDNSAging.test_update_aging_enabled_on_no_refresh_boundarycCr]rfryrar#r#r$�+test_update_aging_enabled_in_refresh_window�rcz8TestDNSAging.test_update_aging_enabled_in_refresh_windowcCr]rhryrar#r#r$�/test_update_aging_enabled_beyond_refresh_window�rcz<TestDNSAging.test_update_aging_enabled_beyond_refresh_windowcCr]rkryrar#r#r$�/test_update_aging_enabled_in_eighteenth_centuryrcz<TestDNSAging.test_update_aging_enabled_in_eighteenth_centuryc	Cs�d}dg}dg}dg}dg}|�d�|�||�j|j||dd�|�||�|�||�|�||�j}|�|d�|�||�j}|�|d�|�|g�|�||�|�||�j}|�|d�dS)	Nr;�A�B�C�DFrr0)rr�rTrr�r�r�)	rpr:rr�r�r��ctime�btime�dtimer#r#r$�test_update_static_stickinesss$
z*TestDNSAging.test_update_static_stickinessc
Cs$d}dg}dg}|�|�|�||�j}|�||d�|�||�j}|�||�j}|dkr7|r7|�||�n|�||�|�||�j}	|�|	|�|�||�j}|r^|dkr^|�||�n|�||�|�||�|j|||d�|�||�j}|�||�j}	|�|	|�|�||�j}|||	fS)Nr;rr�rTrUr0)	rr�rTrr�r*rrr)
rprXr<r:rr�rGrY�time_A�time_Br#r#r$� _test_update_timestamp_weirdnesss0

z-TestDNSAging._test_update_timestamp_weirdnesscC�"|�dd�\}}}|�||�dS�N�F�r�r�rprYr�r�r#r#r$�3test_update_timestamp_weirdness_no_refresh_no_agingH�
�z@TestDNSAging.test_update_timestamp_weirdness_no_refresh_no_agingcCr��Nr�Tr�r�r#r#r$�0test_update_timestamp_weirdness_no_refresh_agingOr�z=TestDNSAging.test_update_timestamp_weirdness_no_refresh_agingcC�"|�dd�\}}}|�||�dS)NrEFr�r�r#r#r$�0test_update_timestamp_weirdness_refresh_no_agingV�
�z=TestDNSAging.test_update_timestamp_weirdness_refresh_no_agingcCr�)NrETr�r�r#r#r$�-test_update_timestamp_weirdness_refresh_aging[r�z:TestDNSAging.test_update_timestamp_weirdness_refresh_agingcCs�ddg}}d}d}|j||dd�|�||�}|j}|�|d�|�||�}|�|j|d�|�|d	�|�||�}|�|j|�|�|d
�|�||�}|�|j|�dS)N�	agingtestr<���r��NoRefreshInterval�RefreshIntervalriV����i��i`���)rmr�rTrrr*)rpr:rG�
no_refresh�refresh�
before_modr3rUr#r#r$�test_aging_refresh`s(��zTestDNSAging.test_aging_refreshcCsB|�d�|�dd�}|�|jd�|�dd�}|�|jd�dS)NT�ldapr;rr;)rrr�rTr�rr#r#r$�test_add_no_timestamp~s

z"TestDNSAging.test_add_no_timestampcCs@|jdddd�}|�|jd�|jdddd�}|�|jd�dS)Nr�r;rr0r;�rr�rTr�rr#r#r$�test_add_zero_timestamp�sz$TestDNSAging.test_add_zero_timestampcCs||jdddd�}|�|jd�|jdddd�}|�|jd�|jdddd�}|�|jd�|jdddd�}|�|jd�dS)Nr�r;i@�r0r;rr�rr#r#r$�test_add_update_timestamp�sz&TestDNSAging.test_add_update_timestampcCs||jdddd�}|�|jd�|jdddd�}|�|jd�|jdddd�}|�|jd�|jdddd�}|�|jd�dS)Nr�r;���rRr;���.)rr�rRr�rr#r#r$�test_add_update_ttl�s�z TestDNSAging.test_add_update_ttlcCs�|jddddd�}|�|jd�|�|jd�|jdddd�}|�|jd�|j}|�|d�|jddd	d�}|�|jd	�|�|j|d
�|jdddd�}|�|jd�|�|jd�dS)
Nr�r;r�r�)rRrQr;r�r_r�rr��|)rr�rRrQr�r)rprU�serialr#r#r$�test_add_update_ttl_serial�s �z'TestDNSAging.test_add_update_ttl_serialcCs(|jddddd�}|�|jd�|�|jd�|jdddd�}|�|jd�|�|jd	�|jt|jddd
dd�|jddddd�}|�|jd�|�|jd
�|jdddd�}|�|jd	�|�|jd�|jdddd�}|�|jd	�|�|jd�|jdddd�}|�|jd�|�|jd	�dS)Nr�r;i�V��)�flagsr�r)rP��riq�[.�	iarE��r��A�test 2�90)rr�r�r�r��assertRaises�
OverflowErrorr�rr#r#r$�test_add_update_dwFlags�s,�z$TestDNSAging.test_add_update_dwFlagscCs||jdddd�}|�|jd�|jdddd�}|�|jd�|jdddd�}|�|jd�|jdddd�}|�|jd�dS)Nr�r;i1�)�
dwReservedr;rr�)rr�r�r�rr#r#r$�test_add_update_dwReserved�sz'TestDNSAging.test_add_update_dwReservedcCsP|jdddd�}|�|jd�|jdddd�}|�|jd�|jdddd�}|�|jd�|�dd�}|�|jd�|�dd�}|�|jd�|�dd�}|�|jd�|jdddd�}|�|jd�|jddd	d�}|�|jd	�|�d
d�}|�|jd�|�dd�}|�|jd
�|�dd�}|�|jd�|�d
d�}|�|jd�dS)Nr�r;r��rQr;r_zdns-0r��r	r��dns2�}�rpc2�~r��)rr�rQr�rr�rr#r#r$�test_add_update_dwSerial�s0z%TestDNSAging.test_add_update_dwSerialcCsZ|jdddd�}|�|jd�|jdddd�}|�|jd�|�dd�}|�|jd�dS)Nr�r;r�r�r�)rr�rQr�r�rr#r#r$�test_add_update_dwSerial_2sz'TestDNSAging.test_add_update_dwSerial_2cCs�d}td�}td�}|�|d|�|�|�}|�t|�d�|�|dj|j�|�|||�|�|�}|�t|�d�|�|dj|j�dS)z0Can we use update to replace a TXT with an AAAA?r�z127.0.0.111Nrr)rr
r�r�r�rErO)rpr:r�r�r�r#r#r$�test_rpc_update_disparate_typess

z,TestDNSAging.test_rpc_update_disparate_typescsd�d����fdd�}|�j�}|�j�}��d��jddddd	d
ddd
d�	}��|jd���|jd���|jd	���|jd
���|jd���|j	d���|j
d
��jdddd�}��|jd���|jd�||jd�||jd���|jd�||j	d�||���d��jdddd�}��|jd���|jd�||jd�||jd���|jd�||j	d���|��jddddddddd�}��|jd���|jd�||jd�||jd���|jd�||j	d���|j
d���dd�}��|jd���|jd�||jd�||jd���|jd �||j	d���|j
d���d��jddd!d�}��|jd���|jd�||jd�||jd"���|jd!�||j	d���|j
d���r���
d#��d$��d%��dSdS)&Nrcs����fdd�}|S)Nc
sn�d7�z�|�WdS�jy6}zddlm}t|�d�d|�d���d7�WYd}~dSd}~ww)Nrr)�format_stack���� �
)�failureException�	tracebackr�rl)rjrqr�)�f�failuresrp�totalr#r$�_defer)s��zFTestDNSAging.test_add_update_many.<locals>._defer_wrap.<locals>._deferr#)r�r��r�rpr�)r�r$�_defer_wrap(s	z6TestDNSAging.test_add_update_many.<locals>._defer_wrapFr�r;���!�,�7�B�M)�versionr�r�rQrRr�rTr�r�r�r��-TiW�.�oiMi�i+i�r�)r�rPrQrRr�rT�/�0r�ix�1zfailed �/z defered assertions)r�rrrr�r�r�rQrRr�rTr�r�rz)rpr��defer_assertEqual�"defer_assert_timestamp_in_ballparkrUr#r�r$�test_add_update_many!s�
�
�	

�
�z!TestDNSAging.test_add_update_manycCsrd}dg}dg}|�d�|j||dd�}|�||�}|�|�|j}|�||�}|�|jd�|�|j|�dS)zcAdd a static record, then a dynamic record.
        The dynamic record should have a timestamp set.r;z
static txtzdynamic txtTrr0N)rrr�rrTr�)rpr:rGr�rU�rec2r,r#r#r$�!test_static_record_dynamic_update�s

z.TestDNSAging.test_static_record_dynamic_updatecCs�d}dg}dg}dg}|�d�|�||�|�||�|�||�|�|�}|D].}dd�|jjD�}||kr@|�|jd�q)||krL|�|jd�q)||krW|�|jd�q)dS)	Nr�zdns update beforezldap updatezdns update afterTcSsg|]}|j�qSr#)rCr�r#r#r$r��szBTestDNSAging.test_dynamic_record_static_update.<locals>.<listcomp>r)	rr�rrrSrCr�rTr�)rpr:rFr�r=r�rL�dr#r#r$�!test_dynamic_record_static_update�s&

��z.TestDNSAging.test_dynamic_record_static_updatec
Cs�d\	}}}}}}}}}	t�tt����}
|
d}t�|
�}t�|�}
|
d@}|
dB}|d@}|dB}|j||
d�|j||d�|j||d�|j||
d�|j||d�|j||d�|j||d�|j||d�|j|	dd�zt�}Wntjy�}z	t	d|�d��d�d}~wwt
�|�||||fD]}|�|�}|�
t|�d	�|j|d
d�q�|||||	fD]}|�|�}|�
t|�d�q�dS)
N�	abcdefgijipl��l��)ri����failing because '�': this is Windows?rF)r�r)r�unix_to_dns_timestampr.�time�dns_timestamp_to_nt_timerr'r�r�r�r�_dns_delete_tombstonesr�r�rEr�)rp�nh�oh�nn�on�on0�onf�nn0�nnf�_1601�	now_hours�	old_hours�
now_nttime�
old_nttime�old_nttime0�old_nttimef�now_nttime0�now_nttimef�
file_samdbrqr:r�r#r#r$�"test_tombstone_in_hours_and_nttime�sJ



����


�z/TestDNSAging.test_tombstone_in_hours_and_nttimecCs|d}d}|�|�|�|�|j|tjd�}|�|jd�|�||�|�|�|�|�|j|tjd�}|�|jd�dS)N�a�b�r�r)rr�r�r	�
DNS_QTYPE_TXTr��ancountr�)rprr�rLr#r#r$�%test_dns_query_for_tombstoned_results�s



z2TestDNSAging.test_dns_query_for_tombstoned_resultsc

Cs�|jdddd�d\}}}}}}|�||�|�||�|�|�|j|tdd�|j|dd�|j|dtd�d	�|�|�|�|�|�|d
�|�|�}|�d�}|dura|�|dd
�|j|dd�|�||�}	|�	|d�|�	|d�|�	|d�|�|d�z|j
�tj
dtdddtjd�t�d�Wn)ty�}
z|
jdtjkr�t�}t�|�t�|�n�WYd}
~
nd}
~
ww|�|dg�}	|�|	�|�||g�}	|�|	�|�|�|�|�}|�|�|�|�}|�|�|�|�dS)N�rr�)rRrSrVrW�5�6)riG�ic�T� _�B)rrzts2 untombstonedr�rsFALSEF)r�i����i����i����zanother record�StartScavengingr)rmr�rrr.r�r�r�r�rrdr7rr8r r@r��sleeprrjr�WERR_CALL_NOT_IMPLEMENTEDr'r�_scavenge_dns_recordsr�r��assertIsNotNoner�)
rpr+r,�ts3�ts4�ts5�ts6�ts2_node�
ts2_tombstonerLrqr�nr#r#r$�test_basic_scavenging�sn�




�
���






z"TestDNSAging.test_basic_scavengingc
Cs�zt�}Wntjy}z	td|�d��d�d}~ww|jdddd�t�tt����}d\}}}}|�	||�j
}|j|||dd�j
}	|j|||d	d�j
}	|j|||d
d�j
}
|�||�|�
|	|d�|�
||d	�|�
|
|d
�t�|�|�||�}|�|�t||tjd�}|�|jd�|�|�}
|�t|
�d�|�|
d�|�||�j
}|�||�j
}	|�||�j
}|�||�|�
|	|d�|�
||d	�|�	||�j
}	|�	||�j
}|�
|	|d	�|�||�t�|�|�|�}
|�t|
�d�|�|
d�|�||�|�|�}
|�t|
�d�|�|
d�t�|�|�|�}
|�t|
�d�|�|
d�|�||d
�|�||d�t�|�|�|�}
|�t|
�d�|�|
d�|�|�}
|�t|
�d�dS)Nr�r�rD�rr��ABCDr0�(�<rr�r�)r'r�r�r�rmrr�r.r�r�rTrr*rrrr�r�r�r	rr�rr�rEr�r�r�r)rprrq�nowrr�r�r��atimer�r�r�rLr�r#r#r$�test_samba_scavengingMs|

�����










z"TestDNSAging.test_samba_scavengingcCs�|�|�d}t�tt����}|d|}|d|}	|�||�|�||d�|�||�}
|j|||	d�}|�	|
|�|�	||	�|�||�|�||�}
|r_|dkr_|}|�
|
|�n|dkrl|}|�	|
|�n|}|�	|
|�|�||�}|�	||	�|�||�|�||�}|s�|j|j
||dd�n|�
||�|j|||	d�}|�||�}
|�	|
|�|�||�|�||�}
|�	||	�t|�\}
}|j
|||d�|�||�|�||�}
|�
|
|�|�||�}|�	||	�dS)	N�aargh�rTr0rUz)windows updates non-aging, samba does not�r�)r�)rrr�r.r�r�rr�rrr*�windows_variationr]r)rprr��a_days�b_daysr<r:r�	a_initial�	b_initial�rec_a�rec_b�time_a�_r�r#r#r$�_test_A_and_AAAA_records�sX
�z%TestDNSAging._test_A_and_AAAA_recordscC�|jttdddd�dS�Nr�T�r<�r-�	IPv4_ADDR�	IPv6_ADDRrar#r#r$�test_A_5_days_AAAA_5_days_aging�rz,TestDNSAging.test_A_5_days_AAAA_5_days_agingcCr.)Nr�Fr0r1rar#r#r$�"test_A_5_days_AAAA_5_days_no_aging�rz/TestDNSAging.test_A_5_days_AAAA_5_days_no_agingcC�|jttdddd�dS)Nr�rTr0r1rar#r#r$� test_A_5_days_AAAA_10_days_aging�rz-TestDNSAging.test_A_5_days_AAAA_10_days_agingcCr6�Nr�rFr0r1rar#r#r$�#test_A_5_days_AAAA_10_days_no_aging�rz0TestDNSAging.test_A_5_days_AAAA_10_days_no_agingcCr6)Nrr�Tr0r1rar#r#r$� test_A_10_days_AAAA_5_days_aging�rz-TestDNSAging.test_A_10_days_AAAA_5_days_agingcCr6)Nrr�Fr0r1rar#r#r$�#test_A_10_days_AAAA_5_days_no_aging�rz0TestDNSAging.test_A_10_days_AAAA_5_days_no_agingcCr6)NrrETr0r1rar#r#r$� test_A_10_days_AAAA_9_days_aging	rz-TestDNSAging.test_A_10_days_AAAA_9_days_agingcCr6)NrErFr0r1rar#r#r$�#test_A_9_days_AAAA_10_days_no_aging	rz0TestDNSAging.test_A_9_days_AAAA_10_days_no_agingcCr6)NrrTr0r1rar#r#r$� test_A_20_days_AAAA_2_days_aging	rz-TestDNSAging.test_A_20_days_AAAA_2_days_agingcCr6)N�rFr0r1rar#r#r$�#test_A_6_days_AAAA_40_days_no_aging		rz0TestDNSAging.test_A_6_days_AAAA_40_days_no_agingcCr.r/�r-r2�IPv4_ADDR_2rar#r#r$�test_A_5_days_A_5_days_aging	rz)TestDNSAging.test_A_5_days_A_5_days_agingcCr6r8rArar#r#r$� test_A_5_days_A_10_days_no_aging	rz-TestDNSAging.test_A_5_days_A_10_days_no_agingcCr6)Nr�r?Tr0�r-r3�IPv6_ADDR_2rar#r#r$�"test_AAAA_5_days_AAAA_6_days_aging	rz/TestDNSAging.test_AAAA_5_days_AAAA_6_days_agingcCr6)Nr�r?Fr0rErar#r#r$�%test_AAAA_5_days_AAAA_6_days_no_aging	rz2TestDNSAging.test_AAAA_5_days_AAAA_6_days_no_agingcCs
|�|�d}t�tt����}|d}|d}|d}|||d�}|||d�}|||d�}	|�|d�|��D]\}
}|j||
tj	|d	�}q8|��D]\}
}|j||
tj
|d	�}qK|	��D]\}
}|j||
|d
�}q^|�|t
j�|�|tj	�}|�|jd�|�|tj�}|�|jd�td
d�|jD��}
|�|
t|	��|�|tj
�}|�|jd�tdd�|jD��}
|�|
t|��|�|�}|�t|�d�|D]3}|jtj
kr�t|j�}
||
}n|jtjkr�|jjd}
|	|
}n	|�d|j���|�|j|�q�dS)Nr!�xr�iX)z1.1.1.1z2.2.2.2z3.3.3.3)rz::2z::3)rRrSrVrV)r�rTr0rr�cs��|]
}|jjjdVqdS�rN�r�rGrCr�r#r#r$�	<genexpr>H	��z:TestDNSAging._test_multi_records_delete.<locals>.<genexpr>css�|]}t|j�VqdSrJ)rr�r�r#r#r$rMM	s�r?zunexpected wType )rrr�r.r�r�rurr	�DNS_QTYPE_A�DNS_QTYPE_AAAArr�r
r\r�r�rr�set�answersr�rErOrrSrCrzrrT)rpr<r:r�back_5_days�back_10_days�back_25_days�ip4s�ip6sr7r�r�rL�rsetr��expectedr#r#r$�_test_multi_records_delete	s`
���



�z'TestDNSAging._test_multi_records_deletecCr]�NT�rZrar#r#r$�test_multi_records_delete_aging^	rcz,TestDNSAging.test_multi_records_delete_agingcCr])NFr\rar#r#r$�"test_multi_records_delete_no_aginga	rcz/TestDNSAging.test_multi_records_delete_no_agingcCs"d}dg}dg}dg}dg}|�|�t�tt����}t||dd�}	|�||�|j|||	d�|j|||	d�|j|||	d�|�||�|�|t	j
�}
td	d
�|
jD��}|�
|td��|�||�j}|�||�j}
|�||�j}|�||�j}|�|�}|�
t|�d�|�|t	j
�}
td
d
�|
jD��}|�
|td��|�||�|�||�||��|�|
|�||��|�||�||��|�|�}|�
t|�d�|�|t	j
�}
tdd
�|
jD��}|�
|td��|�||�|�||�||��|�|
|�||��|�|�}|�
t|�d�|�|t	j
�}
tdd
�|
jD��}|�
|td��|�||�|�|
|�||��|�|�}|�
t|�d�|�|t	j
�}
tdd
�|
jD��}|�
|dh�|�||�|�|�}|�
t|�d�|�|t	j
�}
tdd
�|
jD��}|�
t|�d�dS)Nr;rr�r�r�r"rr0csrJrKrLr�r#r#r$rMz	rNz6TestDNSAging._test_dns_delete_times.<locals>.<genexpr>rr_csrJrKrLr�r#r#r$rM�	rNr�csrJrKrLr�r#r#r$rM�	rN�ABCrcsrJrKrLr�r#r#r$rM�	rN�ABrcsrJrKrLr�r#r#r$rM�	rNcsrJrKrLr�r#r#r$rM�	rN)rrr�r.r��maxr�rr�r	rrQrRr�r�rTr�rEr�rr�r�)rprXr<r:rr�r�r�rrYrLrXrr�r�r�r�r#r#r$�_test_dns_delete_timesd	sn





z#TestDNSAging._test_dns_delete_timescC�|�dd�dSr��rbrar#r#r$�"test_dns_delete_times_5_days_aging�	�z/TestDNSAging.test_dns_delete_times_5_days_agingcCrc)Nr�Trdrar#r#r$�#test_dns_delete_times_11_days_aging�	rfz0TestDNSAging.test_dns_delete_times_11_days_agingcCrc)N�nTrdrar#r#r$�$test_dns_delete_times_366_days_aging�	rfz1TestDNSAging.test_dns_delete_times_366_days_agingcCrc)NrTrdrar#r#r$�"test_dns_delete_times_static_aging�	rfz/TestDNSAging.test_dns_delete_times_static_agingcCrcr�rdrar#r#r$�%test_dns_delete_times_5_days_no_aging�	rfz2TestDNSAging.test_dns_delete_times_5_days_no_agingcCrc)Nr�Frdrar#r#r$�&test_dns_delete_times_11_days_no_aging�	rfz3TestDNSAging.test_dns_delete_times_11_days_no_agingcCrc)NrhFrdrar#r#r$�'test_dns_delete_times_366_days_no_aging�	rfz4TestDNSAging.test_dns_delete_times_366_days_no_agingcCrc)NrFrdrar#r#r$�%test_dns_delete_times_static_no_aging�	rfz2TestDNSAging.test_dns_delete_times_static_no_agingcCs�d}dg}dg}|�|�t�tt����}t||dd�}	t||dd�}
|r6|�||�|�||�|j|||	d�|j|||
d�|�||�j	}|�
||�|sc|rc|�|�||�|�dS|�|�||�|�dS)Nr;rr�r"rr0)
rrr�r.r�rar�rr�rTr�r*r)rpr%r&r<�touchr:rr�r�
a_days_ago�
b_days_agorr#r#r$�_test_dns_delete_simple�	s"
z$TestDNSAging._test_dns_delete_simplecC�|�ddd�dS�Nrr�T�rrrar#r#r$�%test_dns_delete_simple_2_3_days_aging�	�z2TestDNSAging.test_dns_delete_simple_2_3_days_agingcCrs)Nrr�Frurar#r#r$�(test_dns_delete_simple_2_3_days_no_aging�	rwz5TestDNSAging.test_dns_delete_simple_2_3_days_no_agingcCrs�Nr�
Trurar#r#r$�&test_dns_delete_simple_2_13_days_aging�	rwz3TestDNSAging.test_dns_delete_simple_2_13_days_agingcCrs)NrrzFrurar#r#r$�)test_dns_delete_simple_2_13_days_no_aging�	rwz6TestDNSAging.test_dns_delete_simple_2_13_days_no_agingcCrs�Nr�rzTrurar#r#r$�'test_dns_delete_simple_12_13_days_aging�	rwz4TestDNSAging.test_dns_delete_simple_12_13_days_agingcCrs)Nr�rzFrurar#r#r$�*test_dns_delete_simple_12_13_days_no_aging�	rwz7TestDNSAging.test_dns_delete_simple_12_13_days_no_agingcCrs�N�p�qTrurar#r#r$�)test_dns_delete_simple_112_113_days_aging�	rwz6TestDNSAging.test_dns_delete_simple_112_113_days_agingcCrs�Nr�r�Frurar#r#r$�,test_dns_delete_simple_112_113_days_no_aging�	rwz9TestDNSAging.test_dns_delete_simple_112_113_days_no_agingcCrsr�rurar#r#r$r��	rwcCrsr�rurar#r#r$r��	rwcCrs�N�e��Ar�Trurar#r#r$�'test_dns_delete_simple_0_113_days_aging
�z4TestDNSAging.test_dns_delete_simple_0_113_days_agingcCrs)Nr�r�Frurar#r#r$�*test_dns_delete_simple_0_113_days_no_aging
rwz7TestDNSAging.test_dns_delete_simple_0_113_days_no_agingcC�|�ddd�dS�Nr�Trurar#r#r$�%test_dns_delete_simple_0_0_days_aging
rwz2TestDNSAging.test_dns_delete_simple_0_0_days_agingcCr�)Nr�Frurar#r#r$�(test_dns_delete_simple_0_0_days_no_aging
rwz5TestDNSAging.test_dns_delete_simple_0_0_days_no_agingcCrs�Nrr�Trurar#r#r$�&test_dns_delete_simple_10_0_days_aging
rwz3TestDNSAging.test_dns_delete_simple_10_0_days_agingcCrs)Nrr�Frurar#r#r$�)test_dns_delete_simple_10_0_days_no_aging
rwz6TestDNSAging.test_dns_delete_simple_10_0_days_no_agingcC�|�dddd�dSrtrurar#r#r$�+test_dns_delete_simple_2_3_days_aging_touch
�z8TestDNSAging.test_dns_delete_simple_2_3_days_aging_touchcC�|�dddd�dS)Nrr�FTrurar#r#r$�.test_dns_delete_simple_2_3_days_no_aging_touch
r�z;TestDNSAging.test_dns_delete_simple_2_3_days_no_aging_touchcCr�ryrurar#r#r$�,test_dns_delete_simple_2_13_days_aging_touch
r�z9TestDNSAging.test_dns_delete_simple_2_13_days_aging_touchcCr�)NrrzFTrurar#r#r$�/test_dns_delete_simple_2_13_days_no_aging_touch
r�z<TestDNSAging.test_dns_delete_simple_2_13_days_no_aging_touchcCr�r}rurar#r#r$�-test_dns_delete_simple_12_13_days_aging_touch 
r�z:TestDNSAging.test_dns_delete_simple_12_13_days_aging_touchcCr�)Nr�rzFTrurar#r#r$�0test_dns_delete_simple_12_13_days_no_aging_touch#
r�z=TestDNSAging.test_dns_delete_simple_12_13_days_no_aging_touchcCr�r�rurar#r#r$�/test_dns_delete_simple_112_113_days_aging_touch&
r�z<TestDNSAging.test_dns_delete_simple_112_113_days_aging_touchcCr��Nr�r�FTrurar#r#r$�2test_dns_delete_simple_112_113_days_no_aging_touch)
r�z?TestDNSAging.test_dns_delete_simple_112_113_days_no_aging_touchcCr�r�rurar#r#r$r�,
r�cCr�r�rurar#r#r$r�/
r�cCr�r�rurar#r#r$�-test_dns_delete_simple_0_113_days_aging_touch2
sz:TestDNSAging.test_dns_delete_simple_0_113_days_aging_touchcCr�)Nr�r�FTrurar#r#r$�0test_dns_delete_simple_0_113_days_no_aging_touch6
r�z=TestDNSAging.test_dns_delete_simple_0_113_days_no_aging_touchcCs|�dddd�dSr�rurar#r#r$�+test_dns_delete_simple_0_0_days_aging_touch9
r�z8TestDNSAging.test_dns_delete_simple_0_0_days_aging_touchcCs|�dddd�dS)Nr�FTrurar#r#r$�.test_dns_delete_simple_0_0_days_no_aging_touch<
r�z;TestDNSAging.test_dns_delete_simple_0_0_days_no_aging_touchcCr�r�rurar#r#r$�,test_dns_delete_simple_10_0_days_aging_touch?
r�z9TestDNSAging.test_dns_delete_simple_10_0_days_aging_touchcCr�)Nrr�FTrurar#r#r$�/test_dns_delete_simple_10_0_days_no_aging_touchB
r�z<TestDNSAging.test_dns_delete_simple_10_0_days_no_aging_touchr#c
Os�z	||i|��Wnty$}ztdt|��WYd}~dSd}~wwttd��|dur5tt|��tdt|j�d|�d|����dS)Nz6Expected success on Windows only, failed as expected:
zknown Windows failurezExpected success on Windows:
r�)r�rlrrr�__name__)rp�fnr�rjr{rqr#r#r$r$E
s���
�zTestDNSAging.windows_variationc
Cs�d}dg}dg}|jt|�dt|�d�t�tt����}t||dd�}	|r.|�||�|j|||	d�|�||�j	}
|�||�|�||�}|si|ri|	dkrb|j
|j||d	d
�|�|d�n
|�||�n|�||
�|�||�}|�||�dS)Nr;rr�rU)r�r�rr"rr0z.Windows resets static siblings (cache effect?)r#)
rmr.rr�r�rar�rr�rTr$r*r)
rpr%r�r<ror:rr�rrpr�a_rec�b_recr#r#r$�_test_dns_add_siblingR
s4
��z"TestDNSAging._test_dns_add_siblingcCrs�NrrUT�r�rar#r#r$�#test_dns_add_sibling_2_7_days_aging�
rwz0TestDNSAging.test_dns_add_sibling_2_7_days_agingcCrs)NrrUFr�rar#r#r$�&test_dns_add_sibling_2_7_days_no_aging�
rwz3TestDNSAging.test_dns_add_sibling_2_7_days_no_agingcCrs�Nr�rUTr�rar#r#r$�$test_dns_add_sibling_12_7_days_aging�
rwz1TestDNSAging.test_dns_add_sibling_12_7_days_agingcCrs)Nr�rUFr�rar#r#r$�'test_dns_add_sibling_12_7_days_no_aging�
rwz4TestDNSAging.test_dns_add_sibling_12_7_days_no_agingcCrs�Nr�r�Tr�rar#r#r$�$test_dns_add_sibling_12_3_days_aging�
rwz1TestDNSAging.test_dns_add_sibling_12_3_days_agingcCrs)Nr�r�Fr�rar#r#r$�'test_dns_add_sibling_12_3_days_no_aging�
rwz4TestDNSAging.test_dns_add_sibling_12_3_days_no_agingcCrs�Nr�rUTr�rar#r#r$�%test_dns_add_sibling_112_7_days_aging�
rwz2TestDNSAging.test_dns_add_sibling_112_7_days_agingcCrs)Nr�rUFr�rar#r#r$�(test_dns_add_sibling_112_7_days_no_aging�
rwz5TestDNSAging.test_dns_add_sibling_112_7_days_no_agingcCrs�Nr�r�Tr�rar#r#r$�&test_dns_add_sibling_12_113_days_aging�
rwz3TestDNSAging.test_dns_add_sibling_12_113_days_agingcCrs)Nr�r�Fr�rar#r#r$�)test_dns_add_sibling_12_113_days_no_aging�
rwz6TestDNSAging.test_dns_add_sibling_12_113_days_no_agingcCrs�Nr�rUTr�rar#r#r$�#test_dns_add_sibling_0_7_days_aging�
r�z0TestDNSAging.test_dns_add_sibling_0_7_days_agingcCrs)Nr�rUFr�rar#r#r$�&test_dns_add_sibling_0_7_days_no_aging�
rwz3TestDNSAging.test_dns_add_sibling_0_7_days_no_agingcCrs�Nr�rTr�rar#r#r$�#test_dns_add_sibling_0_0_days_aging�
rwz0TestDNSAging.test_dns_add_sibling_0_0_days_agingcCrs)Nr�rFr�rar#r#r$�&test_dns_add_sibling_0_0_days_no_aging�
rwz3TestDNSAging.test_dns_add_sibling_0_0_days_no_agingcCrs�NrrTr�rar#r#r$�$test_dns_add_sibling_10_0_days_aging�
rwz1TestDNSAging.test_dns_add_sibling_10_0_days_agingcCrs)NrrFr�rar#r#r$�'test_dns_add_sibling_10_0_days_no_aging�
rwz4TestDNSAging.test_dns_add_sibling_10_0_days_no_agingcCr�r�r�rar#r#r$�)test_dns_add_sibling_2_7_days_aging_touch�
r�z6TestDNSAging.test_dns_add_sibling_2_7_days_aging_touchcCr�)NrrUFTr�rar#r#r$�,test_dns_add_sibling_2_7_days_no_aging_touch�
r�z9TestDNSAging.test_dns_add_sibling_2_7_days_no_aging_touchcCr�r�r�rar#r#r$�*test_dns_add_sibling_12_7_days_aging_touch�
r�z7TestDNSAging.test_dns_add_sibling_12_7_days_aging_touchcCr�)Nr�rUFTr�rar#r#r$�-test_dns_add_sibling_12_7_days_no_aging_touch�
r�z:TestDNSAging.test_dns_add_sibling_12_7_days_no_aging_touchcCr�r�r�rar#r#r$�*test_dns_add_sibling_12_3_days_aging_touch�
r�z7TestDNSAging.test_dns_add_sibling_12_3_days_aging_touchcCr�)Nr�r�FTr�rar#r#r$�-test_dns_add_sibling_12_3_days_no_aging_touch�
r�z:TestDNSAging.test_dns_add_sibling_12_3_days_no_aging_touchcCr�r�r�rar#r#r$�+test_dns_add_sibling_112_7_days_aging_touch�
r�z8TestDNSAging.test_dns_add_sibling_112_7_days_aging_touchcCr�)Nr�rUFTr�rar#r#r$�.test_dns_add_sibling_112_7_days_no_aging_touch�
r�z;TestDNSAging.test_dns_add_sibling_112_7_days_no_aging_touchcCr�r�r�rar#r#r$�,test_dns_add_sibling_12_113_days_aging_touch�
r�z9TestDNSAging.test_dns_add_sibling_12_113_days_aging_touchcCr�)Nr�r�FTr�rar#r#r$�/test_dns_add_sibling_12_113_days_no_aging_touch�
r�z<TestDNSAging.test_dns_add_sibling_12_113_days_no_aging_touchcCr�r�r�rar#r#r$�)test_dns_add_sibling_0_7_days_aging_touch�
r�z6TestDNSAging.test_dns_add_sibling_0_7_days_aging_touchcCr�)Nr�rUFTr�rar#r#r$�,test_dns_add_sibling_0_7_days_no_aging_touch�
r�z9TestDNSAging.test_dns_add_sibling_0_7_days_no_aging_touchcCr�r�r�rar#r#r$�)test_dns_add_sibling_0_0_days_aging_touch�
r�z6TestDNSAging.test_dns_add_sibling_0_0_days_aging_touchcCr�)Nr�rFTr�rar#r#r$�,test_dns_add_sibling_0_0_days_no_aging_touch�
r�z9TestDNSAging.test_dns_add_sibling_0_0_days_no_aging_touchcCr�r�r�rar#r#r$�*test_dns_add_sibling_10_0_days_aging_touch�
r�z7TestDNSAging.test_dns_add_sibling_10_0_days_aging_touchcCr�)NrrFTr�rar#r#r$�-test_dns_add_sibling_10_0_days_no_aging_touch�
r�z:TestDNSAging.test_dns_add_sibling_10_0_days_no_aging_touchrJ)NN)r�)TN)F)T)TF)�r��
__module__�__qualname__�__doc__�SERVER_NAME�serverr �	server_ipr"�credsrcrmr�r�r�r	�
DNS_QTYPE_ALLr�r�r�r�r�r�r�r�r�r�r�r�r�r�rr
rZrrrr�DNS_TIMESTAMP_1981rrrrrr�r*rr5r6r:rQr\rbrergrjrlrmrtrurxrzr{r|r}r~r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrr r-r4r5r7r9r:r;r<r=r>r@rCrDrGrHrZr]r^rbrergrirjrkrlrmrnrrrvrxr{r|r~rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r$r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��
__classcell__r#r#rrr$r^�sh
�%/
�
� *{/i,

#"
d/cULFG 
/r^)�module�optsr[rJ)Q�sys�sambarr�	samba.ndrrr�samba.samdbr�
samba.authrr�r�samba.dcerpcr	r
r�samba.dnsserverrr
rr�samba.tests.subunitrunrrrr�samba.tests.dns_baser�samba.getopt�getopt�options�optparser��samba.colourrrr�OptionParser�parser�SambaOptions�	sambaopts�add_option_group�CredentialsOptions�credopts�subunitopts�
parse_argsr�rjrE�print_usage�exit�get_loadparmr!�get_credentialsr"r�r �set_krb_forwardable�NO_KRB_FORWARDABLE�	get_realm�lower�DOMAINrrr�r2r3rBrFr%r'r(r>rArIrMrWr]r^r�r#r#r#r$�<module>s��






	



	Q