
    h5                         d dl Z d dlZd dlZd dlZd dl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 d dlmZ d dlmZ  G d d      Z G d	 d
e      Zy)    N)system_session)CommandCommandErrorOption)get_fsmo_roleowner)
setup_path)SamDBc                   "    e Zd ZdZd Zd Zd Zy)ldif_schema_updatez-Helper class for applying LDIF schema updatesc                 <    d| _         d | _        d | _        d| _        y )NF )
is_defunctunknown_oiddnldif)selfs    C/usr/lib/python3/dist-packages/samba/netcmd/domain/schemaupgrade.py__init__zldif_schema_update.__init__*   s    	    c                     |j                   \  }}|t        j                  k(  r%| j                  rt	        d| j
                  z         y| j                  &t	        d| j                  d| j
                         yy)z>Checks if we can safely ignore failure to apply an LDIF updatez)Defunct object %s doesn't exist, skippingTzSkipping unknown OID z for object F)argsldbERR_NO_SUCH_OBJECTr   printr   r   )r   errornumerrstrs       r   can_ignore_failurez%ldif_schema_update.can_ignore_failure0   sc    

f #(((T__=GH)T=M=MtwwWXr   c                     	 	 |j                  | j                  dg       y	# t        j                  $ rZ}|j                  d   t        j
                  k(  r/|j                          |j                  | j                  dg       n Y d}~y	d}~ww xY w# t        j                  $ rX}| j                  |      rY d}~yt        d|z         t        d       t        d       t        d| j                  z          d}~ww xY w)
z*Applies a single LDIF update to the schemazrelax:0)controlsr   NException: %sz4Encountered while trying to apply the following LDIFz4----------------------------------------------------z%s   )	modify_ldifr   r   LdbErrorr   ERR_INVALID_ATTRIBUTE_SYNTAXset_schema_update_nowr   r   )r   samdbes      r   applyzldif_schema_update.apply>   s    	!!$))yk!B2 1 << 66!9 @ @@ //1%%dii9+%F G 1 || 		&&q)o)*LMLMdTYY&'		s9   " BAB
B 
BB C=%C8;=C88C=N)__name__
__module____qualname____doc__r   r   r)    r   r   r   r   '   s    7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dd       e
dddd       e
dddg ddd       e
dedd       e
dedd      gZd Zd  Zd! Zy)"cmd_domain_schema_upgradezDomain schema upgradingz%prog [options])	sambaoptsversionoptscredoptsz-Hz--URLz%LDB URL for database or target serverURLH)helptypemetavardestz-qz--quietzBe quiet
store_true)r6   actionz-vz	--verbosez
Be verbosez--schemachoiceSCHEMA)20122012_R220162019z9The schema file to upgrade to. Default is (Windows) 2019.rA   )r7   r8   choicesr6   defaultz
--ldf-fileNzBJust apply the schema updates in the adprep/.LDF file(s) specified)r7   rC   r6   z
--base-dirz4Location of ldf files Default is ${SETUPDIR}/adprep.c           	         d}t               }|D ]  }|j                         }|dk(  r/|j                  dk(  r)||j                  |      z  }t               }H|j	                         j                  d      r*|dt        d        t        |j                               z   }nH|j	                         j                  d      r)|dt        d        t        |j                               z   }|j                  d      }|d   j                         dk(  r|d   j                         |_        |d   j                         d	k(  r|j                         j                  d
d      }|j                         j                  dd      }|j                         j                  dd      }|j                         j                  dd      }|d   j                         dv rr|\  }}d|v ri|j                  |j                         d|d|ddg      }	t        |	      dk7  r||_        n)t        |	d   d   d         }
|j                  |d|
z         }|d   j                         dk(  r+|d   j                         j                         dk(  rd|_        |d   j                         dk(  r&|d   j                         j                         dk(  rd}|xj                  |d z   z  c_         |S )!z
        Applies a series of updates specified in an .LDIF file. The .LDIF file
        is based on the adprep Schema updates provided by Microsoft.
        r   r   zDC=XNzCN=X:r   r"   
changetypez: ntdsschemaaddz: addz: ntdsschemamodifyz: modifyz: ntdsschemamodrdnz: modrdnz: ntdsschemadeletez: delete)rdnattid
subclassofsystemposssuperiorssystemmaycontainsystemauxiliaryclass.z(|(attributeId=z)(governsId=z))ldapDisplayName)base
expressionattrs 	isdefuncttrueTaddshowinadvancedviewonlyzreplace: showInAdvancedViewOnly
)r   rstripr   r)   upperendswithlenstrget_default_basednsplitlowerstripr   replacesearchget_schema_basednr   r   )r   r'   	ldif_filecountldif_oplinevalues_valueresdisplay_names              r   _apply_updates_in_filez0cmd_domain_schema_upgrade._apply_updates_in_filey   s   
 $&  J	(D;;=D rz <<2% u-- -. zz|$$V,Mc&k\*S1I1I1K-LL&&v.Mc&k\*S1I1I1K-LLZZ_Fay D(#AY__.
 ay L0zz|++,=,35zz|++,@,68zz|++,@,68zz|++,@,68 ay  %= = "5 %<,,E,C,C,E(-u36.?-@ ' BC
 3x1}.3+'*3q62C+DQ+G'H#||E33EF ay K/F1IOO4E4K4K4MQW4W%)" ay E)fQioo.?.E.E.GKc.c8 LLD4K'LUJ	(X r   c                    t        d|z         d}	 t        t        j                  j	                  ||            }| j                  ||      }|r|j                          	 t        d|z         |S # |r|j                          w w xY w)zBWrapper function for parsing an LDIF file and applying the updateszApplying %s updates...Nz%u changes applied)r   openospathjoinrl   close)r   r'   update_filebase_dirrc   rd   s         r   _apply_updatez'cmd_domain_schema_upgrade._apply_update   s     	&45		"RWW\\(K@AI//yAE !"U*+ ! s   ;A0 0Bc                 	   	 ddl m} ddlm} d}|j                  d      }|j                  d      }|j                         }|j                  |      }	|j                  d	      }
|j                  d
      }|j                  d      }|j                  d      }d }t        |
t               |	|      }|j                  d      |j                  dd       t        d       d}t        j                   ||j#                               }t%        |t'        |j)                               d
      }||k7  rt        d      |r|j+                  d      }ng }|j-                  |      }|j/                  |j)                         t        j0                  dg      }t3        |      dk7  rt        d      t5        |d   d   d         dz   }t7        d      }|+t9        j:                         }t7        d      }	  |||       |}tC        ||dz         D ]  }d|z  }|jE                  |       tF        jH                  jK                  tF        jH                  jM                  ||dz               }|s]tF        jH                  jO                  |      s}	 tQ        jR                  d|d|gtP        jT                  tP        jT                  |       }|j[                         \  }}|j\                  r1t        d"|d#|       t?        j@                  |       t        d      t        d$|d%|        |t7        d&      }|j_                          d}d}	 |D ]  } || ja                  || |      z  } |dkD  r|jc                          t        d'       nt        d(       |je                          |r|j                  dd+       |rt?        j@                  |       |rt        d      y # t        $ r.}| j                  j	                  d|z         t        d      d }~ww xY w# t<        $ r3}t        d|z         t?        j@                  |       t        d      d }~ww xY w# tV        tX        f$ r! t?        j@                  |       t        d!      w xY w# t<        $ r6}t        d)|z         t        d*       |je                          d}Y d }~d }~ww xY w),Nr   )read_ms_markdownz$Exception in importing markdown: %s
zIFailed to import module markdown, please install python3-markdown package)SchemaFr1   r3   r5   schemaldf_filert   )urlsession_infocredentialslpzdsdb:schema update allowedyesz;Temporarily overriding 'dsdb:schema update allowed' settingTz%This server is not the schema master.,objectVersion)rN   scoperP   r"   z*Could not determine current schema versionzadprep/WindowsServerDocsz*adprep/WindowsServerDocs/Schema-Updates.mdz!Exception in markdown parsing: %szFailed to upgrade schemaz	Sch%d.ldfz.diffpatchz-i)stdoutstderrcwdz6Failed to upgrade schema. Is '/usr/bin/patch' missing?zException in patch: rV   zPatched z using adprepzSchema successfully updatedzNo changes applied to schemar!   z*Error encountered, aborting schema upgradeno)3samba.ms_schema_markdownrw   ImportErroroutfwriter   samba.schemarx   getget_loadparmget_credentialsr	   r   setr   r   Dnget_dsServiceNamer   r[   rb   r]   get_versionra   
SCOPE_BASErZ   intr   tempfilemkdtemp	Exceptionshutilrmtreerangeappendro   rp   abspathrq   exists
subprocessPopenPIPEOSErrorIOErrorcommunicate
returncodetransaction_startru   transaction_committransaction_cancel)!r   kwargsrw   r(   rx   updates_allowed_overriddenr1   r3   r~   credsr5   target_schema	ldf_filesrt   temp_folderr'   own_dnmasterschema_updatesendrj   startdiff_dirrs   versionupdatediffpr   r   rd   error_encounteredrc   s!                                    r   runzcmd_domain_schema_upgrade.run   sy   	lA 	(%*"JJ{+	::j)##%((,JJsO

8,JJz*	::j)!.*:RTU 66./7FF/7OP)-&u6689#E3u/F/F/H+I$,.VFGG &__S1NN $$]3C ,,E$;$;$=%(^^O;L  NC 3x1}"#OPPA/23a7E!"<=H&..0()UVC$[+> ' a0 B$w.%%f- wwrww||Hfw>N'OP277>>$#7K&,,gvtT-J4>OO4>OOV &']]_NFF||ffMNk2*+EFF64@A/B2 !(+H!!	%+ H	++E9hGGH qy((*3445((* &FF/6MM+&9:: o  	lIIOOCaGHjkk	lr ! C=ABMM+.&'ABBC$ $W- Kk2* ,J K KK@  	%/A%&>?$$& $		%sT   O .	P 9QAR 	P )P		P	Q.QQ0R 	S+R==S)r*   r+   r,   r-   synopsisoptionsSambaOptionsVersionOptionsCredentialsOptionstakes_optiongroupsr   r[   takes_optionsrl   ru   r   r.   r   r   r0   r0   _   s    ! H ))--.. 	tW#JQT3	(tYZEt[|LIz(:O	 	|#tX	Z|#tJ	LMUn&{;r   r0   )ro   r   r   r   r   samba.getoptgetoptr   
samba.authr   samba.netcmdr   r   r   samba.netcmd.fsmor   samba.provisionr   samba.samdbr	   r   r0   r.   r   r   <module>r      sD   2 
    
  % 6 6 0 & 5 5p; ;r   