
    Id l                        d dl Z d dlZd dlm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mZmZm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mZmZmZ d dlZd dlZd dl m!Z!m"Z" d dl#m$Z$ d dl%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-  eddde.dd       eddde.dd       eddddd       ed d!d"#       ed$d% e/ ej`                               &       ed'd(d)d"d*+       ed,d-d.d"d*+       ed/d0d1d2d34      gZ1 ed5d6dd7d       ed8d9dd:d      gZ2d;Z3 G d< d=e      Z4d> Z5d? Z6d@ Z7 G dA dBe4      Z8 G dC dDe9      Z: G dE dFe4      Z; G dG dHe4      Z< G dI dJe      Z=y)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                       e Zd ZdZdZej                  ej                  ej                  dZ	e
ez   ZdZd ZddZd Zd	 Zd
 Zy)GraphCommandz Base class for graphing commandsz%prog [options])	sambaoptsversionoptscredopts c                 h    |j                         }|j                  |d      }t        |||      }|S )NTfallback_machine)urlcredentialslp)get_loadparmget_credentialsr
   )selfr   r4   r6   r=   credssamdbs          8/usr/lib/python3/dist-packages/samba/netcmd/visualize.pyget_dbzGraphCommand.get_db^   s8    ##%((d(C!26    Nc                 &   ||dk(  rt        || j                         y|t        u r<t        j                  d|      \  }}t        |d      }t        j                  |       nt        |d      }|j                  |       |j                          |S )a  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)r@   sfnrL   fdfs         rC   rV   zGraphCommand.writed   s{     :s!$))$?%%-C-35FBRAHHRLRA	
			rE   c                 \    |s#|r |j                         j                  d      ryy|dk(  ry|S )z5Heuristics to work out what output format was wanted..dotr/   r'   r0   )lowerendswith)r@   r&   outputs      rC   calc_output_formatzGraphCommand.calc_output_format   s1    &,,.11&9!VrE   c                     || j                  |t              }n| j                  ||      }t        j                  j	                  dd      }t        j                  ||g       t        j                  |       y )NSAMBA_TOOL_XDOT_PATHz/usr/bin/xdot)rV   rP   rT   environget
subprocesscallremove)r@   rW   r_   rX   r0   s        rC   	call_xdotzGraphCommand.call_xdot   sW    >Ay)BAv&Bzz~~4oFr
#
		"rE   c                     ||S |dv r| j                   }t        || j                        }|sydt        j                  j                  dd      v ryy)	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)rG   N)hint256colorTERM zxterm-256color-heatmapansi)rO   r   requested_colourrT   rc   rd   )r@   color_schemer_   want_colours       rC   calc_distance_color_schemez'GraphCommand.calc_distance_color_scheme   sX     #[ YYF&vD4I4IJ
 33+rE   )Nr\   )__name__
