
    g l                        S SK r S SKrS SKJr  S SKrS SKrS SKJr  S SK	J
r
  S SK	Jr  S SKJrJrJrJr  S SKJr  S SKJr  S SKJrJr  S S	KJr  S S
KJr  S SKJrJrJr  S SKrS SKrS SK J!r!J"r"  S SK#J$r$  S SK%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r-  \" SSS\.SSS9\" SSS\.SSS9\" SSSSSS9\" S S!S"S#9\" S$S%\/" \R`                  " 5       5      S&9\" S'S(S)S"S*S+9\" S,S-S.S"S*S+9\" S/S0S1S2S3S49/r1\" S5S6SS7SS9\" S8S9SS:SS9/r2S;r3 " S< S=\5      r4S> r5S? r6S@ r7 " SA SB\45      r8 " SC SD\95      r: " SE SF\45      r; " SG SH\45      r< " SI SJ\5      r=g)K    N)defaultdict)dsdb)nttime2unix)CommandSuperCommandCommandErrorOption)SamDB)	dot_graph)distance_matrixCOLOUR_SETS)full_matrix)is_colour_wanted)
SCOPE_BASESCOPE_SUBTREELdbError)KCCldif_import_export)KCCError)get_partition_mapsget_partitionget_own_cursorget_utdvget_utdv_edgesget_utdv_distancesget_utdv_max_distanceget_kcc_and_dsasz-Hz--URLz%LDB URL for database or target serverURLH)helptypemetavardestz-oz--outputzwrite here (default stdout)FILE)r    r!   r"   defaultz
--distancez&Distance matrix graph output (default)formatdistancestore_const)r    r#   constactionz--utf8zUse utf-8 Unicode characters
store_true)r    r*   z--color-schemez,use this colour scheme (implies --color=yes))r    choicesz-Sz--shorten-namesz don't print long common suffixesF)r    r*   r%   z-rz--talk-to-remotezquery other DCs' databasesz--no-keyzomit the explanatory keystore_falseTkey)r    r*   r%   r#   z--dotzGraphviz dot outputdotz--xdotzattempt to call Graphviz xdotxdot__temp__c                       \ rS rSrSrSr\R                  \R                  \R                  S.r
\\-   rSrS rSS jrS	 rS
 rS rSrg)GraphCommandR   z Base class for graphing commandsz%prog [options])	sambaoptsversionoptscredopts c                 Z    UR                  5       nUR                  USS9n[        XUS9nU$ )NTfallback_machine)urlcredentialslp)get_loadparmget_credentialsr
   )selfr   r5   r7   r>   credssamdbs          8/usr/lib/python3/dist-packages/samba/netcmd/visualize.pyget_dbGraphCommand.get_db^   s6    ##%((d(C!26    Nc                     Ub  US:X  a  [        XR                  S9  gU[        L a:  [        R                  " SUS9u  pB[        US5      n[        R                  " U5        O[        US5      nUR                  U5        UR                  5         U$ )aW  Decide whether we're dealing with a filename, a tempfile, or
stdout, and write accordingly.

:param s: the string to write
:param fn: a destination
:param suffix: suffix, if destination is a tempfile

If fn is None or "-", write to stdout.
If fn is visualize.TEMP_FILE, write to a temporary file
Otherwise fn should be a filename to write to.
N-filesamba-tool-visualise)prefixsuffixw)	printoutf	TEMP_FILEtempfilemkstempopenosclosewrite)rA   sfnrN   fdfs         rD   rX   GraphCommand.writed   sw     :s!))$?%%-C-35FBRAHHRLRA	
			rG   c                 |    U(       d-  U(       a%  UR                  5       R                  S5      (       a  ggUS:X  a  gU$ )z5Heuristics to work out what output format was wanted..dotr/   r'   r0   )lowerendswith)rA   r&   outputs      rD   calc_output_formatGraphCommand.calc_output_format   s4    &,,.11&99!VrG   c                     Uc  U R                  U[        5      nOU R                  X5      n[        R                  R	                  SS5      n[
        R                  " XC/5        [        R                  " U5        g )NSAMBA_TOOL_XDOT_PATHz/usr/bin/xdot)rX   rR   rV   environget
