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); } } }
int ipa_topo_post_add(Slapi_PBlock *pb) { int result = SLAPI_PLUGIN_SUCCESS; int entry_type; Slapi_Entry *add_entry = NULL; slapi_log_error(SLAPI_LOG_PLUGIN, IPA_TOPO_PLUGIN_SUBSYSTEM, "--> ipa_topo_post_add\n"); /* 1. get entry */ slapi_pblock_get(pb,SLAPI_ENTRY_POST_OP,&add_entry); if (add_entry == NULL) { slapi_log_error(SLAPI_LOG_PLUGIN, IPA_TOPO_PLUGIN_SUBSYSTEM, "no entry\n"); return 1; } /* 2. check if it is in scope and type * and if plugin is active */ entry_type = ipa_topo_check_entry_type(add_entry); if (0 == ipa_topo_get_plugin_active() && entry_type != TOPO_DOMLEVEL_ENTRY) { slapi_log_error(SLAPI_LOG_PLUGIN, IPA_TOPO_PLUGIN_SUBSYSTEM, "<-- ipa_topo_post_add - plugin not active\n"); return 0; } switch (entry_type) { case TOPO_CONFIG_ENTRY: /* initialize the shared topology data for a replica */ break; case TOPO_SEGMENT_ENTRY: { TopoReplicaSegment *tsegm; TopoReplica *tconf = ipa_topo_util_get_conf_for_segment(add_entry); char *status; /* TBD check that one node is the current server and * that the other node is also managed by the * shared config. * If all checks pass create the replication agreement */ tsegm = ipa_topo_util_segment_from_entry(tconf, add_entry); status = slapi_entry_attr_get_charptr(add_entry, "ipaReplTopoSegmentStatus"); if (status == NULL || strcasecmp(status,"autogen")) { ipa_topo_util_missing_agmts_add(tconf, tsegm, ipa_topo_get_plugin_hostname()); } /* keep the new segment in tconf data */ ipa_topo_cfg_segment_add(tconf, tsegm); /* TBD: do we know if the replica already has been initialized ? * should the agreement be enabled ? * For now assume everything is ok and enable */ /* check if it is unidirectional and if other direction exists */ ipa_topo_util_segment_merge(tconf, tsegm); slapi_ch_free_string(&status); break; } case TOPO_HOST_ENTRY: { /* add to list of managed hosts */ ipa_topo_cfg_host_add(add_entry); /* we are adding a new master, there could be * a segment which so far was inactive since * the host was not managed */ ipa_topo_util_update_segments_for_host(add_entry); break; } case TOPO_DOMLEVEL_ENTRY: { /* the domain level entry was just added * check and set the level, if plugin gets activated * do initialization. */ char *domlevel = slapi_entry_attr_get_charptr(add_entry, "ipaDomainLevel"); ipa_topo_set_domain_level(domlevel); ipa_topo_util_check_plugin_active(); if (ipa_topo_get_plugin_active()) { ipa_topo_util_start(0); } slapi_ch_free_string(&domlevel); break; } case TOPO_IGNORE_ENTRY: break; } slapi_log_error(SLAPI_LOG_PLUGIN, IPA_TOPO_PLUGIN_SUBSYSTEM, "<-- ipa_topo_post_add\n"); return result; }
int ipa_topo_post_mod(Slapi_PBlock *pb) { int result = SLAPI_PLUGIN_SUCCESS; int entry_type; Slapi_Entry *mod_entry = NULL; slapi_log_error(SLAPI_LOG_PLUGIN, IPA_TOPO_PLUGIN_SUBSYSTEM, "--> ipa_topo_post_mod\n"); /* 1. get entry */ slapi_pblock_get(pb,SLAPI_ENTRY_POST_OP,&mod_entry); if (mod_entry == NULL) { slapi_log_error(SLAPI_LOG_PLUGIN, IPA_TOPO_PLUGIN_SUBSYSTEM, "no entry\n"); return (1); } /* 2. check if it is in scope */ entry_type = ipa_topo_check_entry_type(mod_entry); if (0 == ipa_topo_get_plugin_active() && entry_type != TOPO_DOMLEVEL_ENTRY) { slapi_log_error(SLAPI_LOG_PLUGIN, IPA_TOPO_PLUGIN_SUBSYSTEM, "<-- ipa_topo_post_mod - plugin not active\n"); return 0; } switch (entry_type) { case TOPO_CONFIG_ENTRY: break; case TOPO_SEGMENT_ENTRY: { LDAPMod **mods; TopoReplica *tconf = ipa_topo_util_get_conf_for_segment(mod_entry); TopoReplicaSegment *tsegm; tsegm = ipa_topo_util_find_segment(tconf, mod_entry); if (tsegm == NULL) { slapi_log_error(SLAPI_LOG_FATAL, IPA_TOPO_PLUGIN_SUBSYSTEM, "ipa_topo_post_mod - segment to be modified does not exist\n"); break; } slapi_pblock_get(pb, SLAPI_MODIFY_MODS, &mods); ipa_topo_util_segment_update(tconf, tsegm, mods,ipa_topo_get_plugin_hostname()); ipa_topo_util_existing_agmts_update(tconf, tsegm, mods, ipa_topo_get_plugin_hostname()); /* also update local segment in tconf */ break; } case TOPO_DOMLEVEL_ENTRY: { /* the domain level entry was just modified * check and set the level, if plugin gets activated * do initialization. */ char *domlevel = slapi_entry_attr_get_charptr(mod_entry, "ipaDomainLevel"); int already_active = ipa_topo_get_plugin_active(); ipa_topo_set_domain_level(domlevel); ipa_topo_util_check_plugin_active(); if (!already_active && ipa_topo_get_plugin_active()) { ipa_topo_util_start(0); } slapi_ch_free_string(&domlevel); break; } case TOPO_HOST_ENTRY: case TOPO_IGNORE_ENTRY: break; } slapi_log_error(SLAPI_LOG_PLUGIN, IPA_TOPO_PLUGIN_SUBSYSTEM, "<-- ipa_topo_post_mod\n"); return result; }