From cc5d7d9ec7f6ab7c848261d5d49cab4ef841e2eb Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 10 Oct 2013 09:15:57 +0200 Subject: [PATCH 1/4] idl: Add a new message for winbind domain states. BUG: https://bugzilla.samba.org/show_bug.cgi?id=10194 Signed-off-by: Andreas Schneider --- source3/librpc/idl/messaging.idl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source3/librpc/idl/messaging.idl b/source3/librpc/idl/messaging.idl index ddcf0e3..9d16570 100644 --- a/source3/librpc/idl/messaging.idl +++ b/source3/librpc/idl/messaging.idl @@ -100,6 +100,8 @@ interface messaging MSG_WINBIND_VALIDATE_CACHE = 0x0408, MSG_WINBIND_DUMP_DOMAIN_LIST = 0x0409, MSG_WINBIND_IP_DROPPED = 0x040A, + MSG_WINBIND_DOMAIN_ONLINE = 0x040B, + MSG_WINBIND_DOMAIN_OFFLINE = 0x040C, /* event messages */ MSG_DUMP_EVENT_LIST = 0x0500, -- 1.8.4 From 382059a7e4b96cfc7bb97b50905cb110fa69c07f Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 10 Oct 2013 10:01:40 +0200 Subject: [PATCH 2/4] s3-winbind: Add functions for domain online/offline handling. BUG: https://bugzilla.samba.org/show_bug.cgi?id=10194 Signed-off-by: Andreas Schneider --- source3/winbindd/winbindd_cm.c | 40 +++++++++++++++++++++++++++++++++++++++ source3/winbindd/winbindd_proto.h | 10 ++++++++++ 2 files changed, 50 insertions(+) diff --git a/source3/winbindd/winbindd_cm.c b/source3/winbindd/winbindd_cm.c index 3906d3d..cfd15ff 100644 --- a/source3/winbindd/winbindd_cm.c +++ b/source3/winbindd/winbindd_cm.c @@ -340,6 +340,46 @@ static void calc_new_online_timeout_check(struct winbindd_domain *domain) } } +void winbind_msg_domain_offline(struct messaging_context *msg_ctx, + void *private_data, + uint32_t msg_type, + struct server_id server_id, + DATA_BLOB *data) +{ + const char *domain_name = (const char *)data->data; + struct winbindd_domain *domain; + + domain = find_domain_from_name_noinit(domain_name); + if (domain == NULL) { + return; + } + + domain->online = false; + + DEBUG(10, ("Domain %s is marked as offline now.\n", + domain_name)); +} + +void winbind_msg_domain_online(struct messaging_context *msg_ctx, + void *private_data, + uint32_t msg_type, + struct server_id server_id, + DATA_BLOB *data) +{ + const char *domain_name = (const char *)data->data; + struct winbindd_domain *domain; + + domain = find_domain_from_name_noinit(domain_name); + if (domain == NULL) { + return; + } + + domain->online = true; + + DEBUG(10, ("Domain %s is marked as online now.\n", + domain_name)); +} + /**************************************************************** Set domain offline and also add handler to put us back online if we detect a DC. diff --git a/source3/winbindd/winbindd_proto.h b/source3/winbindd/winbindd_proto.h index b07f303..3df7d7c 100644 --- a/source3/winbindd/winbindd_proto.h +++ b/source3/winbindd/winbindd_proto.h @@ -153,6 +153,16 @@ enum winbindd_result winbindd_dual_ccache_ntlm_auth(struct winbindd_domain *doma void winbindd_ccache_save(struct winbindd_cli_state *state); /* The following definitions come from winbindd/winbindd_cm.c */ +void winbind_msg_domain_offline(struct messaging_context *msg_ctx, + void *private_data, + uint32_t msg_type, + struct server_id server_id, + DATA_BLOB *data); +void winbind_msg_domain_online(struct messaging_context *msg_ctx, + void *private_data, + uint32_t msg_type, + struct server_id server_id, + DATA_BLOB *data); void set_domain_offline(struct winbindd_domain *domain); void set_domain_online_request(struct winbindd_domain *domain); -- 1.8.4 From 003a20930c63d26c3052c9d428277d2d41059768 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 10 Oct 2013 10:02:27 +0200 Subject: [PATCH 3/4] s3-winbind: Register handlers for domain online/offline messages. BUG: https://bugzilla.samba.org/show_bug.cgi?id=10194 Signed-off-by: Andreas Schneider --- source3/winbindd/winbindd.c | 6 ++++++ source3/winbindd/winbindd_dual.c | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/source3/winbindd/winbindd.c b/source3/winbindd/winbindd.c index 953e208..50573ac 100644 --- a/source3/winbindd/winbindd.c +++ b/source3/winbindd/winbindd.c @@ -1168,6 +1168,12 @@ static void winbindd_register_handlers(struct messaging_context *msg_ctx, messaging_register(msg_ctx, NULL, MSG_WINBIND_ONLINESTATUS, winbind_msg_onlinestatus); + /* Handle domain online/offline messages for domains */ + messaging_register(winbind_messaging_context(), NULL, + MSG_WINBIND_DOMAIN_OFFLINE, winbind_msg_domain_offline); + messaging_register(winbind_messaging_context(), NULL, + MSG_WINBIND_DOMAIN_ONLINE, winbind_msg_domain_online); + messaging_register(msg_ctx, NULL, MSG_DUMP_EVENT_LIST, winbind_msg_dump_event_list); diff --git a/source3/winbindd/winbindd_dual.c b/source3/winbindd/winbindd_dual.c index 34896d5..972924c 100644 --- a/source3/winbindd/winbindd_dual.c +++ b/source3/winbindd/winbindd_dual.c @@ -1241,6 +1241,11 @@ NTSTATUS winbindd_reinit_after_fork(const struct winbindd_child *myself, messaging_deregister(winbind_messaging_context(), MSG_DEBUG, NULL); + messaging_deregister(winbind_messaging_context(), + MSG_WINBIND_DOMAIN_OFFLINE, NULL); + messaging_deregister(winbind_messaging_context(), + MSG_WINBIND_DOMAIN_ONLINE, NULL); + /* We have destroyed all events in the winbindd_event_context * in reinit_after_fork(), so clean out all possible pending * event pointers. */ -- 1.8.4 From 32202c86cb09498a37306216de8c7efeb19da01c Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Thu, 10 Oct 2013 10:03:32 +0200 Subject: [PATCH 4/4] s3-winbind: Send online/offline message of the domain to the parent. https://bugzilla.samba.org/show_bug.cgi?id=10194 Signed-off-by: Andreas Schneider --- source3/winbindd/winbindd_cm.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/source3/winbindd/winbindd_cm.c b/source3/winbindd/winbindd_cm.c index cfd15ff..46ffc16 100644 --- a/source3/winbindd/winbindd_cm.c +++ b/source3/winbindd/winbindd_cm.c @@ -387,6 +387,8 @@ void winbind_msg_domain_online(struct messaging_context *msg_ctx, void set_domain_offline(struct winbindd_domain *domain) { + pid_t parent_pid = getppid(); + DEBUG(10,("set_domain_offline: called for domain %s\n", domain->name )); @@ -434,6 +436,15 @@ void set_domain_offline(struct winbindd_domain *domain) DEBUG(10,("set_domain_offline: added event handler for domain %s\n", domain->name )); + /* Send a message to the parrent that the domain is offline. */ + if (parent_pid > 1 && !domain->internal) { + messaging_send_buf(winbind_messaging_context(), + pid_to_procid(parent_pid), + MSG_WINBIND_DOMAIN_OFFLINE, + (uint8 *)domain->name, + strlen(domain->name) + 1); + } + /* Send an offline message to the idmap child when our primary domain goes offline */ @@ -458,6 +469,8 @@ void set_domain_offline(struct winbindd_domain *domain) static void set_domain_online(struct winbindd_domain *domain) { + pid_t parent_pid = getppid(); + DEBUG(10,("set_domain_online: called for domain %s\n", domain->name )); @@ -509,6 +522,15 @@ static void set_domain_online(struct winbindd_domain *domain) domain->online = True; + /* Send a message to the parrent that the domain is online. */ + if (parent_pid > 1 && !domain->internal) { + messaging_send_buf(winbind_messaging_context(), + pid_to_procid(parent_pid), + MSG_WINBIND_DOMAIN_ONLINE, + (uint8 *)domain->name, + strlen(domain->name) + 1); + } + /* Send an online message to the idmap child when our primary domain comes online */ -- 1.8.4