
    b                        d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZm	Z	 d dl
mZ d dlmZ d dlZd dlmZ  G d d	e          ZdS )
    N)system_session)SamDB)
ndr_unpackndr_pack)dnsp)SambaToolCmdTest)dsdb_dnsc                        e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z xZS )DnsCmdTestCasec           	      f   t          t          |                                            dt          j        d         z  | _        dt          j        d         dt          j        d         | _        |                     d| j        | j                  | _        t          | j        
                                          | _        d| _        d	| _        |                     | j                   |                                  d
dddz  dddddg}g d}ddg}g d}ddg}g d}|D ]2}|                    d|z             |                    d|z             3|D ]2}|                    d|z             |                    d|z             3ddgg d|||||g dd | _        d!d"gg d#|||||d$| _        d S )%Nz	ldap://%sSERVERz-UDC_USERNAMEz%DC_PASSWORDz-Hz192.168.0.193z192.168.0.194SAMDOM.EXAMPLE.COMz1.EXAMPLE.COMz%sEXAMPLE.COMz1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.EXAMPLEz!@#$%^&*()_u
   HIGHÿBYTEz@.EXAMPLE.COM.)z...z.EXAMPLE.COMz	.EXAMPLE. zSAMDOM..EXAMPLE.COMzSAMDOM.EXAMPLE.COM 65530zSAMDOM.EXAMPLE.COM     0)zSAMDOM.EXAMPLE.COM -1r    zSAMDOM.EXAMPLE.COM 1 1z%SAMDOM.EXAMPLE.COM SAMDOM.EXAMPLE.COMz$SAMDOM.EXAMPLE.COM 65530 65530 65530z$SAMDOM.EXAMPLE.COM     1     1     1)zSAMDOM.EXAMPLE.COM 0 65536 0zSAMDOM.EXAMPLE.COM 0 0 65536zSAMDOM.EXAMPLE.COM 65536 0 0z%s 1z%s 0 0 0z192.168.0.1z255.255.255.255)
z'1234:5678:9ABC:DEF0:0000:0000:0000:0000z'0000:0000:0000:0000:0000:0000:0000:0000z'1234:5678:9ABC:DEF0:1234:5678:9ABC:DEF0z1234:1234:1234::z1234:5678:9ABC:DEF0::z0000:0000::0000z#1234::5678:9ABC:0000:0000:0000:0000z::1z::z1:1:1:1:1:1:1:1)textr   z@#!
)AAAAAPTRCNAMENSMXSRVTXTz192.168.0.500z255.255.255.255/32)z'GGGG:1234:5678:9ABC:0000:0000:0000:0000z)0000:0000:0000:0000:0000:0000:0000:0000/1z'AAAA:AAAA:AAAA:AAAA:G000:0000:0000:1234z,1234:5678:9ABC:DEF0:1234:5678:9ABC:DEF0:1234z"1234:5678:9ABC:DEF0:1234:5678:9ABCz1111::1111::1111)r   r   r   r   r   r   r   )superr   setUposenvirondburlcreds_stringgetSamDBsamdbstrget_config_basedn	config_dntestiptestip2
addCleanup
deleteZoneaddZoneappendgood_recordsbad_records)
selfgood_dnsbad_dnsgood_mxbad_mxgood_srvbad_srvbad_dngood_dn	__class__s
            ?/usr/lib/python3/dist-packages/samba/tests/samba_tool/dnscmd.pyr    zDnsCmdTestCase.setUp    sC   nd##))+++ 2:h#77

*,*]*C*C*C*,*]*C*CE ]]4T5FGG
TZ99;;<<%&((( )##z2!"#* * * .-/; ; ; ;:<3 3 3  	0 	0FMM&6/***NN:.//// 	2 	2GNN6G+,,,OOJ01111 #$56	+ 	+ 	+  !000#
 
* %)+, , ,  
 
    c                 V    |                                   |                                  d S )N)r-   r.   )r2   s    r<   	resetZonezDnsCmdTestCase.resetZoney   s#    r=   c                     d| _         |                     ddt          j        d         | j         | j                  \  }}}|                     |||           d S )Nzonedns
zonecreater   )rA   	runsubcmdr!   r"   r$   assertCmdSuccessr2   resultouterrs       r<   r.   zDnsCmdTestCase.addZone}   s]    	>>%*6*,*X*>*.)*.*;	= =S
 	fc3/////r=   c                     |                      ddt          j        d         | j        | j                  \  }}}|                     |||           d S )NrB   
zonedeleter   )rD   r!   r"   rA   r$   rE   rF   s       r<   r-   zDnsCmdTestCase.deleteZone   sV    >>%*6*,*X*>*.)*.*;	= =S
 	fc3/////r=   c                    d| d| j                                          }d}| j                             |t          j        |ddg          }i }|D ]:}|d         d                                         }t          |d                   ||<   ;|S )NDC=#,CN=MicrosoftDNS,DC=DomainDNSZones,z/(&(objectClass=dnsNode)(!(dNSTombstoned=TRUE)))	dnsRecordnamebasescope
expressionattrsr   )r&   get_default_basednsearchldbSCOPE_SUBTREEdecodelist)r2   	zone_namezone_dnrT   nodes
record_mapnoderP   s           r<   get_all_recordszDnsCmdTestCase.get_all_records   s    8 8 8j33558 8 G

