a
    ¡ÖaÏ^  ã                   @   sÐ   d Z ddlmZ ddlZ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 ddlmZ ej ejd d	¡Zej ejd d
¡ZdZde Zg d¢Zddd„Zddd„ZG dd„ deƒZdZdZdZdS )zÔTests for samba-tool visualize ntdsconn using the test ldif
topologies.

We don't test samba-tool visualize reps here because repsTo and
repsFrom are not replicated, and there are actual remote servers to
query.
é    )Úprint_functionN)ÚSambaToolCmdTest)Úldif_import_export)ÚCOLOUR_SETS)ÚLoadParmZ
SRCDIR_ABSz'testdata/ldif-utils-test-multisite.ldifz#testdata/unconnected-intrasite.ldifz DC=ad,DC=samba,DC=example,DC=comz1CN=%s,CN=Servers,CN=%s,CN=Sites,CN=Configuration,)
)ZWIN01zDefault-First-Site-Name)ZWIN08úSite-4)ZWIN07r   )ZWIN06zSite-3)ZWIN09úSite-5)ZWIN10r   )ZWIN02úSite-2)ZWIN04r	   )ZWIN03r	   )ZWIN05r	   Ú c                 C   sJ   |d u rd}n|d d… }t j |d||f ¡}tj||| |d}||fS )Nzdefault-DSAé   zldif-to-sambdb-%s-%s)Zforced_local_dsa)ÚosÚpathÚjoinr   Zldif_to_samdb)ZldifÚtempdirÚlpÚdsaÚtagZdsa_nameÚdburlÚsamdb© r   úB/usr/lib/python3/dist-packages/samba/tests/samba_tool/visualize.pyÚsamdb_from_ldif>   s    ÿÿ
ÿr   Fc                 C   s@   g }|   ¡ D ](}d | ¡  ¡ ¡}|s*|r| |¡ qd |¡S )Nú Ú
)Ú
splitlinesr   ÚstripÚsplitÚappend)ÚsZkeep_empty_linesÚlinesÚliner   r   r   Úcollapse_spaceK   s    r!   c                       sˆ   e Zd Z‡ fdd„Z‡ f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‡  ZS )ÚSambaToolVisualizeLdifc                    s>   t t| ƒ ¡  tƒ | _tt| j| jƒ\| _| _	d| j	 | _
d S )Nútdb://)Úsuperr"   ÚsetUpr   r   r   ÚMULTISITE_LDIFr   r   Údbfiler   ©Úself©Ú	__class__r   r   r%   U   s    þzSambaToolVisualizeLdif.setUpc                    s   |   | j¡ tt| ƒ ¡  d S ©N)Úremove_filesr'   r$   r"   ÚtearDownr(   r*   r   r   r.   ]   s    zSambaToolVisualizeLdif.tearDownc                 G   s*   |D ] }|   | | j¡¡ t |¡ qd S r,   )Ú
assertTrueÚ
startswithr   r   Úunlink)r)   ÚfilesÚfr   r   r   r-   a   s    z#SambaToolVisualizeLdif.remove_filesc           	      C   sÈ   t  d¡}|  ddd| jdd¡\}}}|  |||¡ |  | |¡¡ dgg}|dd	„ tD ƒ7 }|D ]`}| jddd| jdg|¢R Ž \}}}|  |||¡ |  | 	|¡¡ | 
d
|¡}| j||dd qbdS )z–Ensure the colour output is the same as the monochrome output
        EXCEPT for the colours, of which the monochrome one should
        know nothing.ú
\[[\d;]+mÚ	visualizeÚntdsconnú-Hú
--color=noú-Sú--color=yesc                 S   s   g | ]}|d urd|g‘qS )Nz--color-schemer   )Ú.0Úxr   r   r   Ú
<listcomp>r   s   ÿz6SambaToolVisualizeLdif.test_colour.<locals>.<listcomp>r
   T©r   N)ÚreÚcompileÚ	runsubcmdr   ÚassertCmdSuccessÚassertFalseÚfindallr   r/   ÚsearchÚsubÚassertStringsEqual)	r)   Ú	colour_reÚresultZ
