a
    “I_¬Q  ã                   @   sÌ   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 d dl	m
Z
 d dlZ d dlmZmZmZmZ d dlmZ dd„ Zd	d
„ Zd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dS )é    N)ÚLdbError)ÚdrsuapiÚmisc)Úsystem_session)ÚCommandÚCommandErrorÚSuperCommandÚOption)ÚSamDBc              
   C   s”   z| j |tjdgd}W nF ty^ } z.|j\}}|tjkrHtd| ƒ‚‚ W Y d}~n
d}~0 0 d|d v rŒt | |d d d  d¡¡}nd}|S )znGets the owner of an FSMO role

    :param roledn: The DN of the FSMO role
    :param role: The FSMO role
    ÚfSMORoleOwner©ÚscopeÚattrsz+The '%s' role is not present in this domainNr   Úutf8)	ÚsearchÚldbÚ
SCOPE_BASEr   ÚargsZERR_NO_SUCH_OBJECTr   ÚDnÚdecode)ÚsamdbZrolednÚroleÚresZe7ÚnumÚmsgÚmaster_owner© r   ú3/usr/lib/python3/dist-packages/samba/netcmd/fsmo.pyÚget_fsmo_roleowner$   s    ÿ


 r   c              
   C   s(  |dkr|  ¡ }d| }n|dkr8t | ¡ ¡}d| }| ¡ }|j|dgtjdgd}	d|	d v r
zTtt	 
t ||	d d d  d	¡¡ d
¡¡ƒ}
tt ||	d d d  d	¡¡ƒ}W nL ty } z2|j\}}td|	d d d |f ƒ‚W Y d}~n
d}~0 0 n|  d| ¡ dS |dkrLd|
| ¡ f }d| ¡ | ¡ f }n.|dkrzd|
| ¡ f }d| ¡ | ¡ f }| ¡ }||kr| ¡ }|j|dd}td| tƒ ||d}t ¡ }t ||¡|_t |tjd¡|d< t |tjd¡|d< z| |¡ W n@ tyD } z&|j\}}td||f ƒ‚W Y d}~n
d}~0 0 ztj  |||¡}W n4 tjj!yŽ } ztd|ƒ‚W Y d}~n
d}~0 0 z:|d }|d }t"j#}|dd… }tj $|||
||¡ W n4 tjj!yþ } ztd|ƒ‚W Y d}~n
d}~0 0 |  d| ¡ dS |  d| ¡ dS dS )zTransfer dns FSMO role. Ú	domaindnsú$CN=Infrastructure,DC=DomainDnsZones,Ú	forestdnsú$CN=Infrastructure,DC=ForestDnsZones,r   zextended_dn:1:1)r   r   Zcontrolsr   r   ÚGUIDz+No GUID found in naming master DN %s : %s 
Nz0* The '%s' role does not have an FSMO roleowner
Fz%s._msdcs.%sT©Zfallback_machinez	ldap://%s©ZurlZsession_infoZcredentialsÚlpZfSMORoleOwner_DelZfSMORoleOwner_AddzFailed to add role '%s': %szDrsuapi Connect failedé   é   zReplication failedú&FSMO transfer of '%s' role successful
ú'This DC already has the '%s' FSMO role
)%Ú	domain_dnÚsambaÚdn_from_dns_nameÚforest_dns_nameZhost_dns_namer   r   r   Ústrr   r#   r   r   Zget_extended_componentr   r   r   ÚwriteZdomain_dns_nameZget_ntds_GUIDÚget_dsServiceNameÚget_loadparmÚget_credentialsr
   r   ÚMessageÚdnÚMessageElementZFLAG_MOD_DELETEZFLAG_MOD_ADDÚmodifyZ	drs_utilsZdrsuapi_connectZdrsExceptionr   ZDRSUAPI_DRS_WRIT_REPZsendDsReplicaSync)ÚoutfÚ	sambaoptsÚcredoptsr   r   r+   Zrole_objectÚ	forest_dnZnew_host_dns_namer   Zmaster_guidr   Ze3r   r   Zmaster_dns_nameZnew_dns_nameÚ	new_ownerr&   ÚcredsÚmZe5Z
connectionÚeZdrsuapi_connectionZdrsuapi_handleZreq_optionsZNCZestrr   r   r   Útransfer_dns_role;   s¬    
ýÿþ&
ÿ
ÿÿ
ÿÿ
þþþ
&ÿ ý r@   c              
   C   s  |  ¡ }d| }d| ¡  }d| }t| ¡ ƒ}t || ¡ ¡}t ¡ }	t |d¡|	_|dkr€t	|||ƒ}