!!wc6G-7)4f(= " ? ? 
 	7 	7D<?))++D#D$566Jtr=   c                    | j                             d| j                                         z  t          j        ddg          }|D ]!}|t          |j                  v r	|j        } n"| j                             |t          j        ddg          }|D ]G}|t          |j                  v r/|j        t          t          j	        |d         d                   fc S Hd S )NzDC=DomainDnsZones,%sz(objectClass=dnsZone)cnrQ   z(objectClass=dnsNode)rO   r   )
r&   rW   rV   rX   rY   r'   dnr   r   DnssrvRpcRecord)r2   r\   record_namezonesrA   r]   recordsold_packed_records           r<   get_record_from_dbz!DnsCmdTestCase.get_record_from_db   s#   
!!'=$(J$A$A$C$C(D(+(9-D)-	 " 0 0  	 	DCLL((' ) *##8I/F+6- $ 9 9 ") 	G 	Gc"3"67777),"4#7#4[#A!#DF FG G G G 8	G 	Gr=   c           
         d}d}|                      ddt          j        d         | j        d||| j                  \  }}}|                     |||d|d|d	           |                     | j        d          \  }}d
|_        | j        	                    ||g          }|| 
                    d           g }	|                      ddt          j        d         | j        d|| j                  \  }}}	 |                     |||d           |                     d|v o||v d           n# t          $ r
}
Y d }
~
nd }
~
ww xY w|                      ddt          j        d         | j        d||| j                  \  }}}	 |                     |d           n,# t          $ r}
|	                    |
           Y d }
~
nd }
~
ww xY w|                      ddt          j        d         | j        d||| j                  \  }}}	 |                     |||d           n,# t          $ r}
|	                    |
           Y d }
~
nd }
~
ww xY w|                      ddt          j        d         | j        d|| j                  \  }}}	 |                     |d           n,# t          $ r}
|	                    |
           Y d }
~
nd }
~
ww xY wt          |	          d
k    r+d}|	D ]}|dz   t!          |          z   }t          |          d S )Nz192.168.50.50r   rB   addr   
testrecordFailed to add record '' with type r   r   z2Unable to update dns record to have DNS_RANK_NONE.queryz4Failed to query for a recordwhich had DNS_RANK_NONE.zVQuery for a record which had DNS_RANK_NONEsucceeded but produced no resulting records.zBSuccessfully added duplicate recordof one which had DNS_RANK_NONE.deletez/Failed to delete recordwhich had DNS_RANK_NONE.z?Successfully queried for deleted recordwhich had DNS_RANK_NONE.z0Failed appropriate behaviour with DNS_RANK_NONE:r   )rD   r!   r"   rA   r$   rE   rj   rankr&   dns_replace_by_dnfail
assertTrueAssertionErrorassertCmdFailr/   lenr'   )r2   
record_strrecord_type_strrG   rH   rI   rd   recordreserrorseerr_strerrors                r<   test_rank_nonezDnsCmdTestCase.test_rank_none   s   $
>>%
88L*.)\?*4d6GI IS 	fc33!+___>	? 	? 	? ,,TYEE
Fj**2x88?IIJKKK  >>%"*X:N*.)\?*.*;= =S		!!&#s#=> > > OOLC/EJ#4EKL L L L  	 	 	DDDD	
  >>%
88L*.)\?*4d6GI IS	v (A B B B B 	 	 	MM!	  >>%2:h;O*.)\?*4d6GI IS	!!&#s 5= > > > > 	 	 	MM!	  >>%"*X:N*.)\*94;LN NS	v (: ; ; ; ; 	 	 	MM!	 v;;??HG 6 6!D.3u::5 )))	 ?sZ   24D' '
D;6D;9F 
F9F44F97H 
H9H44H96J 
J6J11J6c                 ,   d}g }| j         D ]R}| j         |         D ]@}	 |                     ddt          j        d         | j        d||| j                  \  }}}|                     |||d|d|d           |                     dd	t          j        d         | j        d|| j                  \  }}}|                     |||d
|d|d           |                     ddt          j        d         | j        d||| j                  \  }}}|                     |||d|d|d           # t          $ r%}|dz   }|                    |           Y d}~:d}~ww xY wT|dk    r.|D ]}	t          |	           | 
                    d|z             dS dS )zN
        For all good records, attempt to add, query and delete them.
        r   rB   rl   r   rm   zFailed to addrecord  with type r   rp   zFailed to queryrecord  with qualifier rq   zFailed to removerecord    N@Failed to accept valid commands. %d total failures.Errors above.)r0   rD   r!   r"   rA   r$   rE   rv   r/   printrt   )
r2   num_failuresfailure_msgsdnstyper{   rG   rH   rI   r~   msgs
             r<   test_accept_valid_commandsz)DnsCmdTestCase.test_accept_valid_commands   sE    ( 	+ 	+G+G4 + ++'+~~eU68j6J6:i6=v6:6G	(I (I$FC
 ))&#ss-3VVWWW=> ? ? ? (,~~eW68j6J6:i6=6:6G	(I (I$FC
 ))&#ss-3VVWWW=> ? ? ? (,~~eX68j6J6:i6=v6:6G	(I (I$FC
 ))&#ss-3VVWWW=> ? ? ? ? & + + +#/!#3L ''********+9+@ !#  c