subprocesscallremove)rA   rY   rb   rZ   r0   s        rD   	call_xdotGraphCommand.call_xdot   sS    >Ay)BA&Bzz~~4oF
#
		"rG   c                     Ub  U$ US;   a  U R                   n[        X R                  S9nU(       d  gS[        R                  R                  SS5      ;   a  gg)	zHeuristics to work out the colour scheme for distance matrices.
Returning None means no colour, otherwise it should be a colour
from graph.COLOUR_SETSN)rI   N)hint256colorTERM zxterm-256color-heatmapansi)rQ   r   requested_colourrV   rg   rh   )rA   color_schemerb   want_colours       rD   calc_distance_color_scheme'GraphCommand.calc_distance_color_scheme   sV     #[ YYF&v4I4IJ
 33+rG   )Nr_   )__name__
__module____qualname____firstlineno____doc__synopsisoptionsSambaOptionsVersionOptionsCredentialsOptionstakes_optiongroupsCOMMON_OPTIONSDOT_OPTIONStakes_options
takes_argsrE   rX   rc   rl   rw   __static_attributes__r8   rG   rD   r3   r3   R   sW    * H))--..
 #[0MJ:rG   r3   c                 d    [         R                  " SU 5      nU(       a  UR                  S5      $ U $ )zBHelper function for sorting and grouping DNs by site, if