t 
dtjd¡|	d< nê|dkrÞt	|||ƒ}
|j|tjd	gd
}t|ƒdks¸J ‚|d d	 d }t 
|tjd¡|	d< nŒ|dkr
t	|||ƒ}
t 
dtjd¡|	d< n`|dkr6t	|||ƒ}
t 
dtjd¡|	d< n4|dkrbt	|||ƒ}
t 
dtjd¡|	d< ntdƒ‚|
du r†|  d| ¡ dS |
|kròz| |	¡ W n@ tyÞ } z&|j\}}td||f ƒ‚W Y d}~n
d}~0 0 |  d| ¡ dS |  d| ¡ dS dS )zTransfer standard FSMO role. úCN=RID Manager$,CN=System,úCN=Partitions,%súCN=Infrastructure,Ú ÚridÚ1ZbecomeRidMasterÚpdcZ	objectSidr   r'   r   Z	becomePdcÚnamingZbecomeDomainMasterÚinfrastructureZbecomeInfrastructureMasterÚschemaZbecomeSchemaMasterúInvalid FSMO role.NzECannot transfer, no DC assigned to the %s role.  Try 'seize' instead
Fz Transfer of '%s' role failed: %sr)   Tr*   )r+   Úget_config_basednr/   Úget_schema_basednr   r   r1   r4   r5   r   r6   ÚFLAG_MOD_REPLACEr   r   Úlenr   r0   r7   r   r   )r8   r   r   r+   Úrid_dnÚ	naming_dnÚinfrastructure_dnÚ	schema_dnr<   r>   r   r   ZsidZe6r   r   r   r   r   Útransfer_role•   sv    þ
ÿþ

þ

þ

þ



ÿrT   c                   @   sx   e Zd ZdZdZejejejdœZ	e
dddeddd	e
d
ddde
ddg d¢ddgZg Zdd„ Zdd„ Zddd„ZdS )Úcmd_fsmo_seizezSeize the role.ú%prog [options]©r9   r:   Úversionoptsú-Hú--URLú%LDB URL for database or target serverÚURLÚH©ÚhelpÚtypeÚmetavarÚdestz--forcez5Force seizing of role without attempting to transfer.Ú
store_true)r_   Úactionú--roleÚchoice©rE   rG   rI   rJ   rH   r   r!   ÚalláI  The FSMO role to seize or transfer.

rid=RidAllocationMasterRole

schema=SchemaMasterRole

pdc=PdcEmulationMasterRole

naming=DomainNamingMasterRole

infrastructure=InfrastructureMasterRole

domaindns=DomainDnsZonesMasterRole

forestdns=ForestDnsZonesMasterRole

all=all of the above

You must provide an Admin user and password.©r`   Úchoicesr_   c                 C   s¦  |  ¡ }| ¡ }d| | _d| ¡  | _t| ¡ ƒ| _d| | _t	 
¡ }|dkrbt	 || j¡|_nn|dkrzt	 ||¡|_nV|dkr”t	 || j¡|_n<|dkr®t	 || j¡|_n"|dkrÈt	 || j¡|_ntd	ƒ‚d
}t||j|ƒ}|dur^||krH|du r\|  d¡ zt| j||ƒ W n   d}|  d¡ Y n0 |  d¡ dS n| j d| ¡ d
S nd}|dusr|r¢|  d| ¡ t	 |t	jd¡|d< | ¡  z | |¡ |dkrº| ¡  W nÈ ty„ }	 z®|	j\}
}|dkrX|
t	jkrX| ¡  | ¡  z| |¡ W nH tyT } z.|j\}
}| ¡  td||f ƒ‚W Y d}~n
d}~0 0 n| ¡  td||f ƒ‚W Y d}	~	n
d}	~	0 0 | ¡  | j d| ¡ dS dS )zSeize standard fsmo role. rC   rB   rA   rE   rG   rH   rI   rJ   rK   FNúAttempting transfer...Tú!Transfer unsuccessful, seizing...z%Transfer successful, not seizing roler*   úSeizing %s FSMO role...r   úFailed to seize '%s' role: %sú#FSMO seize of '%s' role successful
)r1   r+   rR   rL   rQ   r/   rM   rS   rP   r   r4   r   r5   r   r   ÚmessagerT   r8   r0   r6   rN   Ztransaction_startr7   Zcreate_own_rid_setr   r   ZERR_ENTRY_ALREADY_EXISTSZtransaction_cancelZtransaction_commit)Úselfr   r   ÚforceÚserviceNamer+   r>   Úseizer   Ze1r   r   r?   r   r   r   Ú
seize_roleõ   s†    






ÿþ



ÿÿzcmd_fsmo_seize.seize_rolec              
   C   s¢  |  ¡ }| ¡ }t | ¡ ¡}	d| | _d|	 | _t ¡ }
