sss_cache.c revision 2ba16c5a5c4b6d3cd2a44179186ec60eda828bcd
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
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozekstatic errno_t search_autofsmaps(TALLOC_CTX *mem_ctx, struct sysdb_ctx *sysdb,
770896b194b7b66b09c2a30545b4d091fd86b1f4Simo Sorce struct sss_domain_info *domain,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek const char *sub_filter, const char **attrs,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek size_t *msgs_count, struct ldb_message ***msgs);
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zelenystruct cache_tool_ctx {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny struct confdb_ctx *confdb;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny struct sss_domain_info *domains;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek struct sss_names_ctx *nctx;
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;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek bool update_user_filter;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek bool update_group_filter;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek bool update_netgroup_filter;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek bool update_service_filter;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek bool update_autofs_filter;
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);
3f94d6718d44185137e13b6d326dfd63e8dc61c6Simo Sorcestatic errno_t invalidate_entry(TALLOC_CTX *ctx, struct sysdb_ctx *sysdb,
3f94d6718d44185137e13b6d326dfd63e8dc61c6Simo Sorce struct sss_domain_info *domain,
3f94d6718d44185137e13b6d326dfd63e8dc61c6Simo Sorce const char *name, int entry_type);
1e6f2180724de4722a5218826c9401181168d9d4Simo Sorcestatic bool invalidate_entries(TALLOC_CTX *ctx,
1e6f2180724de4722a5218826c9401181168d9d4Simo Sorce struct sss_domain_info *dinfo,
1e6f2180724de4722a5218826c9401181168d9d4Simo Sorce struct sysdb_ctx *sysdb,
480195bd70467bf05e2fd92cf25cec822a670cedSimo Sorce enum sss_cache_entry entry_type,
480195bd70467bf05e2fd92cf25cec822a670cedSimo Sorce const char *filter, const char *name);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidekstatic errno_t update_all_filters(struct cache_tool_ctx *tctx,
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek char *domain_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;
69f6f2ed116d1c987851bfcc410cf2bdd1b0cc97Michal Zidek bool skipped = true;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek struct sss_domain_info *dinfo;
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
0232747f04b650796db56fd7b487aee8a96fab03Simo Sorce for (dinfo = tctx->domains; dinfo; dinfo = get_next_domain(dinfo, false)) {
72aa8e7b1d234b6b68446d42efa1cff22b70c81bSimo Sorce sysdb = dinfo->sysdb;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek /* Update filters for each domain */
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek ret = update_all_filters(tctx, dinfo->name);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek if (ret != EOK) {
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek DEBUG(SSSDBG_CRIT_FAILURE, ("Failed to update filters.\n"));
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek goto done;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek }
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek
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
1e6f2180724de4722a5218826c9401181168d9d4Simo Sorce skipped &= !invalidate_entries(tctx, dinfo, sysdb, TYPE_USER,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek tctx->user_filter, tctx->user_name);
1e6f2180724de4722a5218826c9401181168d9d4Simo Sorce skipped &= !invalidate_entries(tctx, dinfo, sysdb, TYPE_GROUP,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek tctx->group_filter, tctx->group_name);
1e6f2180724de4722a5218826c9401181168d9d4Simo Sorce skipped &= !invalidate_entries(tctx, dinfo, sysdb, TYPE_NETGROUP,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek tctx->netgroup_filter, tctx->netgroup_name);
1e6f2180724de4722a5218826c9401181168d9d4Simo Sorce skipped &= !invalidate_entries(tctx, dinfo, sysdb, TYPE_SERVICE,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek tctx->service_filter, tctx->service_name);
1e6f2180724de4722a5218826c9401181168d9d4Simo Sorce skipped &= !invalidate_entries(tctx, dinfo, 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
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidekstatic errno_t update_filter(struct cache_tool_ctx *tctx, char *domain_name,
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek char *name, bool update, const char *fmt,
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek char **filter)
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek{
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek errno_t ret;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek char *parsed_domain = NULL;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek char *parsed_name = NULL;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek if (name && update) {
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek ret = sss_parse_name(tctx, tctx->nctx, name,
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek &parsed_domain, &parsed_name);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek if (ret != EOK) {
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek DEBUG(SSSDBG_CRIT_FAILURE, ("sss_parse_name failed\n"));
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek goto done;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek }
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek if (parsed_domain) {
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek talloc_free(*filter);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek if (!strcmp(domain_name, parsed_domain)) {
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek if (fmt) {
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek *filter = talloc_asprintf(tctx, fmt,
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek SYSDB_NAME, parsed_name);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek } else {
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek *filter = talloc_strdup(tctx, parsed_name);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek }
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek if (*filter == NULL) {
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek DEBUG(SSSDBG_CRIT_FAILURE, ("Out of memory\n"));
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek ret = ENOMEM;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek goto done;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek }
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek } else {
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek /* Set to NULL to indicate that it will not be used
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek * in this domain */
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek *filter = NULL;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek }
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek } else {
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek if (fmt) {
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek *filter = talloc_asprintf(tctx, fmt, SYSDB_NAME, name);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek } else {
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek *filter = talloc_strdup(tctx, name);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek }
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek if (*filter == NULL) {
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek DEBUG(SSSDBG_CRIT_FAILURE, ("Out of memory\n"));
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek ret = ENOMEM;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek goto done;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek }
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek }
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek }
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek ret = EOK;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidekdone:
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek talloc_free(parsed_domain);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek talloc_free(parsed_name);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek return ret;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek}
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek/* This function updates all filters for specified domain using this
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek * domains regex to parse string into domain and name (if exists). */
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidekstatic errno_t update_all_filters(struct cache_tool_ctx *tctx,
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek char *domain_name)
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek{
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek errno_t ret;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek ret = sss_names_init(tctx, tctx->confdb, domain_name, &tctx->nctx);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek if (ret != EOK) {
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek DEBUG(SSSDBG_CRIT_FAILURE, ("sss_names_init() failed\n"));
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek return ret;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek }
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek /* Update user filter */
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek ret = update_filter(tctx, domain_name, tctx->user_name,
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek tctx->update_user_filter, "(%s=%s)",
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek &tctx->user_filter);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek if (ret != EOK) {
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek return ret;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek }
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek /* Update group filter */
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek ret = update_filter(tctx, domain_name, tctx->group_name,
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek tctx->update_group_filter, "(%s=%s)",
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek &tctx->group_filter);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek if (ret != EOK) {
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek return ret;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek }
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek /* Update netgroup filter */
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek ret = update_filter(tctx, domain_name, tctx->netgroup_name,
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek tctx->update_netgroup_filter, "(%s=%s)",
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek &tctx->netgroup_filter);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek if (ret != EOK) {
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek return ret;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek }
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek /* Update service filter */
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek ret = update_filter(tctx, domain_name, tctx->service_name,
e3ce042be3a6c66aa720fc139f557b065ae6dc5eSimo Sorce tctx->update_service_filter, "(%s=%s)",
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek &tctx->service_filter);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek if (ret != EOK) {
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek return ret;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek }
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek /* Update autofs filter */
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek ret = update_filter(tctx, domain_name, tctx->autofs_name,
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek tctx->update_autofs_filter,
e3ce042be3a6c66aa720fc139f557b065ae6dc5eSimo Sorce "(&(objectclass="SYSDB_AUTOFS_MAP_OC")(%s=%s))",
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek &tctx->autofs_filter);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek if (ret != EOK) {
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek return ret;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek }
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek return EOK;
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek}
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek
1e6f2180724de4722a5218826c9401181168d9d4Simo Sorcestatic bool invalidate_entries(TALLOC_CTX *ctx,
1e6f2180724de4722a5218826c9401181168d9d4Simo Sorce struct sss_domain_info *dinfo,
1e6f2180724de4722a5218826c9401181168d9d4Simo Sorce struct sysdb_ctx *sysdb,
480195bd70467bf05e2fd92cf25cec822a670cedSimo Sorce enum sss_cache_entry entry_type,
480195bd70467bf05e2fd92cf25cec822a670cedSimo Sorce const char *filter, 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;
480195bd70467bf05e2fd92cf25cec822a670cedSimo Sorce const char *type_string = "unknown";
480195bd70467bf05e2fd92cf25cec822a670cedSimo Sorce errno_t ret = EINVAL;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny int i;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny const char *c_name;
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek bool iret;
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek if (!filter) return false;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
2eaf2045b5b55cdaff6ae5704225cf9a75b16950Simo Sorce switch (entry_type) {
2eaf2045b5b55cdaff6ae5704225cf9a75b16950Simo Sorce case TYPE_USER:
2eaf2045b5b55cdaff6ae5704225cf9a75b16950Simo Sorce type_string = "user";
044868b388b4e47499f12a9105310b247bbe1ce2Simo Sorce ret = sysdb_search_users(ctx, sysdb, dinfo,
044868b388b4e47499f12a9105310b247bbe1ce2Simo Sorce filter, attrs, &msg_count, &msgs);
2eaf2045b5b55cdaff6ae5704225cf9a75b16950Simo Sorce break;
2eaf2045b5b55cdaff6ae5704225cf9a75b16950Simo Sorce case TYPE_GROUP:
2eaf2045b5b55cdaff6ae5704225cf9a75b16950Simo Sorce type_string = "group";
2b7ee2a760e7fcc70f4970a3bbee6fbf8f2ccb9dSimo Sorce ret = sysdb_search_groups(ctx, sysdb, dinfo,
2b7ee2a760e7fcc70f4970a3bbee6fbf8f2ccb9dSimo Sorce filter, attrs, &msg_count, &msgs);
2eaf2045b5b55cdaff6ae5704225cf9a75b16950Simo Sorce break;
2eaf2045b5b55cdaff6ae5704225cf9a75b16950Simo Sorce case TYPE_NETGROUP:
2eaf2045b5b55cdaff6ae5704225cf9a75b16950Simo Sorce type_string = "netgroup";
84c986f9bb2767d8930b6f5d92d34b09b8fabe60Simo Sorce ret = sysdb_search_netgroups(ctx, sysdb, dinfo,
84c986f9bb2767d8930b6f5d92d34b09b8fabe60Simo Sorce filter, attrs, &msg_count, &msgs);
2eaf2045b5b55cdaff6ae5704225cf9a75b16950Simo Sorce break;
2eaf2045b5b55cdaff6ae5704225cf9a75b16950Simo Sorce case TYPE_SERVICE:
2eaf2045b5b55cdaff6ae5704225cf9a75b16950Simo Sorce type_string = "service";
681742138b2afbbefa7f14de937beb438409208eSimo Sorce ret = sysdb_search_services(ctx, sysdb, dinfo,
681742138b2afbbefa7f14de937beb438409208eSimo Sorce filter, attrs, &msg_count, &msgs);
2eaf2045b5b55cdaff6ae5704225cf9a75b16950Simo Sorce break;
2eaf2045b5b55cdaff6ae5704225cf9a75b16950Simo Sorce case TYPE_AUTOFSMAP:
2eaf2045b5b55cdaff6ae5704225cf9a75b16950Simo Sorce type_string = "autofs map";
770896b194b7b66b09c2a30545b4d091fd86b1f4Simo Sorce ret = search_autofsmaps(ctx, sysdb, dinfo,
770896b194b7b66b09c2a30545b4d091fd86b1f4Simo Sorce filter, attrs, &msg_count, &msgs);
2eaf2045b5b55cdaff6ae5704225cf9a75b16950Simo Sorce break;
2eaf2045b5b55cdaff6ae5704225cf9a75b16950Simo Sorce }
2eaf2045b5b55cdaff6ae5704225cf9a75b16950Simo Sorce
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek if (ret != EOK) {
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek DEBUG(SSSDBG_MINOR_FAILURE,
69f6f2ed116d1c987851bfcc410cf2bdd1b0cc97Michal Zidek ("Searching for %s in domain %s with filter %s failed\n",
2eaf2045b5b55cdaff6ae5704225cf9a75b16950Simo Sorce 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",
2eaf2045b5b55cdaff6ae5704225cf9a75b16950Simo Sorce type_string, name, dinfo->name);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek } else {
69f6f2ed116d1c987851bfcc410cf2bdd1b0cc97Michal Zidek ERROR("No objects of type %1$s from domain %2$s in the cache, "
2eaf2045b5b55cdaff6ae5704225cf9a75b16950Simo Sorce "skipping\n", 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));
2eaf2045b5b55cdaff6ae5704225cf9a75b16950Simo Sorce ERROR("Couldn't invalidate %1$s", type_string);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek iret = false;
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek } else {
3f94d6718d44185137e13b6d326dfd63e8dc61c6Simo Sorce ret = invalidate_entry(ctx, sysdb, dinfo, c_name, entry_type);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek if (ret != EOK) {
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek DEBUG(SSSDBG_MINOR_FAILURE,
2eaf2045b5b55cdaff6ae5704225cf9a75b16950Simo Sorce ("Couldn't invalidate %s %s", type_string, c_name));
2eaf2045b5b55cdaff6ae5704225cf9a75b16950Simo Sorce ERROR("Couldn't invalidate %1$s %2$s", 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
3f94d6718d44185137e13b6d326dfd63e8dc61c6Simo Sorcestatic errno_t invalidate_entry(TALLOC_CTX *ctx, struct sysdb_ctx *sysdb,
3f94d6718d44185137e13b6d326dfd63e8dc61c6Simo Sorce struct sss_domain_info *domain,
3f94d6718d44185137e13b6d326dfd63e8dc61c6Simo Sorce 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:
3f94d6718d44185137e13b6d326dfd63e8dc61c6Simo Sorce ret = sysdb_set_user_attr(sysdb, domain, name, sys_attrs,
e79d23932ef9d52cf4eb32ddec2d0a9b3af9a9ebJan Zeleny SYSDB_MOD_REP);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny break;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny case TYPE_GROUP:
20d2466dbce2bb950813e3f739bc40b511020efbSimo Sorce ret = sysdb_set_group_attr(sysdb, domain, name, sys_attrs,
e79d23932ef9d52cf4eb32ddec2d0a9b3af9a9ebJan Zeleny SYSDB_MOD_REP);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny break;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny case TYPE_NETGROUP:
3187afe4aafa562f2a6747846181ac06d0659dffSimo Sorce ret = sysdb_set_netgroup_attr(sysdb, domain, name,
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny sys_attrs, SYSDB_MOD_REP);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny break;
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek case TYPE_SERVICE:
681742138b2afbbefa7f14de937beb438409208eSimo Sorce ret = sysdb_set_service_attr(sysdb, domain, name,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek sys_attrs, SYSDB_MOD_REP);
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek break;
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek case TYPE_AUTOFSMAP:
2913240aee51ce81195148a4d814e967f66839c4Simo Sorce ret = sysdb_set_autofsmap_attr(sysdb, domain, 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
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) {
234958be042980242fff6da936af674da877c5efSimo Sorce ret = sssd_domain_init(ctx, ctx->confdb,
234958be042980242fff6da936af674da877c5efSimo Sorce domain, DB_PATH, &ctx->domains);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (ret != EOK) {
4c9a85ab708ec7debecad51e4240e04d8bc6ca4eOndrej Kos SYSDB_VERSION_ERROR(ret);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny DEBUG(1, ("Could not initialize connection to the sysdb\n"));
72aa8e7b1d234b6b68446d42efa1cff22b70c81bSimo Sorce return ret;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
72aa8e7b1d234b6b68446d42efa1cff22b70c81bSimo Sorce } else {
72aa8e7b1d234b6b68446d42efa1cff22b70c81bSimo Sorce ret = confdb_get_domains(ctx->confdb, &ctx->domains);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (ret != EOK) {
72aa8e7b1d234b6b68446d42efa1cff22b70c81bSimo Sorce DEBUG(1, ("Could not initialize domains\n"));
72aa8e7b1d234b6b68446d42efa1cff22b70c81bSimo Sorce return ret;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
72aa8e7b1d234b6b68446d42efa1cff22b70c81bSimo Sorce
2ba16c5a5c4b6d3cd2a44179186ec60eda828bcdMichal Zidek ret = sysdb_init(ctx, ctx->domains, false);
4c9a85ab708ec7debecad51e4240e04d8bc6ca4eOndrej Kos SYSDB_VERSION_ERROR(ret);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (ret != EOK) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny DEBUG(1, ("Could not initialize connection to the sysdb\n"));
72aa8e7b1d234b6b68446d42efa1cff22b70c81bSimo Sorce return ret;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny return EOK;
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
f82135b75f0574e65c73269d6f24d42ba025b8e2Michal Zidek DEBUG_INIT(debug);
f82135b75f0574e65c73269d6f24d42ba025b8e2Michal Zidek debug_prg_name = argv[0];
f82135b75f0574e65c73269d6f24d42ba025b8e2Michal Zidek
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
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);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek ctx->update_user_filter = false;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny } else if (user) {
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ctx->user_name = talloc_strdup(ctx, user);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek ctx->update_user_filter = true;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (idb & INVALIDATE_GROUPS) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ctx->group_filter = talloc_asprintf(ctx, "(%s=*)", SYSDB_NAME);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek ctx->update_group_filter = false;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny } else if (group) {
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ctx->group_name = talloc_strdup(ctx, group);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek ctx->update_group_filter = true;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny if (idb & INVALIDATE_NETGROUPS) {
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ctx->netgroup_filter = talloc_asprintf(ctx, "(%s=*)", SYSDB_NAME);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek ctx->update_netgroup_filter = false;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny } else if (netgroup) {
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ctx->netgroup_name = talloc_strdup(ctx, netgroup);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek ctx->update_netgroup_filter = true;
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny }
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek if (idb & INVALIDATE_SERVICES) {
e3ce042be3a6c66aa720fc139f557b065ae6dc5eSimo Sorce ctx->service_filter = talloc_asprintf(ctx, "(%s=*)", SYSDB_NAME);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek ctx->update_service_filter = false;
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek } else if (service) {
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ctx->service_name = talloc_strdup(ctx, service);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek ctx->update_service_filter = true;
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);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek ctx->update_autofs_filter = false;
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek } else if (map) {
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ctx->autofs_name = talloc_strdup(ctx, map);
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek ctx->update_autofs_filter = true;
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek }
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek if (((idb & INVALIDATE_USERS) && !ctx->user_filter) ||
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek ((idb & INVALIDATE_GROUPS) && !ctx->group_filter) ||
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek ((idb & INVALIDATE_NETGROUPS) && !ctx->netgroup_filter) ||
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek ((idb & INVALIDATE_SERVICES) && !ctx->service_filter) ||
d27d11b360b92f1728206802005bb3da359e1ea4Michal Zidek ((idb & INVALIDATE_AUTOFSMAPS) && !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_autofsmaps(TALLOC_CTX *mem_ctx, struct sysdb_ctx *sysdb,
770896b194b7b66b09c2a30545b4d091fd86b1f4Simo Sorce struct sss_domain_info *domain,
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
770896b194b7b66b09c2a30545b4d091fd86b1f4Simo Sorce return sysdb_search_custom(mem_ctx, sysdb, domain, 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}