
    IdI                         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	 d dl
mZmZmZmZmZmZ  G d de      Zd	 Zdd
Zd Z	 	 	 	 	 ddZ	 	 	 	 	 	 	 ddZd Zd Zy)    N)LdbError)werror)
ndr_unpack)miscdnsp)DNS_TYPE_NS
DNS_TYPE_ADNS_TYPE_AAAADNS_TYPE_CNAMEDNS_TYPE_SRVDNS_TYPE_PTRc                       e Zd ZdZd Zd Zy)DemoteExceptionzBase element for demote errorsc                     || _         y Nvalue)selfr   s     1/usr/lib/python3/dist-packages/samba/remove_dc.py__init__zDemoteException.__init__    s	    
    c                      d| j                   z   S )NzDemoteException: r   )r   s    r   __str__zDemoteException.__str__#   s    "TZZ//r   N)__name__
__module____qualname____doc__r   r    r   r   r   r      s    (0r   r   c           	         | j                         }dd|z  fD ]  }t        j                  | |      }	 |j                  | j	                                	 |j                  d       |j                  dd|       	 |j                  d	|z         | j                  |        d
D ]  }t        j                  | |      }	 |j                  | j                                	 |j                  d       |j                  dd|       	 |j                  d	|z         | j                  |        y # t        j
                  $ r  t        d|d| j	                               w xY w# t        j
                  $ r t        d|z        w xY w# t        j
                  $ r/}|j                  \  }}|t        j                  k(  rn Y d }~d }~ww xY w# t        j
                  $ r  t        d|d| j                               w xY w# t        j
                  $ r t        d|d|d      w xY w# t        j
                  $ r/}	|	j                  \  }}|t        j                  k(  rn Y d }	~	d }	~	ww xY w)Nz3CN=Enterprise,CN=Microsoft System Volumes,CN=Systemz+CN=%s,CN=Microsoft System Volumes,CN=SystemzFailed constructing DN z by adding base zCN=Xz.Failed constructing DN %s by adding child CN=Xr   CNzRemoving Sysvol reference: %s)zMCN=Domain System Volumes (SYSVOL share),CN=File Replication Service,CN=SystemzDCN=Topology,CN=Domain System Volume,CN=DFSR-GlobalSettings,CN=Systemz% by adding child CN=X (soon to be CN=))domain_dns_nameldbDnadd_baseget_config_basednr   r   	add_childset_componentinfodeleteargsERR_NO_SUCH_OBJECTget_default_basedn)
samdbloggerdc_namerealmsdneenumestre1s
             r   remove_sysvol_referencesr8   '   sm   !!#EC;eCE VVE1	EKK//12	*LL  	D'*	KK7"<=LL'8V  VVE1	FKK0023	MLL  	D'*	KK7"<=LL') || 	E!%')@)@)B#D E E	E
 || 	*!"R%'#) * *	* || 	66LT4s--- 	 || 	F!%')A)A)C#E F F	F
 || 	M!?A7#L M M	M || 	77LT4s--- 	s_   D'E7%F:GG=?%H&'3E"E?G$F??G3G:=&H#&I(9$I##I(c           
      d     j                  dt        j                  dg dg      }t        |      dk(  ry |j	                         }	  j                  |      \  } j                  |g         j                  dt        j                  dg	      }
t        |
      d
k(  sJ |
d   d   } fdt        fd|D              }fd}|D ]  }	 |j!                  d|z          j                  |      \  }}t        |      }|D cg c]  } ||      r| }}t        |      |k7  s^|j#                  d|t        |      |t        |      z
  fz          j                  ||        t         |||       y # t        $ r`}|j                  \  }}	|t        j                  k(  s|t        j                  k(  r|rt         |||       Y d }~y t        d|d|	      d }~ww xY w# t        $ r>}|j                  \  }}	|t        j                  k(  rY d }~ y t        d|d|	      d }~ww xY wc c}w )N z.(&(objectClass=dnsZone)(!(dc=RootDNSServers)))search_options:0:2)basescope
