
    Id                        d dl mZ d dlZd dlZddlmZ d dl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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 m!Z!m"Z" d dl#m$Z$ d dlm%Z% d Z&d Z'd Z(d Z)dZ* G d de      Z+ G d de      Z, G d de      Z- G d de      Z. G d de      Z/ G d de      Z0 G d  d!e      Z1 G d" d#e      Z2y)$    N   )common)system_session)CommandCommandErrorOptionSuperCommand)attr_default)SamDB)	drs_utilsnttime2stringdsdb)drsuapimisc)
join_clone)colour)get_partition_mapsget_utdv_edgesget_utdv_distancesget_utdv_summaryget_kcc_and_dsas)
get_string)get_default_backend_storec                     	 t        j                  | j                  | j                  | j                        \  | _        | _        | _        y# t        $ r}t        d| j                  z  |      d}~ww xY w)z'make a DRSUAPI connection to the serverzDRS connection to %s failedN)
r   drsuapi_connectserverlpcredsr   drsuapi_handlebind_supported_extensions	Exceptionr   ctxes     2/usr/lib/python3/dist-packages/samba/netcmd/drs.pyr   r   4   su    JKTKdKdeheoeoqtqwqwy|  zC  zC  LDHc(#*G J83::EqIIJs   AA 	A2A--A2c                     	 t        d| j                  z  t               | j                  | j                        | _        y# t        $ r}t        d| j                  z  |      d}~ww xY w)z$make a ldap connection to the server	ldap://%surlsession_infocredentialsr   zLDAP connection to %s failedN)r   r   r   r   r   samdbr!   r   r"   s     r%   samdb_connectr-   <   s]    KkCJJ6'5'7&)iiCFF<	  K9CJJFJJKs   =A   	A'	A""A'c                 &    | \  }}|dk(  ryd||fz  S )z*return "was successful" or an error stringr   zwas successfulzfailed, result %u (%s) )werrecodeestrings      r%   
drs_errmsgr3   F   s&    UGz#ug&666    c                     | j                  d      }|d   dk7  s|d   dk7  s|d   dk7  rt        d| z        |d	   j                  d
      d	   }|d   j                  d
      d	   }||fS )z+parse a NTDS DN returning a site and server,r   zCN=NTDS Settings   z
