
    IdQ                         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 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y)    N)LdbError)drsuapimisc)system_session)CommandCommandErrorSuperCommandOption)SamDBc                 D   	 | j                  |t        j                  dg      }d|d   v r0t        j                  | |d   d   d   j                  d            }|S d}|S # t        $ r6}|j                  \  }}|t        j
                  k(  rt        d|z         d}~ww xY w)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   argsERR_NO_SUCH_OBJECTr   Dndecode)samdbrolednrolerese7nummsgmaster_owners           3/usr/lib/python3/dist-packages/samba/netcmd/fsmo.pyget_fsmo_roleownerr"   $   s    ll6!$7H  J #a& uc!f_&=a&@&G&G&OP    WW
c#(((LtSTT	s   #A   	B)1BBc           
         |dk(  r|j                         }d|z   }n-|dk(  r(t        j                  |j                               }d|z   }|j	                         }|j                  dgt        j                  dg      }	d|	d   v r	 t        t        j                  t        j                  ||	d   d   d   j                  d	            j                  d
                  }
t        t        j                  ||	d   d   d   j                  d	                  }n| j#                  d|z         y|dk(  r9|
d|j%                         }|j'                         d|j%                         }n=|dk(  r8|
d|j                         }|j'                         d|j                         }|j)                         }k7  rH|j+                         }|j-                  |d      }t/        d|z  t1               ||      }t        j2                         }t        j                  ||      |_        t        j6                  |t        j8                  d      |d<   t        j6                  |t        j:                  d      |d<   	 |j=                  |       	 t        j>                  jA                  |||      }	 |d   }|d   }tD        jF                  }|dd }t        j>                  jI                  |||
||       | j#                  d|z         y| j#                  d|z         y# t        $ r/}|j                  \  }}t!        d|	d   d   d   d|d      d}~ww xY w# t        $ r%}|j                  \  }}t!        d|d|      d}~ww xY w# t        j>                  jB                  $ r}t!        d|      d}~ww xY w# t        j>                  jB                  $ r}t!        d|      d}~ww xY w) zTransfer dns FSMO role. 	domaindns$CN=Infrastructure,DC=DomainDnsZones,	forestdns$CN=Infrastructure,DC=ForestDnsZones,r   zextended_dn:1:1)r   r   controlsr   r   GUIDz"No GUID found in naming master DN z : z 
Nz0* The '%s' role does not have an FSMO roleowner
Fz._msdcs.Tfallback_machinez	ldap://%surlsession_infocredentialslpfSMORoleOwner_DelfSMORoleOwner_AddzFailed to add role 'z': z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_namehost_dns_namer   r   r   strr   r)   r   r   get_extended_componentr   r   r   writedomain_dns_nameget_ntds_GUIDget_dsServiceNameget_loadparmget_credentialsr   r   MessagednMessageElementFLAG_MOD_DELETEFLAG_MOD_ADDmodify	drs_utilsdrsuapi_connectdrsExceptionr   DRSUAPI_DRS_WRIT_REPsendDsReplicaSync)outf	sambaoptscredoptsr   r   r7   role_object	forest_dnnew_host_dns_namer   master_guidr    e3r   r   master_dns_namenew_dns_name	new_ownerr0   credsme5
connectionedrsuapi_connectiondrsuapi_handlereq_optionsNCestrs                                r!   transfer_dns_rolerd   ;   s    {OO%	<yH		**5+@+@+BC	<yH++-
,,{-. ^^!2 3  5C
 #a& 	Bdiiu/21vo/Fq/I/P/PQW/X)Z)?)?)GI JK svveSVO-DQ-G-N-Nv-VWXL 	

FMN{,7,1,A,A,CE).)<)<)>).)>)>)@B		,7,1,A,A,CE).)<)<)>).)>)>)@B '')I,&##%((d(C+9#1#3"'B0 KKMvve[)!$!3!3L474G4G4C"E
 "%!3!3I474D4D4C"E
	LLLO
	<889J9;UDJ

	;!+A']N!66KRS!BOO--.@.<.9.0+? 	

