sss_cache.c revision 95cc95749a5e783f2b5d2124d783f85820baf937
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny/*
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny SSSD
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny sss_cache
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny Copyright (C) Jan Zeleny <jzeleny@redhat.com> 2011
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny This program is free software; you can redistribute it and/or modify
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny it under the terms of the GNU General Public License as published by
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny the Free Software Foundation; either version 3 of the License, or
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny (at your option) any later version.
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny This program is distributed in the hope that it will be useful,
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny but WITHOUT ANY WARRANTY; without even the implied warranty of
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny GNU General Public License for more details.
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny You should have received a copy of the GNU General Public License
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny along with this program. If not, see <http://www.gnu.org/licenses/>.
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny*/
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny#include <stdio.h>
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny#include <stdlib.h>
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny#include <talloc.h>
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny#include <popt.h>
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny#include <sys/types.h>
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny#include "util/util.h"
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny#include "tools/sss_sync_ops.h"
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny#include "db/sysdb.h"
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek#include "db/sysdb_services.h"
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek#include "db/sysdb_autofs.h"
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny#define INVALIDATE_NONE 0
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny#define INVALIDATE_USERS 1
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny#define INVALIDATE_GROUPS 2
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny#define INVALIDATE_NETGROUPS 4
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek#define INVALIDATE_SERVICES 8
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek#define INVALIDATE_AUTOFSMAPS 16
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozekenum sss_cache_entry {
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek TYPE_USER=0,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek TYPE_GROUP,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek TYPE_NETGROUP,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek TYPE_SERVICE,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek TYPE_AUTOFSMAP
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek};
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zelenystruct entry_type_t {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny const char *type_string;
8a1738f9379a1b8fb5c95c3df649e014ff5a1434Jan Zeleny int (* search_fn)(TALLOC_CTX *, struct sysdb_ctx *,
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny const char *, const char **, size_t *, struct ldb_message ***);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny};
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozekstatic errno_t search_services(TALLOC_CTX *mem_ctx, struct sysdb_ctx *sysdb,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek const char *sub_filter, const char **attrs,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek size_t *msgs_count, struct ldb_message ***msgs);
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozekstatic errno_t search_autofsmaps(TALLOC_CTX *mem_ctx, struct sysdb_ctx *sysdb,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek const char *sub_filter, const char **attrs,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek size_t *msgs_count, struct ldb_message ***msgs);
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zelenystatic struct entry_type_t entry_types[] = {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny {"user", sysdb_search_users},
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny {"group", sysdb_search_groups},
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek {"netgroup", sysdb_search_netgroups},
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek {"service", search_services},
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek {"autofs map", search_autofsmaps}
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny};
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zelenystruct cache_tool_ctx {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny struct confdb_ctx *confdb;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny struct sss_domain_info *domains;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny struct sysdb_ctx_list *sysdb_list;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny char *user_filter;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny char *group_filter;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny char *netgroup_filter;
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek char *service_filter;
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek char *autofs_filter;
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek char *user_name;
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek char *group_name;
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek char *netgroup_name;
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek char *service_name;
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek char *autofs_name;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny};
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zelenyerrno_t init_domains(struct cache_tool_ctx *ctx, const char *domain);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zelenyerrno_t init_context(int argc, const char *argv[], struct cache_tool_ctx **tctx);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zelenyerrno_t invalidate_entry(TALLOC_CTX *ctx, struct sysdb_ctx *sysdb,
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny const char *name, int entry_type);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozekbool invalidate_entries(TALLOC_CTX *ctx, struct sysdb_ctx *sysdb,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek enum sss_cache_entry entry_type, const char *filter,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek const char *name);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zelenyint main(int argc, const char *argv[])
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny{
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny errno_t ret;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny struct cache_tool_ctx *tctx = NULL;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny struct sysdb_ctx *sysdb;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny int i;
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek bool skipped;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ret = init_context(argc, argv, &tctx);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (ret != EOK) {
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ("Error initializing context for the application\n"));
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny goto done;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny for (i = 0; i < tctx->sysdb_list->num_dbs; i++) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny sysdb = tctx->sysdb_list->dbs[i];
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ret = sysdb_transaction_start(sysdb);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (ret != EOK) {
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE, ("Could not start the transaction!\n"));
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny goto done;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek skipped = true;
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek skipped &= !invalidate_entries(tctx, sysdb, TYPE_USER,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek tctx->user_filter, tctx->user_name);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek skipped &= !invalidate_entries(tctx, sysdb, TYPE_GROUP,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek tctx->group_filter, tctx->group_name);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek skipped &= !invalidate_entries(tctx, sysdb, TYPE_NETGROUP,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek tctx->netgroup_filter, tctx->netgroup_name);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek skipped &= !invalidate_entries(tctx, sysdb, TYPE_SERVICE,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek tctx->service_filter, tctx->service_name);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek skipped &= !invalidate_entries(tctx, sysdb, TYPE_AUTOFSMAP,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek tctx->autofs_filter, tctx->autofs_name);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ret = sysdb_transaction_commit(sysdb);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (ret != EOK) {
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE, ("Could not commit the transaction!\n"));
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny sysdb_transaction_cancel(sysdb);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek if (skipped == true) {
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ERROR("No cache object matched the specified search\n");
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ret = ENOENT;
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek goto done;
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zelenydone:
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (tctx) talloc_free(tctx);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny return ret;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny}
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozekbool invalidate_entries(TALLOC_CTX *ctx, struct sysdb_ctx *sysdb,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek enum sss_cache_entry entry_type, const char *filter,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek const char *name)
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny{
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny const char *attrs[] = {SYSDB_NAME, NULL};
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny size_t msg_count;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny struct ldb_message **msgs;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny struct entry_type_t type_rec;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny errno_t ret;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny int i;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny const char *c_name;
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek bool iret;
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek if (!filter) return false;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny type_rec = entry_types[entry_type];
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ret = type_rec.search_fn(ctx, sysdb, filter, attrs,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek &msg_count, &msgs);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek if (ret != EOK) {
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek DEBUG(SSSDBG_MINOR_FAILURE,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ("Searching for %s with filter %s failed\n",
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek type_rec.type_string, filter));
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek if (name) {
95cc95749a5e783f2b5d2124d783f85820baf937Stephen Gallagher ERROR("No such %1$s named %2$s, skipping\n",
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek type_rec.type_string, name);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek } else {
95cc95749a5e783f2b5d2124d783f85820baf937Stephen Gallagher ERROR("No objects of type %1$s in the cache, skipping\n",
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek type_rec.type_string);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek return false;
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek iret = true;
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek for (i = 0; i < msg_count; i++) {
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek c_name = ldb_msg_find_attr_as_string(msgs[i], SYSDB_NAME, NULL);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek if (c_name == NULL) {
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek DEBUG(SSSDBG_MINOR_FAILURE,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ("Something bad happened, can't find attribute %s", SYSDB_NAME));
95cc95749a5e783f2b5d2124d783f85820baf937Stephen Gallagher ERROR("Couldn't invalidate %1$s", type_rec.type_string);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek iret = false;
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek } else {
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ret = invalidate_entry(ctx, sysdb, c_name, entry_type);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek if (ret != EOK) {
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek DEBUG(SSSDBG_MINOR_FAILURE,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ("Couldn't invalidate %s %s", type_rec.type_string, c_name));
95cc95749a5e783f2b5d2124d783f85820baf937Stephen Gallagher ERROR("Couldn't invalidate %1$s %2$s", type_rec.type_string, c_name);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek iret = false;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek talloc_zfree(msgs);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek return iret;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny}
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zelenyerrno_t invalidate_entry(TALLOC_CTX *ctx, struct sysdb_ctx *sysdb,
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny const char *name, int entry_type)
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny{
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny struct sysdb_attrs *sys_attrs = NULL;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny errno_t ret;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny sys_attrs = sysdb_new_attrs(ctx);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (sys_attrs) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ret = sysdb_attrs_add_time_t(sys_attrs,
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny SYSDB_CACHE_EXPIRE, 1);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (ret == EOK) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny switch (entry_type) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny case TYPE_USER:
e79d23932ef9d52cf4eb32ddec2d0a9b3af9a9ebJan Zeleny ret = sysdb_set_user_attr(sysdb, name, sys_attrs,
e79d23932ef9d52cf4eb32ddec2d0a9b3af9a9ebJan Zeleny SYSDB_MOD_REP);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny break;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny case TYPE_GROUP:
e79d23932ef9d52cf4eb32ddec2d0a9b3af9a9ebJan Zeleny ret = sysdb_set_group_attr(sysdb, name, sys_attrs,
e79d23932ef9d52cf4eb32ddec2d0a9b3af9a9ebJan Zeleny SYSDB_MOD_REP);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny break;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny case TYPE_NETGROUP:
8a1738f9379a1b8fb5c95c3df649e014ff5a1434Jan Zeleny ret = sysdb_set_netgroup_attr(sysdb, name,
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny sys_attrs, SYSDB_MOD_REP);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny break;
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek case TYPE_SERVICE:
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek ret = sysdb_set_service_attr(sysdb, name,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek sys_attrs, SYSDB_MOD_REP);
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek break;
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek case TYPE_AUTOFSMAP:
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek ret = sysdb_set_autofsmap_attr(sysdb, name,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek sys_attrs, SYSDB_MOD_REP);
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek break;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny default:
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny return EINVAL;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (ret != EOK) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny DEBUG(3, ("Could not set entry attributes\n"));
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny } else {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny DEBUG(3, ("Could not add expiration time to attributes\n"));
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny talloc_zfree(sys_attrs);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny } else {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny DEBUG(3, ("Could not create sysdb attributes\n"));
d35c8317ed23aff66fde8147bfa2ea91f43a12e4Jan Zeleny ret = ENOMEM;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny return ret;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny}
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozekerrno_t init_domains(struct cache_tool_ctx *ctx, const char *domain)
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek{
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny char *confdb_path;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny int ret;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny struct sysdb_ctx *db_ctx = NULL;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny confdb_path = talloc_asprintf(ctx, "%s/%s", DB_PATH, CONFDB_FILE);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (confdb_path == NULL) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny return ENOMEM;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny /* Connect to the conf db */
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ret = confdb_init(ctx, &ctx->confdb, confdb_path);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny talloc_free(confdb_path);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (ret != EOK) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny DEBUG(1, ("Could not initialize connection to the confdb\n"));
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny return ret;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (domain) {
d2d2d6ae0c436461bcc8f881df059eb036314c44Sumit Bose ret = sysdb_init_domain_and_sysdb(ctx, ctx->confdb, domain, DB_PATH,
d2d2d6ae0c436461bcc8f881df059eb036314c44Sumit Bose &ctx->domains, &db_ctx);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (ret != EOK) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny DEBUG(1, ("Could not initialize connection to the sysdb\n"));
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny goto fail;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ret = sysdb_list_init(ctx, DB_PATH, db_ctx, &ctx->sysdb_list);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (ret != EOK) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny DEBUG(1, ("Could not initialize the list of connections\n"));
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny goto fail;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny } else {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ret = sysdb_init(ctx, ctx->confdb, NULL, false, &ctx->sysdb_list);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (ret != EOK) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny DEBUG(1, ("Could not initialize connection to the sysdb\n"));
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny goto fail;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny return EOK;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zelenyfail:
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (ctx->confdb) talloc_zfree(ctx->confdb);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (ctx->domains) talloc_zfree(ctx->domains);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (ctx->sysdb_list) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny talloc_zfree(ctx->sysdb_list);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny } else {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (db_ctx) talloc_free(db_ctx);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny return ret;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny}
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zelenyerrno_t init_context(int argc, const char *argv[], struct cache_tool_ctx **tctx)
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny{
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny struct cache_tool_ctx *ctx = NULL;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny int idb = INVALIDATE_NONE;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny char *user = NULL;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny char *group = NULL;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny char *netgroup = NULL;
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek char *service = NULL;
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek char *map = NULL;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny char *domain = NULL;
89caf5edcc99f5731e89bd51e6ffaad3ec11c304Pavel Březina int debug = SSSDBG_DEFAULT;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny errno_t ret = EOK;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny poptContext pc = NULL;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny struct poptOption long_options[] = {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny POPT_AUTOHELP
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny { "debug", '\0', POPT_ARG_INT | POPT_ARGFLAG_DOC_HIDDEN, &debug,
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny 0, _("The debug level to run with"), NULL },
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny { "user", 'u', POPT_ARG_STRING, &user, 0,
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny _("Invalidate particular user"), NULL },
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny { "users", 'U', POPT_ARG_NONE, NULL, 'u',
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny _("Invalidate all users"), NULL },
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny { "group", 'g', POPT_ARG_STRING, &group, 0,
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny _("Invalidate particular group"), NULL },
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny { "groups", 'G', POPT_ARG_NONE, NULL, 'g',
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny _("Invalidate all groups"), NULL },
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny { "netgroup", 'n', POPT_ARG_STRING, &netgroup, 0,
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny _("Invalidate particular netgroup"), NULL },
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny { "netgroups", 'N', POPT_ARG_NONE, NULL, 'n',
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny _("Invalidate all netgroups"), NULL },
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek { "service", 's', POPT_ARG_STRING, &service, 0,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek _("Invalidate particular service"), NULL },
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek { "services", 'S', POPT_ARG_NONE, NULL, 's',
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek _("Invalidate all services"), NULL },
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek#ifdef BUILD_AUTOFS
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek { "autofs-map", 'a', POPT_ARG_STRING, &map, 0,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek _("Invalidate particular autofs map"), NULL },
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek { "autofs-maps", 'A', POPT_ARG_NONE, NULL, 'a',
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek _("Invalidate all autofs maps"), NULL },
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek#endif /* BUILD_AUTOFS */
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny { "domain", 'd', POPT_ARG_STRING, &domain, 0,
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny _("Only invalidate entries from a particular domain"), NULL },
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny POPT_TABLEEND
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny };
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ret = set_locale();
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (ret != EOK) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny DEBUG(1, ("set_locale failed (%d): %s\n", ret, strerror(ret)));
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ERROR("Error setting the locale\n");
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny goto fini;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny pc = poptGetContext(NULL, argc, argv, long_options, 0);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny while ((ret = poptGetNextOpt(pc)) > 0) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny switch (ret) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny case 'u':
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny idb |= INVALIDATE_USERS;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny break;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny case 'g':
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny idb |= INVALIDATE_GROUPS;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny break;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny case 'n':
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny idb |= INVALIDATE_NETGROUPS;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny break;
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek case 's':
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek idb |= INVALIDATE_SERVICES;
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek break;
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek case 'a':
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek idb |= INVALIDATE_AUTOFSMAPS;
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek break;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (ret != -1) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny BAD_POPT_PARAMS(pc, poptStrerror(ret), ret, fini);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek if (idb == INVALIDATE_NONE && !user && !group &&
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek !netgroup && !service && !map) {
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek BAD_POPT_PARAMS(pc,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek _("Please select at least one object to invalidate\n"),
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ret, fini);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek }
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek
99dd40a885ed3d42af4bbbde7ee2fc98830544d0Pavel Březina debug_level = debug_convert_old_level(debug);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny debug_prg_name = argv[0];
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny CHECK_ROOT(ret, debug_prg_name);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ctx = talloc_zero(NULL, struct cache_tool_ctx);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (ctx == NULL) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny DEBUG(1, ("Could not allocate memory for tools context\n"));
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ret = ENOMEM;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny goto fini;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (idb & INVALIDATE_USERS) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ctx->user_filter = talloc_asprintf(ctx, "(%s=*)", SYSDB_NAME);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny } else if (user) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ctx->user_filter = talloc_asprintf(ctx, "(%s=%s)", SYSDB_NAME, user);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ctx->user_name = talloc_strdup(ctx, user);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (idb & INVALIDATE_GROUPS) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ctx->group_filter = talloc_asprintf(ctx, "(%s=*)", SYSDB_NAME);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny } else if (group) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ctx->group_filter = talloc_asprintf(ctx, "(%s=%s)", SYSDB_NAME, group);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ctx->group_name = talloc_strdup(ctx, group);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (idb & INVALIDATE_NETGROUPS) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ctx->netgroup_filter = talloc_asprintf(ctx, "(%s=*)", SYSDB_NAME);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny } else if (netgroup) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ctx->netgroup_filter = talloc_asprintf(ctx, "(%s=%s)", SYSDB_NAME,
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny netgroup);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ctx->netgroup_name = talloc_strdup(ctx, netgroup);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek if (idb & INVALIDATE_SERVICES) {
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek ctx->service_filter = talloc_strdup(ctx, "*");
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek } else if (service) {
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek ctx->service_filter = talloc_strdup(ctx, service);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ctx->service_name = talloc_strdup(ctx, service);
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek }
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek if (idb & INVALIDATE_AUTOFSMAPS) {
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek ctx->autofs_filter = talloc_asprintf(ctx, "(&(objectclass=%s)(%s=*))",
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek SYSDB_AUTOFS_MAP_OC, SYSDB_NAME);
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek } else if (map) {
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek ctx->autofs_filter = talloc_asprintf(ctx, "(&(objectclass=%s)(%s=%s))",
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek SYSDB_AUTOFS_MAP_OC,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek SYSDB_NAME, map);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ctx->autofs_name = talloc_strdup(ctx, map);
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek }
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (((idb & INVALIDATE_USERS || user) && !ctx->user_filter) ||
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ((idb & INVALIDATE_GROUPS || group) && !ctx->group_filter) ||
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek ((idb & INVALIDATE_NETGROUPS || netgroup) && !ctx->netgroup_filter) ||
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek ((idb & INVALIDATE_SERVICES || service) && !ctx->service_filter) ||
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ((idb & INVALIDATE_AUTOFSMAPS || map) && !ctx->autofs_filter) ||
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek (user && !ctx->user_name) || (group && !ctx->group_name) ||
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek (netgroup && !ctx->netgroup_name) || (map && !ctx->autofs_name) ||
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek (service && !ctx->service_name)) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny DEBUG(1, ("Construction of filters failed\n"));
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ret = ENOMEM;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny goto fini;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ret = init_domains(ctx, domain);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (ret != EOK) {
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek if (domain) {
95cc95749a5e783f2b5d2124d783f85820baf937Stephen Gallagher ERROR("Could not open domain %1$s\n", domain);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek } else {
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ERROR("Could not open available domains\n");
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek }
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek DEBUG(SSSDBG_OP_FAILURE,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ("Initialization of sysdb connections failed\n"));
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny goto fini;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ret = EOK;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zelenyfini:
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny poptFreeContext(pc);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny free(user);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny free(group);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny free(netgroup);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny free(domain);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (ret != EOK && ctx) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny talloc_zfree(ctx);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (ret == EOK) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny *tctx = ctx;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny return ret;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny}
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozekstatic errno_t
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozeksearch_services(TALLOC_CTX *mem_ctx, struct sysdb_ctx *sysdb,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek const char *sub_filter, const char **attrs,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek size_t *msgs_count, struct ldb_message ***msgs)
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek{
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek errno_t ret;
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek struct ldb_result *res;
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek if (strcmp(sub_filter, "*") == 0) {
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek /* All services */
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek ret = sysdb_enumservent(mem_ctx, sysdb, &res);
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek } else {
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek /* Get service by name */
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek ret = sysdb_getservbyname(mem_ctx, sysdb, sub_filter,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek NULL, &res);
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek }
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek if (ret != EOK) {
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("Could not get service from sysdb: "
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek "[%d]: %s\n", ret, strerror(ret)));
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek return ret;
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek }
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek *msgs_count = res->count;
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek *msgs = res->msgs;
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek return EOK;
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek}
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozekstatic errno_t
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozeksearch_autofsmaps(TALLOC_CTX *mem_ctx, struct sysdb_ctx *sysdb,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek const char *sub_filter, const char **attrs,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek size_t *msgs_count, struct ldb_message ***msgs)
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek{
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek#ifdef BUILD_AUTOFS
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek return sysdb_search_custom(mem_ctx, sysdb, sub_filter,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek AUTOFS_MAP_SUBDIR, attrs,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek msgs_count, msgs);
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek#else
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek return ENOSYS;
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek#endif /* BUILD_AUTOFS */
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek}