
    bm                         d Z ddlZddlZddlZddlZddlZddlmZ dZddgddgdZ	g d	Z
d
 Zd Zd Zd Z G d de          ZdS )a  Tests for samba-tool visualize using the vampire DC and promoted DC
environments. For most tests we assume we can't assert much about what
state they are in, so we mainly check for command failure, but for
others we try to grasp control of replication and make more specific
assertions.
    N)SambaToolCmdTestFziCN=PROMOTEDVDC,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=samba,DC=example,DC=comzeCN=LOCALDC,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=samba,DC=example,DC=comzlCN=LOCALVAMPIREDC,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=samba,DC=example,DC=com)promoted_dc
vampire_dc)DOMAINCONFIGURATIONSCHEMA	DNSDOMAIN	DNSFORESTc                 |    t          j        dd           r&|                     dt           j        d                    | S )NPYTHONr   )osgetenvinsertenviron)partss    F/usr/lib/python3/dist-packages/samba/tests/samba_tool/visualize_drs.pyadjust_cmd_for_py_versionr   3   s6    	y4   .Q
8,---L    c                     dt           j        d         dt           j        d         }|rdnd}dD ]0}t          dd	d
|| d||g          }t          j        |           1d S )N-UUSERNAME%PASSWORD-+)DISABLE_INBOUND_REPLDISABLE_OUTBOUND_REPLbin/samba-tooldrsoptionsz--dsa-option=r   r   r   
subprocess
check_call)dcallow
credstring	on_or_offoptcmds         r   set_auto_replicationr*   8   s     !z*555rz*7M7MNJ%#I) # #')9i22&/i5)7 8 8
 	c""""# #r   c           
          dt           j        d         dt           j        d         }t          ddd|| ||dg          }t          j        |           d S )	Nr   r   r   r   r   r   	replicatez--sync-forcedr!   )srcdestbaser&   r)   s        r   force_replicationr0   F   sg     !z*555rz*7M7MNJ
#%5+d	%  C #r   c                    t          j        dd|           } |                     d          }d |D             }g }g }|D ]}|                    d t	          |                    }|d         |dd          }}t          j        d|                                                              d          }|                    |           t	          |          dk    rt          |d                   }|                    d |D                        i }	t          ||          D ]+\  }
}i |	|
<   t          ||          D ]\  }}||	|
         |<   ,|	S )	Nz	\[[^m]+m 
c                 f    g | ].}d |v |                                                     d d          /S )   ·0)stripreplace.0xs     r   
<listcomp>z#get_utf8_matrix.<locals>.<listcomp>W   s5    EEEQ4199AGGIIdC((999r   r      zcn=([^+,]+)c                 X    g | ]'}|                                 rt          |          nd (S )g      )isdigitintr9   s     r   r<   z#get_utf8_matrix.<locals>.<listcomp>b   s/    CCCA7s1vvv%CCCr   )resubsplitrsplitlenmatchlowergroupappendlistzip)slinesrowsnamesvaluesrr   kvdn1rown2s                r   get_utf8_matrixrX   Q   s\    	!2q))AGGDMMEEE%EEEDEF E Es4yy))Qxqrr1H^QWWYY//55a88Qq66Q;;QqT

ACCCCCDDDD
Auf%%  C"__ 	 	EBAbE"II	 Hr   c                        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dZd Zd Zd Zd Zd Zd Z xZS )SambaToolVisualizeDrsTestc                 V    t          t          |                                            d S )N)superrZ   setUp)self	__class__s    r   r]   zSambaToolVisualizeDrsTest.setUpn   s&    '..4466666r   c           
          dt           j        d         z  }t           j        d         dt           j        d         }|                     ddd|d	|d
d          \  }}}|                     |||           d S )N	ldap://%sSERVERr   r   r   	visualizentdsconn-Hr   
--color=no-Sr   r   	runsubcmdassertCmdSuccessr^   servercredsresultouterrs         r   test_ntdsconnz'SambaToolVisualizeDrsTest.test_ntdsconnq   s    rz(33Jz222BJz4J4JK!^^K,0&,0%,8$@ @c 	fc3/////r   c                     dt           j        d         z  }t           j        d         dt           j        d         }|                     ddd|d	|d
dd	  	        \  }}}|                     |||           d S )Nra   rb   r   r   r   rc   rd   re   r   rf   rg   -rrh   rk   s         r   test_ntdsconn_remotez.SambaToolVisualizeDrsTest.test_ntdsconn_remotez   s    rz(33Jz222BJz4J4JK!^^K,0&,0%,8$F Fc 	fc3/////r   c           
          dt           j        d         z  }t           j        d         dt           j        d         }|                     ddd|d	|d
d          \  }}}|                     |||           d S )Nra   rb   r   r   r   rc   repsre   r   rf   rg   rh   rk   s         r   	test_repsz#SambaToolVisualizeDrsTest.test_reps   s    rz(33Jz222BJz4J4JK!^^K,0&,0%,8$@ @c 	fc3/////r   c                    t           j        d         dt           j        d         }t           j        d         }t           j        d         }|                     dddd	d
|z  d|dd	  	        \  }}}|                     |||           |                     dddd	d
|z  d|dd	  	        \  }}}|                     |||           d S )Nr   r   r   rb   	DC_SERVERrc   uptodatenessrs   re   ra   r   rf   rg   rh   )r^   rm   dc1dc2rn   ro   rp   s          r    test_uptodateness_all_partitionsz:SambaToolVisualizeDrsTest.test_uptodateness_all_partitions   s    Jz222BJz4J4JKj"j% "^^K,0,0+2C,0%,8$	@ @c
 	fc3///!^^K,0,0+2C,0%,8$	@ @c
 	fc3/////r   c                    t           j        d         dt           j        d         }t           j        d         }t          D ]?}|                     ddddd	|z  d
|ddd|          \  }}}|                     |||           @d S )Nr   r   r   rb   rc   rz   rs   re   ra   r   rf   rg   --partition)r   r   PARTITION_NAMESri   rj   )r^   rm   r{   partrn   ro   rp   s          r   test_uptodateness_partitionsz6SambaToolVisualizeDrsTest.test_uptodateness_partitions   s    Jz222BJz4J4JKj"# 	4 	4D!%^0404kC6G04e0<d0=t"E "EVS# !!&#s3333	4 	4r   c           	         t           j        d         dt           j        d         }t           j        d         }t           j        d         }||fD ]}|                     dddd	|z  d
|          \  }}}|                     |||           t          D ]}|                     |||           |                                D ]}	dD ]}
|                     |
|	           dS )a  
        Test cmd `drs uptodateness`

        It should print info like this:

            DNSDOMAIN       failure: 4  median: 1.5  maximum: 2
            SCHEMA          failure: 4  median: 220.0  maximum: 439
            DOMAIN          failure: 1  median: 25  maximum: 25
            CONFIGURATION   failure: 1  median: 25  maximum: 25
            DNSFOREST       failure: 4  median: 1.5  maximum: 2

        r   r   r   rb   ry   r   rz   re   ra   r   )msgmaximummedianfailureN)r   r   ri   rj   r   assertIn
splitlines)r^   rm   r{   r|   r$   rn   ro   rp   	part_namelineattrs              r   test_drs_uptodatenessz/SambaToolVisualizeDrsTest.test_drs_uptodateness   s    Jz222BJz4J4JKj"j%* 	. 	.B!%~04kB6F04e"= "=VS# !!&#s333, 7 7	i#6666(( . .< . .DMM$----..	. 	.r   c                    t           j        d         dt           j        d         }t           j        d         }t           j        d         }||fD ]}|                     dddd	|z  d
|dd          \  }}}|                     |||           |                                }|                     t          |          d           |d         }	|                     |	                    d                     dS )z
        Test cmd `drs uptodateness --partition DOMAIN`

        It should print info like this:

            DOMAIN          failure: 1  median: 25  maximum: 25

        r   r   r   rb   ry   r   rz   re   ra   r   r   r   r=   r   N)	r   r   ri   rj   r   assertEqualrE   
assertTrue
startswith)
r^   rm   r{   r|   r$   rn   ro   rp   rM   r   s
             r   test_drs_uptodateness_partitionz9SambaToolVisualizeDrsTest.test_drs_uptodateness_partition   s     Jz222BJz4J4JKj"j%* 	7 	7B!%~04kB6F04e0=x"I "IVS# !!&#s333NN$$ESZZ+++8DOODOOH556666	7 	7r   c           
         t           j        d         dt           j        d         }t           j        d         }t           j        d         }||fD ]}|                     dddd	|z  d
|d          \  }}}|                     |||           t	          j        |          }t          D ];}	|                     |	|           ||	         }
dD ]}|                     ||
           <dS )a  
        Test cmd `drs uptodateness --json`

        Example output:

            {
                "DNSDOMAIN": {
                    "failure": 0,
                    "median": 0.0,
                    "maximum": 0
                },
                ...
                "SCHEMA": {
                    "failure": 0,
                    "median": 0.0,
                    "maximum": 0
                }
            }
        r   r   r   rb   ry   r   rz   re   ra   r   --jsonr   N)r   r   ri   rj   jsonloadsr   r   )r^   rm   r{   r|   r$   rn   ro   rp   objr   summary_objr   s               r   test_drs_uptodateness_jsonz4SambaToolVisualizeDrsTest.test_drs_uptodateness_json   s   ( Jz222BJz4J4JKj"j%* 	5 	5B!%~04kB6F04e08": ":VS# !!&#s333*S//C, 5 5	i---!)n< 5 5DMM$444455	5 	5r   c                    t           j        d         dt           j        d         }t           j        d         }t           j        d         }||fD ]}|                     dddd	|z  d
|dd          \  }}}|                     |||           t	          j        |          }t          D ]b}	|                     |	|           ||	         }
|                     d|
           |                     d|
           |                     d|
           cdS )a@  
        Test cmd `drs uptodateness --json --median`

            drs uptodateness --json --median

            {
                "DNSDOMAIN": {
                    "median": 0.0
                },
                ...
                "SCHEMA": {
                    "median": 0.0
                }
            }
        r   r   r   rb   ry   r   rz   re   ra   r   r   z--medianr   r   r   N)	r   r   ri   rj   r   r   r   r   assertNotIn)r^   rm   r{   r|   r$   rn   ro   rp   r   r   r   s              r   !test_drs_uptodateness_json_medianz;SambaToolVisualizeDrsTest.test_drs_uptodateness_json_median  s)     Jz222BJz4J4JKj"j%* 	9 	9B!%~04kB6F04e08*"F "FVS# !!&#s333*S//C, 9 9	i---!)nh444  K888  K88889	9 	9r    c                     |D ]}|                      ||           |                                D ]!\  }}|                     ||         d           "d S )Nr   )r   itemsr   )r^   matrixdcsr$   rR   rV   s         r   assert_matrix_validityz0SambaToolVisualizeDrsTest.assert_matrix_validity/  sj     	& 	&BMM"f%%%%llnn 	( 	(FAsSVQ''''	( 	(r   c                 Z   t           j        d         dt           j        d         }t           j        d         }t           j        d         }|                     t          |d           |                     t          |d           d }|                     dd	|z  d
|          }|                     dd	|z  d
|          }|                                }|                     ||                                k    d           dt          j        d          |fz  }dt          j        d          |fz  }	|	                    |dd           |	                    |	dd           t          |d           | 
                    ddddd	|z  d
|ddddd          \  }
}} |d|           |                     |
||           t          |          }|                     |||g           t          |||           | 
                    ddddd	|z  d
|ddddd          \  }
}} |d|d||           |                     |
||           t          |          }|                     |||g           |                     ||         |         d           t          |||           | 
                    ddddd	|z  d
|ddddd          \  }
}} |d|d||           |                     |
||           t          |          }|                     |||g           |                     ||         |         d           d|z  }d|	z  }t!          d           D ]}|	                    ||z  d!d           | 
                    ddddd	|z  d
|ddddd          \  }
}} |d"|z  |           |                     |
||           t          |          }|                     |||g           |                     ||         |         d            t!          d           D ]}|	                    ||z  d!d           | 
                    ddddd	|z  d
|ddddd          \  }
}} |d"|z  |           |                     |
||           t          |          }|                     |||g           |                     ||         |         d            t!          d d#          D ]8}|	                    ||z  d!d           |	                    ||z  d!d           9| 
                    ddddd	|z  d
|ddddd          \  }
}} |d$|           |                     |
||           t          |          }|                     |||g           |                     ||         |         d%           |                     ||         |         d%           | 
                    ddddd	|z  d
|dddddd&d'          \  }
}} |d(|           |                     |
||           t          |          }|                     |||g           |                     ||         |         d)           |                     ||         |         d)           | 
                    ddddd	|z  d
|dddddd&d*          \  }
}} |d+|           |                     |
||           t          |          }|                     |||g           |                     ||         |         d)           |                     ||         |         d)           t          |||                                           | 
                    ddddd	|z  d
|ddddd          \  }
}} |d|d||           |                     |
||           t          |          }|                     |||g           |                     ||         |         d           t          |||                                           | 
                    ddddd	|z  d
|ddddd          \  }
}} |d|d||           |                     |
||           t          |          }|                     |||g           |                     ||         |         d           |                    |d,g           |                    |	d,g           | 
                    ddddd	|z  d
|ddddd          \  }
}} |d-||           |                     |
||           t          |          }|                     |||g           |                     ||         |         d%           |                     ||         |         d%           t          |d           | 
                    ddddd	|z  d
|ddddd          \  }
}} |d.|           |                     |
||           t          |          }|                     |||g           | 
                    ddddd	|z  d
|ddddd          \  }
}} |d/|z  |           |                     |
||           t          |          }|                     |||g           t          |||                                           | 
                    ddddd	|z  d
|ddddd          \  }
}} |d|d||           |                     |
||           t          |          }|                     |||g           t          |||                                           | 
                    ddddd	|z  d
|ddddd          \  }
}} |d|d||           |                     |
||           t          |          }|                     |||g           | 
                    ddddd	|z  d
|ddddd          \  }
}} |d/|z  |           |                     |
||           t          |          }|                     |||g           d S )0Nr   r   r   rb   ry   Tc                 X    t           r"t          d| d           t          |           d S d S )Nz========z	=========)VERBOSEprint)headingro   s     r   displayzTSambaToolVisualizeDrsTest.test_uptodateness_stop_replication_domain.<locals>.display<  s5     j';777c




 r   re   ra   r   z)We expected the same domain_dn across DCszOU=dc1.%x,%sl            zOU=dc2.%x,%sorganizationalUnit)dnobjectclassFrc   rz   rs   z--color=yesz--utf8rg   r   r   zdc1 replication is now offzforced replication z -> r   zcn=u1.%%d,%szcn=u2.%%d,%s
   userzadded 10 users on %se   zadded 91 users on bothd   z--max-digits2zwith --max-digits 2g.B}T1zwith --max-digits 1ztree_delete:1ztree delete both ous on zreplication is now onz	%s's view)r   r   
addCleanupr*   getSamDB	domain_dnr   random	randrangeaddri   rj   rX   r   r0   r   rangeassertGreaterEqualdelete)r^   rm   r{   r|   r   samdb1samdb2r   ou1ou2rn   ro   rp   r   dn1dn2is                    r   )test_uptodateness_stop_replication_domainzCSambaToolVisualizeDrsTest.test_uptodateness_stop_replication_domain5  s   Jz222BJz4J4JKj"j%,c4888,c4888	 	 	
 t[3%6eDDt[3%6eDD$$&&		V%5%5%7%77C	E 	E 	E  0 9 99EE 0 9 99EE

/
 
 	 	 	 	

/
 
 	 	 	
 	S%(((!^^K,0,0+2C,0%,9,4d,98E Ec 	,c222fc3/// %%##FS#J777#sI...!^^K,0,0+2C,0%,9,4d,98E Ec 	cc:C@@@fc3/// %%##FS#J777S)1---#sI...!^^K,0,0+2C,0%,9,4d,98E Ec 	cc:C@@@fc3/// %%##FS#J777S)1---$$r 	 	AJJAg%     
 "^^K,0,0+2C,0%,9,4d,98E Ec 	&,c222fc3/// %%##FS#J777S)2...r 	 	AJJAg%     
 "^^K,0,0+2C,0%,9,4d,98E Ec 	&,c222fc3/// %%##FS#J777sC 0"555r3 	 	AJJAg%     JJAg%     
 "^^K,0,0+2C,0%,9,4d,98E Ec 	(#...fc3/// %%##FS#J777sC 0#666sC 0#666!^^K,0,0+2C,0%,9,4d,98,:CA Ac 	%s+++fc3/// %%##FS#J777sC 0$777sC 0$777!^^K,0,0+2C,0%,9,4d,98,:CA Ac 	%s+++fc3/// %%##FS#J777sC 0$777sC 0$777#sF$4$4$6$6777!^^K,0,0+2C,0%,9,4d,98E Ec 	cc:C@@@fc3/// %%##FS#J777S)1---#sF$4$4$6$6777!^^K,0,0+2C,0%,9,4d,98E Ec 	cc:C@@@fc3/// %%##FS#J777S)1---cO,---cO,---!^^K,0,0+2C,0%,9,4d,98E Ec 	5s;;;fc3/// %%##FS#J777sC 0#666sC 0#666S$'''!^^K,0,0+2C,0%,9,4d,98E Ec 	'---fc3/// %%##FS#J777 "^^K,0,0+2C,0%,9,4d,98E Ec 	c!3'''fc3/// %%##FS#J777#sF$4$4$6$6777!^^K,0,0+2C,0%,9,4d,98E Ec 	cc:C@@@fc3/// %%##FS#J777#sF$4$4$6$6777!^^K,0,0+2C,0%,9,4d,98E Ec 	cc:C@@@fc3/// %%##FS#J777!^^K,0,0+2C,0%,9,4d,98E Ec 	c!3'''fc3/// %%##FS#J77777r   c                     dt           j        d         z  }t           j        d         dt           j        d         }|                     ddd|d	|d
dd	  	        \  }}}|                     |||           d S )Nra   rb   r   r   r   rc   rv   re   r   rf   rg   rs   rh   rk   s         r   test_reps_remotez*SambaToolVisualizeDrsTest.test_reps_remoteS  s    rz(33Jz222BJz4J4JK!^^K,0&,0%,8$F Fc 	fc3/////r   c                     dt           j        d         z  }t           j        d         dt           j        d         }|                     ddd|d	|d
dd	  	        \  }}}|                     |||           d S )Nra   rb   r   r   r   rc   rd   re   r   --dotrf   rg   rh   rk   s         r   test_ntdsconn_dotz+SambaToolVisualizeDrsTest.test_ntdsconn_dot\  s    rz(33Jz222BJz4J4JK!^^K,0&,0%,8$@ @c 	fc3/////r   c                     dt           j        d         z  }t           j        d         dt           j        d         }|                     ddd|d	|d
ddd
  
        \  }}}|                     |||           d S )Nra   rb   r   r   r   rc   rd   re   r   r   rf   rg   rs   rh   rk   s         r   test_ntdsconn_remote_dotz2SambaToolVisualizeDrsTest.test_ntdsconn_remote_dote  s    rz(33Jz222BJz4J4JK!^^K,0&,0%,8$F Fc 	fc3/////r   c                     dt           j        d         z  }t           j        d         dt           j        d         }|                     ddd|d	|d
dd	  	        \  }}}|                     |||           d S )Nra   rb   r   r   r   rc   rv   re   r   r   rf   rg   rh   rk   s         r   test_reps_dotz'SambaToolVisualizeDrsTest.test_reps_dotn  s    rz(33Jz222BJz4J4JK!^^K,0&,0%,8$@ @c 	fc3/////r   c                     dt           j        d         z  }t           j        d         dt           j        d         }|                     ddd|d	|d
ddd
  
        \  }}}|                     |||           d S )Nra   rb   r   r   r   rc   rv   re   r   r   rf   rg   rs   rh   rk   s         r   test_reps_remote_dotz.SambaToolVisualizeDrsTest.test_reps_remote_dotw  s    rz(33Jz222BJz4J4JK!^^K,0&,0%,8$F Fc 	fc3/////r   )r   )__name__
__module____qualname__r]   rq   rt   rw   r}   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r_   s   @r   rZ   rZ   m   s3       7 7 7 7 70 0 00 0 00 0 00 0 0.
4 
4 
4. . .<7 7 72$5 $5 $5L!9 !9 !9F( ( ( (\8 \8 \8|0 0 00 0 00 0 00 0 00 0 0 0 0 0 0r   rZ   )__doc__r   rA   r   r   r"   samba.tests.samba_tool.baser   r   ENV_DSASr   r   r*   r0   rX   rZ   r   r   r   <module>r      s  (  
			 				       8 8 8 8 8 8
 @{}z BC     
# # #    8Q0 Q0 Q0 Q0 Q0 0 Q0 Q0 Q0 Q0 Q0r   