a
    WaM                     @   s  d dl mZ 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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d Z&dd Z'dd Z(dd Z)dd Z*dZ+G dd deZ,G dd deZ-G dd deZ.G d d! d!eZ/G d"d# d#eZ0G d$d% d%eZ1G d&d' d'eZ2G d(d) d)eZ3dS )*    )print_functionN   )common)system_session)CommandCommandErrorOptionSuperCommand)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              
   C   s^   z$t | j| j| j\| _| _| _W n4 tyX } zt	d| j |W Y d}~n
d}~0 0 dS )z'make a DRSUAPI connection to the serverzDRS connection to %s failedN)
r   drsuapi_connectserverlpcredsr   drsuapi_handleZbind_supported_extensions	Exceptionr   ctxe r"   2/usr/lib/python3/dist-packages/samba/netcmd/drs.pyr   4   s    $r   c              
   C   s\   z"t d| j t | j| jd| _W n4 tyV } ztd| j |W Y d}~n
d}~0 0 dS )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   r"   r"   r#   samdb_connect<   s    
r*   c                 C   s    | \}}|dkrdS d||f S )z*return "was successful" or an error stringr   zwas successfulzfailed, result %u (%s)r"   )ZwerrZecodeZestringr"   r"   r#   
drs_errmsgF   s    r+   c                 C   s   || v r| | d S |S )z/get an attribute from a ldap msg with a defaultr   r"   )msgattrnamedefaultr"   r"   r#   attr_defaultN   s    r/   c                 C   sf   |  d}|d dks.|d dks.|d dkr:td|  |d	  d
d	 }|d  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   siter"   r"   r#   drs_parse_ntds_dnU   s    
$r:   classicc                   @   s  e Zd ZdZdZejejejdZ	e
dddddd	e
d
ddddd	e
dddddd	e
dddddde
dddddede
ddddde
dddd gZd!gZd"d# Zd$d% Zd&d' Zd(d(d(d(ed)dfd*d+Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd(S ):cmd_drs_showreplzShow replication status.%prog [<DC>] [options]	sambaoptsversionoptscredopts--jsonz"replication details in JSON formatformatZ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 relevent servers?pull_summaryz--notify-summarynotify_summaryzsHave we successfully notified all relevent servers of local changes, and did they say they successfully replicated?)rG   rH   rF   rE   z	--classiczprint local replication detailsr;   )rE   rF   rG   rH   r.   z-vz	--verbosez
Be verbose
store_truerE   rG   z--colorzUse colour output (yes|no|auto)Zno)rE   r.   DC?c           	   
   C   s   t |j}|j|t|jt|j|jt|jt |j	dd}z| j
jd| tjg d W nF tjy } z,|j\}}|tjkrd|d< n W Y d}~n
d}~0 0 z"t|j	\}}d||f |d	< W n ty   Y n0 |S )
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attrsTrV   N%s\%sDSA)strZsource_dsa_obj_guidZnaming_context_dnr   Zlast_attemptr+   Zresult_last_attemptZconsecutive_sync_failuresZlast_successZsource_dsa_obj_dnr)   searchldb
SCOPE_BASELdbErrorargsERR_NO_SUCH_OBJECTr:   r6   )	selfnZdsa_objectguiddr!   errno_r9   r   r"   r"   r#   parse_neighbour   s4    




z cmd_drs_showrepl.parse_neighbourc                 C   s   |  d|d   d|v r.|  d|d   n|  d|d   |  d|d   |  d	|d
 |d f  |  d|d   |  d|d   |  d dS )z&print one set of neighbour informationz%srO   r\   z	%s via RPCz	NTDS DN: %srU   z		DSA object GUID: %srP   z		Last attempt @ %s %srQ   rR   z		%u consecutive failure(s).rS   z		Last success @ %srT    N)message)rd   rf   r"   r"   r#   print_neighbour   s    z cmd_drs_showrepl.print_neighbourc              
      st   t  }||_z j  jd|\}}W n2 tyZ } ztd| |W Y d }~n