CN=Servers   zCN=Siteszbad NTDS DN %sr   =   )splitRuntimeError)ntds_dnar   sites       r%   drs_parse_ntds_dnr@   N   sz    cAt!!QqT\%9QqTZ=O+g566qTZZ_QFqTZZ_QD&>r4   classicc                   F   e Zd ZdZdZej                  ej                  ej                  dZ	 e
ddddd	       e
d
dddd	       e
ddddd	       e
ddddd       e
ddddde       e
dddd      gZdgZd Zd Zd  Zd!d!d!d!ed"fd#Zd$ Zd% Zd& Zd' Zd( Zd) Zd* Zy!)+cmd_drs_showreplzShow replication status.%prog [<DC>] [options]	sambaoptsversionoptscredopts--jsonz"replication details in JSON formatformatstore_constjson)helpdestactionconstz	--summaryz5summarize overall DRS health as seen from this serversummaryz--pull-summaryz:Have we successfully replicated from all relevant servers?pull_summaryz--notify-summarynotify_summaryzsHave we successfully notified all relevant servers of local changes, and did they say they successfully replicated?)rO   rP   rN   rM   z	--classiczprint local replication detailsrA   )rM   rN   rO   rP   defaultz-vz	--verbosez
Be verbose
store_truerM   rO   DC?c           	      ^   t        |j                        }|j                  |t        |j                        t        |j                        |j                  t        |j                        t        |j                        dd}	 | j                  j                  d|z  t        j                  g        	 t#        |j                        \  }}|d||d	<   |S # t        j                  $ r3}|j                  \  }}|t        j                   k(  rd|d<   n Y d}~fd}~ww xY w# t$        $ r Y |S w xY w)
z8Convert an ldb neighbour object into a python dictionaryF)NC dnDSA objectGUIDlast attempt timelast attempt messageconsecutive failureslast successNTDS DN
is deletedz	<GUID=%s>basescopeattrsTr`   N\DSA)strsource_dsa_obj_guidnaming_context_dnr   last_attemptr3   result_last_attemptconsecutive_sync_failureslast_successsource_dsa_obj_dnr,   searchldb
SCOPE_BASELdbErrorargsERR_NO_SUCH_OBJECTr@   r<   )	selfndsa_objectguiddr$   errno_r?   r   s	            r%   parse_neighbourz cmd_drs_showrepl.parse_neighbour|   s   Q223((,!.q~~!>$.q/D/D$E$%$?$?)!..91../	
		JJ;#?$'NN$&  (	.q/B/BCNT6#'0AeH  || 	JUA..."&,  	  		s*   /C 2"D D))DD	D,+D,c                 ~   | j                  d|d   z         d|v r| j                  d|d   z         n| j                  d|d   z         | j                  d|d   z         | j                  d	|d
   d|d          | j                  d|d   z         | j                  d|d   z         | j                  d       y)z&print one set of neighbour informationz%srY   rf   z	%s via RPCz	NTDS DN: %sr_   z		DSA object GUID: %srZ   z		Last attempt @ r[    r\   z		%u consecutive failure(s).r]   z		Last success @ %sr^    N)message)ru   rx   s     r%   print_neighbourz cmd_drs_showrepl.print_neighbour   s    TAgJ&'A:LL!E(23LL1Y<78.3C1DDE15H3I345K3LN 	O5-./ 	0,q/@@ARr4   c                 ,   t        j                         }||_        	 | j                   j                  | j                  d|      \  }}|j                  D cg c]  }| j                  |       }}|S # t
        $ r}t        d|z  |      d }~ww xY wc c}w )Nr   z"DsReplicaGetInfo of type %u failed)	r   DsReplicaGetInfoRequest1	info_typeDsReplicaGetInfor   r!   r   arrayr{   )ru   r   req1infor$   rv   repss          r%   get_neighbourszcmd_drs_showrepl.get_neighbours   s    //1"	T $ = =##Q!.Y
 26<A$$Q'<<	  	TCiOQRSS	T =s   *A1 B1	B:B		BNFc                    |j                         | _        |t        j                  | j                        }|| _        |j                  | j                  d      | _        || _        | j                  | j                  | j                  | j                  | j                  dj                  |      }|t        d|z         |       S )NTfallback_machine)rQ   rS   rR   rL   rA   zunknown showrepl format %s)get_loadparmr   r   netcmd_dnsnamer   get_credentialsr   verbosesummary_outputnotify_summary_outputpull_summary_outputjson_outputclassic_outputgetr   )ru   DCrF   rH   rG   rJ   r   output_functions           r%   runzcmd_drs_showrepl.run   s     ((*:&&tww/B--dgg-M
 **"88 44$$**
 #f+ 	 ";fDEE  r4   c                 t    | j                         }|d= |d= t        j                  || j                  d       y )Nr?   r   r7   indent)get_local_repl_datarL   dumpoutf)ru   datas     r%   r   zcmd_drs_showrepl.json_output   s2    '')LN		$		!,r4   c                    g }g }| j                         }|dk7  r2|d   D ]*  }|d   r	|d   dk7  s	|d   dk(  s|j                  |       , |dk7  r2|d   D ]*  }|d   r	|d   dk7  s	|d   dk(  s|j                  |       , |s|r| j                  t        j                  d	             |r<| j                  t        j                  d
             |D ]  }| j                  |        |r<| j                  t        j                  d             |D ]  }| j                  |        y| j                  t        j                  d             y)zcPrint a short message if every seems fine, but print details of any
        links that seem broken.rR   repsTor`   r]   r   r^   rS   repsFromzThere are failing connectionszFailing outbound connections:zFailing inbound connection:r   z
[ALL GOOD]N)r   appendr   r   c_REDr   c_GREEN)ru   typeof_outputfailing_repstofailing_repsfrom
local_datareps         r%   summary_output_handlerz'cmd_drs_showrepl.summary_output_handler   sb    --/
N*!(+ /|$-.!3s>7Ja7O"))#.	/ ,,!*- 1|$-.!3s>7Ja7O$++C0	1 -LL&EFGV\\*IJK) .C((-.V\\*GHI+ .C((-. V^^L12r4   c                 $    | j                  d      S )NrQ   r   ru   s    r%   r   zcmd_drs_showrepl.summary_output   s    **955r4   c                 $    | j                  d      S )NrS   r   r   s    r%   r   z&cmd_drs_showrepl.notify_summary_output   s    **+;<<r4   c                 $    | j                  d      S )NrR   r   r   s    r%   r   z$cmd_drs_showrepl.pull_summary_output   s    **>::r4   c                    t        |        t        |        | j                  j                         }t	        |      \  }}	 | j                  j                  |t        j                  g d      }t        t        |d   dd            t        | j                  j                  d|d   d   d               t        | j                  j                  d|d   d   d               d}| j                  j                  |d	      }| j                  t        j                         }| j                  t        j"                        }	g }
|D ]3  }t%        |d
   d         j'                  d      \  }}}t%        |d         t%        |d
   d         t        t        |dd            t        t        |dd            j)                         dk(  d}|
