sss_cache.c revision a290ace39af184d878568e17588b6b2210aea63f
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;
69f6f2ed116d1c987851bfcc410cf2bdd1b0cc97Michal Zidek bool skipped = true;
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 &= !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"));
21d485184df986e1a123f70c689517386e51a5ceMichal Zidek ret = sysdb_transaction_cancel(sysdb);
21d485184df986e1a123f70c689517386e51a5ceMichal Zidek if (ret != EOK) {
21d485184df986e1a123f70c689517386e51a5ceMichal Zidek DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to cancel transaction\n"));
21d485184df986e1a123f70c689517386e51a5ceMichal Zidek }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
69f6f2ed116d1c987851bfcc410cf2bdd1b0cc97Michal Zidek }
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek
69f6f2ed116d1c987851bfcc410cf2bdd1b0cc97Michal Zidek if (skipped == true) {
69f6f2ed116d1c987851bfcc410cf2bdd1b0cc97Michal Zidek ERROR("No cache object matched the specified search\n");
69f6f2ed116d1c987851bfcc410cf2bdd1b0cc97Michal Zidek ret = ENOENT;
69f6f2ed116d1c987851bfcc410cf2bdd1b0cc97Michal Zidek goto done;
69f6f2ed116d1c987851bfcc410cf2bdd1b0cc97Michal Zidek } else {
a290ace39af184d878568e17588b6b2210aea63fMichal Zidek ret = sss_memcache_clear_all();
33cbb789ff71be5dccbb4a0acd68814b0d53da34Michal Zidek if (ret != EOK) {
a290ace39af184d878568e17588b6b2210aea63fMichal Zidek DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to clear memory cache.\n"));
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek goto done;
69f6f2ed116d1c987851bfcc410cf2bdd1b0cc97Michal Zidek }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
a290ace39af184d878568e17588b6b2210aea63fMichal Zidek ret = EOK;
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;
69f6f2ed116d1c987851bfcc410cf2bdd1b0cc97Michal Zidek struct sss_domain_info *dinfo;
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek if (!filter) return false;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
69f6f2ed116d1c987851bfcc410cf2bdd1b0cc97Michal Zidek dinfo = sysdb_ctx_get_domain(sysdb);
69f6f2ed116d1c987851bfcc410cf2bdd1b0cc97Michal Zidek
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,
69f6f2ed116d1c987851bfcc410cf2bdd1b0cc97Michal Zidek ("Searching for %s in domain %s with filter %s failed\n",
69f6f2ed116d1c987851bfcc410cf2bdd1b0cc97Michal Zidek type_rec.type_string, dinfo->name, filter));
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek if (name) {
69f6f2ed116d1c987851bfcc410cf2bdd1b0cc97Michal Zidek ERROR("No such %1$s named %2$s in domain %3$s, skipping\n",
69f6f2ed116d1c987851bfcc410cf2bdd1b0cc97Michal Zidek type_rec.type_string, name, dinfo->name);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek } else {
69f6f2ed116d1c987851bfcc410cf2bdd1b0cc97Michal Zidek ERROR("No objects of type %1$s from domain %2$s in the cache, "
69f6f2ed116d1c987851bfcc410cf2bdd1b0cc97Michal Zidek "skipping\n", type_rec.type_string, dinfo->name);
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) {
4c9a85ab708ec7debecad51e4240e04d8bc6ca4eOndrej Kos SYSDB_VERSION_ERROR(ret);
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);
4c9a85ab708ec7debecad51e4240e04d8bc6ca4eOndrej Kos SYSDB_VERSION_ERROR(ret);
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
9e2c64c6d4f5560e27207193efea6536a566865eMichal Zidek DEBUG_INIT(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}