|dkrTt 	|| j¡|
_
n"|dkrnt 	|| j¡|
_
ntdƒ‚d}t||
j
|ƒ}|dur||krî|du rì|  d¡ zt| j||||ƒ W n   d	}|  d
¡ Y n0 |  d¡ d	S n| j d| ¡ dS nd	}|dus|rž|  d| ¡ t |tjd¡|
d< z| |
¡ W n@ tyˆ } z&|j\}}td||f ƒ‚W Y d}~n
d}~0 0 | j d| ¡ d	S dS )zSeize DNS FSMO role. r    r"   r   r!   rK   FNrl   Trm   z&Transfer successful, not seizing role
r*   rn   r   ro   rp   )r1   r+   r,   r-   r.   Údomaindns_dnÚforestdns_dnr   r4   r   r5   r   r   rq   r@   r8   r0   r6   rN   r7   r   r   )rr   r   r   r:   r9   rX   rs   rt   r+   r;   r>   ru   r   Ze2r   r   r   r   r   Úseize_dns_roleN  s\    



ÿ
ÿþ
ÿzcmd_fsmo_seize.seize_dns_roleNc           
      C   sØ   |  ¡ }|j|dd}t|tƒ ||d}	|dkr |  d|	|¡ |  d|	|¡ |  d|	|¡ |  d|	|¡ |  d	|	|¡ |  d
|	||||¡ |  d|	||||¡ n4|d
ks°|dkrÆ|  ||	||||¡ n|  ||	|¡ d S ©NTr$   r%   rh   rE   rG   rH   rI   rJ   r   r!   )r2   r3   r
   r   rv   ry   ©
rr   rs   r]   r   r:   r9   rX   r&   r=   r   r   r   r   Úrun‡  s,    ÿÿÿÿzcmd_fsmo_seize.run)NNNNNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚsynopsisÚoptionsÚSambaOptionsÚCredentialsOptionsÚVersionOptionsÚtakes_optiongroupsr	   r/   Útakes_optionsÚ
takes_argsrv   ry   r|   r   r   r   r   rU   Ô   s.   ýÿþþúY9  ÿrU   c                   @   sJ   e Zd ZdZdZejejejdœZ	e
dddeddd	gZg Zddd„Zd
S )Úcmd_fsmo_showzShow the roles.rV   rW   rY   rZ   r[   r\   r]   r^   Nc                 C   s@  |  ¡ }|j|dd}t|tƒ ||d}| ¡ }t | ¡ ¡}	d| }
d| ¡  }| 	¡ }d| }d| }d|	 }|d	d
f|
ddf|ddf|ddf|ddf|ddf|ddfg}|D ]ˆ}|\}}}z>t
|||ƒ}|d urî|  d|t|ƒf ¡ n|  d| ¡ W q² ty8 } z |  d||jf ¡ W Y d }~q²d }~0 0 q²d S )NTr$   r%   rC   rB   rA   r    r"   rJ   ZSchemaMasterRolerI   ZInfrastructureMasterRolerE   ZRidAllocationMasterRolerG   ZPdcEmulationMasterRolerH   ZDomainNamingMasterRoler   ZDomainDnsZonesMasterRoler!   ZForestDnsZonesMasterRolez%s owner: %sz%s has no current ownerz%s: * %s)r2   r3   r
   r   r+   r,   r-   r.   rL   rM   r   rq   r/   r   )rr   r]   r:   r9   rX   r&   r=   r   r+   r;   rR   rQ   rS   rP   rw   rx   ZmastersZmasterr5   Z
short_nameZ	long_namer?   r   r   r   r|   ´  s<    ÿú	
zcmd_fsmo_show.run)NNNN©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deddd	e
d
dg d¢ddgZg Zddd„ZdS )Úcmd_fsmo_transferzTransfer the role.rV   rW   rY   rZ   r[   r\   r]   r^   re   rf   rg   ri   rj   Nc           
      C   sÒ   |  ¡ }|j|dd}t|tƒ ||d}	|dkrœt| jd|	ƒ t| jd|	ƒ t| jd|	ƒ t| jd|	ƒ t| jd	|	ƒ t| j||d
|	ƒ t| j||d|	ƒ n2|d
ks¬|dkrÀt| j||||	ƒ nt| j||	ƒ d S rz   )r2   r3   r
   r   rT   r8   r@   r{   r   r   r   r|   ÷  s(    ÿ
ÿÿzcmd_fsmo_transfer.run)NNNNNNrŠ   r   r   r   r   r‹   Ù  s"   ýÿþý  ÿr‹   c                   @   s2   e Zd ZdZi Zeƒ ed< eƒ ed< eƒ ed< dS )Úcmd_fsmoz:Flexible Single Master Operations (FSMO) roles management.ru   ZshowZtransferN)r}   r~   r   r€   ZsubcommandsrU   r‰   r‹   r   r   r   r   rŒ     s
   

rŒ   )r,   Zsamba.getoptZgetoptr‚   r   r   Zsamba.dcerpcr   r   Z
samba.authr   Zsamba.drs_utilsZsamba.netcmdr   r   r   r	   Zsamba.samdbr
   r   r@   rT   rU   r‰   r‹   rŒ   r   r   r   r   Ú<module>   s    Z? O78