Patch 1: (sssd_nss part) In functions nss_cmd_getXXnam, if working with
a local domain and no results were found in sysdb, the entries are
invalidated in memory cache too.
Patch 2: (tools part) Tools sss_userdel and sss_groupdel send
SSS_NSS_GETXXNAM requests after the entry was removed from sysdb. With
the first patch, this invalidates the entry in memory cache.
Patches are in attachment.
Thanks
Michal
>From 08aa1af5629b1015e1fc4202c3f1dd8812309979 Mon Sep 17 00:00:00 2001
From: Michal Zidek <[email protected]>
Date: Thu, 13 Dec 2012 17:38:55 +0100
Subject: [PATCH 1/2] sssd_nss: Remove entries from memory cache if not found
in sysdb
Functions nss_cmd_getXXnam remove entries from memory cache if
not found in sysdb cache of a local domain.
---
src/responder/nss/nsssrv_cmd.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/src/responder/nss/nsssrv_cmd.c b/src/responder/nss/nsssrv_cmd.c
index 14bb3af..c30e21e 100644
--- a/src/responder/nss/nsssrv_cmd.c
+++ b/src/responder/nss/nsssrv_cmd.c
@@ -660,6 +660,7 @@ static int nss_cmd_getpwnam_search(struct nss_dom_ctx *dctx)
struct sss_domain_info *dom = dctx->domain;
struct cli_ctx *cctx = cmdctx->cctx;
char *name = NULL;
+ struct sized_string delete_usrname;
struct sysdb_ctx *sysdb;
struct nss_ctx *nctx;
int ret;
@@ -744,6 +745,17 @@ static int nss_cmd_getpwnam_search(struct nss_dom_ctx *dctx)
DEBUG(2, ("No results for getpwnam call\n"));
+ /* User not found in ldb -> delete user from memory cache. */
+ to_sized_string(&delete_usrname, name);
+ ret = sss_mmap_cache_pw_invalidate(nctx->pwd_mc_ctx,
+ &delete_usrname);
+ if (ret != EOK && ret != ENOENT) {
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ ("Internal failure in memory cache code: %d [%s]\n",
+ ret, strerror(ret)));
+ }
+
+
return ENOENT;
}
@@ -2250,6 +2262,7 @@ static int nss_cmd_getgrnam_search(struct nss_dom_ctx *dctx)
struct sss_domain_info *dom = dctx->domain;
struct cli_ctx *cctx = cmdctx->cctx;
char *name = NULL;
+ struct sized_string delete_grpname;
struct sysdb_ctx *sysdb;
struct nss_ctx *nctx;
int ret;
@@ -2334,6 +2347,16 @@ static int nss_cmd_getgrnam_search(struct nss_dom_ctx *dctx)
DEBUG(2, ("No results for getgrnam call\n"));
+ /* Group not found in ldb -> delete group from memory cache. */
+ to_sized_string(&delete_grpname, name);
+ ret = sss_mmap_cache_gr_invalidate(nctx->grp_mc_ctx,
+ &delete_grpname);
+ if (ret != EOK && ret != ENOENT) {
+ DEBUG(SSSDBG_CRIT_FAILURE,
+ ("Internal failure in memory cache code: %d [%s]\n",
+ ret, strerror(ret)));
+ }
+
return ENOENT;
}
--
1.7.11.2
>From 9f0ed703ef9eee86a6b0224fce4171f5133fe786 Mon Sep 17 00:00:00 2001
From: Michal Zidek <[email protected]>
Date: Thu, 13 Dec 2012 17:44:36 +0100
Subject: [PATCH 2/2] tools: sss_userdel and groupdel remove entries from
memory cache
https://fedorahosted.org/sssd/ticket/1659
---
Makefile.am | 8 ++++++++
src/tools/sss_groupdel.c | 24 ++++++++++++++++++++++++
src/tools/sss_userdel.c | 23 +++++++++++++++++++++++
3 files changed, 55 insertions(+)
diff --git a/Makefile.am b/Makefile.am
index 3145f49..337fa63 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -680,12 +680,16 @@ sss_useradd_LDADD = \
$(TOOLS_LIBS)
sss_userdel_SOURCES = \
+ src/sss_client/common.c \
src/tools/sss_userdel.c \
src/util/find_uid.c \
$(SSSD_TOOLS_OBJ)
sss_userdel_LDADD = \
libsss_util.la \
$(TOOLS_LIBS)
+sss_userdel_CFLAGS = $(AM_CFLAGS)
+sss_userdel_LDFLAGS = \
+ $(CLIENT_LIBS)
sss_groupadd_SOURCES = \
src/tools/sss_groupadd.c \
@@ -695,11 +699,15 @@ sss_groupadd_LDADD = \
$(TOOLS_LIBS)
sss_groupdel_SOURCES = \
+ src/sss_client/common.c \
src/tools/sss_groupdel.c \
$(SSSD_TOOLS_OBJ)
sss_groupdel_LDADD = \
libsss_util.la \
$(TOOLS_LIBS)
+sss_groupdel_CFLAGS = $(AM_CFLAGS)
+sss_groupdel_LDFLAGS = \
+ $(CLIENT_LIBS)
sss_usermod_SOURCES = \
src/tools/sss_usermod.c \
diff --git a/src/tools/sss_groupdel.c b/src/tools/sss_groupdel.c
index 57c3e70..66ea292 100644
--- a/src/tools/sss_groupdel.c
+++ b/src/tools/sss_groupdel.c
@@ -19,6 +19,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <nss.h>
#include <stdio.h>
#include <stdlib.h>
#include <talloc.h>
@@ -28,6 +29,7 @@
#include "util/util.h"
#include "tools/tools_util.h"
#include "tools/sss_sync_ops.h"
+#include "sss_client/sss_cli.h"
int main(int argc, const char **argv)
{
@@ -35,6 +37,10 @@ int main(int argc, const char **argv)
int pc_debug = SSSDBG_DEFAULT;
const char *pc_groupname = NULL;
struct tools_ctx *tctx = NULL;
+ struct sss_cli_req_data rd;
+ uint8_t *repbuf = NULL;
+ size_t replen;
+ enum nss_status nret;
poptContext pc = NULL;
struct poptOption long_options[] = {
@@ -106,6 +112,24 @@ int main(int argc, const char **argv)
/* groupdel */
ret = groupdel(tctx, tctx->sysdb, tctx->octx);
+ if (ret != EOK) {
+ goto done;
+ }
+
+ rd.data = pc_groupname;
+ rd.len = strlen(pc_groupname) + 1;
+
+ sss_nss_lock();
+ nret = sss_nss_make_request(SSS_NSS_GETGRNAM, &rd,
+ &repbuf, &replen, &ret);
+ sss_nss_unlock();
+ free(repbuf);
+ if (nret != NSS_STATUS_SUCCESS && nret != NSS_STATUS_NOTFOUND) {
+ ERROR("NSS request failed (%1$d). Entry might remain in memory"
+ " cache.\n",nret);
+ }
+
+ ret = EOK;
done:
if (ret) {
diff --git a/src/tools/sss_userdel.c b/src/tools/sss_userdel.c
index 5d250f6..53273f6 100644
--- a/src/tools/sss_userdel.c
+++ b/src/tools/sss_userdel.c
@@ -19,6 +19,7 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <nss.h>
#include <stdio.h>
#include <stdlib.h>
#include <talloc.h>
@@ -31,6 +32,7 @@
#include "util/find_uid.h"
#include "tools/tools_util.h"
#include "tools/sss_sync_ops.h"
+#include "sss_client/sss_cli.h"
#ifndef KILL_CMD
#define KILL_CMD "killall"
@@ -119,6 +121,10 @@ int main(int argc, const char **argv)
int ret = EXIT_SUCCESS;
struct tools_ctx *tctx = NULL;
const char *pc_username = NULL;
+ struct sss_cli_req_data rd;
+ uint8_t *repbuf = NULL;
+ size_t replen;
+ enum nss_status nret;
int pc_debug = SSSDBG_DEFAULT;
int pc_remove = 0;
@@ -285,6 +291,21 @@ int main(int argc, const char **argv)
goto fini;
}
+ /* Delete user from memory cache */
+ rd.data = pc_username;
+ rd.len = strlen(pc_username) + 1;
+
+ sss_nss_lock();
+ nret = sss_nss_make_request(SSS_NSS_GETPWNAM, &rd,
+ &repbuf, &replen, &ret);
+
+ sss_nss_unlock();
+ free(repbuf);
+ if (nret != NSS_STATUS_SUCCESS && nret != NSS_STATUS_NOTFOUND) {
+ ERROR("NSS request failed (%1$d). Entry might remain in memory "
+ "cache.\n",nret);
+ }
+
if (tctx->octx->remove_homedir) {
ret = remove_homedir(tctx,
tctx->octx->home,
@@ -301,6 +322,8 @@ int main(int argc, const char **argv)
}
}
+ ret = EOK;
+
done:
if (ret) {
DEBUG(1, ("sysdb operation failed (%d)[%s]\n", ret, strerror(ret)));
--
1.7.11.2
_______________________________________________
sssd-devel mailing list
[email protected]
https://lists.fedorahosted.org/mailman/listinfo/sssd-devel