monochromeÚerrZcolour_argsÚargsÚoutZ
uncolouredr   r   r   Útest_colourf   s(    
þ
þþz"SambaToolVisualizeLdif.test_colourc              	   C   s2  |   ddd| jddd¡\}}}|  |||¡ tj d¡}t ¡ }tj 	|d¡}tj 	|d	¡}t
|d
ƒ}td|d td| |d | ¡  t |d¡ |tjd< |   dddtddd¡\}}	}t
|ƒ}| ¡ }
| ¡  t |¡ t |¡ t |¡ |dur|tjd< ntjd= |  ||
|¡ | j||
dd dS )zªWe can't test actual xdot, but using the environment we can
        persuade samba-tool that a script we write is xdot and ensure
        it gets the right text.
        r5   r6   r7   r8   r9   ú--dotZSAMBA_TOOL_XDOT_PATHÚ	fake_xdotÚcontentÚwz	#!/bin/sh)Úfilezcp $1 %siÀ  ú--importldifz--xdotNTr>   )rA   r   rB   r   ÚenvironÚgetÚtempfileZmkdtempr   r   ÚopenÚprintÚcloseÚchmodr&   ÚreadÚremoveÚrmdirrG   )r)   rI   ÚexpectedrJ   Zold_xdot_pathZtmpdirrO   rP   r3   ÚemptyZxdotr   r   r   Útest_import_ldif_xdot   s@    ý


ý




z,SambaToolVisualizeLdif.test_import_ldif_xdotc                 C   sb   |   ddd| jdd¡\}}}|  |||¡ |   dddtdd¡\}}}|  |||¡ |  ||¡ dS )z•Make sure the samba-tool visualize --importldif option gives the
        same output as using the externally generated db from the same
        LDIF.r5   r6   r7   r8   r9   rS   N)rA   r   rB   r&   rG   )r)   rI   Ús1rJ   Ús2r   r   r   Útest_import_ldif«   s    þ
þ
z'SambaToolVisualizeLdif.test_import_ldifc                 C   s  t  d¡}|  ddd| jdd¡\}}}|  |||¡ |  | |¡¡ | ¡ }tj	 
| jd¡}|  ddd| jddd|¡\}}}|  |||¡ |  |d	¡ t|ƒ}| ¡ }| ¡  | j||d
d |  |¡ tj	 
| jd¡}	|  ddd| jddd|	¡\}}}|  |||¡ |  |d	¡ t|	ƒ}| ¡ }
| ¡  |  |	¡ | j|
|d
d tj	 
| jd¡}|  ddd| jddd|¡\}}}|  |||¡ |  |d	¡ t|ƒ}| ¡ }| ¡  |  | ¡ |¡ |  |¡ dD ]N\}}|  ddd| jd|ddd¡	\}}}|  |||¡ |  | ¡ |k|¡ qÄdS )zJCheck that writing to a file works, with and without
        --color=auto.r4   r5   r6   r7   z--color=autor9   z
color-autoú-or
   Tr>   zcolor-nor8   r:   ))ZnoT)ÚautoT)ZyesFz--colorú-N)r?   r@   rA   r   rB   rC   rE   r   r   r   r   r   ZassertEqualrW   r[   rY   rG   r-   ZassertNotEqual)r)   rH   rI   r^   rJ   Zcolor_auto_filerL   r3   Z
color_autoZcolor_no_fileZcolor_noZcolor_yes_fileZ
colour_yesÚcZequalr   r   r   Útest_output_file»   sn    
þ
ý

ý

ý

ý
z'SambaToolVisualizeLdif.test_output_filec              	   C   sŒ   |   ddd| jddd¡\}}}|  |||¡ |   ddd| jdd¡\}}}|  |||¡ dD ],}|  ||v d| ¡ |  ||vd	| ¡ qZd
S )zeEnsure that --utf8 adds at least some expected utf-8, and that it
        isn't there without --utf8.r5   r6   r7   r8   r9   z--utf8)u   â”‚u   â”€u   â•­zUTF8 should contain %szASCII should not contain %sN)rA   r   rB   r/   )r)   rI   Úutf8rJ   Úasciirg   r   r   r   Ú	test_utf8ý   s    þ