II &(45 6 6 6 6 6 s   D
D,,
E6EEc                 2   d}g }| j         D ]P}| j         |         D ]>}	 |                     ddt          j        d         | j        d||| j                  \  }}}|                     |d|d|d           nE# t          $ r8}|d	z   }|                    |           | 	                                 Y d
}~nd
}~ww xY w	 |                     ddt          j        d         | j        d||| j                  \  }}}|                     |d|d|d           # t          $ r9}|d	z   }|                    |           | 	                                 Y d
}~8d
}~ww xY wR| j         D ]|}| j         |         D ]j}	| j
        |         d         }
	 |                     ddt          j        d         | j        d||
| j                  \  }}}|                     |||d|d|d           |                     ddt          j        d         | j        d||
|	| j        	  	        \  }}}|                     |d|
d|d|	d           |                     ddt          j        d         | j        d||
| j                  \  }}}|                     |||d|
d|d           &# t          $ r9}|d	z   }|                    |           | 	                                 Y d
}~dd
}~ww xY w~|dk    r.|D ]}t          |           |                     d|z             d
S d
S )z}
        For all bad records, attempt to add them and update to them,
        making sure that both operations fail.
        r   rB   rl   r   rm   z"Successfully added invalidrecord '' of type ''.r   Nrq   z$Successfully deleted invalidrecord 'z' whichshouldn't exist.rn   ro   r   updatez#Successfully updated valid record 'z' to invalid record 'z' of the same type.Could not delete valid record 'zCFailed to reject invalid commands. %d total failures. Errors above.)r1   rD   r!   r"   rA   r$   rw   rv   r/   r?   r0   rE   r   rt   )r2   r   r   r   r{   rG   rH   rI   r~   
bad_recordgood_recordr   s               r<   test_reject_invalid_commandsz+DnsCmdTestCase.test_reject_invalid_commands(  sY   
  ' 	% 	%G*73 % %%'+~~eU68j6J6:i6=v6:6G	(I (I$FC
 &&vv*0&&'''0; < < < < & % % %#/!#3L ''***NN$$$$$$$$%%'+~~eX68j6J6:i6=v6:6G	(I (I$FC
 &&vv=CVVWWW0N O O O O & % % %#/!#3L ''***NN$$$$$$$$%/%< ' $	% $	%G".w7 #% #%
"/8; %'+~~eU68j6J6:i6={6:6G	(I (I$FC
 ))&#ss-3VVWWW=> ? ? ? (,~~eX68j6J6:i6={6@6:6G(I (I$FC &&vv +6++www


0L M M M
 (,~~eX68j6J6:i6={6:6G	(I (I$FC
 ))&#ss-8[['''=C D D D D & % % %#/!#3L ''***NN$$$$$$$$%A#%J !#  c



II &(45 6 6 6 6 6 sJ   AA88
B:.B55B:>AD
E .EEDJ
K%.KKc                    d}|D ]J}| j         |         d         }|                     ddt          j        d         | j        d||| j                  \  }}}|                     |||d|d|d	           |D ]}||k    r	| j         |         d         }|                     dd
t          j        d         | j        d|||| j        	  	        \  }}}|                     |d|d|d|d|d	           |                     dd
t          j        d         | j        d|||| j        	  	        \  }}}|                     |d|d|d|d|d	           ِLdS )a  Make sure that a record can't be updated to another type leaving
        the data the same, where that data would be incompatible with
        the new type. This is not always enforced at the C level.

        We don't try with all types, because many types are compatible
        in their representations (e.g. A records could be TXT or CNAME
        records; PTR record values are exactly the same as CNAME
        record values, etc).
        )r   r   r   r   rB   rl   r   rm   Failed to add record r   r   r   Successfully updated record '' to 'z&', even though the latter is of type 'z	' where 'z' was expected.z&', even though the former is of type 'Nr0   rD   r!   r"   rA   r$   rE   rw   )	r2   dnstypesdnstype1record1rG   rH   rI   dnstype2record2s	            r<   test_update_invalid_typez'DnsCmdTestCase.test_update_invalid_type|  s    (  %	M %	MH'1!4G#~~eU.0j.B.2i.6.2.?	 A  AFC
 !!&#ss%,WWhhh58 9 9 9 % M Mx''+H5a8 $(>>%24*X2F26)\2:G294;L	$N $N S
 ""66 '.ggwww(((,L M M M
 $(>>%24*X2F26)\2:GW262C	$E $E S
 ""66 '.ggwww(((,L M M M M/M%	M %	Mr=   c                 6   | j         D ]*}| j         |         D ]}|                     ddt          j        d         | j        d||| j                  \  }}}|                     |||d|d|d           |dk    r|dk    ri|                     dd	t          j        d         | j        d|||| j        	  	        \  }}}|                     |||d