d }~0 0  fdd|jD }|S )Nr   z"DsReplicaGetInfo of type %u failedc                    s   g | ]}  |qS r"   )ri   ).0re   rd   r"   r#   
<listcomp>       z3cmd_drs_showrepl.get_neighbours.<locals>.<listcomp>)r   ZDsReplicaGetInfoRequest1	info_typeZDsReplicaGetInfor   r   r   Zarray)rd   rq   req1infor!   Zrepsr"   rn   r#   get_neighbours   s    $zcmd_drs_showrepl.get_neighboursNFc           	      C   s   |  | | | _|d u r(t| j}|| _|j| jdd| _|| _| j	| j
| j| j| jd|}|d u rztd| | S )NTZfallback_machine)rI   rK   rJ   rD   r;   zunknown showrepl format %s)Zapply_colour_choiceget_loadparmr   r   netcmd_dnsnamer   get_credentialsr   verbosesummary_outputnotify_summary_outputpull_summary_outputjson_outputclassic_outputgetr   )	rd   DCr?   rA   r@   rC   ry   ZcolorZoutput_functionr"   r"   r#   run   s$    

zcmd_drs_showrepl.runc                 C   s*   |   }|d= |d= tj|| jdd d S )Nr9   r   r1   indent)get_local_repl_datarD   dumpoutf)rd   datar"   r"   r#   r}      s    zcmd_drs_showrepl.json_outputc                 C   s  g }g }|   }|dkrR|d D ]0}|d r.q |d dksF|d dkr || q |dkr|d D ]0}|d rpqb|d dks|d dkrb|| qb|s|r| td	 |r| td
 |D ]}| | q|r| td |D ]}| | qdS | td dS )zcPrint a short message if every seems fine, but print details of any
        links that seem broken.rJ   repsTorV   rS   r   rT   rK   repsFromzThere are failing connectionszFailing outbound connections:zFailing inbound connection:r   z
[ALL GOOD]N)r   appendrk   r   Zc_REDrl   Zc_GREEN)rd   Ztypeof_outputZfailing_repstoZfailing_repsfromZ
local_dataZrepr"   r"   r#   summary_output_handler   s6    
z'cmd_drs_showrepl.summary_output_handlerc                 C   s
   |  dS )NrI   r   rn   r"   r"   r#   rz     s    zcmd_drs_showrepl.summary_outputc                 C   s
   |  dS )NrK   r   rn   r"   r"   r#   r{     s    z&cmd_drs_showrepl.notify_summary_outputc                 C   s
   |  dS )NrJ   r   rn   r"   r"   r#   r|     s    z$cmd_drs_showrepl.pull_summary_outputc                 C   sN  t |  t|  | j }t|\}}z| jj|tjg dd}W n0 tyr } zt	d| W Y d }~n
d }~0 0 t
t|d ddt| jd|d d d t| jd|d d d d}| jj|dd	}| tj}| tj}	g }
|D ]D}t|d
 d d\}}}t|d t|d
 d t