j+                  |       	 | j                  j                  |t        j                  dg      }t%        |d   d   d         |d<   g |d<   |j7                  dg       D ]A  }t%        |      j9                  d      }|d   j+                  |d   t        |d         f       C 6 |||	|
||dS # t        $ r}t        d|z        d }~ww xY w# t        j,                  $ r1}|j.                  \  }}|t        j0                  k(  rd|d<   Y d }~d }~wt2        t4        f$ r Y w xY w)N)options
objectGUIDinvocationIdra   zFailed to search NTDS DN %sr   r   r   r   z(objectClass=nTDSConnection))rb   
expression
fromServerr6   nameenabledConnectionTRUE)r   	remote DNr   enableddnsHostNamedns nameTr`   replicates NCzmS-DS-ReplicatesNCReason:r:   r7   )dsar   r   NTDSConnectionsr?   r   )r   r-   r,   get_dsServiceNamer@   ro   rp   rq   r!   r   intr
   r   schema_format_valuer   r   !DRSUAPI_DS_REPLICA_INFO_NEIGHBORSDRSUAPI_DS_REPLICA_INFO_REPSTOrg   	partitionupperr   rr   rs   rt   KeyError
IndexErrorr   r;   )ru   r=   r?   r   ntdsr$   dsa_detailsconnrepsfromrepstoconn_detailscc_rdnsepc_server_dnrx   c_server_resry   rz   rr>   s                        r%   r   z$cmd_drs_showrepl.get_local_repl_data  s   d **..0*73v	H::$$'Ox$yD
 <QA>?$TZZ%C%Cd1gl3A6&8 9&tzz'E'Ed1gn5a8(: ;	
 zz  g:X Y&&w'P'PQ$$W%K%KL 	=A&)!L/!*<&=&G&G&L#E3AfI <!34|Ay!<=&|A7J)/(1 227%'VD	A "
#zz00k7:~~8E  1  H !$LOM$B1$E F* "$AoUU5r: =FLL%/"))1Q4QqT*;<=1	=:  +
 	
Y  	H<wFGG	H@ << +VV
C222&*AlOj) s7    .J AJ!	JJJ!K54'K  K54K5c                    | j                         }|d   }|d   }|d   }|d   }|d   }|d   }| j                  |d|       | j                  d|d	   z         | j                  d
|d   z         | j                  d|d   z         | j                  d       |D ]  }| j                  |        | j                  d       |D ]  }| j                  |        g d}	| j                  d       |D ]Z  }
| j                  d       |
j                  d      r| j                  d       | j                  d|
d   z         | j                  dt	        |
d         j                         z         | j                  d|
j                  d      z         | j                  d|
d   z         | j                  d       | j                  d|
d	   z         |
d   rg|
d   D ]]  \  }}| j                  d |z         | j                  d!|z         |	D ]+  }t        t        |d"      |z  s| j                  d#|z         - _ J| j                  d$       ] y )%Nr   r   r   r   r?   r   re   zDSA Options: 0x%08xr   zDSA object GUID: %sr   zDSA invocationId: %s
r   z==== INBOUND NEIGHBORS ====
z==== OUTBOUND NEIGHBORS ====
)
NTDSCONN_KCC_GC_TOPOLOGYNTDSCONN_KCC_RING_TOPOLOGY#NTDSCONN_KCC_MINIMIZE_HOPS_TOPOLOGY#NTDSCONN_KCC_STALE_SERVERS_TOPOLOGY,NTDSCONN_KCC_OSCILLATING_CONNECTION_TOPOLOGY"NTDSCONN_KCC_INTERSITE_GC_TOPOLOGYNTDSCONN_KCC_INTERSITE_TOPOLOGY%NTDSCONN_KCC_SERVER_FAILOVER_TOPOLOGY#NTDSCONN_KCC_SITE_FAILOVER_TOPOLOGY&NTDSCONN_KCC_REDUNDANT_SERVER_TOPOLOGYz!==== KCC CONNECTION OBJECTS ====
zConnection --r`   z'	WARNING: Connection to DELETED server!z	Connection name: %sr   z	Enabled        : %sr   z	Server DNS name : %sr   z	Server DN name  : %sr   z		TransportType: RPCz		options: 0x%08Xr   z		ReplicatesNC: %sz		Reason: 0x%08xr   z			%sz)Warning: No NC replicated for Connection!)r   r   r   r   rg   r   getattrr   )ru   r   r   r   r   r   r?   r   rv   reasonsrx   ncreasonss                 r%   r   zcmd_drs_showrepl.classic_output@  sR   '')5k
#h-.F|hv./*[-CCD*[-FFG-N0KKL45 	$A  #	$ 	56 	$A  #	$	= 	9: 	JALL)uu\"GHLL01V9<=LL03q|3D3J3J3LLMLL1AEE*4EEFLL1AkNBCLL12LL.9=>!"#O"4 9JBLL!7"!<=LL!5!>?$ 9"4A.7 LLa899 HI)	Jr4   )__name__
__module____qualname____doc__synopsisr   SambaOptionsVersionOptionsCredentialsOptionstakes_optiongroupsr   DEFAULT_SHOWREPL_FORMATtakes_options
takes_argsr{   r   r   r   r   r   r   r   r   r   r   r/   r4   r%   rC   rC   [   s   "'H ))--.. 	xB]&	B{ #5])	E 	 (D].	J 	!-%H#	%
 	{!B]).	0 	t[|LI#M( J>
 Tt*!.-#3J6=;=
~6Jr4   rC   c                   n    e Zd ZdZdZej                  ej                  ej                  dZ	dgZ
	 	 ddZy)cmd_drs_kccz)Trigger knowledge consistency center run.rD   rE   rW   Nc                    |j                         | _        |t        j                  | j                        }|| _        |j                  | j                  d      | _        t        |        t        j                         }	 | j                  j                  | j                  d|       | j                  d|z         y # t        $ r}t        d|      d }~ww xY w)NTr   r   zDsExecuteKCC failedz#Consistency check on %s successful.)r   r   r   r   r   r   r   r   r   DsExecuteKCC1DsExecuteKCCr   r!   r   r   )ru   r   rF   rH   rG   r   r$   s          r%   r   zcmd_drs_kcc.run  s     ((*:&&tww/B--dgg-M