__module____qualname____doc__synopsisoptionsSambaOptionsVersionOptionsCredentialsOptionstakes_optiongroupsCOMMON_OPTIONSDOT_OPTIONStakes_options
takes_argsrD   rV   r`   rh   rr   r7   rE   rC   r3   r3   R   sW    * H))--..
 #[0MJ:rE   r3   c                 X    t        j                  d|       }|r|j                  d      S | S )zFHelper function for sorting and grouping DNs by site, if
    possible.z$CN=Servers,CN=\s*([^,]+)\s*,CN=Sites   )researchgroup)dnms     rC   get_dnstr_siter      s+     			92>AwwqzIrE   c                     t        | d         S )z\Helper function for sorting and grouping lists of (DN, ...) tuples
    by site, if possible.r   )r   )ts    rC   get_dnstrlist_siter      s     !A$rE   c                     ddl m} t        |       }t        |t              r|j	                  d      }t         ||      j                         dd d      dz  }d	|z  S )
zQGenerate 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       rC   colour_hashr      sW     !fG'3..(CL""$Ra(r2X=AQ;rE   c                   H    e Zd ZdZeez    edddd      gz   Z	 	 	 	 	 ddZy)	cmd_repszrepsFrom/repsTo from every DSA-p--partitionrestrict to this partitionNr    r%   c                    |j                         }|j                  |d      }t        |||      \  }}|j                  }t	        |j
                  |
      }
t        d       }i }|D ]D  }t        |d      }|r|j
                  j                  |t        dg      }t        |d   d   d         }t        d|d	|d
t        j                         	 |j                  d|z  ||       |j!                  |||       n(|j                  |||       |j!                  ||||       t#        |j%                               }||k7  rt        dt        j                         ||z
  D ]   }t        d|z  t        j                         " t        d|z  t        j                         ||z
  D ]   }t        d|z  t        j                         " |D ]  }|	dk(  r||k(  r|	dk(  r||k7  r|j'                  d|z         }|j)                  |       ||t        |j*                        <   |j-                         \  }} |j/                         D ]&  \  }!}"|
|!|
k(  s||!   d   j1                  ||"f       ( | j/                         D ]&  \  }!}"|
|!|
k(  s||!   d   j1                  ||"f       (  G g g dg g dd}#t3        |j
                        \  }$}%|j/                         D ]  \  }&}!|#j/                         D ]  \  }'}(|!|'   D ]  \  }}"|%j5                  |&|&      })|"j6                  D ]/  }*|(d   j1                  ||t        |*j8                           |)f       1 |"j:                  D ]/  }*|(d   j1                  |t        |*j8                           ||)f       1    | j=                  ||      dk(  r| j?                  ||      }ddd}+|#j/                         D ]  \  }'}(|(j/                         D ]  \  },}-t        t@              }.|-D ]  \  }/}0}!|.|!   j1                  |/|0f        |.j/                         D ];  \  }!}1tC        d |1||||tD              }2d |+|,   |!z  d |2}2| jG                  |2|       =   y g }3g }4g }5t#               }6i }7t#               }8|#j/                         D ]  \  }'}9|9j/                         D ]  \  },}-|-D ]  \  }/}0}!|7jI                  |!tK        |!|,f            }:|'dk(  rd!nd"};|,dk(  rd#nd$}<|6jM                  |/       |6jM                  |0       |5j1                  |/|0f       |3j1                  |:       d%|;d&|<}=|4j1                  |=       |8jM                  |!d'|,jO                         z   |:|=f          g }>|rVtQ        |8      D ]&  \  }!},}:};|>j1                  d(d)|:d*|;|!d+|,f       ( |>j1                  d,       |>j1                  d-       tS        |6|5d|3|4||>.      }2|d/k(  r| jU                  |2|       y | jG                  |2|       y # t        $ r-}t        d|d	|d
t        j                         Y d }~d }~ww xY w)0NTr9   c                       t        t              S )N)r   listr7   rE   rC   <lambda>zcmd_reps.run.<locals>.<lambda>   s    k$&7 rE   )readonlydNSHostNamescopeattrsr   zAttempting to contact ldap:// ()rH   	ldap://%sCould not contact ldap://)forced_local_dsazfound extra DSAs:z   %sz(missing DSAs (known locally, not by %s):othersr@   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solidrS   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   rB   r   r   r   r   r   rN   sysstderr
load_samdbr   runset	list_dsasget_dsatranslate_ntdsconndsa_guidget_rep_tablesitemsappendr   rd   rep_repsFromsource_dsa_obj_guid
rep_repsTor`   rr   r   r   r   rV   
setdefaultr   addtitlesortedr   rh   )?r@   r   r_   r   r.   talk_to_remoter4   r6   r5   mode	partitionrp   r   r&   r0   r=   rA   	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#   edgesrW   edge_coloursr   	dot_edgesdot_verticesused_colourskey_setedgelistr   	linestylearrowstyler   s?                                                                  rC   r   zcmd_reps.run   s    ##%((d(C*1b%8	4%%!)//9=	
 78
  1	FFh.Coo,,V3=4A? - D s1vm4Q78)::'NN;#92uE 2u%q"e,2uv> 1N~%)

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

