sysdb_ranges.c revision 6a8999bf933f72923a271831d85a01ef88a81f39
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose System Database - ID ranges related calls
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose Copyright (C) 2012 Sumit Bose <sbose@redhat.com>
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose This program is free software; you can redistribute it and/or modify
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose it under the terms of the GNU General Public License as published by
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose the Free Software Foundation; either version 3 of the License, or
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose (at your option) any later version.
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose This program is distributed in the hope that it will be useful,
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose but WITHOUT ANY WARRANTY; without even the implied warranty of
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose GNU General Public License for more details.
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose You should have received a copy of the GNU General Public License
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose along with this program. If not, see <http://www.gnu.org/licenses/>.
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bosestatic errno_t find_attr_as_uint32_t(const struct ldb_message *msg,
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose val = ldb_msg_find_attr_as_uint64(msg, attr_name, UINT64_MAX);
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Boseerrno_t sysdb_get_ranges(TALLOC_CTX *mem_ctx, struct sysdb_ctx *sysdb,
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose basedn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_TMPL_RANGE_BASE,
6a8999bf933f72923a271831d85a01ef88a81f39Jakub Hrozek list = talloc_zero_array(tmp_ctx, struct range_info *, res->count + 1);
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose tmp_str = ldb_msg_find_attr_as_string(res->msgs[c], SYSDB_NAME, NULL);
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose DEBUG(SSSDBG_MINOR_FAILURE, ("The object [%s] doesn't have a name.\n",
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose tmp_str = ldb_msg_find_attr_as_string(res->msgs[c], SYSDB_DOMAIN_ID,
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose list[c]->trusted_dom_sid = talloc_strdup(list, tmp_str);
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose ret = find_attr_as_uint32_t(res->msgs[c], SYSDB_BASE_ID,
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose DEBUG(SSSDBG_MINOR_FAILURE, ("find_attr_as_uint32_t failed.\n"));
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose ret = find_attr_as_uint32_t(res->msgs[c], SYSDB_ID_RANGE_SIZE,
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose DEBUG(SSSDBG_MINOR_FAILURE, ("find_attr_as_uint32_t failed.\n"));
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose ret = find_attr_as_uint32_t(res->msgs[c], SYSDB_BASE_RID,
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose DEBUG(SSSDBG_MINOR_FAILURE, ("find_attr_as_uint32_t failed.\n"));
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose ret = find_attr_as_uint32_t(res->msgs[c], SYSDB_SECONDARY_BASE_RID,
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose DEBUG(SSSDBG_MINOR_FAILURE, ("find_attr_as_uint32_t failed.\n"));
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Boseerrno_t sysdb_range_create(struct sysdb_ctx *sysdb, struct range_info *range)
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose msg->dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_TMPL_RANGE,
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_OBJECTCLASS,
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose if (range->trusted_dom_sid == NULL && range->secondary_base_rid != 0) {
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_OBJECTCLASS,
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_SECONDARY_BASE_RID,
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_OBJECTCLASS,
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_DOMAIN_ID,
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose DEBUG(SSSDBG_OP_FAILURE, ("Invalid range, expected that either "
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose "the secondary base rid or the SID of the "
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose "trusted domain is set, but not both or "
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose "none of them.\n"));
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose ret = add_string(msg, LDB_FLAG_MOD_ADD, SYSDB_NAME, range->name);
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_BASE_ID,
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_ID_RANGE_SIZE,
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_BASE_RID,
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose ret = add_ulong(msg, LDB_FLAG_MOD_ADD, SYSDB_CREATE_TIME,
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose DEBUG(6, ("Error: %d (%s)\n", ret, strerror(ret)));
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Boseerrno_t sysdb_update_ranges(struct sysdb_ctx *sysdb,
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose /* Retrieve all ranges that are currently in sysdb */
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose ret = sysdb_get_ranges(tmp_ctx, sysdb, &cur_range_count,
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose DEBUG(SSSDBG_OP_FAILURE, ("sysdb_get_ranges failed.\n"));
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose keep_range = talloc_zero_array(tmp_ctx, bool, cur_range_count);
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose DEBUG(SSSDBG_OP_FAILURE, ("talloc_zero_array failed.\n"));
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose DEBUG(SSSDBG_OP_FAILURE, ("sysdb_transaction_start failed.\n"));
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose /* Go through a list of retrieved ranges and:
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose * - if a range already exists in sysdb, mark it for preservation
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose * - if the range doesn't exist in sysdb, create it
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose for (d = 0; d < cur_range_count; d++) {
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose if (strcasecmp(ranges[c]->name, cur_ranges[d]->name) == 0) {
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose /* range already in cache, nothing to do */
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose DEBUG(SSSDBG_TRACE_FUNC, ("Adding range [%s].\n", ranges[c]->name));
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose DEBUG(SSSDBG_OP_FAILURE, ("sysdb_range_create failed.\n"));
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose /* Now delete all ranges that have been in sysdb prior to
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose * refreshing the list and are not marked for preservation
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose * (i.e. they are not in the new list of ranges)
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose for (d = 0; d < cur_range_count; d++) {
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose DEBUG(SSSDBG_TRACE_FUNC, ("Removing range [%s].\n",
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_TMPL_RANGE,
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose DEBUG(SSSDBG_OP_FAILURE, ("sysdb_delete_entry failed.\n"));
3a59cbd0b7b9c5dd3c62ac1679876070c264d80fMichal Zidek DEBUG(SSSDBG_CRIT_FAILURE, ("Could not commit transaction\n"));
386a66b1aa18a176e6a06fa126556c9590c373b6Sumit Bose DEBUG(SSSDBG_CRIT_FAILURE, ("Could not cancel transaction\n"));