|z             |                     ddt          j        d         | j        d||| j                  \  }}}|                     |||d|d|d           ,| j         d         D ]}|                     ddt          j        d         | j        dd|| j                  \  }}}|                     |||d|z             |                                }t          t          |d                   dz             }|d         d|d         d|d         d|}|                     dd	t          j        d         | j        dd||| j        	  	        \  }}}|                     |||d|ddd|d           |                     ddt          j        d         | j        dd| j                  \  }}}|                     |||d|ddd           |                     ddt          j        d         | j        dd|| j                  \  }}}|                     |||d|ddd           | j         D ]}t          | j         |                   dk     r"| j         |         d         }	| j         |         d         }
| j         |         d         }|                     ddt          j        d         | j        d||	| j                  \  }}}|                     |||d|	d|d           |                     dd	t          j        d         | j        d||
|| j        	  	        \  }}}|                     |d|	d|
d|d           d S )NrB   rl   r   rm   r   r   r   r   r   z4Could not update record '%s' to be exactly the same.rq   r   r   r   r   z(Failed to add record %s with type 'SRV'.   r   r   r      zFailed to update record 'r   rp   Failed to query for record 'r   z' from 'z4', even though the given source record is incorrect.)r0   rD   r!   r"   rA   r$   rE   splitr'   intrx   rw   )r2   r   r{   rG   rH   rI   r   new_bit
new_recordused_recordunused_records              r<   test_update_valid_typez%DnsCmdTestCase.test_update_valid_type  sM   ( %	; %	;G+G4 $; $;#'>>%24*X2F26)\296262C	$E $E S
 %%fc33)/9: ; ; ; S==W%5%5  $(>>%24*X2F26)\2966262C	$E $E S
 %%fc3'EGM'NO O O $(>>%24*X2F26)\296262C	$E $E S
 %%fc33)/9: ; ; ; ;E$;L '. %	9 %	9F#~~eU.0j.B.2i.3V.2.?	 A  AFC
 !!&#s 5?AG5H I I I LLNNE#eAh--!+,,G*/(((E!HHHeAhhhPJ#~~eX.0j.B.2i.3V.8$:K	 M  MFC
 !!&#ss%+VVUUUJJJ5@ A A A  $~~eW.0j.B.2i.3T5F H  HFC !!&#ss%/ZZ58 9 9 9  $~~eX.0j.B.2i.3Z.2.?	 A  AFC
 !!&#ss%/ZZ58 9 9 9 9 ( 	K 	KG4$W-..22+G4Q7K -g6q9M*73A6J#~~eU.0j.B.2i.5{.2.?	 A  AFC
 !!&#ss5@[['''5K L L L  $~~eX.0j.B.2i.5}.8.2.? A  AFC vv #.++}}}jjj(J K K K K-	K 	Kr=   c           
          |                      ddt          j        d         | j        ddd| j                  \  }}}|                     |d           |                     d|v d	|z             d S )
NrB   rl   r   rm   SOAtestzNSuccessfully added record of type SOA, when this type should not be available.ztype SOA is not supportedzEInvalid error message '%s' when attempting to add record of type SOA.)rD   r!   r"   rA   r$   rw   ru   rF   s       r<   test_invalid_typesz!DnsCmdTestCase.test_invalid_types  s    >>%*,*X*>*.)\*/*.*;	= =S
 	6 $E 	F 	F 	F3s:2478	9 	9 	9 	9 	9r=   c                    d}| j         D ]q}| j         |         d         }| j         D ]R}|dz  }|dz  dk    r||k    r| j         |         d         }|                     ddt          j        d         | j        d||| j                  \  }}}|                     |||d|d	|d
           |                     ddt          j        d         | j        d||| j                  \  }}}|                     |||d|d	|d|d	|d	           |                     ddt          j        d         | j        d|| j                  \  }}}|                     |||d|d	|d|d	|d	           |                     ddt          j        d         | j        d|| j                  \  }}}|                     |||d|d	|d|d	|d
	           |                     ddt          j        d         | j        d||| j                  \  }}}|                     |||d|d	|d
           |                     ddt          j        d         | j        d||| j                  \  }}}|                     |||d|d	|d
           TsdS )zp
        Make sure that we can add an entry with the same name as an existing one but a different type.
        r   r      rB   rl   r   rm   rn   r   r   z' when a record 'z' with the same name exists.rp   r   z' when a new record 'z' with the same name was added.zFailed to query record 'z=' which should have been added with the same name as record 'rq   zFailed to delete record 'N)r0   rD   r!   r"   rA   r$   rE   )	r2   ir   r   r   r   rG   rH   rI   s	            r<   #test_add_overlapping_different_typez2DnsCmdTestCase.test_add_overlapping_different_type&  sr   
 ) C	= C	=H'1!4G - A= A=Qq5A::x''+H5a8#'>>%24*X2F26)\2:G262C	$E $E S
 %%fc33>Eggxxx9Q R R R $(>>%24*X2F26)\2:G262C	$E $E S
 %%fc33 *1(((GGGXXX9O P P P
 $(>>%24*X2F26)\2:D<M$O $O S %%fc33 *1(((GGGXXX	9O P P P $(>>%24*X2F26)\2:D<M$O $O S %%fc33 *1(((GGGXXX	9O P P P $(>>%24*X2F26)\2:G262C	$E $E S
 %%fc33)0(((9< = = = $(>>%24*X2F26)\2:G262C	$E $E S
 %%fc33)0(((9< = = = =A=C	= C	=r=   c           
         |                      ddt          j        d         | j        dd| j        | j                   |                      ddt          j        d         | j        dd| j        | j                   |                      ddt          j        d         | j        dd| j                  \  }}}|                     |           d S )NrB   rl   r   rm   r   rq   rp   rD   r!   r"   rA   r*   r$   rw   rF   s       r<   test_query_deleted_recordz(DnsCmdTestCase.test_query_deleted_recordq  s    ueRZ%949#S$+t7H	J 	J 	Juh
8(<di#S$+t7H	J 	J 	J  >>%*,*X*>*.)\*-t/@B BS 	6"""""r=   c                    | j         D ]w}|                     ddt          j        d         | j        d|| j         |         d         | j                  \  }}}|                     |||           |                     ddt          j        d         | j        d|| j         |         d         | j                  \  }}}|                     |           |                     ddt          j        d         | j        d|| j                  \  }}}|                     |||           |                     ddt          j        d         | j        d|| j         |         d         | j                  \  }}}|                     |||           yd S )NrB   rl   r   rm   r   rp   rq   r   )r2   record_typerG   rH   rI   s        r<   test_add_duplicate_recordz(DnsCmdTestCase.test_add_duplicate_record}  s   , 	4 	4K#~~eU.0j.B.2i.9.2.?.LQ.O.2.? A  AFC !!&#s333#~~eU.0j.B.2i.9.2.?.LQ.O.2.? A  AFC v&&&#~~eW.0j.B.2i.94;L N  NFC !!&#s333#~~eX.0j.B.2i.9.2.?.LQ.O.2.? A  AFC !!&#s33335	4 	4r=   c           
         |                      ddt          j        d         | j        dd| j        | j                   |                      ddt          j        d         | j        dd| j        | j                   |                      ddt          j        d         | j        dd| j        | j                  \  }}}|                     |           |                      ddt          j        d         | j        dd| j                  \  }}}|                     |           |                      ddt          j        d         | j        dd| j        | j                  \  }}}|                     |           d S )	NrB   rl   r   rm   r   rq   rp   testrecord2r   rF   s       r<   test_remove_deleted_recordz)DnsCmdTestCase.test_remove_deleted_record  so   ueRZ%949#S$+t7H	J 	J 	Juh
