sss_cache.c revision 95cc95749a5e783f2b5d2124d783f85820baf937
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny Copyright (C) Jan Zeleny <jzeleny@redhat.com> 2011
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 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 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/>.
8a1738f9379a1b8fb5c95c3df649e014ff5a1434Jan Zeleny int (* search_fn)(TALLOC_CTX *, struct sysdb_ctx *,
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny const char *, const char **, size_t *, struct ldb_message ***);
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozekstatic errno_t search_services(TALLOC_CTX *mem_ctx, struct sysdb_ctx *sysdb,
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 size_t *msgs_count, struct ldb_message ***msgs);
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,
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);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ("Error initializing context for the application\n"));
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny for (i = 0; i < tctx->sysdb_list->num_dbs; i++) {
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE, ("Could not start the transaction!\n"));
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek skipped &= !invalidate_entries(tctx, sysdb, TYPE_USER,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek skipped &= !invalidate_entries(tctx, sysdb, TYPE_GROUP,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek skipped &= !invalidate_entries(tctx, sysdb, TYPE_NETGROUP,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek skipped &= !invalidate_entries(tctx, sysdb, TYPE_SERVICE,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek skipped &= !invalidate_entries(tctx, sysdb, TYPE_AUTOFSMAP,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE, ("Could not commit the transaction!\n"));
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek if (skipped == true) {
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ERROR("No cache object matched the specified search\n");
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 const char *c_name;
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek if (!filter) return false;
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ret = type_rec.search_fn(ctx, sysdb, filter, attrs,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ("Searching for %s with filter %s failed\n",
95cc95749a5e783f2b5d2124d783f85820baf937Stephen Gallagher ERROR("No such %1$s named %2$s, skipping\n",
95cc95749a5e783f2b5d2124d783f85820baf937Stephen Gallagher ERROR("No objects of type %1$s in the cache, skipping\n",
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek return false;
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 ("Something bad happened, can't find attribute %s", SYSDB_NAME));
95cc95749a5e783f2b5d2124d783f85820baf937Stephen Gallagher ERROR("Couldn't invalidate %1$s", type_rec.type_string);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ret = invalidate_entry(ctx, sysdb, c_name, entry_type);
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);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zelenyerrno_t invalidate_entry(TALLOC_CTX *ctx, struct sysdb_ctx *sysdb,
e79d23932ef9d52cf4eb32ddec2d0a9b3af9a9ebJan Zeleny ret = sysdb_set_user_attr(sysdb, name, sys_attrs,
e79d23932ef9d52cf4eb32ddec2d0a9b3af9a9ebJan Zeleny ret = sysdb_set_group_attr(sysdb, name, sys_attrs,
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny DEBUG(3, ("Could not add expiration time to attributes\n"));
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny DEBUG(3, ("Could not create sysdb attributes\n"));
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozekerrno_t init_domains(struct cache_tool_ctx *ctx, const char *domain)
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny confdb_path = talloc_asprintf(ctx, "%s/%s", DB_PATH, CONFDB_FILE);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny /* Connect to the conf db */
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ret = confdb_init(ctx, &ctx->confdb, confdb_path);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny DEBUG(1, ("Could not initialize connection to the confdb\n"));
d2d2d6ae0c436461bcc8f881df059eb036314c44Sumit Bose ret = sysdb_init_domain_and_sysdb(ctx, ctx->confdb, domain, DB_PATH,
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny DEBUG(1, ("Could not initialize connection to the sysdb\n"));
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ret = sysdb_list_init(ctx, DB_PATH, db_ctx, &ctx->sysdb_list);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny DEBUG(1, ("Could not initialize the list of connections\n"));
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny ret = sysdb_init(ctx, ctx->confdb, NULL, false, &ctx->sysdb_list);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny DEBUG(1, ("Could not initialize connection to the sysdb\n"));
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zelenyerrno_t init_context(int argc, const char *argv[], struct cache_tool_ctx **tctx)
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny { "debug", '\0', POPT_ARG_INT | POPT_ARGFLAG_DOC_HIDDEN, &debug,
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny { "netgroup", 'n', POPT_ARG_STRING, &netgroup, 0,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek { "service", 's', POPT_ARG_STRING, &service, 0,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek { "autofs-maps", 'A', POPT_ARG_NONE, NULL, 'a',
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek#endif /* BUILD_AUTOFS */
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny _("Only invalidate entries from a particular domain"), NULL },
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny DEBUG(1, ("set_locale failed (%d): %s\n", ret, strerror(ret)));
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny pc = poptGetContext(NULL, argc, argv, long_options, 0);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny BAD_POPT_PARAMS(pc, poptStrerror(ret), ret, fini);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek if (idb == INVALIDATE_NONE && !user && !group &&
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek _("Please select at least one object to invalidate\n"),
99dd40a885ed3d42af4bbbde7ee2fc98830544d0Pavel Březina debug_level = debug_convert_old_level(debug);
c737e1444fb186e349e59bfa9dac4995b720b4b1Jan Zeleny DEBUG(1, ("Could not allocate memory for tools context\n"));
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);
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);
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,
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ctx->netgroup_name = talloc_strdup(ctx, netgroup);
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 ctx->autofs_filter = talloc_asprintf(ctx, "(&(objectclass=%s)(%s=*))",
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek } else if (map) {
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek ctx->autofs_filter = talloc_asprintf(ctx, "(&(objectclass=%s)(%s=%s))",
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) ||
95cc95749a5e783f2b5d2124d783f85820baf937Stephen Gallagher ERROR("Could not open domain %1$s\n", domain);
da0b829a2002987339aadaa01b85adbb5ddba20dJakub Hrozek ("Initialization of sysdb connections failed\n"));
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozeksearch_services(TALLOC_CTX *mem_ctx, struct sysdb_ctx *sysdb,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek size_t *msgs_count, struct ldb_message ***msgs)
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek /* All services */
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek /* Get service by name */
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek ret = sysdb_getservbyname(mem_ctx, sysdb, sub_filter,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("Could not get service from sysdb: "
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozeksearch_autofsmaps(TALLOC_CTX *mem_ctx, struct sysdb_ctx *sysdb,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek size_t *msgs_count, struct ldb_message ***msgs)
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek return sysdb_search_custom(mem_ctx, sysdb, sub_filter,
82b5429d1438392c45e70a0f84dd4d0f5fa1a171Jakub Hrozek#endif /* BUILD_AUTOFS */