<tCD

=DEA  	BJS# #A 7 :C A B B	BL  	LJS#cJKK	L ++ 	<7;;	< ++ 	;3T::	;sb   BL :M !N .AN7 	M#*MM	N M>>NN4#N//N47O%O  O%c                 (   |j                         }d|z   }d|j                         z  }d|z   }t        |j                               }t	        j
                  ||j                               }t	        j                         }	t	        j
                  |d      |	_        |dk(  r7t        |||      }
t	        j                  dt        j                  d      |	d<   n5|dk(  rtt        |||      }
|j                  |t        j                  d	g
      }t        |      dk(  sJ |d   d	   d   }t	        j                  |t        j                  d      |	d<   n|dk(  r6t        |||      }
t	        j                  dt        j                  d      |	d<   n|dk(  r6t        |||      }
t	        j                  dt        j                  d      |	d<   nF|dk(  r6t        |||      }
t	        j                  dt        j                  d      |	d<   nt        d      |
| j!                  d|z         y|
|k7  r'	 |j#                  |	       | j!                  d|z         y| j!                  d|z         y# t$        $ r%}|j&                  \  }}t        d|d|      d}~ww xY w)zTransfer standard FSMO role. CN=RID Manager$,CN=System,CN=Partitions,%sCN=Infrastructure, rid1becomeRidMasterpdc	objectSidr   r3   r   	becomePdcnamingbecomeDomainMasterinfrastructurebecomeInfrastructureMasterschemabecomeSchemaMasterInvalid FSMO role.NzECannot transfer, no DC assigned to the %s role.  Try 'seize' instead
FzTransfer of 'z' role failed: r5   Tr6   )r7   get_config_basednr<   get_schema_basednr   r   rA   rD   rE   r"   rF   FLAG_MOD_REPLACEr   r   lenr   r>   rI   r   r   )rO   r   r   r7   rid_dn	naming_dninfrastructure_dn	schema_dnrY   r[   r    r   side6r   r   s                   r!   transfer_roler      s    !I)I5F"U%<%<%>>I,y8E++-.Iue5578IA66%ADu})%>"11%% 
 
)%DAll9!$}  F3x1}}!f[!!$++%%+ 
	)%DA"%"4"4%% #"
 
!	!)%1BDI*-*<*<%%(+*
&' 
	)%DA"%"4"4%% #"
 /00