possible.z$CN=Servers,CN=\s*([^,]+)\s*,CN=Sites   )researchgroup)dnms     rD   get_dnstr_siter      s+     			92>AwwqzIrG   c                     [        U S   5      $ )zXHelper function for sorting and grouping lists of (DN, ...) tuples
by site, if possible.r   )r   )ts    rD   get_dnstrlist_siter      s     !A$rG   c                     SSK Jn  [        U 5      n[        U[        5      (       a  UR	                  S5      n[        U" U5      R                  5       SS SS9S-  nS	U-  $ )
zMGenerate a randomish but consistent darkish colour based on the
given object.r   )md5utf8N      )basei z#%06x)hashlibr   str
isinstanceencodeint	hexdigest)xr   tmp_strcs       rD   colour_hashr      sZ     !fG'3..(CL""$Ra(r2X=AQ;rG   c                   L    \ rS rSrSr\\-   \" SSSSS9/-   r     S
S jr	S	r
g)cmd_reps   zrepsFrom/repsTo from every DSA-p--partitionrestrict to this partitionNr    r%   c                    UR                  5       nUR                  USS9n[        XU5      u  nnUR                  n[	        UR
                  U
5      n
[        S 5      n0 nU GHH  n[        USS9nU(       a  UR
                  R                  U[        S/S9n[        US   S   S   5      n[        SU< S	U< S
3[        R                  S9   UR                  SU-  UU5        UR!                  XU5        O#UR                  XU5        UR!                  XUUS9  [#        UR%                  5       5      nUU:w  a  [        S[        R                  S9  UU-
   H  n[        SU-  [        R                  S9  M      [        SU-  [        R                  S9  UU-
   H  n[        SU-  [        R                  S9  M      U H  nU	S:X  a  UU:X  a  M  U	S:X  a  UU:w  a  M  UR'                  SU-   5      nUR)                  U5        UU[        UR*                  5      '   UR-                  5       u  nn UR/                  5        H*  u  n!n"U
b  U!U
:X  d  M  UU!   S   R1                  UU"45        M,     U R/                  5        H*  u  n!n"U
b  U!U
:X  d  M  UU!   S   R1                  UU"45        M,     M     GMK     / / S./ / S.S.n#[3        UR
                  5      u  n$n%UR/                  5        H  u  n&n!U#R/                  5        H  u  n'n(U!U'    H  u  nn"U%R5                  U&U&5      n)U"R6                   H0  n*U(S   R1                  UU[        U*R8                  5         U)45        M2     U"R:                   H0  n*U(S   R1                  U[        U*R8                  5         UU)45        M2     M     M     M     U R=                  X5      S:X  a  U R?                  UU5      nSSS.n+U#R/                  5        H  u  n'n(U(R/                  5        H  u  n,n-[        [@        5      n.U- H  u  n/n0n!U.U!   R1                  U/U045        M     U.R/                  5        H;  u  n!n1[C        S U1UUUU[D        S9n2S U+U,   U!-  < S U2< 3n2U RG                  U2U5        M=     M     M     g / n3/ n4/ n5[#        5       n60 n7[#        5       n8U#R/                  5        H  u  n'n9U9R/                  5        H  u  n,n-U- H  u  n/n0n!U7RI                  U![K        U!U,45      5      n:U'S:X  a  S!OS"n;U,S:X  a  S#OS$n<U6RM                  U/5        U6RM                  U05        U5R1                  U/U045        U3R1                  U:5        S%U;< S&U<< 3n=U4R1                  U=5        U8RM                  U!S'U,RO                  5       -   U:U=45        M     M     M     / n>U(       a\  [Q        U85       H+  u  n!n,n:n;U>R1                  S(S)U:< S*U;< 3U!< S+U,< 345        M-     U>R1                  S,5        U>R1                  S-5        [S        U6U5SU3U4UU>S.9n2US/:X  a  U RU                  U2U5        g U RG                  U2U5        g ! [         a-  n[        SU< S	U< S
3[        R                  S9   S nAGM  S nAff = f)0NTr:   c                       [        [        5      $ )N)r   listr8   rG   rD   <lambda>cmd_reps.run.<locals>.<lambda>   s	    k$&7rG   )readonlydNSHostNamescopeattrsr   zAttempting to contact ldap:// ()rJ   	ldap://%sCould not contact ldap://)forced_local_dsazfound extra DSAs:z   %sz(missing DSAs (known locally, not by %s):othersrA   CN=NTDS Settings,currentneeded)tofrom)r   r   r   r   r'   zRepsFrom objects for %szRepsTo objects for %s)r   r   )r   colourshorten_namesgenerate_keygrouping_function
dottedsolidrU   emptyzstyle="z"; arrowhead=repsFzcolor="z";  )Fz style="dotted"; arrowhead="open"zrepsFromTo is needed)Fzstyle="solid"; arrowhead="open"zrepsFromTo currently exists)directededge_colorsedge_stylesr   	key_itemsr0   )+r?   r@   r   unix_nowr   rC   r   r   r   r   r   rP   sysstderr
load_samdbr   runset	list_dsasget_dsatranslate_ntdsconndsa_guidget_rep_tablesitemsappendr   rh   rep_repsFromsource_dsa_obj_guid
rep_repsTorc   rw   r   r   r   rX   
setdefaultr   addtitlesortedr   rl   )?rA   r   rb   r   r.   talk_to_remoter5   r7   r6   mode	partitionru   r   r&   r0   r>   rB   	local_kccdsasr   nc_repsguid_to_dnstrdsa_dnkccresdns_nameedsas_from_heredsa	remote_dn
remote_dsar   npartrep	all_edgesshort_partitionslong_partitionspartnamestate	edgelists
short_namerheader_strings	directionr   
part_edgessrcr#   edgesrY   edge_coloursr   	dot_edgesdot_verticesused_colourskey_setedgelistr   	linestylearrowstyler   s?                                                                  rD   r   cmd_reps.run   s    ##%((d(C*1%8	4%%!)//9=	
 78
 Fh.Coo,,V3=4A? - D s1vm4Q78)::'NN;#92uE u%qe,uv> 1N~%)

;*T1C'C-cjj9 2@6I::' >1C'C-cjj9 2 ,	8#	V(;V^	V(; [[)<y)HI
&&z2:Cc*"5"567 "0021!"ID# (DI,=i077F "+ "#ID# (DI,=h/66}E "+ ,A f ')"5')2 68	 -?y,O)/%mmoNHd$-OO$5 y#';KFC!0!4!4Xx!HJ --!&)00#*3q/D/D+EF')* .
 !^^!$..*3q/D/D+EF#')* , $/ %6 .$ ""62j@::<;ACL 2-N %.OO$5 y(1(9$Iu!,T!2J+0T4"4(//d< ,1'1'7'7'9e+D%153?:G9<>LN +9*Cd*JAN

1f- (:	 ): %6 	u%(0OE8$,NN$4 	5',OCt)44d5@$BKBM 6NOF -2X,=7I&/4&7FWE $$S) $$T*$$c4[1 ''/:CUKE&&u-KKv	0A'A!'!0 1 (- %5  1" 	6<Wo2i  %6<i"H-19"="? @ 7F  6 7  = > lI#"."-$1 )+ VNN1f%JJq&!I   !L"zz+s   X>>
Y5!Y00Y5r8   )NNFTFNNNrA   NNNNF)ry   rz   r{   r|   r}   r   r   r	   r   r   r   r8   rG   rD   r   r      sB    $"[0t])E	4 M
 6;%*7;6:).	h"rG   r   c                   $    \ rS rSrSrS rS rSrg)NTDSConni}  zTCollects observation counts for NTDS connections, so we know
whether all DSAs agree.c                 F    SU l         SU l        SU l        Xl        X l        g )Nr   F)observationssrc_attestsdest_attestsr   r#   )rA   r   r#   s      rD   __init__NTDSConn.__init__  s$     !	rG   c                     U =R                   S-  sl         XR                  :X  a  SU l        XR                  :X  a  SU l        g g )Nr   T)r  r   r  r#   r  )rA   attesters     rD   attestNTDSConn.attest  s<    Qxx#Dyy  $D !rG   )r#   r  r  r   r  N)ry   rz   r{   r|   r}   r  r  r   r8   rG   rD   r  r  }  s    %rG   r  c                   R    \ rS rSrSr\\-   \" SSSS9/-   rS r	      S
S jr
S	rg)cmd_ntdsconni  zDraw the NTDSConnection graphz--importldifz#graph from samba_kcc generated ldifNr   c                     [         R                  " SS9n[        R                  R	                  US5      nX@l        [        R                  " XBU5      nU$ )NrL   )rM   zimported.ldb)rS   mkdtemprV   pathjoin_tmp_fn_to_deleter   ldif_to_samdb)rA   ldifr>   drZ   rC   s         rD   import_ldif_dbcmd_ntdsconn.import_ldif_db  sD    $:;WW\\!^,!#"00>	rG   c                 r   UR                  5       nUc  UR                  USS9nOS nU R                  X5      n[        XU5      u  nnUR                  R                  SS5      S   n[        5       n/ nU GH8  nU(       ac  UR                  R                  U[        S/S9nUS   S   S   n U R                  SU-  UU5      nUR                  5       nUR!                  5       nOU R                  XU5      nSU-   nUnUR                  U[        S/S9nUS   S   S   S:H  nUR#                  UU(       a  SOS45        UR                  U[$        SS/S/S9nU HR  n['        UR(                  5      nUUR+                  S5      S-   S  nUR-                  ['        US   S   5      UU45        MT     GM;     U(       aX  XR.                  :X  aI  [0        R2                  " U5        [0        R4                  " [0        R6                  R9                  U5      5        0 n U H5  u  n!n"n#U!U"4n$U$U ;   a  U U$   nO[;        U$6 nUU U$'   UR=                  U#5        M7     [?        [A        U5      6 u  nn%U RC                  X5      S:X  Ga  U RE                  U	U5      n	[F        U	   n&U&RI                  SS5      n'U&RI                  SS5      n(/ n)SU%;   a  U)R-                  S5        U(       d  U RK                  5       n*SU-  n+GO@/ n*/ n,/ n-/ n.U RM                  5        H  u  nn/U/RN                  (       a7  U*R-                  U5        U/RP                  (       d  U,R-                  U5        ML  MN  U/RP                  (       a  U-R-                  U5        Mr  U.R-                  U5        M     Sn+U.(       a.  U)R-                  S5        U. H  nU)R-                  SU-  5        M     U-(       a.  U)R-                  S5        U- H  nU)R-                  SU-  5        M     U,(       a.  U)R-                  S5        U, H  nU)R-                  SU-  5        M     [S        UU*U
U	UU[T        U%S 9n0SRW                  U)5      n)U)(       a  S!U'< S"U(< S!U)< 3n)U RY                  S!U+< S#U0< S!U)< 3U5        g / n1/ n2/ n3/ n4[[        U5      n5[A        U RM                  5       5       GH  u  n$nU1R-                  U$5        UR\                  U5:X  d  U(       d$  U2R-                  S$5        U3R-                  S5        MS  URN                  (       aH  U3R-                  S5        URP                  (       a  U2R-                  S%5        M  U2R-                  S&5        M  URP                  (       a$  U2R-                  S'5        U3R-                  S(5        M  U2R-                  S'5        U3R-                  S)5        GM     / n6U(       ag  U6R-                  S*5        S+ H%  u  n7n8U7U2;   d  M  U6R-                  S,S-U7-  U845        M'     S. H%  u  n9n8U9U3;   d  M  U6R-                  S,S/U9-  U845        M'     U(       a  S0n+OSU-  n+[_        [A        U5      U1SU+U2U4U3UU6S19	n0US2:X  a  U Ra                  U0U5        g U RY                  U0U5        g ! [         a-  n[        S	U< S
U< S3[        R                  S9   S nAGM=  S nAff = f)3NTr:   ,r   r   r   r   r   r   r   r   rJ   r   zmsDS-isRODCTRUERODCrr   z(objectClass=nTDSConnection)
fromServerzsearch_options:0:2)r   
expressionr   controlsr'   headerresetz/No outbound connections are expected from RODCszNTDS Connections known to %sz-NTDS Connections known to each destination DCzTThe following connections are alleged by DCs other than the source and destination:
z  %s -> %s
zbThe following connections are alleged by DCs other than the destination but including the source:
zRThe following connections (included in the chart) are not known to the source DC:
)r   r   r   r   r   row_commentsr   NOTES

z#000000#0000ff#cc00ffz#ff0000style=dashedstyle=dotted)Fzcolor="#000000"zNTDS Connection))r0  zmissing from some DCs)r1  zmissing from source DCFz
color="%s"))r2  zunknown to destination)r3  z!unknown to source and destinationzcolor="#ff0000; %s"zNTDS Connections)r   r   r   edge_labelsr   r   r   r0   )1r?   r@   r"  r   my_dsa_dnstrsplitr   rC   r   r   rE   r   rP   r   r   get_dsServiceName	domain_dnr   r   r   r   indexr   r  rV   rk   rmdirr  dirnamer  r  zipr   rc   rw   r   rh   keysr   r  r  r   r   r  rX   lenr  r   rl   ):rA   r   rb   r   r.   r   r5   r7   r6   ru   r   r&   
importldifr0   r>   rB   r   r   local_dsa_dnverticesattested_edgesr   r   r   rC   r   ntds_dnr   is_rodcmsgmsgdndest_dnr  r   r#   r  krodc_statuscoloursc_headerc_resetepiloggraph_edgesr   source_deniesdest_denies	both_denyconnrY   r  r  r   r4  	n_serversr   r   descr
  s:                                                             rD   r   cmd_ntdsconn.run  s    ##%,,R$,GEE##J3A*1%8	4 --33C;A>5Foo,,V3=4A? - D q6-03 KKh(>	(02E  113__&A(;-6,,w%/&3_  6C !f]+A.&8GLL'W6"=>,,r%2*H&2^ *>(>  !C CFFC 01 4 56%%s3|+<Q+?'@'.'9 : M X !555IIaLHHRWW__Q'( #1CxdAEz!HaLaHHX $2 !$VH%5 6+""62j@::<;ACL!,/G{{8R0Hkk'2.GF$OP! $jjl6E ! " 	${{}GAt((#**1-#//)003  0))#**1-!((+  - HMM #3 4 'nq&89 'MM #< = )nq&89 ) MM #F G +nq&89 +  +%)'3.;-02D-8:A WWV_F.6.5.46 JJ5+,+134:< 	I	5;;=)DAqQ~~*.##I.""2&""2&== ''	2 ''	2##I."">2##I."">2! *$ 	 1 2!H\)$$e\F-BD%IJ!H
 Gt K'$$e&;e&C&*&, -	 G &E2\AEfX&	#!"."-"-$1 )+ VNN1f%JJq&!E   !L"zz+s   +Y??
Z6	!Z11Z6)r  )NNFTFNNNNNNNF)ry   rz   r{   r|   r}   r   r   r	   r   r"  r   r   r8   rG   rD   r  r    sH    #"[0~$I	4 M
 6;%*7;/3]"rG   r  c            	       X    \ rS rSrSr\\" SSSSS9\" SS	\S
S9/-   r      SS jr	Sr
g)cmd_uptodatenessi}  zvisualize uptodateness vectorsr   r   r   Nr   z--max-digits   z,display this many digits of out-of-date-ness)r%   r!   r    c                    U(       d  [        SU R                  S9  g UR                  5       nUR                  USS9n[	        UUU5      u  nnUR
                  U l        [        U R
                  U5      n[        U R
                  5      u  nnU R                  U	U5      n	UR                  5        H  u  nnUUS 4;  a  M  [        UUUUU5      n[        UU5      n[        U5      n[        U[        [        U5      5      5      nUS:  a  SnSU-  n[!        UU
U	UU["        UUSSS	9
nU R%                  S
U< SU< 3U5        M     g )Nz>this won't work without talking to the remote servers (use -r)rJ   Tr:   r   
   DCzout-of-date-ness)	r   r   r   r   r   colour_scaledigitsylabelxlabelr   r/  )rP   rQ   r?   r@   r   rC   r   r   rw   r   r   r   r   minr>  r   r   r   rX   )rA   r   rb   r   r.   r   r5   r7   r6   ru   r   r&   r?  r0   r   
max_digitsr>   rB   r   r   r   r   	part_namepart_dn
utdv_edges	distancesmax_distancer]  c_scalerY   s                                 rD   r   cmd_uptodateness.run  sQ     #'99. ##%((d(C*1b%8	4__
!$**i8	,>tzz,J)/66|7=? #3"8"8":Iw$/'	4"eLJ*:t<I0;LS\):%;<FzFlGI!%#/*7),.<)0#)#'#5	7A JJy!4f=5 #;rG   )rC   )NNFTFNNNNFNNFNrX  )ry   rz   r{   r|   r}   r   r	   r   r   r   r   r8   rG   rD   rW  rW  }  sQ    ("t])E	~qsB	D& M 6;%*7;04341>rG   rW  c                       \ rS rSrSr0 r\" 5       R                  5        H+  u  rr	\R                  S5      (       d  M  \	" 5       \\SS '   M-     Srg)cmd_visualizei  z:Produces graphical representations of Samba network state.cmd_   Nr8   )ry   rz   r{   r|   r}   subcommandsglobalsr   rH  v
startswithr   r8   rG   rD   rj  rj    sB    DK	!1<<!"K!" "rG   rj  )>rV   r   collectionsr   ri   rS   samba.getoptgetoptr   sambar   r   samba.netcmdr   r   r   r	   samba.samdbr
   samba.graphr   r   r   r   samba.colourr   ldbr   r   r   timer   	samba.kccr   r   samba.kcc.kcc_utilsr   samba.uptodatenessr   r   r   r   r   r   r   r   r   r   r=  r   r   rR   r3   r   r   r   r   objectr  r  rW  rj  r8   rG   rD   <module>r     s  ( 
 
 #      D D  ! 4 # ) 3 3  	 - (	 	 	 4FU.
4"?VT3
<F
=B
88 
 $;((*+- 4"2/ 4#*F/
:6E;#, 7.X}.
89/ 	Z7 Zz p"| p"f%v %$k"< k"\;>| ;>|%L %rG   