def provision_schema(sam_db, setup_path, names, reporter, ldif, msg, modify_mode=False): """Provision/modify schema using LDIF specified file :param sam_db: sam db where to provision the schema :param setup_path: Path to the setup directory. :param names: provision names object. :param reporter: A progress reporter instance (subclass of AbstractProgressReporter) :param ldif: path to the LDIF file :param msg: reporter message :param modify_mode: whether entries are added or modified """ sam_db.transaction_start() try: reporter.reportNextStep(msg) ldif_params = { "FIRSTORG": names.firstorg, "FIRSTORGDN": names.firstorgdn, "FIRSTOU": names.firstou, "CONFIGDN": names.configdn, "SCHEMADN": names.schemadn, "DOMAINDN": names.domaindn, "DOMAIN": names.domain, "DNSDOMAIN": names.dnsdomain, "NETBIOSNAME": names.netbiosname, "HOSTNAME": names.hostname } if modify_mode: setup_modify_ldif(sam_db, setup_path(ldif), ldif_params) else: full_path = setup_path(ldif) ldif_data = read_and_sub_file(full_path, ldif_params) # schemaIDGUID can raise error if not match what is expected by schema master, if not present it will be automatically filled by the schema master ldif_data = re.sub("^schemaIDGUID:", '#schemaIDGUID:', ldif_data, flags=re.M) # we add elements one by one only to control better the exact position of the error ldif_elements = re.split("\n\n+", ldif_data) elements_to_add = [] for element in ldif_elements: if not element: continue # this match is to assure we have a legit element match = re.search('^\s*dn:\s+(.*)$', element, flags=re.M) if match: elements_to_add.append(element) if elements_to_add: for el in elements_to_add: try: sam_db.add_ldif(el, ['relax:0']) except Exception as ex: print 'Error: "' + str(ex) + '" when adding element:\n' + el + '\n' raise else: raise Exception('No elements to add found in ' + full_path) except: sam_db.transaction_cancel() raise sam_db.transaction_commit() force_schemas_update(sam_db, setup_path)
def modify_schema(setup_path, names, lp, creds, reporter, ldif, msg): """Modify schema using LDIF specified file :param setup_path: Path to the setup directory. :param names: provision names object. :param lp: Loadparm context :param creds: Credentials Context :param reporter: A progress reporter instance (subclass of AbstractProgressReporter) :param ldif: path to the LDIF file :param msg: reporter message """ session_info = system_session() db = SamDB(url=lp.samdb_url(), session_info=session_info, credentials=creds, lp=lp) db.transaction_start() try: reporter.reportNextStep(msg) setup_modify_ldif(db, setup_path(ldif), { "SCHEMADN": names.schemadn, "CONFIGDN": names.configdn }) except: db.transaction_cancel() raise db.transaction_commit()
def force_schemas_update(sam_db, setup_path): sam_db.transaction_start() try: # update schema now setup_modify_ldif(sam_db, setup_path('AD/update_now.ldif'), None) except: sam_db.transaction_cancel() raise sam_db.transaction_commit()
def provision_schema(setup_path, names, lp, creds, reporter, ldif, msg, modify_mode=False): """Provision/modify schema using LDIF specified file :param setup_path: Path to the setup directory. :param names: provision names object. :param lp: Loadparm context :param creds: Credentials Context :param reporter: A progress reporter instance (subclass of AbstractProgressReporter) :param ldif: path to the LDIF file :param msg: reporter message :param modify_mode: whether entries are added or modified """ session_info = system_session() db = SamDB(url=get_ldb_url(lp, creds, names), session_info=session_info, credentials=creds, lp=lp) db.transaction_start() try: reporter.reportNextStep(msg) if modify_mode: ldif_function = setup_modify_ldif else: ldif_function = setup_add_ldif ldif_params = { "FIRSTORG": names.firstorg, "FIRSTORGDN": names.firstorgdn, "FIRSTOU": names.firstou, "CONFIGDN": names.configdn, "SCHEMADN": names.schemadn, "DOMAINDN": names.domaindn, "DOMAIN": names.domain, "DNSDOMAIN": names.dnsdomain, "NETBIOSNAME": names.netbiosname, "HOSTNAME": names.hostname } ldif_function(db, setup_path(ldif), ldif_params) setup_modify_ldif(db, setup_path("AD/oc_provision_schema_update.ldif"), ldif_params) except: db.transaction_cancel() raise db.transaction_commit()