1f-	.	.. 	u%(0 	1OE8$,NN$4 1 	5', 1OC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11	1" 	6<Wo @2i  %6<i"H-19"="? @@  6 7  = > lI#"."-$1 )+ VNN1f%JJq&!I   !L"zz+s   X	Y""Y

Y)NNFTFNNNr@   NNNNF)	rs   rt   ru   rv   r}   r~   r	   r   r   r7   rE   rC   r   r      sB    $"[0t])E	4 M
 6;%*7;6:).	h"rE   r   c                       e Zd ZdZd Zd Zy)NTDSConnzXCollects observation counts for NTDS connections, so we know
    whether all DSAs agree.c                 J    d| _         d| _        d| _        || _        || _        y )Nr   F)observationssrc_attestsdest_attestsr   r#   )r@   r   r#   s      rC   __init__zNTDSConn.__init__  s(     !	rE   c                     | xj                   dz  c_         || j                  k(  rd| _        || j                  k(  rd| _        y y )Nr   T)r  r   r  r#   r  )r@   attesters     rC   attestzNTDSConn.attest  s@    Qtxx#Dtyy  $D !rE   N)rs   rt   ru   rv   r  r
  r7   rE   rC   r  r  }  s    %rE   r  c                   N    e Zd ZdZeez    eddd      gz   Zd Z	 	 	 	 	 	 ddZ	y)	cmd_ntdsconnzDraw the NTDSConnection graphz--importldifz#graph from samba_kcc generated ldifNr   c                     t        j                  d      }t        j                  j	                  |d      }|| _        t        j                  |||      }|S )NrJ   )rK   zimported.ldb)rQ   mkdtemprT   pathjoin_tmp_fn_to_deleter   ldif_to_samdb)r@   ldifr=   drX   rB   s         rC   import_ldif_dbzcmd_ntdsconn.import_ldif_db  sH    $:;WW\\!^,!#"00R>	rE   c                    |j                         }||j                  |d      }nd }| j                  ||      }t        |||      \  }}|j                  j                  dd      d   }t               }g }|D ]5  }|rf|j                  j                  |t        dg      }|d   d   d   }	 | j                  d|z  ||      }|j                         }|j!                         }n| j                  |||      }d|z   }|}|j                  |t        dg      }|d   d   d   dk(  }|j#                  ||rdndf       |j                  |t$        ddgdg      }|D ]Q  }t'        |j(                        }||j+                  d      dz   d  }|j-                  t'        |d   d         ||f       S 8 |rV|| j.                  k(  rGt1        j2                  |       t1        j4                  t0        j6                  j9                  |             i } |D ]2  \  }!}"}#|!|"f}$|$| v r| |$   }nt;        |$ }|| |$<   |j=                  |#       4 t?        tA        |       \  }}%| jC                  ||      dk(  r| jE                  |	|      }	tF        |	   }&|&jI                  dd      }'|&jI                  dd      }(g })d|%v r|)j-                  d       |s| jK                         }*d|z  }+ng }*g },g }-g }.| jM                         D ]p  \  }}/|/jN                  r0|*j-                  |       |/jP                  r0|,j-                  |       B|/jP                  r|-j-                  |       `|.j-                  |       r d}+|.r,|)j-                  d       |.D ]  }|)j-                  d|z          |-r,|)j-                  d       |-D ]  }|)j-                  d|z          |,r,|)j-                  d       |,D ]  }|)j-                  d|z          tS        ||*|