þ
z SambaToolVisualizeLdif.test_utf8c              	   C   sæ   |   ddd| jdd¡\}}}|  |||¡ g }| ¡  dd¡d }tD ]\}}t||f }tt| j	| j
||d\}}	|   dddd	|	 dd¡\}}
}|  ||
|¡ |
 ¡  dd¡\}}|  ||¡ |  ||¡ | |	¡ qF| j|Ž  d S )
Nr5   r6   r7   r8   r9   r   é   ©r   r#   )rA   r   rB   r   r   ÚMULTISITE_LDIF_DSASÚDN_TEMPLATEr   r&   r   r   rG   ZassertInr   r-   )r)   rI   ÚtargetrJ   r2   ZcnZsiter   r   r'   rL   ÚtitleÚbodyr   r   r   Útest_forced_local_dsa  s0    þ
ý
þ
z,SambaToolVisualizeLdif.test_forced_local_dsac              	   C   sd  |   ddd| jddd¡\}}}|  |||¡ |   ddd| jdd¡\}}}|  |||¡ | d¡}g }dg}g }|D ]J}	t d	|	¡}
|
r²|
 ¡ \}}| t|ƒ||f¡ | |	¡ qr| |	¡ qrd 	|¡}|j
d
d |}| ¡  dd¡\}}|D ]"\}}}| ||¡}| ||¡}qðd||f }t|ƒ}t|ƒ}t|ƒ}t|ƒ}| j||d
d | j||d
d dS )zŠEnsure the colour ones are the same as the monochrome ones EXCEPT
        for the colours, of which the monochrome one should know nothingr5   r6   r7   r8   r9   ú--no-keyr   r
   z'(.{1,2})' stands for '(.+)'T)Úreverserl   z%s
%sr>   N)rA   r   rB   r   r?   ÚmatchÚgroupsr   Úlenr   Úsortr   Úreplacer!   rG   )r)   rI   ZshortrJ   Zlongr   ZreplacementsZ	key_linesZshort_without_keyr    ÚmÚaÚbZ
short2longZlong_headerZ
long2shortÚ_r   r   r   Útest_short_names(  sF    þ
þ


z'SambaToolVisualizeLdif.test_short_namesc                 C   sb   t t| j| jdd\}}d| }|  ddd|dd¡\}}}|  |¡ |  |||¡ |  |t¡ d	S )
zZTest that the 'unconnected' ldif shows up and exactly matches the
        expected output.Údisconnectedrm   r#   r5   r6   r7   r8   r9   N)	r   ÚUNCONNECTED_LDIFr   r   rA   r-   rB   rG   Ú EXPECTED_DISTANCE_GRAPH_WITH_KEY)r)   r   r'   r   rI   ÚoutputrJ   r   r   r   Útest_disconnected_ldif_with_keyV  s    þ
þ

ÿz6SambaToolVisualizeLdif.test_disconnected_ldif_with_keyc              
   C   s>   |   ddd| jdddd¡\}}}|  |||¡ |  t|¡ dS )	zGraphviz NTDS Connection outputr5   r6   r7   r8   r9   rN   rt   N)rA   r   rB   rG   ÚEXPECTED_DOT_MULTISITE_NO_KEY)r)   rI   ÚdotrJ   r   r   r   Útest_dot_ntdsconnj  s    ý
z(SambaToolVisualizeLdif.test_dot_ntdsconnc                 C   sh   t t| j| jdd\}}|  dddd| ddd	d
d¡	\}}}|  |||¡ |  |¡ | jt|dd dS )z7Graphviz NTDS Connection output from disconnected graphr€   rm   r5   r6   r7   r#   r8   r9   rN   rd   rf   Tr>   N)	r   r   r   r   rA   rB   r-   rG   Ú"EXPECTED_DOT_NTDSCONN_DISCONNECTED)r)   r   r'   rI   r†   rJ   r   r   r   Útest_dot_ntdsconn_disconnecteds  s    þ
ý