t|ddtt|dd dkd}|
| z2| jj|tjdgd}t|d d d |d< W n\ tjy } z*|j\}}|tjkrd|d< W Y d }~n d }~0  ttfy   Y n0 g |d< |dg D ]2}t|d}|d |d t
|d f qq|||	|
||dS )N)options
objectGUIDinvocationIdrW   zFailed to search NTDS DN %sr   r   r   r   z(objectClass=nTDSConnection))rX   
expressionZ
fromServerr0   nameZenabledConnectionZTRUE)r   	remote DNr   enabledZdnsHostNamedns nameTrV   replicates NCzmS-DS-ReplicatesNCReason:r4   r1   )dsar   r   NTDSConnectionsr9   r   )r   r*   r)   get_dsServiceNamer:   r^   r_   r`   r   r   intr/   r   schema_format_valuert   r   Z!DRSUAPI_DS_REPLICA_INFO_NEIGHBORSZDRSUAPI_DS_REPLICA_INFO_REPSTOr]   	partitionupperr   ra   rb   rc   KeyError
IndexErrorr   r5   )rd   r7   r9   r   Zntdsr!   dsa_detailsZconnrepsfromrepstoconn_detailscZc_rdnsepZc_server_dnrf   Zc_server_resrg   rh   rr8   r"   r"   r#   r     sn    
"



$z$cmd_drs_showrepl.get_local_repl_datac                 C   s  |   }|d }|d }|d }|d }|d }|d }| d||f  | d|d	   | d
|d   | d|d   | d |D ]}| | q| d |D ]}| | qg d}	| d |D ]}
| d |
dr| d | d|
d   | dt|
d    | d|
d  | d|
d   | d | d|
d	   |
d r|
d D ]R\}}| d |  | d!|  |	D ]&}tt|d"|@ r| d#|  qqvq| d$ qd S )%Nr   r   r   r   r9   r   r[   zDSA Options: 0x%08xr   zDSA object GUID: %sr   zDSA invocationId: %s
r   z==== INBOUND NEIGHBORS ====
z==== OUTBOUND NEIGHBORS ====
)
ZNTDSCONN_KCC_GC_TOPOLOGYZNTDSCONN_KCC_RING_TOPOLOGYZ#NTDSCONN_KCC_MINIMIZE_HOPS_TOPOLOGYZ#NTDSCONN_KCC_STALE_SERVERS_TOPOLOGYZ,NTDSCONN_KCC_OSCILLATING_CONNECTION_TOPOLOGYZ"NTDSCONN_KCC_INTERSITE_GC_TOPOLOGYZNTDSCONN_KCC_INTERSITE_TOPOLOGYZ%NTDSCONN_KCC_SERVER_FAILOVER_TOPOLOGYZ#NTDSCONN_KCC_SITE_FAILOVER_TOPOLOGYZ&NTDSCONN_KCC_REDUNDANT_SERVER_TOPOLOGYz!==== KCC CONNECTION OBJECTS ====
zConnection --rV   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   rk   rl   r   r]   r   getattrr   )rd   r   r   r   r   r   r9   r   re   Zreasonsrf   Zncreasonsr"   r"   r#   r~   J  sJ    








zcmd_drs_showrepl.classic_output)__name__
__module____qualname____doc__synopsisr   SambaOptionsVersionOptionsCredentialsOptionstakes_optiongroupsr   DEFAULT_SHOWREPL_FORMATtakes_options
takes_argsri   rl   rt   r   r}   r   rz   r{   r|   r   r~   r"   r"   r"   r#   r<   b   sX   
%?r<   c                   @   s6   e Zd ZdZdZejejejdZ	dgZ
dddZdS )	cmd_drs_kccz)Trigger knowledge consistency center run.r=   r>   rN   Nc              
   C   s   |  | _|d u rt| j}|| _|j| jdd| _t|  t	 }z| j
| jd| W n. ty } ztd|W Y d }~n
d }~0 0 | d|  d S )NTru   r   zDsExecuteKCC failedz#Consistency check on %s successful.)rv   r   r   rw   r   rx   r   r   r   ZDsExecuteKCC1ZDsExecuteKCCr   r   r   rk   )rd   r   r?   rA   r@   rr   r!   r"   r"   r#   r     s    
 zcmd_drs_kcc.run)NNNNr   r   r   r   r   r   r   r   r   r   r   r   r"   r"   r"   r#   r     s     r   c                   @   s   e Zd ZdZdZejejejdZ	g dZ
edddded	d
ddeddddeddddeddddeddddeddddeddddgZdddZdddZdS )cmd_drs_replicatez+Replicate a naming context between two DCs.z/%prog <destinationDC> <sourceDC> <NC> [options]r>   )DEST_DC	SOURCE_DCNCz	--add-refz&use ADD_REF to add to repsTo on sourcerL   rM   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)Fc              
   C   s  || _ t|  tt d| j| jdd| _td| j  t | j| jd| _| jjdt	j
dgd}|d d d | _| jj| jt	j
d	gd}t| jd	|d d	 d | _t| j }t| j }| j}	tj}
|rtj}
d
}| j  td| j  | j| j| j|}| j }z |j|||	|||
|d\}}W n4 tyh } ztd| |W Y d}~n
d}~0 0 | j  |r| d|||| jjf  n| d|||| jjf  dS )z+replicate from a source DC to the local SAMNr   )r'   r&   r(   r   flagsr$   r%   rj   ZdsServiceNamerW   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   Zlocal_samdbr)   r^   r_   r`   r7   r   GUIDr   Z	ntds_guidZget_invocation_idr   ZDRSUAPI_EXOP_NONEZDRSUAPI_EXOP_REPL_OBJZtransaction_startr   Zdrs_ReplicateZam_rodc	replicater   r   Ztransaction_commitrk   r&   )rd   r   r   r   single_objectr   resZsource_dsa_invocation_idZdest_dsa_invocation_idZdestination_dsa_guidr   replr   Znum_objectsZ	num_linksr!   r"   r"   r#   drs_local_replicate  sv    