8(<di#S$+t7H	J 	J 	J  >>%*,*X*>*.)\*-t{D<MO OS 	6""">>%*,*X*>*.)\*-t/@B BS 	6""">>%*,*X*>*.)]*-t{D<MO OS 	6"""""r=   c           
         |                      ddt          j        d         | j        dd| j        | j                   d                    d| j                                                  }|                      ddt          j        d         | j        dd|| j                   |                      ddt          j        d         | j        d	d
|| j                   |                      ddt          j        d         | j        dd|| j                   d                    |          }|                      ddt          j        d         | j        dd|| j                   |                      ddt          j        d         || j                   dD ]}| j        	                    d                    | j        
                                          t          j        d                    |          dg          }|                     t          |          d           |D ]+}|                     t          |d                   d           ,dS )z;
        Test dns cleanup command is working fine.
        rB   rl   r   testar   {0}.{1}	testcnamer   testnsr   testptrr   {0} 65530 65530 65530testsrvr   cleanup)r   r   r   r   r   DC=DomainDnsZones,{0}"(&(objectClass=dnsNode)(name={0}))dNSTombstonedrQ   r   TRUENrD   r!   r"   rA   r*   r$   formatlowerr&   rW   rV   rX   rY   assertEqualrx   r'   r2   dnshostname
srv_recordrf   rh   r{   s         r<   test_cleanup_recordz"DnsCmdTestCase.test_cleanup_record  sR    	ueRZ%949T[$2C	E 	E 	E  &&w	0A0ABB 	ueRZ%949"G[$:K	M 	M 	M 	ueRZ%949{D4E	G 	G 	G 	ueRZ%949 %d6G	I 	I 	I -33K@@
ueRZ%949 %T5F	H 	H 	H 	uiH)="D$5	7 	7 	7 R 
	G 
	GKj'',33DJ4Q4Q4S4STT'?FF{SS&'	 ( ) )G S\\1---! G G  VO%<!=!=vFFFFG
	G 
	Gr=   c           
         |                      ddt          j        d         | j        dd| j        | j                   d                    d| j                                                  }|                      ddt          j        d         | j        dd	|| j                   |                      ddt          j        d         | j        d
d|| j                   |                      ddt          j        d         | j        dd|| j                   d                    |          }|                      ddt          j        d         | j        dd|| j                   |                      ddt          j        d         | j        dd| j        | j                   |                      ddt          j        d         || j                   dD ]}| j        	                    d                    | j        
                                          t          j        d                    |          dg          }|                     t          |          d           |D ]+}|                     t          |d                   d           ,dS )zB
        Test dns cleanup command works with no A record.
        rB   rl   r   notestar   r   r   notestcnamer   notestnsr   	notestptrr   r   	notestsrvr   rq   r   )r   r   r   r   r   r   r   rQ   r   r   Nr   r   s         r<   test_cleanup_record_no_A_recordz.DnsCmdTestCase.test_cleanup_record_no_A_record  s    	ueRZ%949 #t{D4E	G 	G 	G  &&w	0A0ABB 	ueRZ%949$g{D<M	O 	O 	O 	ueRZ%949!4d6G	I 	I 	I 	ueRZ%949"E;8I	K 	K 	K -33K@@