$$&	9LL%%d&9&91dC 	:R?@  	94a88	9s    'B< <	CCCNNNNr   r   r   r   r   r   r   r   r   r   r   r   r/   r4   r%   r   r   y  sD    3'H ))--.. J%)'+Ar4   r   c                   $   e Zd ZdZdZej                  ej                  ej                  dZ	g dZ
 eddd       ed	d
d       eddd       eddd       eddd       eddd       eddd       eddd      gZ	 	 	 ddZ	 	 	 ddZy)cmd_drs_replicatez+Replicate a naming context between two DCs.z/%prog <destinationDC> <sourceDC> <NC> [options]rE   )DEST_DC	SOURCE_DCNCz	--add-refz&use ADD_REF to add to repsTo on sourcerU   rV   z--sync-forcedz,use SYNC_FORCED to force inbound replicationz
--sync-allz&use SYNC_ALL to replicate from all DCsz--full-synczresync all objectsz--localzIpull changes directly into the local database (destination DC is ignored)z--local-onlinez_pull changes into the local database (destination DC is ignored) as a normal online replicationz
--async-opz use ASYNC_OP for the replicationz--single-objectz\Replicate only the object specified, instead of the whole Naming Context (only with --local)c           	         || _         t        |        t        t               d| j                  | j
                  d      | _        t        d| j                   z  t               | j                  | j
                        | _        | j                  j                  dt        j                  dg      }|d   d   d   | _        | j                  j                  | j                  t        j                  d	g      }t        j                  | j                  j                  d	|d   d	   d               | _        t        j                  | j                  j!                               }t        j                  | j                  j!                               }| j                  }	t"        j$                  }
|rt"        j&                  }
d
}| j                  j)                          t+        j,                  d| j                   z  | j
                  | j                  | j                  |      }| j                  j/                         }	 |j1                  |||	|||