|	||tT        |%       }0djW                  |)      })|)rd!|'d"|(d!|)})| jY                  d!|+d#|0d!|)|       y g }1g }2g }3g }4t[        |      }5tA        | jM                               D ]  \  }$}|1j-                  |$       |j\                  |5k(  s|s#|2j-                  d$       |3j-                  d       K|jN                  rA|3j-                  d       |jP                  r|2j-                  d%       |2j-                  d&       |jP                  r#|2j-                  d'       |3j-                  d(       |2j-                  d'       |3j-                  d)        g }6|r]|6j-                  d*       d+D ]!  \  }7}8|7|2v s|6j-                  d,d-|7z  |8f       # d.D ]!  \  }9}8|9|3v s|6j-                  d,d/|9z  |8f       # |rd0}+nd|z  }+t_        tA        |      |1d|+|2|4|3||61	      }0|d2k(  r| ja                  |0|       y | jY                  |0|       y # t        $ r-}t        d	|d
|dt        j                         Y d }~d }~ww xY w)3NTr9   ,r   r   r   r   r   r   r   r   rH   r   zmsDS-isRODCTRUERODCrm   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))r"  zmissing from some DCs)r#  zmissing from source DCFz
color="%s"))r$  zunknown to destination)r%  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   rB   r   r   rD   r   rN   r   r   get_dsServiceName	domain_dnr   r   r   r   indexr   r  rT   rg   rmdirr  dirnamer  r
  zipr   r`   rr   r   rd   keysr   r  r  r   r   r  rV   lenr  r   rh   ):r@   r   r_   r   r.   r   r4   r6   r5   rp   r   r&   
importldifr0   r=   rA   r   r   local_dsa_dnverticesattested_edgesr   r   r   rB   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connrW   r   r   r   r&  	n_serversr   r   descr   s:                                                             rC   r   zcmd_ntdsconn.run  s    ##%,,R$,GEE##J3A*1b%8	4 --33C;A>5 *	:Foo,,V3=4A? - D q6-03 KKh(>	(02E  113__&Ay(;-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 !t555IIaLHHRWW__Q'( #1 	CxdAEz!HaLaHHX	 !$VH%5 6+""662j@::<;ACL!,/G{{8R0Hkk'2.GF$OP! $jjl6E ! " 	${{} ,GAt((#**1-#//)003))#**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;;=) 	3DAqQ~~*.##I.""2&""2&== ''	2 ''	2##I."">2##I."">2!	3$ 	 1 2!H K\)$$e\F-BD%IJK
 G -t K'$$e&;e&C&*&, -	- &E2\AEfX&	#!"."-"-$1 )+ VNN1f%JJq&!E   !L"zz+s   -X	Y"X>>Y)NNFTFNNNNNNNF)
rs   rt   ru   rv   r}   r~   r	   r   r  r   r7   rE   rC   r  r    sH    #"[0~$I	4 M
 6;%*7;/3]"rE   r  c                   Z    e Zd ZdZe edddd       edded	
      gz   Z	 	 	 	 	 	 ddZy)cmd_uptodatenesszvisualize uptodateness vectorsr   r   r   Nr   z--max-digits   z,display this many digits of out-of-date-ness)r%   r!   r    c                    |st        d| j                         y |j                         }|j                  |d      }t	        |||      \  }}|j
                  | _        t        | j
                  |      }t        | j
                        \  }}| j                  |	|      }	|j                         D ]  \  }}||d fvrt        |||||      }t        ||      }t        |      }t        |t        t        |                  }|dk  rd}d|z  }t!        ||
|	||t"        ||dd	
      }| j%                  d
|d||        y )Nz>this won't work without talking to the remote servers (use -r)rH   Tr9   r   
   DCzout-of-date-ness)	r   r   r   r   r   colour_scaledigitsylabelxlabelr   r!  )rN   rO   r>   r?   r   rB   r   r   rr   r   r   r   r   minr0  r   r   r   rV   )r@   r   r_   r   r.   r   r4   r6   r5   rp   r   r&   r1  r0   r   
max_digitsr=   rA   r   r   r   r   	part_namepart_dn
utdv_edges	distancesmax_distancerN  c_scalerW   s                                 rC   r   zcmd_uptodateness.run  sV     #'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	>rE   )NNFTFNNNNFNNFNrI  )	rs   rt   ru   rv   r}   r	   r   r   r   r7   rE   rC   rH  rH  }  sQ    ("t])E	~qsB	D& M 6;%*7;04341>rE   rH  c                       e Zd ZdZi Z e       j                         D ]$  \  ZZej                  d      s e       eedd <   & y)cmd_visualizez:Produces graphical representations of Samba network state.cmd_   N)
rs   rt   ru   rv   subcommandsglobalsr   r:  v
startswithr7   rE   rC   rZ  rZ    sD    DK	! %1<<!"K!"%rE   rZ  )>rT   r   collectionsr   re   rQ   samba.getoptgetoptrx   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~   rP   r3   r   r   r   r   objectr  r  rH  rZ  r7   rE   rC   <module>ro     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 %rE   