$
z%cmd_drs_replicate.drs_local_replicateNc              
   C   s
  || _ | | _|j| jdd| _|r>| j|||||d d S |	r\tjd| jd}t }nt	|  | j}| j
}|
szd|_t|  | jj| j dt|t|f g d}t|d	krtd
| |d	 d }| jj|tjdddgd}t|d	krtd| |d	 d d	 }tt|dd	}d	}|tj@ s@|tjO }|rP|tjO }|r`|tjO }|rp|tjO }|r|tjO }|
r|tjO }zt ||||| W n2 tj!y } ztd|W Y d }~n
d }~0 0 |
r| "d||f  n| "d||f  d S )NTru   )r   r   r   zirpc:dreplsrv)Zlp_ctxi,  z6(&(objectCategory=server)(|(name=%s)(dNSHostName=%s))))rX   r   rZ   r   zFailed to find source DC %sdnz5(|(objectCategory=nTDSDSA)(objectCategory=nTDSDSARO))r   r   )rX   rY   r   rZ   z Failed to find source NTDS DN %szDsReplicaSync failedz$Replicate from %s to %s was started.z'Replicate from %s to %s was successful.)#r   rv   r   rx   r   r   r   r   Zpolicy_handler   r   Zrequest_timeoutr*   r)   r^   Zget_config_basednr_   Zbinary_encodelenr   ZSCOPE_ONELEVELr   r/   r   Z$DS_NTDSDSA_OPT_DISABLE_OUTBOUND_REPLZDRSUAPI_DRS_WRIT_REPZDRSUAPI_DRS_ADD_REFZDRSUAPI_DRS_SYNC_FORCEDZDRSUAPI_DRS_SYNC_ALLZDRSUAPI_DRS_FULL_SYNC_NOWZDRSUAPI_DRS_ASYNC_OPr   ZsendDsReplicaSyncZdrsExceptionrk   )rd   r   r   r   Zadd_refr   Zsync_allr   ZlocalZlocal_onlineZasync_opr   r?   rA   r@   Zserver_bindZserver_bind_handler,   Z	server_dnZsource_dsa_guidZdsa_optionsZreq_optionsZestrr"   r"   r#   r     sp    








 zcmd_drs_replicate.run)FFF)FFFFFFFFNNN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r"   r"   r"   r#   r     s0      
G   r   c                   @   s6   e Zd ZdZdZejejejdZ	dgZ
dddZdS )	cmd_drs_bindz"Show DRS capabilities of a server.r=   r>   rN   Nc                 C   s  |  | _|d u rt| j}|| _|j| jdd| _t|  t	 }d|_
t |_| jttj|\}}g d}g d}	| d|  | d |D ]>\}
}tt|
d}|jj|@ rd	}nd
}| d|
||f  qt|jtjr<| d |	D ]@\}
}tt|
d}|jj|@ r"d	}nd
}| d|
||f  q| d|jj  | d|jj  t|jtjr| d|jj  d S )NTru      )")Z DRSUAPI_SUPPORTED_EXTENSION_BASEZDRS_EXT_BASE)Z-DRSUAPI_SUPPORTED_EXTENSION_ASYNC_REPLICATIONZDRS_EXT_ASYNCREPL)Z%DRSUAPI_SUPPORTED_EXTENSION_REMOVEAPIZDRS_EXT_REMOVEAPI)Z&DRSUAPI_SUPPORTED_EXTENSION_MOVEREQ_V2ZDRS_EXT_MOVEREQ_V2)Z+DRSUAPI_SUPPORTED_EXTENSION_GETCHG_COMPRESSZDRS_EXT_GETCHG_DEFLATE)Z%DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V1ZDRS_EXT_DCINFO_V1)Z4DRSUAPI_SUPPORTED_EXTENSION_RESTORE_USN_OPTIMIZATIONZ DRS_EXT_RESTORE_USN_OPTIMIZATION)Z$DRSUAPI_SUPPORTED_EXTENSION_ADDENTRYZDRS_EXT_ADDENTRY)Z'DRSUAPI_SUPPORTED_EXTENSION_KCC_EXECUTEZDRS_EXT_KCC_EXECUTE)Z'DRSUAPI_SUPPORTED_EXTENSION_ADDENTRY_V2ZDRS_EXT_ADDENTRY_V2)Z4DRSUAPI_SUPPORTED_EXTENSION_LINKED_VALUE_REPLICATIONZ DRS_EXT_LINKED_VALUE_REPLICATION)Z%DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V2ZDRS_EXT_DCINFO_V2)Z8DRSUAPI_SUPPORTED_EXTENSION_INSTANCE_TYPE_NOT_REQ_ON_MODZ$DRS_EXT_INSTANCE_TYPE_NOT_REQ_ON_MOD)Z'DRSUAPI_SUPPORTED_EXTENSION_CRYPTO_BINDZDRS_EXT_CRYPTO_BIND)Z)DRSUAPI_SUPPORTED_EXTENSION_GET_REPL_INFOZDRS_EXT_GET_REPL_INFO)Z-DRSUAPI_SUPPORTED_EXTENSION_STRONG_ENCRYPTIONZDRS_EXT_STRONG_ENCRYPTION)Z&DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V01ZDRS_EXT_DCINFO_VFFFFFFFF)Z1DRSUAPI_SUPPORTED_EXTENSION_TRANSITIVE_MEMBERSHIPZDRS_EXT_TRANSITIVE_MEMBERSHIP)Z+DRSUAPI_SUPPORTED_EXTENSION_ADD_SID_HISTORYZDRS_EXT_ADD_SID_HISTORY)Z&DRSUAPI_SUPPORTED_EXTENSION_POST_BETA3ZDRS_EXT_POST_BETA3)Z(DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V5ZDRS_EXT_GETCHGREQ_V5)Z,DRSUAPI_SUPPORTED_EXTENSION_GET_MEMBERSHIPS2ZDRS_EXT_GETMEMBERSHIPS2)Z(DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V6ZDRS_EXT_GETCHGREQ_V6)Z)DRSUAPI_SUPPORTED_EXTENSION_NONDOMAIN_NCSZDRS_EXT_NONDOMAIN_NCS)Z(DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V8ZDRS_EXT_GETCHGREQ_V8)Z*DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V5ZDRS_EXT_GETCHGREPLY_V5)Z*DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V6ZDRS_EXT_GETCHGREPLY_V6)Z,DRSUAPI_SUPPORTED_EXTENSION_ADDENTRYREPLY_V3DRS_EXT_WHISTLER_BETA3)Z*DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V7r   )Z)DRSUAPI_SUPPORTED_EXTENSION_VERIFY_OBJECTr   )Z+DRSUAPI_SUPPORTED_EXTENSION_XPRESS_COMPRESSZDRS_EXT_W2K3_DEFLATE)Z)DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V10ZDRS_EXT_GETCHGREQ_V10)Z*DRSUAPI_SUPPORTED_EXTENSION_RESERVED_PART2Z*DRS_EXT_RESERVED_FOR_WIN2K_OR_DOTNET_PART2)Z*DRSUAPI_SUPPORTED_EXTENSION_RESERVED_PART3Z*DRS_EXT_RESERVED_FOR_WIN2K_OR_DOTNET_PART3))Z DRSUAPI_SUPPORTED_EXTENSION_ADAMZDRS_EXT_ADAM)Z$DRSUAPI_SUPPORTED_EXTENSION_LH_BETA2ZDRS_EXT_LH_BETA2)Z'DRSUAPI_SUPPORTED_EXTENSION_RECYCLE_BINZDRS_EXT_RECYCLE_BINzBind to %s succeeded.zExtensions supported:r   ZYeszNo z  %-60s: %s (%s)z
Extended Extensions supported:z
Site GUID: %szRepl epoch: %uzForest GUID: %s)rv   r   r   rw   r   rx   r   r   r   ZDsBindInfoCtrZlengthZDsBindInfo28rs   ZDsBindr   r   ZDRSUAPI_DS_BIND_GUIDrk   r   Zsupported_extensions
isinstanceZDsBindInfo48Zsupported_extensions_extZ	site_guidZ
repl_epochZconfig_dn_guid)rd   r   r?   rA   r@   Z	bind_infors   ZhandleZoptmapZ
optmap_extZoptr]   ZoptvalZyesnor"   r"   r#   r   W  s@    

%

zcmd_drs_bind.run)NNNNr   r"   r"   r"   r#   r   J  s     r   c                   @   sV   e Zd ZdZdZejejejdZ	dgZ
eddddd	gZd
ddddZdddZdS )cmd_drs_optionszJQuery or change 'options' for NTDS Settings object of a Domain Controller.r=   r>   rN   z--dsa-optionzDSA option to enable/disabler]   za{+|-}IS_GC | {+|-}DISABLE_INBOUND_REPL | {+|-}DISABLE_OUTBOUND_REPL | {+|-}DISABLE_NTDSCONN_XLATE)rE   typemetavarr   r1   r2      )ZIS_GCZDISABLE_INBOUND_REPLZDISABLE_OUTBOUND_REPLZDISABLE_NTDSCONN_XLATENc                    s  |  _|d u rtj}|_|jjdd_t j	 }jj
|tjdgd}t|d d d   fddjD }dd	|  |r||d d
 dvrtd| |d
d  }	|	j vrtd| |d d
 dkr j|	 O  n j|	  M  t }
tj||
_tt tjd|
d< j|
  fddjD }dd	|  d S )NTru   r   rW   r   c                    s   g | ]}j |  @ r|qS r"   
option_maprm   xZdsa_optsrd   r"   r#   ro     rp   z'cmd_drs_options.run.<locals>.<listcomp>zCurrent DSA options: z, r   )+-zUnknown option %sr   c                    s   g | ]}j |  @ r|qS r"   r   r   r   r"   r#   ro     rp   zNew DSA options: )rv   r   r   rw   r   rx   r   r*   r)   r   r^   r_   r`   r   r   rk   joinr   keysZMessageZDnr   ZMessageElementr]   ZFLAG_MOD_REPLACEZmodify)rd   r   Z
dsa_optionr?   rA   r@   r7   r   Zcur_optsflagmr"   r   r#   r     s4    