|      \  }}| j                  j7                          |r-| j9                  d|||| j                  j:                  fz         y| j9                  d|||| j                  j:                  fz         y# t2        $ r}t5        d|z  |      d}~ww xY w)z+replicate from a source DC to the local SAMNr   )r*   r)   r+   r   flagsr'   r(   r~   dsServiceNamera   r   Tzncacn_ip_tcp:%s[seal])rodc	full_syncexopsync_forcedzError replicating DN %szMFull Replication of all %d objects and %d links from %s to %s was successful.zPIncremental replication of %d objects and %d links from %s to %s was successful.)r   r   r   r   r   r   local_samdbr,   ro   rp   rq   r=   r   GUIDr   	ntds_guidget_invocation_idr   DRSUAPI_EXOP_NONEDRSUAPI_EXOP_REPL_OBJtransaction_startr   drs_Replicateam_rodc	replicater!   r   transaction_commitr   r)   )ru   r   r   r  single_objectr  ressource_dsa_invocation_iddest_dsa_invocation_iddestination_dsa_guidr  replr  num_objects	num_linksr$   s                   r%   drs_local_replicatez%cmd_drs_replicate.drs_local_replicate  s   
   !n.>D-1ZZDGG'(* {T[[8(6(8'+zzdgg?

 %%2S^^-<,= & ?1vo.q1%%4<<s~~-9N & <JJ**<+.q6,+?+BDE $(99TZZ-I-I-K#L !%4+;+;+M+M+O!P#~~((00DI

$$&&&'>'L'+ww'+zz43C3C'=? '')		B'+~~b6N6J;?@I;?BM (6 (O$[) 	

%%'LL 9%y)**..00 1
 LL 9%y)**..00 1  	B82=qAA	Bs   5K 	K#KK#Nc           	         || _         |j                         | _        |j                  | j                  d      | _        |r| j                  |||||       y |	r6t        j                  d| j                        }t        j                         }n#t        |        | j                  }| j                  }|
sd|_        t        |        | j                  j                  | j                  j                         dt!        j"                  |      dt!        j"                  |      d	g 
      }t%        |      dk(  rt'        d|z        |d   d   }| j                  j                  |t         j(                  dddg      }t%        |      dk(  rt'        d|z        |d   d   d   }t+        t-        |dd            }d}|t.        j0                  z  s|t        j2                  z  }|r|t        j4                  z  }|r|t        j6                  z  }|r|t        j8                  z  }|r|t        j:                  z  }|
