From c74f34cd0909b5ca680166d9c649cea9674e941b Mon Sep 17 00:00:00 2001 From: Sumit Bose Date: Fri, 31 May 2013 10:52:05 +0200 Subject: [PATCH 1/3] Lookup domains at startup To make sure that e.g. the short/NetBIOS domain name is available this patch make sure that the responders send a get_domains request to their backends at startup the collect the domain information or read it from the cache if the backend is offline. For completeness I added this to all responders even if they do not need the information at the moment. Fixes https://fedorahosted.org/sssd/ticket/1951 --- src/responder/autofs/autofssrv.c | 6 +++ src/responder/common/responder.h | 4 ++ src/responder/common/responder_get_domains.c | 49 ++++++++++++++++++++++++++ src/responder/nss/nsssrv.c | 6 +++ src/responder/pac/pacsrv.c | 6 +++ src/responder/pam/pamsrv.c | 6 +++ src/responder/ssh/sshsrv.c | 6 +++ src/responder/sudo/sudosrv.c | 6 +++ 8 files changed, 89 insertions(+), 0 deletions(-) diff --git a/src/responder/autofs/autofssrv.c b/src/responder/autofs/autofssrv.c index ea4c049..edd6f42 100644 --- a/src/responder/autofs/autofssrv.c +++ b/src/responder/autofs/autofssrv.c @@ -194,6 +194,12 @@ autofs_process_init(TALLOC_CTX *mem_ctx, goto fail; } + ret = schedule_get_domains_task(rctx, rctx->ev, rctx); + if (ret != EOK) { + DEBUG(SSSDBG_FATAL_FAILURE, ("schedule_get_domains_tasks failed.\n")); + goto fail; + } + DEBUG(SSSDBG_TRACE_FUNC, ("autofs Initialization complete\n")); return EOK; diff --git a/src/responder/common/responder.h b/src/responder/common/responder.h index 68b4ebb..5331d5b 100644 --- a/src/responder/common/responder.h +++ b/src/responder/common/responder.h @@ -303,6 +303,10 @@ struct tevent_req *sss_dp_get_domains_send(TALLOC_CTX *mem_ctx, errno_t sss_dp_get_domains_recv(struct tevent_req *req); +errno_t schedule_get_domains_task(TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct resp_ctx *rctx); + errno_t csv_string_to_uid_array(TALLOC_CTX *mem_ctx, const char *cvs_string, bool allow_sss_loop, size_t *_uid_count, uid_t **_uids); diff --git a/src/responder/common/responder_get_domains.c b/src/responder/common/responder_get_domains.c index defa4a4..592cd8d 100644 --- a/src/responder/common/responder_get_domains.c +++ b/src/responder/common/responder_get_domains.c @@ -369,3 +369,52 @@ static errno_t check_last_request(struct resp_ctx *rctx, const char *hint) return EOK; } + +static void get_domains_at_startup_done(struct tevent_req *req) +{ + int ret; + + ret = sss_dp_get_domains_recv(req); + talloc_free(req); + if (ret != EOK) { + DEBUG(SSSDBG_OP_FAILURE, ("sss_dp_get_domains request failed.\n")); + } + + return; +} + +static void get_domains_at_startup(struct tevent_context *ev, + struct tevent_immediate *imm, + void *pvt) +{ + struct tevent_req *req; + struct resp_ctx *rctx; + + rctx = talloc_get_type(pvt, struct resp_ctx); + + req = sss_dp_get_domains_send(rctx, rctx, true, NULL); + if (req == NULL) { + DEBUG(SSSDBG_OP_FAILURE, ("sss_dp_get_domains_send failed.\n")); + return; + } + + tevent_req_set_callback(req, get_domains_at_startup_done, NULL); + return; +} + +errno_t schedule_get_domains_task(TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct resp_ctx *rctx) +{ + struct tevent_immediate *imm; + + imm = tevent_create_immediate(mem_ctx); + if (imm == NULL) { + DEBUG(SSSDBG_OP_FAILURE, ("tevent_create_immediate failed.\n")); + return ENOMEM; + } + + tevent_schedule_immediate(imm, ev, get_domains_at_startup, rctx); + + return EOK; +} diff --git a/src/responder/nss/nsssrv.c b/src/responder/nss/nsssrv.c index ee8fecb..ebad150 100644 --- a/src/responder/nss/nsssrv.c +++ b/src/responder/nss/nsssrv.c @@ -532,6 +532,12 @@ int nss_process_init(TALLOC_CTX *mem_ctx, } responder_set_fd_limit(fd_limit); + ret = schedule_get_domains_task(rctx, rctx->ev, rctx); + if (ret != EOK) { + DEBUG(SSSDBG_FATAL_FAILURE, ("schedule_get_domains_tasks failed.\n")); + goto fail; + } + DEBUG(SSSDBG_TRACE_FUNC, ("NSS Initialization complete\n")); return EOK; diff --git a/src/responder/pac/pacsrv.c b/src/responder/pac/pacsrv.c index 9bc2766..22f87cb 100644 --- a/src/responder/pac/pacsrv.c +++ b/src/responder/pac/pacsrv.c @@ -207,6 +207,12 @@ int pac_process_init(TALLOC_CTX *mem_ctx, } responder_set_fd_limit(fd_limit); + ret = schedule_get_domains_task(rctx, rctx->ev, rctx); + if (ret != EOK) { + DEBUG(SSSDBG_FATAL_FAILURE, ("schedule_get_domains_tasks failed.\n")); + goto fail; + } + DEBUG(SSSDBG_TRACE_FUNC, ("PAC Initialization complete\n")); return EOK; diff --git a/src/responder/pam/pamsrv.c b/src/responder/pam/pamsrv.c index c71ef07..fad564a 100644 --- a/src/responder/pam/pamsrv.c +++ b/src/responder/pam/pamsrv.c @@ -203,6 +203,12 @@ static int pam_process_init(TALLOC_CTX *mem_ctx, } responder_set_fd_limit(fd_limit); + ret = schedule_get_domains_task(rctx, rctx->ev, rctx); + if (ret != EOK) { + DEBUG(SSSDBG_FATAL_FAILURE, ("schedule_get_domains_tasks failed.\n")); + goto done; + } + ret = EOK; done: diff --git a/src/responder/ssh/sshsrv.c b/src/responder/ssh/sshsrv.c index 410e631..a1d1f6c 100644 --- a/src/responder/ssh/sshsrv.c +++ b/src/responder/ssh/sshsrv.c @@ -166,6 +166,12 @@ int ssh_process_init(TALLOC_CTX *mem_ctx, goto fail; } + ret = schedule_get_domains_task(rctx, rctx->ev, rctx); + if (ret != EOK) { + DEBUG(SSSDBG_FATAL_FAILURE, ("schedule_get_domains_tasks failed.\n")); + goto fail; + } + DEBUG(SSSDBG_TRACE_FUNC, ("SSH Initialization complete\n")); return EOK; diff --git a/src/responder/sudo/sudosrv.c b/src/responder/sudo/sudosrv.c index a6344a9..e6bd997 100644 --- a/src/responder/sudo/sudosrv.c +++ b/src/responder/sudo/sudosrv.c @@ -148,6 +148,12 @@ int sudo_process_init(TALLOC_CTX *mem_ctx, goto fail; } + ret = schedule_get_domains_task(rctx, rctx->ev, rctx); + if (ret != EOK) { + DEBUG(SSSDBG_FATAL_FAILURE, ("schedule_get_domains_tasks failed.\n")); + goto fail; + } + DEBUG(SSSDBG_TRACE_FUNC, ("SUDO Initialization complete\n")); return EOK; -- 1.7.7.6