[^bbcy 	,LLO 	

<tCD

=DE  	,JS# $c + , ,	,s   (I# #	J, JJc                       e Zd ZdZdZej                  ej                  ej                  dZ	 e
dddedd	       e
d
dd       e
ddg dd      gZg Zd Zd Z	 	 ddZy)cmd_fsmo_seizezSeize the role.%prog [options]rP   rQ   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rj   rm   rr   rt   rp   r$   r&   allI  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                    |j                         }|j                         }d|z   | _        d|j                         z  | _        t        |j                               | _        d|z   | _        t        j                         }|dk(  r&t        j                  || j                        |_        n|dk(  rt        j                  ||      |_        n|dk(  r&t        j                  || j                        |_        na|dk(  r&t        j                  || j                        |_        n6|dk(  r&t        j                  || j                        |_        nt        d	      d
}t        ||j                  |      }|a||k7  r=|\| j                  d       	 t!        | j"                  ||       | j                  d       y| j"                  j%                  d|z         y
d}||r| j                  d|z         t        j&                  |t        j(                  d      |d<   |j+                          	 |j-                  |       |dk(  r|j/                          |j9                          | j"                  j%                  d|z         yy#  d}| j                  d       Y xY w# t0        $ r}	|	j2                  \  }
}|dk(  r|
t        j4                  k(  rt|j7                          |j+                          	 |j-                  |       nb# t0        $ r5}|j2                  \  }
}|j7                          t        d|d|      d}~ww xY w|j7                          t        d|d|      Y d}	~	d}	~	ww xY w)zSeize standard fsmo role. rh   rg   rf   rj   rm   rp   rr   rt   rv   FNAttempting transfer...z%Transfer successful, not seizing roleT!Transfer unsuccessful, seizing...r6   Seizing %s FSMO role...r   Failed to seize '' role: #FSMO seize of '%s' role successful
)rA   r7   r}   rw   r|   r<   rx   r~   r{   r   rD   r   rE   r   r"   messager   rO   r>   rF   ry   transaction_startrI   create_own_rid_setr   r   ERR_ENTRY_ALREADY_EXISTStransaction_canceltransaction_commit)selfr   r   forceserviceNamer7   r[   seizer    e1r   r   r^   s                r!   
seize_rolezcmd_fsmo_seize.seize_role   s    --/OO%	!5	!A+e.E.E.GGU44672Y>KKM5=66%-ADU]66%+ADX66%0AD%%66%!7!78ADX66%0AD344)%t<#{*=LL!9:$%diiu= %LM#		 J $!% &ELL2T9:!$!3!3S11"!Ao ##%4Q5=,,.0 $$&IIOOBTIJM !&J $%HI0  4WW
c5=SC,H,H%H ,,.++-8Q# 8%&VV
c002*,0#,7 8 88 ,,.&(,c(3 4 4 (4sI   I< &&J <J	M&AM!'K98M!9	L70L22L77$M!!M&c                    |j                         }|j                         }t        j                  |j	                               }	d|z   | _        d|	z   | _        t        j                         }
|dk(  r&t        j                  || j
                        |
_
        n6|dk(  r&t        j                  || j                        |
_
        nt        d      d}t        ||
j                  |      }|c||k7  r?|^| j                  d       	 t        | j                  ||||       | j                  d	       y
| j                  j!                  d|z         yd
}||rm| j                  d|z         t        j"                  |t        j$                  d      |
d<   	 |j'                  |
       | j                  j!                  d|z         y
y#  d
}| j                  d       Y xY w# t(        $ r%}|j*                  \  }}t        d|d|      d}~ww xY w)zSeize DNS FSMO role. r%   r'   r$   r&   rv   FNr   z&Transfer successful, not seizing role
Tr   r6   r   r   r   r   r   )rA   r7   r8   r9   r:   domaindns_dnforestdns_dnr   rD   r   rE   r   r"   r   rd   rO   r>   rF   ry   rI   r   r   )r   r   r   rQ   rP   r   r   r   r7   rS   r[   r   r    e2r   r   s                   r!   seize_dns_rolezcmd_fsmo_seize.seize_dns_roleN  s    --/OO%	**5+@+@+BC	BYNBYNKKM;66%!2!23AD[ 66%!2!23AD344)%t<#{*=LL!9:	$)$))Y$*/1 %NO#		 J $!% &ELL2T9:!$!3!3S11"!Ao0Q
 IIOOBTIJ !&J $%HI$  0WW
c"$(#$/ 0 00s$   F? G ?G	H" HHNc                    |j                         }|j                  |d      }t        |t               ||      }	|dk(  r| j	                  d|	|       | j	                  d|	|       | j	                  d|	|       | j	                  d|	|       | j	                  d	|	|       | j                  d
|	||||       | j                  d|	||||       y |d
k(  s|dk(  r| j                  ||	||||       y | j	                  ||	|       y NTr*   r,   r   rj   rm   rp   rr   rt   r$   r&   )rB   rC   r   r   r   r   
r   r   r   r   rQ   rP   r   r0   rZ   r   s
             r!   runzcmd_fsmo_seize.run  s    ##%((d(C!.*:"'B0 5=OOE5%0OOE5%0OOHeU3OO,eU;OOHeU3UHi +U4UHi +U4 {"dk&9##D%9$/8 eU3    NNNNNN)__name__
__module____qualname____doc__synopsisoptionsSambaOptionsCredentialsOptionsVersionOptionstakes_optiongroupsr
   r<   takes_options
takes_argsr   r   r    r   r!   r   r      s     H ))..-- 	tW#JS	2yK"	$ 	xh 1f	0	1M( JWr7r ,07;4r   r   c                       e Zd ZdZdZej                  ej                  ej                  dZ	 e
dddedd	      gZg ZddZy
)cmd_fsmo_showzShow the roles.r   r   r   r   r   r   r   r   Nc           	         |j                         }|j                  |d      }t        |t               ||      }|j	                         }t        j                  |j                               }	d|z   }
d|j                         z  }|j                         }d|z   }d|z   }d|	z   }|d	d
f|
ddf|ddf|ddf|ddf|ddf|ddfg}|D ]L  }|\  }}}	 t        |||      }| | j                  |dt        |             n| j                  d|z         N y # t        $ r*}| j                  |d|j                         Y d }~~d }~ww xY w)NTr*   r,   rh   rg   rf   r%   r'   rt   SchemaMasterRolerr   InfrastructureMasterRolerj   RidAllocationMasterRolerm   PdcEmulationMasterRolerp   DomainNamingMasterRoler$   DomainDnsZonesMasterRoler&   ForestDnsZonesMasterRolez owner: z%s has no current ownerz: * )rB   rC   r   r   r7   r8   r9   r:   rw   rx   r"   r   r<   r   )r   r   rQ   rP   r   r0   rZ   r   r7   rS   r}   r|   r~   r{   r   r   mastersmasterrE   
short_name	long_namer^   s                         r!   r   zcmd_fsmo_show.run  s   ##%((d(C!.*:"'B0 OO%	**5+@+@+BC	09<&)@)@)BB	++-	-	9=	I=	Ix);<%'79STE#<=u&>?x)AB +/IJ +/IJ  		BF*0'RYB+E2zB%LL9c&k!JKLL!:i!HI		B   B9aii@AABs   AD	E EE)NNNNr   r   r   r   r   r   r   r   r   r   r
   r<   r   r   r   r   r   r!   r   r     s[     H ))..-- 	tW#JS	2M
 J"Br   r   c                       e Zd ZdZdZej                  ej                  ej                  dZ	 e
dddedd	       e
d
dg dd      gZg Z	 	 ddZy)cmd_fsmo_transferzTransfer the role.r   r   r   r   r   r   r   r   r   r   r   r   r   Nc                 D   |j                         }|j                  |d      }t        |t               ||      }	|dk(  rt	        | j
                  d|	       t	        | j
                  d|	       t	        | j
                  d|	       t	        | j
                  d|	       t	        | j
                  d	|	       t        | j
                  ||d
|	       t        | j
                  ||d|	       y |d
k(  s|dk(  rt        | j
                  ||||	       y t	        | j
                  ||	       y r   )rB   rC   r   r   r   rO   rd   r   s
             r!   r   zcmd_fsmo_transfer.run  s     ##%((d(C!.*:"'B0 5=$))UE2$))UE2$))Xu5$))%5u=$))Xu5diiH)52diiHk#% {"dk&9!$))Y$Ndiiu5r   r   r   r   r   r!   r   r     sw     H ))..-- 	tW#JS	2xh 1f	0	1M" J+/7;6r   r   c                   P    e Zd ZdZi Z e       ed<    e       ed<    e       ed<   y)cmd_fsmoz:Flexible Single Master Operations (FSMO) roles management.r   showtransferN)r   r   r   r   subcommandsr   r   r   r   r   r!   r   r     s0    DK)+K'/K/1K
r   r   )r8   samba.getoptgetoptr   r   r   samba.dcerpcr   r   
samba.authr   samba.drs_utilssamba.netcmdr   r   r	   r
   samba.samdbr   r"   rd   r   r   r   r   r   r   r   r!   <module>r      st   (   
  & %   .Wt<~K4W K4\4BG 4Bn56 56p2| 2r   