expressionattrscontrolsr   z
lookup of z	 failed: namingContextsr=   r?      c                 r    t        j                  |       j                         j                  dd      d   S )N/rC   r   )r#   r$   canonical_strsplit)r3   r.   s    r   dns_name_from_dnz/remove_dns_references.<locals>.dns_name_from_dn   s1     vveR ..066sA>qAAr   c              3   @   K   | ]  } t        |              y wr   )str).0r3   rH   s     r   	<genexpr>z(remove_dns_references.<locals>.<genexpr>   s     6Bs2w'6s   c                     | j                   t        k(  s| j                   t        k(  r<D ]7  }|j                   | j                   k(  s|j                  | j                  k(  s7 y yNTF)wTyper	   r
   data)	dnsRecordrecprimary_recss     r   a_rec_to_removez.remove_dns_references.<locals>.a_rec_to_remove   sP    ??j(IOO},L#  99	/CHH	4N  r   z(checking for DNS records to remove on %s1updating %s keeping %d values, removing %s values)searchr#   SCOPE_SUBTREElenupper
dns_lookupRuntimeErrorr+   r   "WERR_DNS_ERROR_NAME_DOES_NOT_EXISTWERR_DNS_ERROR_RCODE_NAME_ERRORremove_hanging_dns_referencesr   dns_replace
SCOPE_BASEsetdebugr)   )r.   r/   dnsHostNameignore_no_namezonesdnsHostNameUpperr3   e4r5   r6   resncsa_names_to_remove_fromrT   a_namea_rec_dna_recse2orig_num_recsrrH   rS   s   `                   @@r   remove_dns_referencesrq   b   sG    LLb(9(9$T!#7"8  :E 5zQ"((*O"--k:\ 
k2&
,,r ^^4D3E  GCs8q==
a&!
"CB 6#6
6  ) .	NLLCfLM!&!1!1&!9Xv F#>?1+=!>>v;-'KKKVmc&k.IJK Lff-!.$ "%1A5I  	OwwtF===F:::-eV.>.35 ;MNN	Ob  	N77LT4v@@@!vt"LMM		N ?sI   	E7 (G#H-H-7	G  AG
GG #	H*,"H%H%%H*c                 <   fd}|D ]  }|j                  d|j                  z         | j                  |j                  t        j                  ddg      }|D ]  }	 |d   }|D 	cg c]$  }	 ||	      st        t        j                  |	      & }
}	t        |
      t        |      k7  sP|j                  d|j                  t        |
      t        |      t        |
      z
  fz         | j                  |j                  |
         y # t
        $ r Y w xY wc c}	w )Nc                 `   t        t        j                  |       }|j                  t        k(  s&|j                  t
        k(  s|j                  t        k(  r|j                  j                         k(  ryy|j                  t        k(  r(|j                  j                  j                         k(  ryyrN   )r   r   DnssrvRpcRecordrO   r   r   r   rP   rY   r   
nameTarget)r   rQ   rf   s     r   	to_removez0remove_hanging_dns_references.<locals>.to_remove   s    t33U;	??k)oo/oo-~~##%)99  __,~~((..04DDr   zchecking %sz/(&(objectClass=dnsNode)(!(dNSTombstoned=TRUE)))rQ   )r<   r=   r>   r?   rU   )rb   r3   rV   r#   rW   KeyErrorr   r   rt   rX   r)   dns_replace_by_dn)r.   r/   rf   re   rv   zonerecordsrecordorig_valuesvvaluess     `        r   r^   r^      s(   

  ;]TWW,-,,DGG33D3D+:&1]  4  	;F$[1  +@)A, !!5!5q9 @F @ 6{c+..O%yy#f+";/#f+=?? @ ''		6:#	;;  @s   D
')D
	DDc                 $   | j                  dt        j                  dg      }t        |      dk(  sJ |d   d   d   }	| j                  |g dt        j                  d      }
|
d   }t	        |d	   d         }	 t        j
                  | |d
   d   j                  d            }	 t	        |d   d         }|r| j                  |dg       || j                  |dg dt        j                        }d|d   v r9t	        |d   d   d         }|j                  d|z         | j                  |       d|d   v r9t	        |d   d   d         }|j                  d|z         | j                  |       |r'|j                  d|z         | j                  |dg       d|v rt	        |d   d         }|r| j                  dt        j                  |      d|dg t        j                  | j                               }t        |      dk(  r?|j                  d|d   j                  z         | j                  |d   j                         ||rt        | ||       |rt        | ||       y y # t        $ r d }Y w xY w# t        $ r d }Y w xY w)Nr:   dsServiceNamerB   rC   r   )serverReferencecnrc   z(objectClass=server)r<   r?   r=   r>   r   r   utf8rc   tree_delete:0zobjectclass=computer)msDS-KrbTgtLinkrIDSetReferencesr   r<   r>   r?   r=   r   zRemoving RID Set: %sr   zRemoving RODC KDC account: %sz5Removing computer account: %s (and any child objects)z(&(objectclass=user)(cn=dns-z)(servicePrincipalName=DNS/z)))r>   r?   r=   r<   z/Removing Samba-specific DNS service account: %s)rV   r#   r`   rX   rJ   r$   decoderw   r*   r)   binary_encoderW   r-   r3   rq   r8   )r.   r/   	server_dnremove_computer_objremove_server_objremove_sysvol_objremove_dns_namesremove_dns_accountrh   my_serviceNamemsgsmsgr0   computer_dnrc   computer_msgs