ÿz5SambaToolVisualizeLdif.test_dot_ntdsconn_disconnectedc                 C   sŽ   t t| j| jdd\}}tj | jd¡}|  dddd| dd	d
d|¡	\}}}|  |||¡ t	|ƒ}| 
¡ }| ¡  |  t|¡ |  ||¡ dS )z+Graphviz NTDS Connection output into a filer€   rm   Zdotfiler5   r6   r7   r#   r8   r9   rN   rd   N)r   r   r   r   r   r   r   rA   rB   rW   r[   rY   rG   rˆ   r-   )r)   r   r'   Zdot_filerI   r†   rJ   r3   r   r   r   Ú&test_dot_ntdsconn_disconnected_to_file‚  s     þ
ý
z=SambaToolVisualizeLdif.test_dot_ntdsconn_disconnected_to_file)Ú__name__Ú
__module__Ú__qualname__r%   r.   r-   rM   r`   rc   rh   rk   rs   r   r„   r‡   r‰   rŠ   Ú__classcell__r   r   r*   r   r"   T   s   ,B.	r"   a\  /* generated by samba */
digraph A_samba_tool_production {
label="NTDS Connections known to CN=WIN01,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=ad,DC=samba,DC=example,DC=com";
fontsize=10;

node[fontname=Helvetica; fontsize=10];

"CN=NTDS Settings,\nCN=WIN01,\nCN=Servers,\nCN=Default-\nFirst-Site-Name,\n...";
"CN=NTDS Settings,\nCN=WIN02,\nCN=Servers,\nCN=Site-2,\n...";
"CN=NTDS Settings,\nCN=WIN03,\nCN=Servers,\nCN=Site-2,\n...";
"CN=NTDS Settings,\nCN=WIN04,\nCN=Servers,\nCN=Site-2,\n...";
"CN=NTDS Settings,\nCN=WIN05,\nCN=Servers,\nCN=Site-2,\n...";
"CN=NTDS Settings,\nCN=WIN06,\nCN=Servers,\nCN=Site-3,\n...";
"CN=NTDS Settings,\nCN=WIN07,\nCN=Servers,\nCN=Site-4,\n...";
"CN=NTDS Settings,\nCN=WIN08,\nCN=Servers,\nCN=Site-4,\n...";
"CN=NTDS Settings,\nCN=WIN09,\nCN=Servers,\nCN=Site-5,\n...";
"CN=NTDS Settings,\nCN=WIN10,\nCN=Servers,\nCN=Site-5,\n...";
"CN=NTDS Settings,\nCN=WIN01,\nCN=Servers,\nCN=Default-\nFirst-Site-Name,\n..." -> "CN=NTDS Settings,\nCN=WIN03,\nCN=Servers,\nCN=Site-2,\n..." [color="#000000", ];
"CN=NTDS Settings,\nCN=WIN01,\nCN=Servers,\nCN=Default-\nFirst-Site-Name,\n..." -> "CN=NTDS Settings,\nCN=WIN06,\nCN=Servers,\nCN=Site-3,\n..." [color="#000000", ];
"CN=NTDS Settings,\nCN=WIN01,\nCN=Servers,\nCN=Default-\nFirst-Site-Name,\n..." -> "CN=NTDS Settings,\nCN=WIN07,\nCN=Servers,\nCN=Site-4,\n..." [color="#000000", ];
"CN=NTDS Settings,\nCN=WIN01,\nCN=Servers,\nCN=Default-\nFirst-Site-Name,\n..." -> "CN=NTDS Settings,\nCN=WIN08,\nCN=Servers,\nCN=Site-4,\n..." [color="#000000", ];
"CN=NTDS Settings,\nCN=WIN01,\nCN=Servers,\nCN=Default-\nFirst-Site-Name,\n..." -> "CN=NTDS Settings,\nCN=WIN10,\nCN=Servers,\nCN=Site-5,\n..." [color="#000000", ];
"CN=NTDS Settings,\nCN=WIN02,\nCN=Servers,\nCN=Site-2,\n..." -> "CN=NTDS Settings,\nCN=WIN04,\nCN=Servers,\nCN=Site-2,\n..." [color="#000000", ];
"CN=NTDS Settings,\nCN=WIN02,\nCN=Servers,\nCN=Site-2,\n..." -> "CN=NTDS Settings,\nCN=WIN05,\nCN=Servers,\nCN=Site-2,\n..." [color="#000000", ];
"CN=NTDS Settings,\nCN=WIN03,\nCN=Servers,\nCN=Site-2,\n..." -> "CN=NTDS Settings,\nCN=WIN04,\nCN=Servers,\nCN=Site-2,\n..." [color="#000000", ];
"CN=NTDS Settings,\nCN=WIN03,\nCN=Servers,\nCN=Site-2,\n..." -> "CN=NTDS Settings,\nCN=WIN05,\nCN=Servers,\nCN=Site-2,\n..." [color="#000000", ];
"CN=NTDS Settings,\nCN=WIN04,\nCN=Servers,\nCN=Site-2,\n..." -> "CN=NTDS Settings,\nCN=WIN01,\nCN=Servers,\nCN=Default-\nFirst-Site-Name,\n..." [color="#000000", ];
"CN=NTDS Settings,\nCN=WIN04,\nCN=Servers,\nCN=Site-2,\n..." -> "CN=NTDS Settings,\nCN=WIN02,\nCN=Servers,\nCN=Site-2,\n..." [color="#000000", ];
"CN=NTDS Settings,\nCN=WIN04,\nCN=Servers,\nCN=Site-2,\n..." -> "CN=NTDS Settings,\nCN=WIN03,\nCN=Servers,\nCN=Site-2,\n..." [color="#000000", ];
"CN=NTDS Settings,\nCN=WIN05,\nCN=Servers,\nCN=Site-2,\n..." -> "CN=NTDS Settings,\nCN=WIN02,\nCN=Servers,\nCN=Site-2,\n..." [color="#000000", ];
"CN=NTDS Settings,\nCN=WIN05,\nCN=Servers,\nCN=Site-2,\n..." -> "CN=NTDS Settings,\nCN=WIN03,\nCN=Servers,\nCN=Site-2,\n..." [color="#000000", ];
"CN=NTDS Settings,\nCN=WIN07,\nCN=Servers,\nCN=Site-4,\n..." -> "CN=NTDS Settings,\nCN=WIN01,\nCN=Servers,\nCN=Default-\nFirst-Site-Name,\n..." [color="#000000", ];
"CN=NTDS Settings,\nCN=WIN09,\nCN=Servers,\nCN=Site-5,\n..." -> "CN=NTDS Settings,\nCN=WIN10,\nCN=Servers,\nCN=Site-5,\n..." [color="#000000", ];
"CN=NTDS Settings,\nCN=WIN10,\nCN=Servers,\nCN=Site-5,\n..." -> "CN=NTDS Settings,\nCN=WIN01,\nCN=Servers,\nCN=Default-\nFirst-Site-Name,\n..." [color="#000000", ];
"CN=NTDS Settings,\nCN=WIN10,\nCN=Servers,\nCN=Site-5,\n..." -> "CN=NTDS Settings,\nCN=WIN09,\nCN=Servers,\nCN=Site-5,\n..." [color="#000000", ];
}

u  /* generated by samba */
digraph A_samba_tool_production {
label="NTDS Connections known to CN=LOCALDC,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=samba,DC=example,DC=com";
fontsize=10;

node[fontname=Helvetica; fontsize=10];

"CN=NTDS Settings,\nCN=CLIENT,\n...";
"CN=NTDS Settings,\nCN=LOCALDC,\n...";
"CN=NTDS Settings,\nCN=PROMOTEDVDC,\n...";
"CN=NTDS Settings,\nCN=SERVER1,\n...";
"CN=NTDS Settings,\nCN=SERVER2,\n...";
"CN=NTDS Settings,\nCN=SERVER3,\n...";
"CN=NTDS Settings,\nCN=SERVER4,\n...";
"CN=NTDS Settings,\nCN=SERVER5,\n...";
"CN=NTDS Settings,\nCN=LOCALDC,\n..." -> "CN=NTDS Settings,\nCN=PROMOTEDVDC,\n..." [color="#000000", ];
"CN=NTDS Settings,\nCN=PROMOTEDVDC,\n..." -> "CN=NTDS Settings,\nCN=LOCALDC,\n..." [color="#000000", ];
"CN=NTDS Settings,\nCN=SERVER2,\n..." -> "CN=NTDS Settings,\nCN=PROMOTEDVDC,\n..." [color="#000000", ];
"CN=NTDS Settings,\nCN=SERVER3,\n..." -> "CN=NTDS Settings,\nCN=LOCALDC,\n..." [color="#000000", ];
subgraph cluster_key {
label="Key";
subgraph cluster_key_nodes {
label="";
color = "invis";

}
subgraph cluster_key_edges {
label="";
color = "invis";
subgraph cluster_key_0_ {
key_0_e1[label=src; color="#000000"; group="key_0__g"]
key_0_e2[label=dest; color="#000000"; group="key_0__g"]
key_0_e1 -> key_0_e2 [constraint = false; color="#000000"]
key_0__label[shape=plaintext; style=solid; width=2.000000; label="NTDS Connection\r"]
}
{key_0__label}
}

elision0[shape=plaintext; style=solid; label="\â€œ...â€  means  â€œCN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=samba,DC=example,DC=comâ€\r"]

}
"CN=NTDS Settings,\nCN=CLIENT,\n..." -> key_0__label [style=invis];
"CN=NTDS Settings,\nCN=LOCALDC,\n..." -> key_0__label [style=invis];
"CN=NTDS Settings,\nCN=PROMOTEDVDC,\n..." -> key_0__label [style=invis];
"CN=NTDS Settings,\nCN=SERVER1,\n..." -> key_0__label [style=invis];
"CN=NTDS Settings,\nCN=SERVER2,\n..." -> key_0__label [style=invis];
"CN=NTDS Settings,\nCN=SERVER3,\n..." -> key_0__label [style=invis];
"CN=NTDS Settings,\nCN=SERVER4,\n..." -> key_0__label [style=invis];
"CN=NTDS Settings,\nCN=SERVER5,\n..." -> key_0__label [style=invis]
key_0__label -> elision0 [style=invis; weight=9]

}
an  
NTDS Connections known to CN=LOCALDC,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=samba,DC=example,DC=com

                            destination
                  ,-------- *,CN=CLIENT+
                  |,------- *,CN=LOCALDC+
                  ||,------ *,CN=PROMOTEDVDC+
                  |||,----- *,CN=SERVER1+
                  ||||,---- *,CN=SERVER2+
                  |||||,--- *,CN=SERVER3+
                  ||||||,-- *,CN=SERVER4+
           source |||||||,- *,CN=SERVER5+
     *,CN=CLIENT+ 0-------
    *,CN=LOCALDC+ -01-----
*,CN=PROMOTEDVDC+ -10-----
    *,CN=SERVER1+ ---0----
    *,CN=SERVER2+ -21-0---
    *,CN=SERVER3+ -12--0--
    *,CN=SERVER4+ ------0-
    *,CN=SERVER5+ -------0

'*' stands for 'CN=NTDS Settings'
'+' stands for ',CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=samba,DC=example,DC=com'

Data can get from source to destination in the indicated number of steps.
0 means zero steps (it is the same DC)
1 means a direct link
2 means a transitive link involving two steps (i.e. one intermediate DC)
- means there is no connection, even through other DCs

)Nr
   )F)Ú__doc__Z
__future__r   Zsambar   rV   r?   Zsamba.tests.samba_tool.baser   Z	samba.kccr   Zsamba.graphr   Zsamba.paramr   r   r   rT   r&   r   ZDOMAINro   rn   r   r!   r"   r…   rˆ   r‚   r   r   r   r   Ú<module>   s4   ÿÿ

	  E(6