zcmd_drs_options.run)NNNNN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r"   r"   r"   r#   r     s&     r   c                   @   s   e Zd ZdZdZejejejdZ	e
ddede
ddede
d	d
ddde
dddde
dddddgde  de
dddddgZdgZd!dd ZdS )"cmd_drs_clone_dc_databasez9Replicate an initial clone of domain, but DO NOT JOIN it.z%prog <dnsdomain> [options]r>   z--serverz
DC to join)rE   r   z--targetdirz#where to store provision (required)z-qz--quietzBe quietrL   rM   z--include-secretszAlso replicate secret valuesz--backend-storeZchoiceZBACKENDSTOREZtdbZmdbz7Specify the database backend to be used (default is %s))r   r   choicesrE   z--backend-store-sizebytesZSIZEzeSpecify the size of the backend database, currentlyonly supported by lmdb backends (default is 8 Gb).)r   r   rE   domainNFc                 C   sP   |  }||}| j||d}|d u r0tdt|||||d||	|
|d
 d S )N)ry   quietz$--targetdir option must be specifiedZSAMBA_INTERNAL)
loggerr   r   r   r   Zdns_backend	targetdirinclude_secretsbackend_storebackend_store_size)rv   rx   Z
get_loggerr   r   )rd   r   r?   rA   r@   r   r   r   ry   r   r   r   r   r   r   r"   r"   r#   r     s    