r|t        j<                  z  }	 t?        j@                  |||||       |
r| jE                  d|d|d       y | jE                  d|d|d       y # t>        jB                  $ r}t'        d|      d }~ww xY w)NTr   )r  r  r  zirpc:dreplsrv)lp_ctxi,  z!(&(objectCategory=server)(|(name=z)(dNSHostName=z))))rb   r   rd   r   zFailed to find source DC %sdnz5(|(objectCategory=nTDSDSA)(objectCategory=nTDSDSARO))r   r   )rb   rc   r   rd   z Failed to find source NTDS DN %szDsReplicaSync failedzReplicate from z to z was started.z was successful.)#r   r   r   r   r   r  r   r   policy_handler   r   request_timeoutr-   r,   ro   get_config_basednrp   binary_encodelenr   SCOPE_ONELEVELr   r
   r   $DS_NTDSDSA_OPT_DISABLE_OUTBOUND_REPLDRSUAPI_DRS_WRIT_REPDRSUAPI_DRS_ADD_REFDRSUAPI_DRS_SYNC_FORCEDDRSUAPI_DRS_SYNC_ALLDRSUAPI_DRS_FULL_SYNC_NOWDRSUAPI_DRS_ASYNC_OPr   sendDsReplicaSyncdrsExceptionr   )ru   r   r   r   add_refr  sync_allr  locallocal_onlineasync_opr  rF   rH   rG   server_bindserver_bind_handlemsg	server_dnsource_dsa_guiddsa_optionsreq_optionsestrs                          r%   r   zcmd_drs_replicate.run  s   
 ((*--dgg-M
$$Yi3@1< % > !///$''JK!%!3!3!5D!,,K!%!4!4*0K'd jjTZZ%A%A%Ci(i(,* ')	   *
 s8q=<yHIIF4L	jjYc6H6H+b'3Y&?   A s8q=AIMNNa&.q1,sIq9:dGGG7777K7666K7:::K7777K7<<<K7777K	=''5GZ\^ij LL9gVWLLiQXYZ %% 	=5t<<	=s   J J=,J88J=)FFF)FFFFFFFFNNN)r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r/   r4   r%   r   r     s    5@H ))--.. 0J 	{!IR^_%S\hi|"JS_`}#7Myjs  	A  'H  Q]  	^|"D\Z   (F  O[  	\	M <A*/(-D1N INKP7;E[r4   r   c                   n    e Zd ZdZdZej                  ej                  ej                  dZ	dgZ
	 	 ddZy)cmd_drs_bindz"Show DRS capabilities of a server.rD   rE   rW   Nc           
         |j                         | _        |t        j                  | j                        }|| _        |j                  | j                  d      | _        t        |        t        j                         }d|_
        t        j                         |_        | j                  j                  t        j                  t        j                         |      \  }}g d}g d}	| j#                  d|z         | j#                  d       |D ]P  \  }
}t%        t        |
d      }|j                  j&                  |z  rd	}nd
}| j#                  d|
dd|d|d       R t)        |j                  t        j*                        rf| j#                  d       |	D ]P  \  }
}t%        t        |
d      }|j                  j,                  |z  rd	}nd
}| j#                  d|
dd|d|d       R | j#                  d|j                  j.                  z         | j#                  d|j                  j0                  z         t)        |j                  t        j*                        r)| j#                  d|j                  j2                  z         y y )NTr      )") DRSUAPI_SUPPORTED_EXTENSION_BASEDRS_EXT_BASE)-DRSUAPI_SUPPORTED_EXTENSION_ASYNC_REPLICATIONDRS_EXT_ASYNCREPL)%DRSUAPI_SUPPORTED_EXTENSION_REMOVEAPIDRS_EXT_REMOVEAPI)&DRSUAPI_SUPPORTED_EXTENSION_MOVEREQ_V2DRS_EXT_MOVEREQ_V2)+DRSUAPI_SUPPORTED_EXTENSION_GETCHG_COMPRESSDRS_EXT_GETCHG_DEFLATE)%DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V1DRS_EXT_DCINFO_V1)4DRSUAPI_SUPPORTED_EXTENSION_RESTORE_USN_OPTIMIZATION DRS_EXT_RESTORE_USN_OPTIMIZATION)$DRSUAPI_SUPPORTED_EXTENSION_ADDENTRYDRS_EXT_ADDENTRY)'DRSUAPI_SUPPORTED_EXTENSION_KCC_EXECUTEDRS_EXT_KCC_EXECUTE)'DRSUAPI_SUPPORTED_EXTENSION_ADDENTRY_V2DRS_EXT_ADDENTRY_V2)4DRSUAPI_SUPPORTED_EXTENSION_LINKED_VALUE_REPLICATION DRS_EXT_LINKED_VALUE_REPLICATION)%DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V2DRS_EXT_DCINFO_V2)8DRSUAPI_SUPPORTED_EXTENSION_INSTANCE_TYPE_NOT_REQ_ON_MOD$DRS_EXT_INSTANCE_TYPE_NOT_REQ_ON_MOD)'DRSUAPI_SUPPORTED_EXTENSION_CRYPTO_BINDDRS_EXT_CRYPTO_BIND))DRSUAPI_SUPPORTED_EXTENSION_GET_REPL_INFODRS_EXT_GET_REPL_INFO)-DRSUAPI_SUPPORTED_EXTENSION_STRONG_ENCRYPTIONDRS_EXT_STRONG_ENCRYPTION)&DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V01DRS_EXT_DCINFO_VFFFFFFFF)1DRSUAPI_SUPPORTED_EXTENSION_TRANSITIVE_MEMBERSHIPDRS_EXT_TRANSITIVE_MEMBERSHIP)+DRSUAPI_SUPPORTED_EXTENSION_ADD_SID_HISTORYDRS_EXT_ADD_SID_HISTORY)&DRSUAPI_SUPPORTED_EXTENSION_POST_BETA3DRS_EXT_POST_BETA3)(DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V5DRS_EXT_GETCHGREQ_V5),DRSUAPI_SUPPORTED_EXTENSION_GET_MEMBERSHIPS2DRS_EXT_GETMEMBERSHIPS2)(DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V6DRS_EXT_GETCHGREQ_V6))DRSUAPI_SUPPORTED_EXTENSION_NONDOMAIN_NCSDRS_EXT_NONDOMAIN_NCS)(DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V8DRS_EXT_GETCHGREQ_V8)*DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V5DRS_EXT_GETCHGREPLY_V5)*DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V6DRS_EXT_GETCHGREPLY_V6),DRSUAPI_SUPPORTED_EXTENSION_ADDENTRYREPLY_V3DRS_EXT_WHISTLER_BETA3)*DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V7ru  ))DRSUAPI_SUPPORTED_EXTENSION_VERIFY_OBJECTru  )+DRSUAPI_SUPPORTED_EXTENSION_XPRESS_COMPRESSDRS_EXT_W2K3_DEFLATE))DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V10DRS_EXT_GETCHGREQ_V10)*DRSUAPI_SUPPORTED_EXTENSION_RESERVED_PART2*DRS_EXT_RESERVED_FOR_WIN2K_OR_DOTNET_PART2)*DRSUAPI_SUPPORTED_EXTENSION_RESERVED_PART3*DRS_EXT_RESERVED_FOR_WIN2K_OR_DOTNET_PART3)) DRSUAPI_SUPPORTED_EXTENSION_ADAMDRS_EXT_ADAM)$DRSUAPI_SUPPORTED_EXTENSION_LH_BETA2DRS_EXT_LH_BETA2)'DRSUAPI_SUPPORTED_EXTENSION_RECYCLE_BINDRS_EXT_RECYCLE_BINzBind to %s succeeded.zExtensions supported:r   YeszNo   60: z ()z
Extended Extensions supported:z
Site GUID: %szRepl epoch: %uzForest GUID: %s)r   r   r   r   r   r   r   r   r   DsBindInfoCtrlengthDsBindInfo28r   DsBindr   r  DRSUAPI_DS_BIND_GUIDr   r   supported_extensions
isinstanceDsBindInfo48supported_extensions_ext	site_guid
repl_epochconfig_dn_guid)ru   r   rF   rH   rG   	bind_infor   handleoptmap
optmap_extoptrg   optvalyesnos                 r%   r   zcmd_drs_bind.runM  s    ((*:&&tww/B--dgg-M
))+		 --/	,,TYYw7S7S-TV_`v#
JP

 	,r12,-  	AJS#Wc1-Fyy--6LLsE3?@	A dii!5!56LL;<( E
c #q19955>!E!E3sCDE 	&)<)<<=%		(<(<<=dii!5!56LL*TYY-E-EEF 7r4   r   r   r/   r4   r%   r;  r;  @  sE    ,'H ))--.. J%)'+QGr4   r;  c                       e Zd ZdZdZej                  ej                  ej                  dZ	dgZ
 edddd	      gZd
ddddZ	 	 ddZy)cmd_drs_optionszJQuery or change 'options' for NTDS Settings object of a Domain Controller.rD   rE   rW   z--dsa-optionzDSA option to enable/disablerg   za{+|-}IS_GC | {+|-}DISABLE_INBOUND_REPL | {+|-}DISABLE_OUTBOUND_REPL | {+|-}DISABLE_NTDSCONN_XLATE)rM   typemetavarr   r7   r8      )IS_GCDISABLE_INBOUND_REPLDISABLE_OUTBOUND_REPLDISABLE_NTDSCONN_XLATENc                    |j                         | _        |t        j                  | j                        }|| _        |j                  | j                  d      | _        t        |        | j                  j                         }| j                  j                  |t        j                  dg      }t        |d   d   d         }| j                  D 	cg c]  }	| j                  |	   |z  s|	 }
}	| j                  ddj!                  |
      z          |rG|d d d	vrt#        d
|z        |dd  }|| j                  j%                         vrt#        d
|z        |d d dk(  r|| j                  |   z  }n|| j                  |    z  }t        j&                         }t        j(                  | j                  |      |_        t        j,                  t/        |      t        j0                  d      |d<   | j                  j3                  |       | j                  D 	cg c]  }	| j                  |	   |z  s|	 }
}	| j                  ddj!                  |
      z          y y c c}	w c c}	w )NTr   r   ra   r   zCurrent DSA options: z, r   )+-zUnknown option %sr  zNew DSA options: )r   r   r   r   r   r   r   r-   r,   r   ro   rp   rq   r   
option_mapr   joinr   keysMessageDnr  MessageElementrg   FLAG_MOD_REPLACEmodify)ru   r   
dsa_optionrF   rH   rG   r=   r  dsa_optsxcur_optsflagms                r%   r   zcmd_drs_options.run  s    ((*:&&tww/B--dgg-M
d**..0jjWCNN9+Vs1vi(+,  $P!$//!2Dx2OAPP,tyy/BBC "1~Z/"#6#CDDab>D4??//11"#6#CDD"1~$DOOD11T__T222A66$**g.AD--c(mS=Q=QS\]AiLJJa #'??Tadooa6H86STHTLL,tyy/BBC# 	 Q( Us   I ,I I%5I%)NNNNN)r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r/   r4   r%   r  r    sw    T'H ))--.. J 	~$Bz	|M
 &*4+5,68J
 '+7;%Dr4   r  c                   
   e Zd ZdZdZej                  ej                  ej                  dZ	 e
dde       e
dde       e
d	d
dd       e
ddd       e
dddddgd e       z         e
dddd      gZdgZ	 	 	 	 ddZy) cmd_drs_clone_dc_databasez9Replicate an initial clone of domain, but DO NOT JOIN it.z%prog <dnsdomain> [options]rE   z--serverz
DC to join)rM   r  z--targetdirz#where to store provision (required)z-qz--quietzBe quietrU   rV   z--include-secretszAlso replicate secret valuesz--backend-storechoiceBACKENDSTOREtdbmdbz7Specify the database backend to be used (default is %s))r  r  choicesrM   z--backend-store-sizebytesSIZEzeSpecify the size of the backend database, currentlyonly supported by lmdb backends (default is 8 Gb).)r  r  rM   domainNc                     |j                         }|j                  |      }| j                  ||      }|t        d      t	        |||||d||	|
|
       y )N)r   quietz$--targetdir option must be specifiedSAMBA_INTERNAL)
loggerr   r   r   r  dns_backend	targetdirinclude_secretsbackend_storebackend_store_size)r   r   
get_loggerr   r   )ru   r  rF   rH   rG   r   r  r  r   r  r  r  r   r   r  s                  r%   r   zcmd_drs_clone_dc_database.run  sg     ##%((,>EFF&u .>&!.&8		:r4   )
NNNNNFFFNN)r   r   r   r   r   r   r   r   r   r   r   rg   r   r   r   r   r/   r4   r%   r  r    s    C,H ))--.. 	z37}#HsStYZE")GP\] xu~&(A(CD	E 	%GVI	JM J37598=37:r4   r  c            
           e Zd ZdZdZej                  ej                  ej                  dZ	 e
ddddd	       e
d
dd       e
ddd       e
ddd       e
ddd       e
ddd      gZd Zd Z	 	 	 	 ddZy)cmd_drs_uptodatenesszShow uptodateness statusz%prog [options]rE   z-Hz--URLURLHz%LDB URL for database or target server)r  rN   rM   z-pz--partitionzrestrict to this partition)rM   rI   rU   zPrint data in json format)rO   rM   z	--maximumz#Print maximum out-of-date-ness onlyz--medianz"Print median out-of-date-ness onlyz--fullz Print full out-of-date-ness datac                 0    t        j                  |d      S )Nr7   r   )rL   dumps)ru   partitions_summariess     r%   format_as_jsonz#cmd_drs_uptodateness.format_as_json(  s    zz.q99r4   c                    g }|j                         D ]T  \  }}|j                         D cg c]  \  }}|d| }}}|dddj                  |      }|j                  |       V dj                  |      S c c}}w )Nr  15r}   r  
)itemsr  r   )	ru   r  lines	part_namerQ   kvr  lines	            r%   format_as_textz#cmd_drs_uptodateness.format_as_text+  s|    "6"<"<"> 	Iw3:==?C41aA&CEC!*DIIe,<=DLL	 yy Ds   A;Nc                 f   |j                         }|j                  |d      }t        |||      \  }}|j                  }t	        |      \  }}|r||v r
||   }||i}nt        d|z        g }|r|j                  d       |r|j                  d       i }i }|j                         D ]7  \  }}t        |||||      }t        ||      }t        ||      }|||<   |||<   9 |r| j                  |      }n%|r| j                  |      }n| j                  |      }t        || j                         y )NTr   zunknown partition %smaximummedian)filters)file)r   r   r   r,   r   r   r   r  r   r   r   r  r  printr   )ru   r  r   rL   r  r  fullrF   rH   rG   r  r   r   r   	local_kccdsasr,   short_partitionsrz   part_dnr  partitions_distancesr  r  
utdv_edges	distancesrQ   outputs                               r%   r   zcmd_drs_uptodateness.run3  sY   
 ##%((d(C*1b%8	407!,,*95$-w#7 "#9I#EFFNN9%NN8$!!"2"8"8": 	6Iw'	4"eLJ*:t<I&y'BG.7 +.5 +	6 (()=>F,,-AB,,-ABf499%r4   )NNFFFFNNNFF)r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r/   r4   r%   r  r    s    " H ))--.. 	tWe#;	=t]0	2x/	1{<9	;z,8	:x6	8M:  %):?7;!&*&r4   r  c                       e Zd ZdZi Z e       ed<    e       ed<    e       ed<    e       ed<    e	       ed<    e
       ed<    e       ed<   y	)
cmd_drsz0Directory Replication Services (DRS) management.bindkccr  showreplr   zclone-dc-databaseuptodatenessN)r   r   r   r   subcommandsr;  r   r   rC   r  r  r  r/   r4   r%   r  r  `  sd    :K&.K$K02K.0K
,.K	'@'BK#$"6"8Kr4   r  )3samba.getoptgetoptr   rp   loggingr~   r   rL   
samba.authr   samba.netcmdr   r   r   r	   samba.netcmd.commonr
   samba.samdbr   sambar   r   r   samba.dcerpcr   r   
samba.joinr   r   samba.uptodatenessr   r   r   r   r   samba.commonr   r   r   r-   r3   r@   r   rC   r   r   r;  r  r  r  r  r/   r4   r%   <module>r      s   ,  
    %  -  0 0 & !   $ 1JK7 $ [Jw [J|A' ABc[ c[L^G7 ^GB<Dg <D~+: +:\O&7 O&d
9l 
9r4   