ueRZ%949"E:t7H	J 	J 	J 	uh
8(<di #t{D4E	G 	G 	G 	uiH)="D$5	7 	7 	7 Q 
	G 
	GKj'',33DJ4Q4Q4S4STT'?FF{SS&'	 ( ) )G S\\1---! G G  VO%<!=!=vFFFFG
	G 
	Gr=   c                    ddg}d}|D ]}|                      ddt          j        d         | j        |d| j        | j                   d                    || j                                                  }d	                    |          }|                      ddt          j        d         | j        |d
|| j                   | j        	                    d                    | j        
                                          t          j        d                    |          dg          }|                     t          |d         d                   d           d                    | j                                                  }|                      ddt          j        d         || j                   | j        	                    d                    | j        
                                          t          j        d                    |          ddg          }|                     t          |d         d                   d           |d         d         d         }t          t           j        |          }	d                    | j                                                  }
|                     |	j        j        |
           |                     d|d         vpt+          |d         d                   dk               dS )a?  
        Test dns cleanup command for multi-valued SRV record.

        Steps:
        - Add 2 A records host1 and host2
        - Add a SRV record srv1 and points to both host1 and host2
        - Run cleanup command for host1
        - Check records for srv1, data for host1 should be gone and host2 is kept.
        host1host2srv1rB   rl   r   r   r   r   r   r   r   rO   rQ   r   r   z	host1.{0}r   r   r   z	host2.{0}FALSEN)rD   r!   r"   rA   r*   r$   r   r   r&   rW   rV   rX   rY   r   rx   r   r   re   data
nameTargetru   r'   )r2   hostssrv_namehostr   r   rh   dnshostname1dns_record_bindns_record_objdnshostname2s              r<   test_cleanup_multi_srv_recordz,DnsCmdTestCase.test_cleanup_multi_srv_record  s    '"  
	K 
	KDNN5%H)=tydk43DF F F $**41B1BCCK 177DDJNN5%H)=ty#UJ8IK K K K *##(//
0M0M0O0OPP#;BB8LL-	 $ ! ! 	WQZ455q999 #))$)//*;*;<<uiH)=#T%6	8 	8 	8 *##(//
0M0M0O0OPP#;BB8LL0	 $ 2 2 	WQZ455q999 !K03#D$8.II #))$)//*;*;<<,7FFF 	wqz9 DGAJ788GC	E 	E 	E 	E 	Er=   c                    d}g }ddg}|D ]\  }}}}	 |                      ddt          j        d         | j        |||| j                  \  }}	}
|                     ||	|
d|d|d	|d
           |                      ddt          j        d         | j        ||| j                  \  }}	}
|                     ||	|
d|d|d
           |                      ddt          j        d         | j        ||| j                  \  }}	}
|                     |d|d|d
           |                      ddt          j        d         | j        |||| j                  \  }}	}
|                     ||	|
d|d|d
           n# t          $ r%}|dz   }|                    |           Y d}~d}~ww xY w|dk    r.|D ]}t          |           | 
                    d|z             dS dS )zT
        Ensure that DNS wild card entries can be added deleted and queried
        r   )z*.MISSr   z1.1.1.1)z*.SAMDOMzMISS.SAMDOMr   z1.1.1.2rB   rl   r   r   z (z) with type r   rp   zFailed to query record r   rq   zFailed to remove record r   r   Nr   )rD   r!   r"   rA   r$   rE   rw   rv   r/   r   rt   )r2   r   r   rh   rP   missr   r{   rG   rH   rI   r~   r   s                r<   test_dns_wildcardsz!DnsCmdTestCase.test_dns_wildcardsN  s    1>@-4 3	' 3	')T4&2'#'>>%24*X2F26)T296262C	$E $E S
 %%Cfffggg/	1 1 1 $(>>%24*X2F26)T29262C	$E $E S
 %%C)	+ + + $(>>%24*X2F26)T29262C	$E $E S
 ""F)+ + +
 $(>>%24*X2F26)T296262C	$E $E S
 %%C)	+ + + + " ' ' '+a/##A&&&&&&&&' !#  c



