From 0995060504bf4d87f2be09dc7a8b59acc02a2c8f Mon Sep 17 00:00:00 2001 From: Ludwig Krispenz Date: Jun 15 2020 07:23:45 +0000 Subject: Ticket 51152 - add changelog config to backup Bug: there is no chchangelog info in a backup Fix: add a config info file Reviewed by: ? --- diff --git a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_import_threads.c b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_import_threads.c index 3108938..ed16ddb 100644 --- a/ldap/servers/slapd/back-ldbm/db-bdb/bdb_import_threads.c +++ b/ldap/servers/slapd/back-ldbm/db-bdb/bdb_import_threads.c @@ -3513,8 +3513,10 @@ ldbm_back_wire_import(Slapi_PBlock *pb) */ #define DSE_INDEX "dse_index.ldif" #define DSE_INSTANCE "dse_instance.ldif" +#define DSE_CHANGELOG "dse_changelog.ldif" #define DSE_INDEX_FILTER "(objectclass=nsIndex)" #define DSE_INSTANCE_FILTER "(objectclass=nsBackendInstance)" +#define DSE_CHANGELOG_FILTER "(cn=changelog5)" static int dse_conf_backup_core(struct ldbminfo *li, char *dest_dir, char *file_name, char *filter) { @@ -3524,6 +3526,7 @@ dse_conf_backup_core(struct ldbminfo *li, char *dest_dir, char *file_name, char Slapi_Attr *attr = NULL; char *attr_name; char *filename = NULL; + char *searchbase = NULL; PRFileDesc *prfd = NULL; int rval = 0; int dlen = 0; @@ -3540,14 +3543,10 @@ dse_conf_backup_core(struct ldbminfo *li, char *dest_dir, char *file_name, char slapi_log_err(SLAPI_LOG_TRACE, "dse_conf_backup_core", "(%s): backup file %s\n", filter, filename); - /* Open the file to write */ - if ((prfd = PR_Open(filename, PR_RDWR | PR_CREATE_FILE | PR_TRUNCATE, - SLAPD_DEFAULT_FILE_MODE)) == NULL) { - slapi_log_err(SLAPI_LOG_ERR, "dse_conf_backup_core", - "(%s): open %s failed: (%s)\n", - filter, filename, slapd_pr_strerror(PR_GetError())); - rval = -1; - goto out; + if (strcmp(filter, DSE_CHANGELOG_FILTER)) { + searchbase = li->li_plugin->plg_dn; + } else { + searchbase = "cn=config"; } srch_pb = slapi_pblock_new(); @@ -3558,10 +3557,27 @@ dse_conf_backup_core(struct ldbminfo *li, char *dest_dir, char *file_name, char goto out; } - slapi_search_internal_set_pb(srch_pb, li->li_plugin->plg_dn, + slapi_search_internal_set_pb(srch_pb, searchbase, LDAP_SCOPE_SUBTREE, filter, NULL, 0, NULL, NULL, li->li_identity, 0); slapi_search_internal_pb(srch_pb); slapi_pblock_get(srch_pb, SLAPI_PLUGIN_INTOP_SEARCH_ENTRIES, &entries); + + if (entries == NULL || entries[0] == NULL) { + /* no entries found, don't write the file */ + rval = 0; + goto out; + } + + /* Open the file to write */ + if ((prfd = PR_Open(filename, PR_RDWR | PR_CREATE_FILE | PR_TRUNCATE, + SLAPD_DEFAULT_FILE_MODE)) == NULL) { + slapi_log_err(SLAPI_LOG_ERR, "dse_conf_backup_core", + "(%s): open %s failed: (%s)\n", + filter, filename, slapd_pr_strerror(PR_GetError())); + rval = -1; + goto out; + } + for (ep = entries; ep != NULL && *ep != NULL; ep++) { int32_t l = strlen(slapi_entry_get_dn_const(*ep)) + 5 /* "dn: \n" */; slapi_log_err(SLAPI_LOG_TRACE, "dse_conf_backup_core", @@ -3663,6 +3679,7 @@ dse_conf_backup(struct ldbminfo *li, char *dest_dir) int rval = 0; rval = dse_conf_backup_core(li, dest_dir, DSE_INSTANCE, DSE_INSTANCE_FILTER); rval += dse_conf_backup_core(li, dest_dir, DSE_INDEX, DSE_INDEX_FILTER); + rval += dse_conf_backup_core(li, dest_dir, DSE_CHANGELOG, DSE_CHANGELOG_FILTER); return rval; }