rid_set_dnkrbtgt_link_dns                     r   offline_remove_serverr      s    ,,r ^^O3D  FCs8q==VO,Q/N <<Y.!nn#9	  ;D
 q'C#d)A,GffUC(9$:1$=$D$DV$LM#m,Q/0  	Y 12+0F,2 ,/>> % ; q!11]1-.@A!DEJKK.;<LL$a 00 q!12C!DQ!GHNKK7.HILL(KKOR]]^LL&78Cc-034Kll--g6'E!#3+<+< % 8 8 :  < s8q=KKICPQFIIUVLLQ##3eV[9 8 c  
  s$   ;+I. 'J  .I=<I= JJc
           
          | j                  dt        j                  dg      }
t        |
      dk(  sJ t        j                  | |
d   d   d   j                  d            }|j                         }||k(  rt        d|z        	 | j                  |dd	gt        j                  
      }t        |      dk(  rt        |d| j                               |d   }|j                  j                         dk7  s|j                  j                         dk7  rt        d|z        t        t         j"                  |d	   d         }|rd| j                  | j%                         d|z        }|D ];  }|j'                  d|j                  z         | j)                  |j                         = |r| j                  dt        j*                  d|z  dg      }|D ]  }t-        |      }t        j.                         }|j                  |_        t        j0                  |t        j2                  d      |d<   |j5                  d|j                  d|d       | j7                  |        	 |j'                  d|z         | j)                  |dg       t9        | |||||||	       y # t        $ r6}|j                  \  }}|t        j                  k(  rt        d|z         d }~ww xY w# t        $ r"}|j                  \  }}t        d|z        d }~ww xY w)Nr:   r   rB   rC   r   r   z#Refusing to demote our own DSA: %s zobjectClass=ntdsDSA