II &(45 6 6 6 6 6 s   E#E99
F(F##F(c           	          dD ]i}|                      ddd|t          j        d         | j                  \  }}}|                     |||d|z             |                     |dk               jd S )N)w2kdotnetlonghornrB   
serverinfoz--client-versionr   z1Failed to print serverinfo with client version %sr   )rD   r!   r"   r$   rE   ru   )r2   vrG   rH   rI   s        r<   test_serverinfozDnsCmdTestCase.test_serverinfo  s    . 	' 	'A#~~e.:.@!.0j.B.2.?	 A  AFC
 !!&"%"%#689#:; ; ;
 OOC2I&&&&	' 	'r=   c                     |                      ddt          j        d         | j        | j                  \  }}}|                     |||d           |                     |dk               d S )NrB   zoneinfor   zFailed to print zoneinfor   )rD   r!   r"   rA   r$   rE   ru   rF   s       r<   test_zoneinfozDnsCmdTestCase.test_zoneinfo  sy    >>%*4*,*X*>*.)*.*;	= =S
 	f!!8	: 	: 	: 	r	"""""r=   c                     dgddidfdgddidfdgddidfd	gi dfd	d
gi dfdd
gddddfddgddddfg ddddddfg di dfdgi dfdgi dffD ]-\  }}} | j         ddt          j        d         | j        | j        g|R  \  }}}|r|                     |d           n|                     |||d           |                      ddt          j        d         | j        | j                  \  }}}	|                     |||	d           d t          j        d|t          j	                  D             }
|
                                D ]7\  }}|                     ||
           |                     ||
|                    8/d S )Nz	--aging=1fAgingr   F	--aging=0r   z
--aging=-1Tz	--aging=2z--norefreshinterval=11)r   dwNoRefreshIntervalz--norefreshinterval=00)r   z--norefreshinterval=99--refreshinterval=9999)r   r   dwRefreshInterval)r   z--norefreshinterval=-99r   z--refreshinterval=9999999z--norefreshinterval=9999999rB   zoneoptionsr   zzoneoptions should failzoneoptions shouldn't failr   z)zoneinfo shouldn't fail after zoneoptionsc                     i | ]\  }}||	S  r  ).0kr   s      r<   
<dictcomp>z9DnsCmdTestCase.test_zoneoptions_aging.<locals>.<dictcomp>  s*     ? ? ?TQAq ? ? ?r=   z^\s*(\w+)\s*:\s*(\w+)\s*$)rD   r!   r"   rA   r$   rw   rE   refindall	MULTILINEitemsassertInr   )r2   optionsvalsr   rG   rH   rI   info_rinfo_outinfo_errinfor  r   s                r<   test_zoneoptions_agingz%DnsCmdTestCase.test_zoneoptions_aging  sw   6 2E:7 3U;(G!4d;D)67TB67"3??H67"3??HPPP#)-'+- -.35 RQQT-.D9/0"d;#% 2	- 2	- GT5&  .t~e.;.0j.B.2i.2.?	 8
 07 8  8  8FC  D""6+DEEEE%%f&)&)&BD D D *.8B8:
88L8<	8<8I	*K *K&FHh !!&"*"*"MO O O
? ?RZ0L0802&> &> ? ? ?D 

 - -1a&&&  DG,,,,-a2	- 2	-r=   c                 <   d| d| j          d| j                                         }g }|D ]}t          j                    }|                    dt          j                  |_        t          j        |_	        d|_
        |                    dd          |_        |                    dd	          |_        |                    t          |                     t          j                            | j        |d
dg|d          }| j                            |           d S )NrM   z,DC=rN   wTypei  dwTimeStampr   r   z10.10.10.10topdnsNode)rd   objectClassrO   )rA   r&   rV   r   re   get
DNS_TYPE_Ar  DNS_RANK_ZONErr   dwTtlSecondsr  r   r/   r   rX   Message	from_dictrl   )r2   rP   rh   rd   dns_recordsrrecr   s           r<   ldap_add_node_with_recordsz)DnsCmdTestCase.ldap_add_node_with_records  s!   3D 3 3di 3 3..003 3  	. 	.A&((Cgt77CI)CH"CeeM155COuuV]33CHx}}----k##DJ+-5:I4F2=%& %&' '
 	
sr=   c                    t           j        t           j        t           j        f}t	          j                    }t          j        t          |                    }|                     | j	                  }i }|
                                D ]\  }}g }|||<   |D ]s}	t          t           j        |	          }
|
j        }t          ||z
            dk     rd}|
j        |v r|                    d|f           \|                    d|f           t|S )Nr   nowishR-)r   r  DNS_TYPE_AAAADNS_TYPE_TXTtimer	   unix_to_dns_timestampr   ra   rA   r  r   re   r  absr  r/   )r2   	re_wtypestnowrh   tsmapr  recsmr  r  	timestamps               r<   get_timestamp_mapz DnsCmdTestCase.get_timestamp_map  s   _'&(	 IKK,SVV44&&ty11}} 	/ 	/GAtAE!H 	/ 	/t3S99M	y3''!++ (I7i''HHc9-....HHc9-....	/ r=   c                 2   d| _         | j        D ]}| j        |         d d         D ]}|                     ddt          j        d         | j        d||| j                   |                     ddt          j        d         | j        d||| j                   |                     ddt          j        d         | j        d||| j                   d	D ] }d
| }|                     |d|ig           !g }d	D ]4}d|dz	  dz   d|dz	  dz   d|dz   }|                    ||d           5|                     d|           | 	                                }dgi g dfddgi g ddfdgdgdgg ddg ddfdgi g dfdgi g dfdgdg d id!gdfd"d#gi g d$dfd%gdg d id&gdfd'gdg d(id)gdfd*gi g dfd+d,gi g d-fd.d,gi g d-fd.d/gi d0gdfd1gi g dfd2gdg d3id4gdfd5dgi d6d7gdfd,gg d3dgg d8d9g d:dfd+gg d g d d;gd;gd;gd;gg d<g d d=g d>dffD ]\  }}	}
} | j        dd?t          j        d         | j        | j        g|R  \  }}}|r| 
                    |d@| dA           n|                     |||dB           | 	                                }|                     t          |          t          |                     i }|D ]}||         ||         k    r||         ||<    |                     |	|           |
D ]}|                     ||           |}
d S )CNi'  r   rB   rl   r   frobitzweerglysnizle)r   d   i@B 逖 zts-r  z10.      r      )r  r   ts-multiz$--mark-old-records-static=1971-13-04zbad datez$--mark-old-records-static=1971-03-04z	--dry-run)z1would make 1/1 records static on ts-1000000.zone.z-would make 1/1 records static on ts-100.zone.z/would make 2/4 records static on ts-multi.zone.Fr#  r   )r<  r<  r<  r#  r7  )ts-100
ts-1000000r;  )z+made 1/1 records static on ts-1000000.zone.z'made 1/1 records static on ts-100.zone.z)made 2/4 records static on ts-multi.zone.z$--mark-old-records-static=1972-03-04z --mark-records-static-regex=snizz!--mark-records-dynamic-regex=sniz)r#  r"  r@  r@  r@  r$  r   rA  rA  rA  rA  rA  rA  rA  rA  rA  r@  r@  )made 6/16 records dynamic on snizle.zone.z!--mark-records-dynamic-regex=[sw]z-n)z0would make 3/4 records dynamic on ts-multi.zone.z,would make 1/1 records dynamic on ts-0.zone.z2would make 1/1 records dynamic on ts-1000000.zone.z0would make 6/16 records dynamic on weergly.zone.z.would make 1/1 records dynamic on ts-100.zone.z--mark-records-dynamic-regex=z*made 6/16 records dynamic on frobitz.zone.z --mark-records-dynamic-regex=[i])r@  r@  r@  r=  z*made 3/4 records dynamic on ts-multi.zone.z+--mark-records-dynamic-regex=^aloooooo[qw]+z--mark-records-dynamic-regex=.z--mark-records-static-regex=.Tz$--mark-old-records-static=1997-07-07r   zSet Aging to 0z--mark-records-static-regex=weez--mark-records-static-regex=obi)r<  r<  r<  r<  rA  rA  rA  rA  rA  rA  rA  rA  rA  rA  r<  r<  z)made 6/16 records static on frobitz.zone.z$--mark-old-records-static=2222-03-04z.would make 6/16 records static on snizle.zone.z/would make 3/4 records static on ts-multi.zone.)r<  r<  r<  r<  )r5  ts-10000000r;  )z)made 4/4 records static on ts-multi.zone.z,made 1/1 records static on ts-10000000.zone.z(made 6/16 records static on snizle.zone.r@  )r@  r@  r@  r@  )r3  r5  zts-0r>  r?  rD  r;  r4  )z*made 4/4 records dynamic on ts-multi.zone.rB  z&made 1/1 records dynamic on ts-0.zone.z,made 1/1 records dynamic on ts-1000000.zone.z-made 1/1 records dynamic on ts-10000000.zone.z(made 1/1 records dynamic on ts-100.zone.rC  z*made 6/16 records dynamic on weergly.zone.r   zzoneoptions should fail ()r   )maxDiffr0   rD   r!   r"   rA   r$   r   r/   r1  rw   rE   r   sortedr	  )r2   r   r{   tsrP   r.  addrr-  r
  diffoutput_substringsr   rG   rH   rI   	new_tsmapchangesr  ss                      r<   test_zoneoptions_mark_recordsz,DnsCmdTestCase.test_zoneoptions_mark_records  s5    ( 	2 	2G+G4RaR8 2 2ue!z(3#y)&#0	2 2 2
 ue!z(3#y)&#0	2 2 2
 ue!z(3#y(&#0	2 2 2 22( - 	I 	IB::D++DM23F2GHHHH, 	; 	;BH"(c)HHR1WOHHb3hHHDKKD99::::''
D999 &&(( <<	 <[I  
 
 <<#+*'/j$S$S$S 
  
 " << 88 99  1  1  1 " AA/8 9$?     66 !2 !2 !2 " BB-8 88 "3 "3 "3 
 BB CC 64 	 <4  <  %&	 77 77 !+ !+ !+ " AA+2 <[IHI 	 55!+ !+ !+  '/Z"J"J"J# &  
 7> 66!2 !2 !2  1  1  1  .. /0$3#4%4$5"3 "3 "3!2 !2 !2Q8 8r	 	 	 MGOo8 K	 K	3GT,e`	  .t~e.;.0j.B.2i.2.?	 8
 07 8  8  8FC  D""6+Ou+O+O+OPPPP%%f&)&)&BD D D
 ..00I VI..u>>>G . .8y|++!*1GAJT7+++& & &a%%%%EEW
K	 K	r=   )__name__
__module____qualname__r    r?   r.   r-   ra   rj   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r1  rO  __classcell__)r;   s   @r<   r   r      s       W
 W
 W
 W
 W
r  0 0 00 0 0  "G G G,D* D* D*L+6 +6 +6ZR6 R6 R6h0M 0M 0MdjK jK jKX
9 
9 
9I= I= I=V
# 
# 
#4 4 4:# # #.,G ,G ,G\0G 0G 0Gd;E ;E ;EzA6 A6 A6F' ' '
# 
# 
#3- 3- 3-l  *  6x x x x x x xr=   r   )r!   rX   r  
samba.authr   samba.samdbr   	samba.ndrr   r   samba.dcerpcr   samba.tests.samba_tool.baser   r'  sambar	   r   r  r=   r<   <module>rZ     s   $ 
			 



 				 % % % % % %       * * * * * * * *       8 8 8 8 8 8       j j j j j% j j j j jr=   