zcmd_drs_clone_dc_database.run)
NNNNNFFFNN)r   r   r   r   r   r   r   r   r   r   r   r]   r   r   r   r   r"   r"   r"   r#   r     s4       r   c                   @   s   e Zd ZdZdZejejejdZ	e
dddddd	e
d
ddde
dddde
dddde
dddde
ddddgZdd Zdd Zd ddZdS )!cmd_drs_uptodatenesszShow uptodateness statusz%prog [options]r>   z-Hz--URLZURLHz%LDB URL for database or target server)r   rF   rE   z-pz--partitionzrestrict to this partition)rE   rB   rL   zPrint data in json format)rG   rE   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                 C   s   t j|ddS )Nr1   r   )rD   dumps)rd   partitions_summariesr"   r"   r#   format_as_json2  s    z#cmd_drs_uptodateness.format_as_jsonc                 C   sN   g }|  D ]6\}}dd |  D }d|d|f }|| qd|S )Nc                 S   s   g | ]\}}d ||f qS )z%s: %sr"   )rm   kvr"   r"   r#   ro   8  rp   z7cmd_drs_uptodateness.format_as_text.<locals>.<listcomp>z%-15s %sz  
)itemsr   r   )rd   r   lines	part_namerI   r   liner"   r"   r#   format_as_text5  s    z#cmd_drs_uptodateness.format_as_textNFc                 C   s  |  }|j|dd}t|||\}}|j}t|\}}|rb||v rV|| }||i}ntd| g }|rt|d |r|d i }i }| D ]>\}}t|||||}t	||}t
||d}|||< |||< q|r| |}n|r| |}n
| |}t|| jd d S )NTru   zunknown partition %smaximummedian)filters)file)rv   rx   r   r)   r   r   r   r   r   r   r   r   r   printr   )rd   r   r   rD   r   r   Zfullr?   rA   r@   r   ry   r   r   Z	local_kccZdsasr)   Zshort_partitionsrh   Zpart_dnr   Zpartitions_distancesr   r   Z
utdv_edgesZ	distancesrI   outputr"   r"   r#   r   =  s:    





zcmd_drs_uptodateness.run)NNFFFFNNNFF)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r"   r"   r"   r#   r     s@   
    r   c                   @   sZ   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< d	S )
cmd_drsz0Directory Replication Services (DRS) management.ZbindZkccr   Zshowreplr   zclone-dc-databaseZuptodatenessN)r   r   r   r   Zsubcommandsr   r   r   r<   r   r   r   r"   r"   r"   r#   r   j  s   





r   )4Z
__future__r   Zsamba.getoptZgetoptr   r_   Zloggingrj   r   rD   Z
samba.authr   Zsamba.netcmdr   r   r   r	   Zsamba.samdbr
   Zsambar   r   r   Zsamba.dcerpcr   r   Z
samba.joinr   r   Zsamba.uptodatenessr   r   r   r   r   Zsamba.compatr   r   r   r*   r+   r/   r:   r   r<   r   r   r   r   r   r   r   r"   r"   r"   r#   <module>   s@   

  #! 'a?.R