objectGUIDr   zGiven DN %s doesn't existz is not an ntdsda in r    zNTDS Settingsz)Given DN (%s) wasn't the NTDS Settings DNz5(&(objectclass=nTDSConnection)(fromServer=<GUID=%s>)))r<   r>   zRemoving nTDSConnection: %sz(fsmoRoleOwner=<GUID=%s>))r;   )r<   r=   r>   r@   fsmoRoleOwnerr   zSeizing FSMO role on: z (now owned by r!   z'Removing nTDSDSA: %s (and any children)r   z,Failed to remove the DCs NTDS DSA object: %sr   r   r   r   r   )rV   r#   r`   rX   r$   r   parentr   r   r+   r,   r"   r3   get_rdn_nameget_rdn_valuer   r   GUIDr&   r)   r*   rW   rJ   MessageMessageElementFLAG_MOD_REPLACEwarningmodifyr   )r.   r/   ntds_dnr   r   remove_connection_objseize_stale_fsmor   r   r   rh   r   r   r   e5r5   r6   r   	ntds_guidstale_connectionsconnstale_fsmo_rolesrolevalme6s                             r   offline_remove_ntds_dcr   )  s    ,,r ^^O3D  FCs8q==VVE3q6/#:1#=#D#DV#LMN I CnTUU||5J#/.  H 	D	Q!(%*?*?*AC D 	D q'C%/1I%& ' 	' 499c,&7&:;I "LLe.E.E.G5CEN5O ) P & 	"DKK5?@LL!	"  <<Rs7H7H3O*3442F1G ( I % 	Dn%CA77AD++C1E1E,;=AgJNN"gg~7 8LLO	&=GHW/0 %.A,=,=+;-?Ao  wwt3)))!"="GHHd  &wwtL $% & 	&&s0   $J  %'K"  	K)1KK"	L+LLc                    | j                          d }	 t        j                  |      }d|z  }	 | j	                  |g t        j"                  d      }
t        |
      dk(  rD|.| j                          t        |d	| j                               t'        | ||ddddd       n"t)        | ||
d   j                  ddddddd
       | j+                          y # t        $ r 	 | j	                  | j                         g dt        j                  |      z        }nB# t        $ r6}|j                  \  }}	t        d|d| j                         d|	      d }~ww xY wt        |      dk(  r.| j                          t        |d	| j                               |d   j                  }t        j                  | d
      }|j!                  |       Y w xY w# t        $ rb}|j                  \  }}	|t        j$                  k(  rg }
n2| j                          t        d|d| j                         d|	      Y d }~d }~ww xY w)N)hexz	<GUID=%s>z(&(objectClass=server)(cn=%s)))r<   r?   r>   zFailure checking if z is an server object in z: r   z is not an AD DC in zCN=NTDS Settingsz(objectClass=ntdsdsa)r   z is an NTDS DSA in Tr   )r   r   r   r   r   r   r   )transaction_startuuidUUID
ValueErrorrV   r&   r#   r   r   r+   r   r"   rX   transaction_cancelr3   r$   r%   r`   r,   r   r   transaction_commit)r.   r/   r0   r   r   r   server_msgse3r5   r6   	ntds_msgse7s               r   	remove_dcr   ~  s`   
 
I$II'*		)0:LLgRs~~,C ! E	 	I!$$&!%,e.C.C.E#G H H 	eV'260404/315	7 	uf(|37155904150426	8 
}  $
	N,,E,C,C,E-/32),):):7)C3D ' EK
  	N77LT4!%,e.C.C.Et#M N N	N !$$&!%,e.C.C.E#G H HN%%	&& 23#)$4  :wwt3)))I$$&!%//149: : :sN   C #G 	G"8DG	E$1EEA5GG	IAH<<Ic                 ^    | j                          t        | |d        | j                          y r   )start_transactionr   commit_transaction)r.   r   s     r    offline_remove_dc_RemoveDsServerr     s&    	5'40	r   )F)FFFFF)FFFFFFF)r   r#   r   sambar   	samba.ndrr   samba.dcerpcr   r   samba.dcerpc.dnspr   r	   r
   r   r   r   	Exceptionr   r8   rq   r^   r   r   r   r   r   r   r   <module>r      s   &  
     #/ /0i 08vMJ`(;Z /4,1,1+0-2I9^ 05-216,1-2,1.3RAjK\r   