void ipa_topo_be_state_change(void *handle, char *be_name, int old_be_state, int new_be_state) { Slapi_Backend *be=NULL; const char *be_suffix; /* check if different backends require different actions */ be = slapi_be_select_by_instance_name(be_name); be_suffix = slapi_sdn_get_dn(slapi_be_getsuffix(be, 0)); if (0 == ipa_topo_cfg_plugin_suffix_is_managed(be_suffix)) { /* nothing to do */ return; } if (new_be_state == SLAPI_BE_STATE_ON) { /* backend came back online - check change in domain level */ slapi_log_error(SLAPI_LOG_FATAL, IPA_TOPO_PLUGIN_SUBSYSTEM, "ipa_topo_be_state_change - " "backend %s is coming online; " "checking domain level and init shared topology\n", be_name); ipa_topo_util_set_domain_level(); ipa_topo_util_check_plugin_active(); if (ipa_topo_get_plugin_active()) { ipa_topo_set_post_init(1); ipa_topo_util_start(1); } } else if (new_be_state == SLAPI_BE_STATE_OFFLINE) { /* backend is about to be taken down - inactivate plugin */ slapi_log_error(SLAPI_LOG_FATAL, IPA_TOPO_PLUGIN_SUBSYSTEM, "ipa_topo_be_state_change" "backend %s is going offline; inactivate plugin\n", be_name); } else if (new_be_state == SLAPI_BE_STATE_DELETE) { /* backend is about to be removed - disable replication */ if (old_be_state == SLAPI_BE_STATE_ON) { slapi_log_error(SLAPI_LOG_FATAL, IPA_TOPO_PLUGIN_SUBSYSTEM, "ipa_topo_be_state_change" "backend %s is about to be deleted; inactivate plugin\n", be_name); } } }
/* * Function: retrocl_create_config * * Returns: LDAP_ * * Arguments: none * * Description: * This function is called if there was no mapping tree node or backend for * cn=changelog. */ int retrocl_create_config(void) { Slapi_PBlock *pb = NULL; Slapi_Entry *e; struct berval *vals[2]; struct berval val; int rc; char *mappingtree_dn = NULL; vals[0] = &val; vals[1] = NULL; /* Assume the mapping tree node is missing. It doesn't hurt to * attempt to add it if it already exists. You will see a warning * in the errors file when the referenced backend does not exist. */ e = slapi_entry_alloc(); /* This function converts the old DN style to the new one. */ mappingtree_dn = slapi_create_dn_string("%s", RETROCL_MAPPINGTREE_DN); if (NULL == mappingtree_dn) { slapi_log_error (SLAPI_LOG_PLUGIN, RETROCL_PLUGIN_NAME, "retrocl_create_config: failed to normalize " "mappingtree dn %s\n", RETROCL_MAPPINGTREE_DN); return LDAP_PARAM_ERROR; } slapi_entry_set_dn(e, mappingtree_dn); /* mappingtree_dn is consumed */ /* Set the objectclass attribute */ val.bv_val = "top"; val.bv_len = 3; slapi_entry_add_values( e, "objectclass", vals ); /* Set the objectclass attribute */ val.bv_val = "extensibleObject"; val.bv_len = strlen(val.bv_val); slapi_entry_add_values( e, "objectclass", vals ); /* Set the objectclass attribute */ val.bv_val = "nsMappingTree"; val.bv_len = strlen(val.bv_val); slapi_entry_add_values( e, "objectclass", vals ); val.bv_val = "backend"; val.bv_len = strlen(val.bv_val); slapi_entry_add_values( e, "nsslapd-state", vals ); val.bv_val = RETROCL_CHANGELOG_DN; val.bv_len = strlen(val.bv_val); slapi_entry_add_values( e, "cn", vals ); val.bv_val = "changelog"; val.bv_len = strlen(val.bv_val); slapi_entry_add_values( e, "nsslapd-backend", vals ); pb = slapi_pblock_new (); slapi_add_entry_internal_set_pb( pb, e, NULL /* controls */, g_plg_identity[PLUGIN_RETROCL], 0 /* actions */ ); slapi_add_internal_pb (pb); slapi_pblock_get( pb, SLAPI_PLUGIN_INTOP_RESULT, &rc ); slapi_pblock_destroy(pb); if (rc == 0) { slapi_log_error (SLAPI_LOG_PLUGIN, RETROCL_PLUGIN_NAME, "created changelog mapping tree node\n"); } else if (rc == LDAP_ALREADY_EXISTS) { slapi_log_error (SLAPI_LOG_PLUGIN, RETROCL_PLUGIN_NAME, "changelog mapping tree node already existed\n"); } else { slapi_log_error( SLAPI_LOG_FATAL, RETROCL_PLUGIN_NAME, "cn=\"cn=changelog\",cn=mapping tree,cn=config could not be created (%d)\n", rc); return rc; } retrocl_be_changelog = slapi_be_select_by_instance_name("changelog"); if (retrocl_be_changelog == NULL) { /* This is not the nsslapd-changelogdir from cn=changelog4,cn=config */ char *bedir; bedir = retrocl_get_config_str(CONFIG_CHANGELOG_DIRECTORY_ATTRIBUTE); if (bedir == NULL) { /* none specified */ } rc = retrocl_create_be(bedir); slapi_ch_free ((void **)&bedir); if (rc != LDAP_SUCCESS && rc != LDAP_ALREADY_EXISTS) { return rc; } retrocl_be_changelog = slapi_be_select_by_instance_name("changelog"); } return LDAP_SUCCESS; }
static void extop_handle_import_start(Slapi_PBlock *pb, char *extoid, struct berval *extval) { char *orig = NULL; const char *suffix = NULL; Slapi_DN *sdn = NULL; Slapi_Backend *be = NULL; struct berval bv; int ret; if (extval == NULL || extval->bv_val == NULL) { slapi_log_err(SLAPI_LOG_ERR, "extop_handle_import_start", "no data supplied\n"); send_ldap_result(pb, LDAP_OPERATIONS_ERROR, NULL, "no data supplied", 0, NULL); return; } orig = slapi_ch_malloc(extval->bv_len+1); strncpy(orig, extval->bv_val, extval->bv_len); orig[extval->bv_len] = 0; /* Check if we should be performing strict validation. */ if (config_get_dn_validate_strict()) { /* check that the dn is formatted correctly */ ret = slapi_dn_syntax_check(pb, orig, 1); if (ret) { /* syntax check failed */ slapi_log_err(SLAPI_LOG_ERR, "extop_handle_import_start", "strict: invalid suffix (%s)\n", orig); send_ldap_result(pb, LDAP_INVALID_DN_SYNTAX, NULL, "invalid suffix", 0, NULL); return; } } sdn = slapi_sdn_new_dn_passin(orig); if (!sdn) { slapi_log_err(SLAPI_LOG_ERR, "extop_handle_import_start", "Out of memory\n"); send_ldap_result(pb, LDAP_OPERATIONS_ERROR, NULL, NULL, 0, NULL); return; } suffix = slapi_sdn_get_dn(sdn); /* be = slapi_be_select(sdn); */ be = slapi_mapping_tree_find_backend_for_sdn(sdn); if (be == NULL || be == defbackend_get_backend()) { /* might be instance name instead of suffix */ be = slapi_be_select_by_instance_name(suffix); } if (be == NULL || be == defbackend_get_backend()) { slapi_log_err(SLAPI_LOG_ERR, "extop_handle_import_start", "invalid suffix or instance name '%s'\n", suffix); send_ldap_result(pb, LDAP_NO_SUCH_OBJECT, NULL, "invalid suffix or instance name", 0, NULL); goto out; } slapi_pblock_set(pb, SLAPI_BACKEND, be); slapi_pblock_set( pb, SLAPI_REQUESTOR_ISROOT, &pb->pb_op->o_isroot ); { /* Access Control Check to see if the client is * allowed to use task import */ char *dummyAttr = "dummy#attr"; char *dummyAttrs[2] = { NULL, NULL }; int rc = 0; char dn[128]; Slapi_Entry *feature; /* slapi_str2entry modify its dn parameter so we must copy * this string each time we call it ! */ /* This dn is no need to be normalized. */ PR_snprintf(dn, sizeof(dn), "dn: oid=%s,cn=features,cn=config", EXTOP_BULK_IMPORT_START_OID); dummyAttrs[0] = dummyAttr; feature = slapi_str2entry(dn, 0); rc = plugin_call_acl_plugin (pb, feature, dummyAttrs, NULL, SLAPI_ACL_WRITE, ACLPLUGIN_ACCESS_DEFAULT, NULL); slapi_entry_free(feature); if (rc != LDAP_SUCCESS) { /* Client isn't allowed to do this. */ send_ldap_result(pb, rc, NULL, NULL, 0, NULL); goto out; } } if (be->be_wire_import == NULL) { /* not supported by this backend */ slapi_log_err(SLAPI_LOG_ERR, "extop_handle_import_start", "bulk import attempted on '%s' (not supported)\n", suffix); send_ldap_result(pb, LDAP_NOT_SUPPORTED, NULL, NULL, 0, NULL); goto out; } ret = SLAPI_UNIQUEID_GENERATE_TIME_BASED; slapi_pblock_set(pb, SLAPI_LDIF2DB_GENERATE_UNIQUEID, &ret); ret = SLAPI_BI_STATE_START; slapi_pblock_set(pb, SLAPI_BULK_IMPORT_STATE, &ret); ret = (*be->be_wire_import)(pb); if (ret != 0) { slapi_log_err(SLAPI_LOG_ERR, "extop_handle_import_start", "error starting import (%d)\n", ret); send_ldap_result(pb, LDAP_OPERATIONS_ERROR, NULL, NULL, 0, NULL); goto out; } /* okay, the import is starting now -- save the backend in the * connection block & mark this connection as belonging to a bulk import */ PR_EnterMonitor(pb->pb_conn->c_mutex); pb->pb_conn->c_flags |= CONN_FLAG_IMPORT; pb->pb_conn->c_bi_backend = be; PR_ExitMonitor(pb->pb_conn->c_mutex); slapi_pblock_set(pb, SLAPI_EXT_OP_RET_OID, EXTOP_BULK_IMPORT_START_OID); bv.bv_val = NULL; bv.bv_len = 0; slapi_pblock_set(pb, SLAPI_EXT_OP_RET_VALUE, &bv); send_ldap_result(pb, LDAP_SUCCESS, NULL, NULL, 0, NULL); slapi_log_err(SLAPI_LOG_INFO, "extop_handle_import_start", "Bulk import begin import on '%s'.\n", suffix); out: slapi_sdn_free(&sdn); return; }