sysdb_upgrade.c revision 46675b5033169e1e954cd570413ce85b2c5e11fc
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher/*
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher SSSD
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher Authors:
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher Simo Sorce <ssorce@redhat.com>
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher Stephen Gallagher <sgallagh@redhat.com>
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher Copyright (C) 2008-2011 Simo Sorce <ssorce@redhat.com>
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher Copyright (C) 2008-2011 Stephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher This program is free software; you can redistribute it and/or modify
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher it under the terms of the GNU General Public License as published by
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher the Free Software Foundation; either version 3 of the License, or
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher (at your option) any later version.
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher This program is distributed in the hope that it will be useful,
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher but WITHOUT ANY WARRANTY; without even the implied warranty of
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher GNU General Public License for more details.
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher You should have received a copy of the GNU General Public License
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher along with this program. If not, see <http://www.gnu.org/licenses/>.
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher*/
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher#include "util/util.h"
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher#include "db/sysdb_private.h"
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek#include "db/sysdb_autofs.h"
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorcestruct upgrade_ctx {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce struct ldb_context *ldb;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce const char *new_version;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce};
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorcestatic errno_t commence_upgrade(TALLOC_CTX *mem_ctx, struct ldb_context *ldb,
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce const char *new_ver, struct upgrade_ctx **_ctx)
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce{
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce struct upgrade_ctx *ctx;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce int ret;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce DEBUG(SSSDBG_CRIT_FAILURE, ("UPGRADING DB TO VERSION %s\n", new_ver));
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ctx = talloc(mem_ctx, struct upgrade_ctx);
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce if (!ctx) {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce return ENOMEM;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce }
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ctx->ldb = ldb;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ctx->new_version = new_ver;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = ldb_transaction_start(ldb);
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce if (ret != LDB_SUCCESS) {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = EIO;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce goto done;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce }
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = EOK;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorcedone:
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce if (ret != EOK) {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce talloc_free(ctx);
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce } else {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce *_ctx = ctx;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce }
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce return ret;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce}
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorcestatic errno_t update_version(struct upgrade_ctx *ctx)
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce{
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce struct ldb_message *msg = NULL;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce errno_t ret;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce msg = ldb_msg_new(ctx);
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce if (!msg) {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = ENOMEM;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce goto done;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce }
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce msg->dn = ldb_dn_new(msg, ctx->ldb, SYSDB_BASE);
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce if (!msg->dn) {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = ENOMEM;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce goto done;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce }
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = ldb_msg_add_empty(msg, "version", LDB_FLAG_MOD_REPLACE, NULL);
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce if (ret != LDB_SUCCESS) {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = ENOMEM;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce goto done;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce }
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = ldb_msg_add_string(msg, "version", ctx->new_version);
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce if (ret != LDB_SUCCESS) {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = ENOMEM;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce goto done;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce }
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = ldb_modify(ctx->ldb, msg);
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce if (ret != LDB_SUCCESS) {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = sysdb_error_to_errno(ret);
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce goto done;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce }
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = EOK;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorcedone:
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce talloc_free(msg);
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce return ret;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce}
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorcestatic int finish_upgrade(int ret, struct upgrade_ctx **ctx, const char **ver)
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher{
cff916f5352fe7c3a679571130090efdb935618aStephen Gallagher int lret;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret == EOK) {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce lret = ldb_transaction_commit((*ctx)->ldb);
cff916f5352fe7c3a679571130090efdb935618aStephen Gallagher ret = sysdb_error_to_errno(lret);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret == EOK) {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce *ver = (*ctx)->new_version;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != EOK) {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce lret = ldb_transaction_cancel((*ctx)->ldb);
cff916f5352fe7c3a679571130090efdb935618aStephen Gallagher if (lret != LDB_SUCCESS) {
cff916f5352fe7c3a679571130090efdb935618aStephen Gallagher DEBUG(SSSDBG_CRIT_FAILURE,
cff916f5352fe7c3a679571130090efdb935618aStephen Gallagher ("Could not cancel transaction! [%s]\n",
cff916f5352fe7c3a679571130090efdb935618aStephen Gallagher ldb_strerror(lret)));
cff916f5352fe7c3a679571130090efdb935618aStephen Gallagher /* Do not overwrite ret here, we want to return
cff916f5352fe7c3a679571130090efdb935618aStephen Gallagher * the original failure, not the failure of the
cff916f5352fe7c3a679571130090efdb935618aStephen Gallagher * transaction cancellation.
cff916f5352fe7c3a679571130090efdb935618aStephen Gallagher */
cff916f5352fe7c3a679571130090efdb935618aStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce talloc_zfree(*ctx);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher return ret;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher}
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher/* serach all groups that have a memberUid attribute.
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher * change it into a member attribute for a user of same domain.
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher * remove the memberUid attribute
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher * add the new member attribute
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher * finally stop indexing memberUid
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher * upgrade version to 0.2
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagherint sysdb_upgrade_01(struct ldb_context *ldb, const char **ver)
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher{
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher struct ldb_message_element *el;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher struct ldb_result *res;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher struct ldb_dn *basedn;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher struct ldb_dn *mem_dn;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher struct ldb_message *msg;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher const struct ldb_val *val;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher const char *filter = "(&(memberUid=*)(objectclass=group))";
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher const char *attrs[] = { "memberUid", NULL };
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher const char *mdn;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher char *domain;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher int ret, i, j;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher TALLOC_CTX *tmp_ctx;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce struct upgrade_ctx *ctx;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher tmp_ctx = talloc_new(NULL);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!tmp_ctx) {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce return ENOMEM;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce }
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = commence_upgrade(tmp_ctx, ldb, SYSDB_VERSION_0_2, &ctx);
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce if (ret) {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce talloc_free(tmp_ctx);
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce return ret;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher basedn = ldb_dn_new(tmp_ctx, ldb, SYSDB_BASE);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!basedn) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = EIO;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_search(ldb, tmp_ctx, &res,
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher basedn, LDB_SCOPE_SUBTREE,
87c9241da76f8a7c93095649b2c09a2a07190a36Krzysztof Klimonda attrs, "%s", filter);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = EIO;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher for (i = 0; i < res->count; i++) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher el = ldb_msg_find_element(res->msgs[i], "memberUid");
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!el) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher DEBUG(1, ("memberUid is missing from message [%s], skipping\n",
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ldb_dn_get_linearized(res->msgs[i]->dn)));
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher continue;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* create modification message */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher msg = ldb_msg_new(tmp_ctx);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!msg) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher msg->dn = res->msgs[i]->dn;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_msg_add_empty(msg, "memberUid", LDB_FLAG_MOD_DELETE, NULL);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_msg_add_empty(msg, SYSDB_MEMBER, LDB_FLAG_MOD_ADD, NULL);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* get domain name component value */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher val = ldb_dn_get_component_val(res->msgs[i]->dn, 2);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher domain = talloc_strndup(tmp_ctx, (const char *)val->data, val->length);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!domain) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher for (j = 0; j < el->num_values; j++) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher mem_dn = ldb_dn_new_fmt(tmp_ctx, ldb, SYSDB_TMPL_USER,
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher (const char *)el->values[j].data, domain);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!mem_dn) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher mdn = talloc_strdup(msg, ldb_dn_get_linearized(mem_dn));
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!mdn) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_msg_add_string(msg, SYSDB_MEMBER, mdn);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher talloc_zfree(mem_dn);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* ok now we are ready to modify the entry */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_modify(ldb, msg);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = sysdb_error_to_errno(ret);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher talloc_zfree(msg);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce /* conversion done, update version number */
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = update_version(ctx);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagherdone:
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = finish_upgrade(ret, &ctx, ver);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher talloc_free(tmp_ctx);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher return ret;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher}
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagherint sysdb_check_upgrade_02(struct sss_domain_info *domains,
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher const char *db_path)
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher{
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher TALLOC_CTX *tmp_ctx = NULL;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher struct ldb_context *ldb;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher char *ldb_file;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher struct sysdb_ctx *sysdb;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher struct sss_domain_info *dom;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher struct ldb_message_element *el;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher struct ldb_message *msg;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher struct ldb_result *res;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher struct ldb_dn *verdn;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher const char *version = NULL;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher bool do_02_upgrade = false;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher bool ctx_trans = false;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher int ret;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher tmp_ctx = talloc_new(NULL);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!tmp_ctx) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher return ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = sysdb_get_db_file(tmp_ctx,
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher "local", "UPGRADE",
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher db_path, &ldb_file);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != EOK) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto exit;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = sysdb_ldb_connect(tmp_ctx, ldb_file, &ldb);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != EOK) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher DEBUG(1, ("sysdb_ldb_connect failed.\n"));
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher return ret;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher verdn = ldb_dn_new(tmp_ctx, ldb, SYSDB_BASE);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!verdn) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = EIO;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto exit;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_search(ldb, tmp_ctx, &res,
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher verdn, LDB_SCOPE_BASE,
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher NULL, NULL);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = EIO;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto exit;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (res->count > 1) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = EIO;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto exit;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (res->count == 1) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher el = ldb_msg_find_element(res->msgs[0], "version");
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (el) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (el->num_values != 1) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = EINVAL;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto exit;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher version = talloc_strndup(tmp_ctx,
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher (char *)(el->values[0].data),
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher el->values[0].length);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!version) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto exit;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (strcmp(version, SYSDB_VERSION) == 0) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* all fine, return */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = EOK;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto exit;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher DEBUG(4, ("Upgrading DB from version: %s\n", version));
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (strcmp(version, SYSDB_VERSION_0_1) == 0) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* convert database */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = sysdb_upgrade_01(ldb, &version);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != EOK) goto exit;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (strcmp(version, SYSDB_VERSION_0_2) == 0) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* need to convert database to split files */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher do_02_upgrade = true;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!do_02_upgrade) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* not a v2 upgrade, return and let the normal code take over any
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher * further upgrade */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = EOK;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto exit;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* == V2->V3 UPGRADE == */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher DEBUG(0, ("UPGRADING DB TO VERSION %s\n", SYSDB_VERSION_0_3));
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* ldb uses posix locks,
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher * posix is stupid and kills all locks when you close *any* file
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher * descriptor associated to the same file.
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher * Therefore we must close and reopen the ldb file here */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* == Backup and reopen ldb == */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* close */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher talloc_zfree(ldb);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* backup*/
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = backup_file(ldb_file, 0);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != EOK) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto exit;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* reopen */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = sysdb_ldb_connect(tmp_ctx, ldb_file, &ldb);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != EOK) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher DEBUG(1, ("sysdb_ldb_connect failed.\n"));
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher return ret;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* open a transaction */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_transaction_start(ldb);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher DEBUG(1, ("Failed to start ldb transaction! (%d)\n", ret));
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = EIO;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto exit;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* == Upgrade contents == */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher for (dom = domains; dom; dom = dom->next) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher struct ldb_dn *domain_dn;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher struct ldb_dn *users_dn;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher struct ldb_dn *groups_dn;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher int i;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* skip local */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (strcasecmp(dom->provider, "local") == 0) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher continue;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* create new dom db */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = sysdb_domain_init_internal(tmp_ctx, dom,
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher db_path, false, &sysdb);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != EOK) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_transaction_start(sysdb->ldb);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher DEBUG(1, ("Failed to start ldb transaction! (%d)\n", ret));
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = EIO;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ctx_trans = true;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* search all entries for this domain in local,
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher * copy them all in the new database,
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher * then remove them from local */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher domain_dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
46675b5033169e1e954cd570413ce85b2c5e11fcSimo Sorce SYSDB_DOM_BASE, dom->name);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!domain_dn) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_search(ldb, tmp_ctx, &res,
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher domain_dn, LDB_SCOPE_SUBTREE,
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher NULL, NULL);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = EIO;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher users_dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
46675b5033169e1e954cd570413ce85b2c5e11fcSimo Sorce SYSDB_TMPL_USER_BASE, dom->name);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!users_dn) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher groups_dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
46675b5033169e1e954cd570413ce85b2c5e11fcSimo Sorce SYSDB_TMPL_GROUP_BASE, dom->name);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!groups_dn) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher for (i = 0; i < res->count; i++) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher struct ldb_dn *orig_dn;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher msg = res->msgs[i];
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* skip pre-created congtainers */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if ((ldb_dn_compare(msg->dn, domain_dn) == 0) ||
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher (ldb_dn_compare(msg->dn, users_dn) == 0) ||
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher (ldb_dn_compare(msg->dn, groups_dn) == 0)) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher continue;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* regenerate the DN against the new ldb as it may have different
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher * casefolding rules (example: name changing from case insensitive
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher * to case sensitive) */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher orig_dn = msg->dn;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher msg->dn = ldb_dn_new(msg, sysdb->ldb,
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ldb_dn_get_linearized(orig_dn));
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!msg->dn) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_add(sysdb->ldb, msg);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher DEBUG(0, ("WARNING: Could not add entry %s,"
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher " to new ldb file! (%d [%s])\n",
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ldb_dn_get_linearized(msg->dn),
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret, ldb_errstring(sysdb->ldb)));
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_delete(ldb, orig_dn);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher DEBUG(0, ("WARNING: Could not remove entry %s,"
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher " from old ldb file! (%d [%s])\n",
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ldb_dn_get_linearized(orig_dn),
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret, ldb_errstring(ldb)));
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* now remove the basic containers from local */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* these were optional so debug at level 9 in case
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher * of failure just for tracing */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_delete(ldb, groups_dn);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher DEBUG(9, ("WARNING: Could not remove entry %s,"
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher " from old ldb file! (%d [%s])\n",
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ldb_dn_get_linearized(groups_dn),
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret, ldb_errstring(ldb)));
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_delete(ldb, users_dn);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher DEBUG(9, ("WARNING: Could not remove entry %s,"
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher " from old ldb file! (%d [%s])\n",
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ldb_dn_get_linearized(users_dn),
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret, ldb_errstring(ldb)));
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_delete(ldb, domain_dn);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher DEBUG(9, ("WARNING: Could not remove entry %s,"
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher " from old ldb file! (%d [%s])\n",
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ldb_dn_get_linearized(domain_dn),
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret, ldb_errstring(ldb)));
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_transaction_commit(sysdb->ldb);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher DEBUG(1, ("Failed to commit ldb transaction! (%d)\n", ret));
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = EIO;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ctx_trans = false;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher talloc_zfree(domain_dn);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher talloc_zfree(groups_dn);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher talloc_zfree(users_dn);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher talloc_zfree(res);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* conversion done, upgrade version number */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher msg = ldb_msg_new(tmp_ctx);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!msg) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher msg->dn = ldb_dn_new(tmp_ctx, ldb, SYSDB_BASE);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!msg->dn) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_msg_add_empty(msg, "version", LDB_FLAG_MOD_REPLACE, NULL);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_msg_add_string(msg, "version", SYSDB_VERSION_0_3);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_modify(ldb, msg);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = sysdb_error_to_errno(ret);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_transaction_commit(ldb);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher DEBUG(1, ("Failed to commit ldb transaction! (%d)\n", ret));
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = EIO;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto exit;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = EOK;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagherdone:
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != EOK) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ctx_trans) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_transaction_cancel(sysdb->ldb);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher DEBUG(1, ("Failed to cancel ldb transaction! (%d)\n", ret));
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_transaction_cancel(ldb);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher DEBUG(1, ("Failed to cancel ldb transaction! (%d)\n", ret));
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagherexit:
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher talloc_free(tmp_ctx);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher return ret;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher}
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagherint sysdb_upgrade_03(struct sysdb_ctx *sysdb, const char **ver)
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher{
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher TALLOC_CTX *tmp_ctx;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher int ret;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher struct ldb_message *msg;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce struct upgrade_ctx *ctx;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher tmp_ctx = talloc_new(NULL);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!tmp_ctx) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher return ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = commence_upgrade(sysdb, sysdb->ldb, SYSDB_VERSION_0_4, &ctx);
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce if (ret) {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce return ret;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* Make this database case-sensitive */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher msg = ldb_msg_new(tmp_ctx);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!msg) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher msg->dn = ldb_dn_new(tmp_ctx, sysdb->ldb, "@ATTRIBUTES");
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!msg->dn) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_msg_add_empty(msg, "name", LDB_FLAG_MOD_DELETE, NULL);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_modify(sysdb->ldb, msg);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = sysdb_error_to_errno(ret);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce /* conversion done, update version number */
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = update_version(ctx);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagherdone:
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = finish_upgrade(ret, &ctx, ver);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher talloc_free(tmp_ctx);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher return ret;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher}
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagherint sysdb_upgrade_04(struct sysdb_ctx *sysdb, const char **ver)
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher{
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher TALLOC_CTX *tmp_ctx;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher int ret;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher struct ldb_message *msg;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce struct upgrade_ctx *ctx;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher tmp_ctx = talloc_new(NULL);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!tmp_ctx) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher return ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = commence_upgrade(sysdb, sysdb->ldb, SYSDB_VERSION_0_5, &ctx);
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce if (ret) {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce return ret;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* Add new index */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher msg = ldb_msg_new(tmp_ctx);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!msg) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher msg->dn = ldb_dn_new(tmp_ctx, sysdb->ldb, "@INDEXLIST");
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!msg->dn) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_msg_add_empty(msg, "@IDXATTR", LDB_FLAG_MOD_ADD, NULL);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_msg_add_string(msg, "@IDXATTR", "originalDN");
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_modify(sysdb->ldb, msg);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = sysdb_error_to_errno(ret);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* Rebuild memberuid and memberoif attributes */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher msg = ldb_msg_new(tmp_ctx);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!msg) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher msg->dn = ldb_dn_new(tmp_ctx, sysdb->ldb, "@MEMBEROF-REBUILD");
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!msg->dn) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_add(sysdb->ldb, msg);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = sysdb_error_to_errno(ret);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce /* conversion done, update version number */
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = update_version(ctx);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagherdone:
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = finish_upgrade(ret, &ctx, ver);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher talloc_free(tmp_ctx);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher return ret;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher}
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagherint sysdb_upgrade_05(struct sysdb_ctx *sysdb, const char **ver)
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher{
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher TALLOC_CTX *tmp_ctx;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher int ret;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher struct ldb_message *msg;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce struct upgrade_ctx *ctx;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher tmp_ctx = talloc_new(NULL);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!tmp_ctx) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher return ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = commence_upgrade(sysdb, sysdb->ldb, SYSDB_VERSION_0_6, &ctx);
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce if (ret) {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce return ret;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* Add new indexes */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher msg = ldb_msg_new(tmp_ctx);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!msg) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher msg->dn = ldb_dn_new(tmp_ctx, sysdb->ldb, "@INDEXLIST");
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!msg->dn) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* Add Index for dataExpireTimestamp */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_msg_add_empty(msg, "@IDXATTR", LDB_FLAG_MOD_ADD, NULL);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_msg_add_string(msg, "@IDXATTR", "dataExpireTimestamp");
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* Add index to speed up ONELEVEL searches */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_msg_add_empty(msg, "@IDXONE", LDB_FLAG_MOD_ADD, NULL);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_msg_add_string(msg, "@IDXONE", "1");
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_modify(sysdb->ldb, msg);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = sysdb_error_to_errno(ret);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce /* conversion done, update version number */
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = update_version(ctx);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagherdone:
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = finish_upgrade(ret, &ctx, ver);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher talloc_free(tmp_ctx);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher return ret;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher}
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagherint sysdb_upgrade_06(struct sysdb_ctx *sysdb, const char **ver)
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher{
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher TALLOC_CTX *tmp_ctx;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher int ret;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher struct ldb_message *msg;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce struct upgrade_ctx *ctx;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher tmp_ctx = talloc_new(NULL);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!tmp_ctx) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher return ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = commence_upgrade(sysdb, sysdb->ldb, SYSDB_VERSION_0_7, &ctx);
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce if (ret) {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce return ret;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* Add new indexes */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher msg = ldb_msg_new(tmp_ctx);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!msg) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher msg->dn = ldb_dn_new(tmp_ctx, sysdb->ldb, "@ATTRIBUTES");
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (!msg->dn) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher /* Case insensitive search for originalDN */
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_msg_add_empty(msg, SYSDB_ORIG_DN, LDB_FLAG_MOD_ADD, NULL);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_msg_add_string(msg, SYSDB_ORIG_DN, "CASE_INSENSITIVE");
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ENOMEM;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = ldb_modify(sysdb->ldb, msg);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher if (ret != LDB_SUCCESS) {
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher ret = sysdb_error_to_errno(ret);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher goto done;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher }
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce /* conversion done, update version number */
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = update_version(ctx);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagherdone:
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = finish_upgrade(ret, &ctx, ver);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher talloc_free(tmp_ctx);
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher return ret;
c2352a73f52f600d95966ebe0b0819649ba923faStephen Gallagher}
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher
0387564f38698c5301b76b24eda000c448174171Stephen Gallagherint sysdb_upgrade_07(struct sysdb_ctx *sysdb, const char **ver)
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher{
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher TALLOC_CTX *tmp_ctx;
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher int ret;
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher struct ldb_message *msg;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce struct upgrade_ctx *ctx;
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher tmp_ctx = talloc_new(NULL);
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher if (!tmp_ctx) {
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher return ENOMEM;
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher }
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = commence_upgrade(sysdb, sysdb->ldb, SYSDB_VERSION_0_8, &ctx);
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce if (ret) {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce return ret;
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher }
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher /* Add new indexes */
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher msg = ldb_msg_new(tmp_ctx);
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher if (!msg) {
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher ret = ENOMEM;
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher goto done;
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher }
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher msg->dn = ldb_dn_new(tmp_ctx, sysdb->ldb, "@INDEXLIST");
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher if (!msg->dn) {
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher ret = ENOMEM;
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher goto done;
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher }
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher /* Add Index for nameAlias */
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher ret = ldb_msg_add_empty(msg, "@IDXATTR", LDB_FLAG_MOD_ADD, NULL);
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher if (ret != LDB_SUCCESS) {
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher ret = ENOMEM;
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher goto done;
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher }
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher ret = ldb_msg_add_string(msg, "@IDXATTR", "nameAlias");
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher if (ret != LDB_SUCCESS) {
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher ret = ENOMEM;
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher goto done;
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher }
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher ret = ldb_modify(sysdb->ldb, msg);
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher if (ret != LDB_SUCCESS) {
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher ret = sysdb_error_to_errno(ret);
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher goto done;
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher }
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce /* conversion done, update version number */
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = update_version(ctx);
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher
0387564f38698c5301b76b24eda000c448174171Stephen Gallagherdone:
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = finish_upgrade(ret, &ctx, ver);
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher talloc_free(tmp_ctx);
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher return ret;
0387564f38698c5301b76b24eda000c448174171Stephen Gallagher}
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagherint sysdb_upgrade_08(struct sysdb_ctx *sysdb, const char **ver)
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher{
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher TALLOC_CTX *tmp_ctx;
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher int ret;
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher struct ldb_message *msg;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce struct upgrade_ctx *ctx;
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher tmp_ctx = talloc_new(NULL);
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher if (!tmp_ctx) {
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher return ENOMEM;
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher }
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = commence_upgrade(sysdb, sysdb->ldb, SYSDB_VERSION_0_9, &ctx);
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce if (ret) {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce return ret;
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher }
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher /* Add new indexes */
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher msg = ldb_msg_new(tmp_ctx);
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher if (!msg) {
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher ret = ENOMEM;
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher goto done;
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher }
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher msg->dn = ldb_dn_new(tmp_ctx, sysdb->ldb, "@INDEXLIST");
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher if (!msg->dn) {
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher ret = ENOMEM;
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher goto done;
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher }
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher /* Add Index for servicePort and serviceProtocol */
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher ret = ldb_msg_add_empty(msg, "@IDXATTR", LDB_FLAG_MOD_ADD, NULL);
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher if (ret != LDB_SUCCESS) {
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher ret = ENOMEM;
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher goto done;
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher }
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher ret = ldb_msg_add_string(msg, "@IDXATTR", "servicePort");
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher if (ret != LDB_SUCCESS) {
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher ret = ENOMEM;
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher goto done;
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher }
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher ret = ldb_msg_add_string(msg, "@IDXATTR", "serviceProtocol");
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher if (ret != LDB_SUCCESS) {
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher ret = ENOMEM;
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher goto done;
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher }
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher ret = ldb_modify(sysdb->ldb, msg);
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher if (ret != LDB_SUCCESS) {
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher ret = sysdb_error_to_errno(ret);
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher goto done;
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher }
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce /* conversion done, update version number */
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = update_version(ctx);
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagherdone:
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = finish_upgrade(ret, &ctx, ver);
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher talloc_free(tmp_ctx);
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher return ret;
ff907ba7a9b5e429de086515642f97a0447e546aStephen Gallagher}
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozekint sysdb_upgrade_09(struct sysdb_ctx *sysdb, const char **ver)
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek{
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek TALLOC_CTX *tmp_ctx;
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek int ret;
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek struct ldb_message *msg;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce struct upgrade_ctx *ctx;
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek tmp_ctx = talloc_new(NULL);
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek if (!tmp_ctx) {
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek return ENOMEM;
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek }
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = commence_upgrade(sysdb, sysdb->ldb, SYSDB_VERSION_0_10, &ctx);
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce if (ret) {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce return ret;
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek }
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek /* Add new indexes */
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek msg = ldb_msg_new(tmp_ctx);
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek if (!msg) {
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek ret = ENOMEM;
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek goto done;
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek }
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek msg->dn = ldb_dn_new(tmp_ctx, sysdb->ldb, "@INDEXLIST");
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek if (!msg->dn) {
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek ret = ENOMEM;
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek goto done;
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek }
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek /* Add Index for servicePort and serviceProtocol */
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek ret = ldb_msg_add_empty(msg, "@IDXATTR", LDB_FLAG_MOD_ADD, NULL);
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek if (ret != LDB_SUCCESS) {
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek ret = ENOMEM;
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek goto done;
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek }
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek ret = ldb_msg_add_string(msg, "@IDXATTR", "sudoUser");
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek if (ret != LDB_SUCCESS) {
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek ret = ENOMEM;
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek goto done;
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek }
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek ret = ldb_modify(sysdb->ldb, msg);
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek if (ret != LDB_SUCCESS) {
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek ret = sysdb_error_to_errno(ret);
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek goto done;
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek }
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce /* conversion done, update version number */
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = update_version(ctx);
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozekdone:
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = finish_upgrade(ret, &ctx, ver);
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek talloc_free(tmp_ctx);
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek return ret;
25a9a1768d2e3587cc68b76a0a5df1e42a2c89abJakub Hrozek}
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny
46675b5033169e1e954cd570413ce85b2c5e11fcSimo Sorceint sysdb_upgrade_10(struct sysdb_ctx *sysdb, struct sss_domain_info *domain,
46675b5033169e1e954cd570413ce85b2c5e11fcSimo Sorce const char **ver)
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny{
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny TALLOC_CTX *tmp_ctx;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny int ret;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny struct ldb_result *res;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny struct ldb_message *msg;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny struct ldb_message *user;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny struct ldb_message_element *memberof_el;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny const char *name;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny struct ldb_dn *basedn;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny const char *filter = "(&(objectClass=user)(!(uidNumber=*))(memberOf=*))";
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny const char *attrs[] = { "name", "memberof", NULL };
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce struct upgrade_ctx *ctx;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny int i, j;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny tmp_ctx = talloc_new(NULL);
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny if (tmp_ctx == NULL) {
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny return ENOMEM;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny }
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = commence_upgrade(sysdb, sysdb->ldb, SYSDB_VERSION_0_11, &ctx);
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce if (ret) {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce return ret;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce }
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce
46675b5033169e1e954cd570413ce85b2c5e11fcSimo Sorce basedn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb,
46675b5033169e1e954cd570413ce85b2c5e11fcSimo Sorce SYSDB_TMPL_USER_BASE, domain->name);
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny if (basedn == NULL) {
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny ret = EIO;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny goto done;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny }
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny ret = ldb_search(sysdb->ldb, tmp_ctx, &res, basedn, LDB_SCOPE_SUBTREE,
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny attrs, "%s", filter);
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny if (ret != LDB_SUCCESS) {
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny ret = EIO;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny goto done;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny }
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny for (i = 0; i < res->count; i++) {
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny user = res->msgs[i];
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny memberof_el = ldb_msg_find_element(user, "memberof");
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny name = ldb_msg_find_attr_as_string(user, "name", NULL);
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny if (name == NULL) {
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny ret = EIO;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny goto done;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny }
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny
3cf417b8502f5af34e6680f12a3365bcdd9fa40dJakub Hrozek DEBUG(SSSDBG_TRACE_LIBS, ("User [%s] is a member of %d groups\n",
3cf417b8502f5af34e6680f12a3365bcdd9fa40dJakub Hrozek name, memberof_el->num_values));
3cf417b8502f5af34e6680f12a3365bcdd9fa40dJakub Hrozek
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny for (j = 0; j < memberof_el->num_values; j++) {
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny msg = ldb_msg_new(tmp_ctx);
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny if (msg == NULL) {
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny ret = ENOMEM;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny goto done;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny }
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny msg->dn = ldb_dn_from_ldb_val(tmp_ctx, sysdb->ldb, &memberof_el->values[j]);
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny if (msg->dn == NULL) {
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny ret = ENOMEM;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny goto done;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny }
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny if (!ldb_dn_validate(msg->dn)) {
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny DEBUG(SSSDBG_MINOR_FAILURE, ("DN validation failed during "
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny "upgrade: [%s]\n",
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny memberof_el->values[j].data));
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny talloc_zfree(msg);
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny continue;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny }
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny ret = ldb_msg_add_empty(msg, "ghost", LDB_FLAG_MOD_ADD, NULL);
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny if (ret != LDB_SUCCESS) {
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny ret = ENOMEM;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny goto done;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny }
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny ret = ldb_msg_add_string(msg, "ghost", name);
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny if (ret != LDB_SUCCESS) {
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny ret = ENOMEM;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny goto done;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny }
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny
3cf417b8502f5af34e6680f12a3365bcdd9fa40dJakub Hrozek DEBUG(SSSDBG_TRACE_FUNC, ("Adding ghost [%s] to entry [%s]\n",
3cf417b8502f5af34e6680f12a3365bcdd9fa40dJakub Hrozek name, ldb_dn_get_linearized(msg->dn)));
3cf417b8502f5af34e6680f12a3365bcdd9fa40dJakub Hrozek
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny ret = ldb_modify(sysdb->ldb, msg);
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny talloc_zfree(msg);
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny if (ret != LDB_SUCCESS) {
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny ret = sysdb_error_to_errno(ret);
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny goto done;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny }
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny }
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny
3cf417b8502f5af34e6680f12a3365bcdd9fa40dJakub Hrozek DEBUG(SSSDBG_TRACE_FUNC, ("Removing fake user [%s]\n",
3cf417b8502f5af34e6680f12a3365bcdd9fa40dJakub Hrozek ldb_dn_get_linearized(user->dn)));
3cf417b8502f5af34e6680f12a3365bcdd9fa40dJakub Hrozek
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny ret = ldb_delete(sysdb->ldb, user->dn);
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny if (ret != LDB_SUCCESS) {
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny ret = sysdb_error_to_errno(ret);
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny goto done;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny }
7733e4179f56fb0ca41788b5d8de2ee1130b1badJakub Hrozek }
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce /* conversion done, update version number */
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = update_version(ctx);
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zelenydone:
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = finish_upgrade(ret, &ctx, ver);
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny talloc_free(tmp_ctx);
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny return ret;
c193cdcb43bffc1eac1bde6dfb0311e033e0c12fJan Zeleny}
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek
46675b5033169e1e954cd570413ce85b2c5e11fcSimo Sorceint sysdb_upgrade_11(struct sysdb_ctx *sysdb, struct sss_domain_info *domain,
46675b5033169e1e954cd570413ce85b2c5e11fcSimo Sorce const char **ver)
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek{
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek TALLOC_CTX *tmp_ctx;
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek errno_t ret;
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek struct ldb_result *res;
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek struct ldb_message *entry;
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek const char *key;
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek const char *value;
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek struct ldb_message_element *memberof_el;
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek struct ldb_dn *memberof_dn;
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek struct ldb_dn *basedn;
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek const struct ldb_val *val;
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek const char *attrs[] = { SYSDB_AUTOFS_ENTRY_KEY,
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek SYSDB_AUTOFS_ENTRY_VALUE,
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek SYSDB_MEMBEROF,
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek NULL };
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce struct upgrade_ctx *ctx;
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek size_t i, j;
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek tmp_ctx = talloc_new(NULL);
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek if (!tmp_ctx) {
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek return ENOMEM;
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek }
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = commence_upgrade(sysdb, sysdb->ldb, SYSDB_VERSION_0_12, &ctx);
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce if (ret) {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce return ret;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce }
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek basedn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_TMPL_CUSTOM_SUBTREE,
46675b5033169e1e954cd570413ce85b2c5e11fcSimo Sorce AUTOFS_ENTRY_SUBDIR, domain->name);
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek if (basedn == NULL) {
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek ret = ENOMEM;
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek goto done;
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek }
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek ret = ldb_search(sysdb->ldb, tmp_ctx, &res, basedn, LDB_SCOPE_SUBTREE,
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek attrs, "(objectClass=%s)", SYSDB_AUTOFS_ENTRY_OC);
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek if (ret != LDB_SUCCESS) {
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek ret = EIO;
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek goto done;
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek }
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek DEBUG(SSSDBG_TRACE_LIBS, ("Found %d autofs entries\n", res->count));
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek for (i = 0; i < res->count; i++) {
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek entry = res->msgs[i];
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek key = ldb_msg_find_attr_as_string(entry,
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek SYSDB_AUTOFS_ENTRY_KEY, NULL);
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek value = ldb_msg_find_attr_as_string(entry,
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek SYSDB_AUTOFS_ENTRY_VALUE, NULL);
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek memberof_el = ldb_msg_find_element(entry, SYSDB_MEMBEROF);
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek if (key && value && memberof_el) {
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek for (j = 0; j < memberof_el->num_values; j++) {
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek memberof_dn = ldb_dn_from_ldb_val(tmp_ctx, sysdb->ldb,
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek &(memberof_el->values[j]));
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek if (!memberof_dn) {
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("Cannot convert memberof into DN, skipping\n"));
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek continue;
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek }
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek val = ldb_dn_get_rdn_val(memberof_dn);
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek if (!val) {
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("Cannot get map name from map DN\n"));
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek continue;
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek }
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek
46675b5033169e1e954cd570413ce85b2c5e11fcSimo Sorce ret = sysdb_save_autofsentry(sysdb, domain,
2913240aee51ce81195148a4d814e967f66839c4Simo Sorce (const char *) val->data,
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek key, value, NULL);
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek if (ret != EOK) {
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE,
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek ("Cannot save autofs entry [%s]-[%s] into map %s\n",
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek key, value, val->data));
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek continue;
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek }
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek }
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek }
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek /* Delete the old entry if it was either processed or incomplete */
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek DEBUG(SSSDBG_TRACE_LIBS, ("Deleting [%s]\n",
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek ldb_dn_get_linearized(entry->dn)));
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek ret = ldb_delete(sysdb->ldb, entry->dn);
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek if (ret != EOK) {
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("Cannot delete old autofs entry %s\n",
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek ldb_dn_get_linearized(entry->dn)));
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek continue;
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek }
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek }
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce /* conversion done, update version number */
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = update_version(ctx);
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozekdone:
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = finish_upgrade(ret, &ctx, ver);
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek talloc_free(tmp_ctx);
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek return ret;
77f445dbaecc8e792e1ad42e3742800ad141bee0Jakub Hrozek}
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholastaint sysdb_upgrade_12(struct sysdb_ctx *sysdb, const char **ver)
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta{
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta TALLOC_CTX *tmp_ctx;
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta int ret;
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta struct ldb_message *msg;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce struct upgrade_ctx *ctx;
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta tmp_ctx = talloc_new(NULL);
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta if (!tmp_ctx) {
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta return ENOMEM;
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta }
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = commence_upgrade(sysdb, sysdb->ldb, SYSDB_VERSION_0_13, &ctx);
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce if (ret) {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce return ret;
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta }
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta /* add new indexes */
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta msg = ldb_msg_new(tmp_ctx);
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta if (!msg) {
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta ret = ENOMEM;
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta goto done;
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta }
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta msg->dn = ldb_dn_new(tmp_ctx, sysdb->ldb, "@INDEXLIST");
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta if (!msg->dn) {
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta ret = ENOMEM;
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta goto done;
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta }
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta /* add index for sshKnownHostsExpire */
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta ret = ldb_msg_add_empty(msg, "@IDXATTR", LDB_FLAG_MOD_ADD, NULL);
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta if (ret != LDB_SUCCESS) {
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta ret = ENOMEM;
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta goto done;
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta }
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta ret = ldb_msg_add_string(msg, "@IDXATTR", "sshKnownHostsExpire");
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta if (ret != LDB_SUCCESS) {
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta ret = ENOMEM;
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta goto done;
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta }
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta ret = ldb_modify(sysdb->ldb, msg);
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta if (ret != LDB_SUCCESS) {
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta ret = sysdb_error_to_errno(ret);
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta goto done;
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta }
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce /* conversion done, update version number */
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = update_version(ctx);
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorcedone:
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = finish_upgrade(ret, &ctx, ver);
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce talloc_free(tmp_ctx);
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce return ret;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce}
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorceint sysdb_upgrade_13(struct sysdb_ctx *sysdb, const char **ver)
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce{
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce struct upgrade_ctx *ctx;
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce struct ldb_result *dom_res;
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce struct ldb_result *res;
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce struct ldb_dn *basedn;
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce const char *attrs[] = { "cn", "name", NULL };
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce const char *tmp_str;
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce errno_t ret;
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce int i, j, l, n;
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce ret = commence_upgrade(sysdb, sysdb->ldb, SYSDB_VERSION_0_14, &ctx);
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce if (ret) {
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce return ret;
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce }
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce basedn = ldb_dn_new(ctx, sysdb->ldb, SYSDB_BASE);
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce if (!basedn) {
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce DEBUG(SSSDBG_OP_FAILURE, ("Failed to build base dn\n"));
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce ret = EIO;
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce goto done;
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce }
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce ret = ldb_search(sysdb->ldb, ctx, &dom_res,
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce basedn, LDB_SCOPE_ONELEVEL,
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce attrs, "objectclass=%s", SYSDB_SUBDOMAIN_CLASS);
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce if (ret != LDB_SUCCESS) {
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce DEBUG(SSSDBG_OP_FAILURE, ("Failed to search subdomains\n"));
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce ret = EIO;
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce goto done;
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce }
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce for (i = 0; i < dom_res->count; i++) {
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce tmp_str = ldb_msg_find_attr_as_string(dom_res->msgs[i], "cn", NULL);
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce if (tmp_str == NULL) {
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce DEBUG(SSSDBG_MINOR_FAILURE,
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce ("The object [%s] doesn't have a name\n",
82505163d22f0ce9cc63f22b2cac5d3ca3af0937Michal Zidek ldb_dn_get_linearized(dom_res->msgs[i]->dn)));
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce continue;
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce }
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce basedn = ldb_dn_new_fmt(ctx, sysdb->ldb, SYSDB_DOM_BASE, tmp_str);
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce if (!basedn) {
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce DEBUG(SSSDBG_OP_FAILURE,
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce ("Failed to build base dn for subdomain %s\n", tmp_str));
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce continue;
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce }
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce ret = ldb_search(sysdb->ldb, ctx, &res,
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce basedn, LDB_SCOPE_SUBTREE, attrs, NULL);
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce if (ret != LDB_SUCCESS) {
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce DEBUG(SSSDBG_OP_FAILURE,
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce ("Failed to search subdomain %s\n", tmp_str));
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce talloc_free(basedn);
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce continue;
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce }
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce l = ldb_dn_get_comp_num(basedn);
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce for (j = 0; j < res->count; j++) {
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce n = ldb_dn_get_comp_num(res->msgs[j]->dn);
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce if (n <= l + 1) {
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce /* Do not remove subdomain containers, only their contents */
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce continue;
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce }
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce ret = ldb_delete(sysdb->ldb, res->msgs[j]->dn);
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce if (ret) {
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce DEBUG(SSSDBG_OP_FAILURE,
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce ("Failed to delete %s\n", res->msgs[j]->dn));
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce continue;
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce }
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce }
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce talloc_free(basedn);
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce talloc_free(res);
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce }
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce talloc_free(dom_res);
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce /* conversion done, update version number */
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce ret = update_version(ctx);
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorcedone:
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce ret = finish_upgrade(ret, &ctx, ver);
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce return ret;
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce}
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorceint sysdb_upgrade_14(struct sysdb_ctx *sysdb, const char **ver)
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce{
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce struct upgrade_ctx *ctx;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce struct ldb_message *msg;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce struct ldb_result *res;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce struct ldb_dn *basedn;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce struct ldb_dn *newdn;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce const char *attrs[] = { SYSDB_NAME, NULL };
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce const char *tmp_str;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce errno_t ret;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce int i;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ret = commence_upgrade(sysdb, sysdb->ldb, SYSDB_VERSION_0_15, &ctx);
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce if (ret) {
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce return ret;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce }
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce basedn = ldb_dn_new(ctx, sysdb->ldb, SYSDB_BASE);
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce if (!basedn) {
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce DEBUG(SSSDBG_OP_FAILURE, ("Failed to build base dn\n"));
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ret = EIO;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce goto done;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce }
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce /* create base ranges container */
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce msg = ldb_msg_new(ctx);
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce if (!msg) {
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ret = ENOMEM;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce goto done;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce }
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce msg->dn = ldb_dn_new(msg, sysdb->ldb, SYSDB_TMPL_RANGE_BASE);
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce if (!msg->dn) {
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ret = ENOMEM;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce goto done;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce }
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ret = ldb_msg_add_string(msg, "cn", "ranges");
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce if (ret != LDB_SUCCESS) {
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ret = EIO;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce goto done;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce }
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce /* do a synchronous add */
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ret = ldb_add(sysdb->ldb, msg);
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce if (ret != LDB_SUCCESS) {
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce DEBUG(SSSDBG_FATAL_FAILURE,
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ("Failed to upgrade DB (%d, [%s])!\n",
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ret, ldb_errstring(sysdb->ldb)));
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ret = EIO;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce goto done;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce }
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce talloc_zfree(msg);
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ret = ldb_search(sysdb->ldb, ctx, &res,
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce basedn, LDB_SCOPE_SUBTREE, attrs,
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce "objectclass=%s", SYSDB_ID_RANGE_CLASS);
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce if (ret != LDB_SUCCESS) {
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce DEBUG(SSSDBG_OP_FAILURE, ("Failed to search range objects\n"));
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ret = EIO;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce goto done;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce }
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce /* Failure to convert any range is not fatal. As long as there are no
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce * left-over objects we can fail to move them around, as they will be
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce * recreated on the next online access */
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce for (i = 0; i < res->count; i++) {
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce tmp_str = ldb_msg_find_attr_as_string(res->msgs[i], SYSDB_NAME, NULL);
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce if (tmp_str == NULL) {
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce DEBUG(SSSDBG_OP_FAILURE,
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ("The object [%s] doesn't have a name\n",
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ldb_dn_get_linearized(res->msgs[i]->dn)));
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ret = ldb_delete(sysdb->ldb, res->msgs[i]->dn);
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce if (ret) {
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce DEBUG(SSSDBG_OP_FAILURE,
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ("Failed to delete %s\n", res->msgs[i]->dn));
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ret = EIO;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce goto done;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce }
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce continue;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce }
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce newdn = ldb_dn_new_fmt(ctx, sysdb->ldb, SYSDB_TMPL_RANGE, tmp_str);
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce if (!newdn) {
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce DEBUG(SSSDBG_CRIT_FAILURE,
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ("Failed to create new DN to move [%s]\n",
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ldb_dn_get_linearized(res->msgs[i]->dn)));
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ret = ENOMEM;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce goto done;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce }
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ret = ldb_rename(sysdb->ldb, res->msgs[i]->dn, newdn);
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce if (ret != LDB_SUCCESS) {
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce DEBUG(SSSDBG_CRIT_FAILURE,
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ("Failed to move [%s] to [%s]\n",
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ldb_dn_get_linearized(res->msgs[i]->dn),
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ldb_dn_get_linearized(newdn)));
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ret = ldb_delete(sysdb->ldb, res->msgs[i]->dn);
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce if (ret) {
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce DEBUG(SSSDBG_OP_FAILURE,
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ("Failed to delete %s\n", res->msgs[i]->dn));
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ret = EIO;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce goto done;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce }
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce }
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce talloc_zfree(newdn);
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce }
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce /* conversion done, update version number */
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ret = update_version(ctx);
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorcedone:
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce ret = finish_upgrade(ret, &ctx, ver);
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce return ret;
73120327cc136229d56d08f7f8c5e8df4129c1e3Simo Sorce}
d096233fe7610186ee12f41f97ca9602a3768405Simo Sorce
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce/*
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce * Example template for future upgrades.
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce * Copy and change version numbers as appropriate.
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce */
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce#if 0
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorceint sysdb_upgrade_13(struct sysdb_ctx *sysdb, const char **ver)
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce{
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce struct upgrade_ctx *ctx;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce errno_t ret;
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = commence_upgrade(sysdb, sysdb->ldb, SYSDB_VERSION_0_14, &ctx);
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce if (ret) {
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce return ret;
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta }
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce /* DO STUFF HERE (use ctx, as the local temporary memory context) */
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce /* conversion done, update version number */
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = update_version(ctx);
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholastadone:
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce ret = finish_upgrade(ret, &ctx, ver);
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta return ret;
3882325ff60f89d0c312e9519bdfd1351978fd73Jan Cholasta}
868ae511c9b0d610f83acf8f01975e1f5e3c1aa3Simo Sorce#endif