svn commit: samba r15428 - branches/SAMBA_3_0/source/include branches/SAMBA_3_0/source/nsswitch branches/SAMBA_3_0/source/utils trunk/source/include trunk/source/nsswitch trunk/source/utils

gd at samba.org gd at samba.org
Thu May 4 12:37:14 GMT 2006


Author: gd
Date: 2006-05-04 12:37:13 +0000 (Thu, 04 May 2006)
New Revision: 15428

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=15428

Log:
Add "smbcontrol winbind onlinestatus" for debugging purpose.

Guenther

Modified:
   branches/SAMBA_3_0/source/include/messages.h
   branches/SAMBA_3_0/source/nsswitch/winbindd.c
   branches/SAMBA_3_0/source/nsswitch/winbindd_cache.c
   branches/SAMBA_3_0/source/nsswitch/winbindd_dual.c
   branches/SAMBA_3_0/source/utils/smbcontrol.c
   trunk/source/include/messages.h
   trunk/source/nsswitch/winbindd.c
   trunk/source/nsswitch/winbindd_cache.c
   trunk/source/nsswitch/winbindd_dual.c
   trunk/source/utils/smbcontrol.c


Changeset:
Modified: branches/SAMBA_3_0/source/include/messages.h
===================================================================
--- branches/SAMBA_3_0/source/include/messages.h	2006-05-04 11:01:10 UTC (rev 15427)
+++ branches/SAMBA_3_0/source/include/messages.h	2006-05-04 12:37:13 UTC (rev 15428)
@@ -76,6 +76,7 @@
 #define MSG_WINBIND_FORGET_STATE 4002
 #define MSG_WINBIND_ONLINE       4003
 #define MSG_WINBIND_OFFLINE      4004
+#define MSG_WINBIND_ONLINESTATUS 4005
 
 /* Flags to classify messages - used in message_send_all() */
 /* Sender will filter by flag. */

Modified: branches/SAMBA_3_0/source/nsswitch/winbindd.c
===================================================================
--- branches/SAMBA_3_0/source/nsswitch/winbindd.c	2006-05-04 11:01:10 UTC (rev 15427)
+++ branches/SAMBA_3_0/source/nsswitch/winbindd.c	2006-05-04 12:37:13 UTC (rev 15428)
@@ -1035,6 +1035,7 @@
 	/* Handle online/offline messages. */
 	message_register(MSG_WINBIND_OFFLINE,winbind_msg_offline);
 	message_register(MSG_WINBIND_ONLINE,winbind_msg_online);
+	message_register(MSG_WINBIND_ONLINESTATUS,winbind_msg_onlinestatus);
 
 	poptFreeContext(pc);
 

Modified: branches/SAMBA_3_0/source/nsswitch/winbindd_cache.c
===================================================================
--- branches/SAMBA_3_0/source/nsswitch/winbindd_cache.c	2006-05-04 11:01:10 UTC (rev 15427)
+++ branches/SAMBA_3_0/source/nsswitch/winbindd_cache.c	2006-05-04 12:37:13 UTC (rev 15428)
@@ -2357,6 +2357,11 @@
 	tdb_delete_bystring(wcache->tdb, "WINBINDD_OFFLINE");
 }
 
+BOOL get_global_winbindd_state_online(void)
+{
+	return global_winbindd_offline_state;
+}
+
 /* the cache backend methods are exposed via this structure */
 struct winbindd_methods cache_methods = {
 	True,

Modified: branches/SAMBA_3_0/source/nsswitch/winbindd_dual.c
===================================================================
--- branches/SAMBA_3_0/source/nsswitch/winbindd_dual.c	2006-05-04 11:01:10 UTC (rev 15427)
+++ branches/SAMBA_3_0/source/nsswitch/winbindd_dual.c	2006-05-04 12:37:13 UTC (rev 15428)
@@ -496,6 +496,26 @@
 	}
 }
 
+/* Forward the online/offline messages to our children. */
+void winbind_msg_onlinestatus(int msg_type, struct process_id src, void *buf, size_t len)
+{
+	struct winbindd_child *child;
+
+	DEBUG(10,("winbind_msg_onlinestatus: got onlinestatus message.\n"));
+
+	for (child = children; child != NULL; child = child->next) {
+		if (child->domain && child->domain->primary) {
+			DEBUG(10,("winbind_msg_onlinestatus: "
+				  "sending message to pid %u of primary domain.\n",
+				  (unsigned int)child->pid));
+			message_send_pid(pid_to_procid(child->pid), 
+					 MSG_WINBIND_ONLINESTATUS, buf, len, False);
+			break;
+		}
+	}
+}
+
+
 static void account_lockout_policy_handler(struct timed_event *te,
 					   const struct timeval *now,
 					   void *private_data)
@@ -582,6 +602,60 @@
 	}
 }
 
+static const char *collect_onlinestatus(TALLOC_CTX *mem_ctx)
+{
+	struct winbindd_domain *domain;
+	char *buf = NULL;
+
+	if ((buf = talloc_asprintf(mem_ctx, "global:%s ", 
+				   get_global_winbindd_state_online() ? 
+				   "Offline":"Online")) == NULL) {
+		return NULL;
+	}
+
+	for (domain = domain_list(); domain; domain = domain->next) {
+		if ((buf = talloc_asprintf_append(buf, "%s:%s ", 
+						  domain->name, 
+						  domain->online ?
+						  "Online":"Offline")) == NULL) {
+			return NULL;
+		}
+	}
+
+	buf = talloc_asprintf_append(buf, "\n");
+
+	DEBUG(5,("collect_onlinestatus: %s\n", buf));
+
+	return buf;
+}
+
+static void child_msg_onlinestatus(int msg_type, struct process_id src, void *buf, size_t len)
+{
+	TALLOC_CTX *mem_ctx;
+	const char *message;
+	struct process_id *sender;
+	
+	DEBUG(5,("winbind_msg_onlinestatus received.\n"));
+
+	if (!buf) {
+		return;
+	}
+
+	sender = (struct process_id *)buf;
+
+	mem_ctx = talloc_init("winbind_msg_onlinestatus");
+	if (mem_ctx == NULL) {
+		return;
+	}
+	
+	message = collect_onlinestatus(mem_ctx);
+
+	message_send_pid(*sender, MSG_WINBIND_ONLINESTATUS, 
+			 message, strlen(message) + 1, True);
+
+	talloc_destroy(mem_ctx);
+}
+
 static BOOL fork_domain_child(struct winbindd_child *child)
 {
 	int fdpair[2];
@@ -646,6 +720,7 @@
 	message_deregister(MSG_SHUTDOWN);
 	message_deregister(MSG_WINBIND_OFFLINE);
 	message_deregister(MSG_WINBIND_ONLINE);
+	message_deregister(MSG_WINBIND_ONLINESTATUS);
 
 	/* The child is ok with online/offline messages now. */
 	message_unblock();
@@ -667,6 +742,7 @@
 	/* Handle online/offline messages. */
 	message_register(MSG_WINBIND_OFFLINE,child_msg_offline);
 	message_register(MSG_WINBIND_ONLINE,child_msg_online);
+	message_register(MSG_WINBIND_ONLINESTATUS,child_msg_onlinestatus);
 
 	while (1) {
 

Modified: branches/SAMBA_3_0/source/utils/smbcontrol.c
===================================================================
--- branches/SAMBA_3_0/source/utils/smbcontrol.c	2006-05-04 11:01:10 UTC (rev 15427)
+++ branches/SAMBA_3_0/source/utils/smbcontrol.c	2006-05-04 12:37:13 UTC (rev 15428)
@@ -909,6 +909,36 @@
 	return ret;
 }
 
+static BOOL do_winbind_onlinestatus(const struct process_id pid,
+				    const int argc, const char **argv)
+{
+	struct process_id myid;
+
+	myid = pid_to_procid(sys_getpid());
+
+	if (argc != 1) {
+		fprintf(stderr, "Usage: smbcontrol winbindd onlinestatus\n");
+		return False;
+	}
+
+	message_register(MSG_WINBIND_ONLINESTATUS, print_pid_string_cb);
+
+	if (!send_message(pid, MSG_WINBIND_ONLINESTATUS, &myid, sizeof(myid), False))
+		return False;
+
+	wait_replies(procid_to_pid(&pid) == 0);
+
+	/* No replies were received within the timeout period */
+
+	if (num_replies == 0)
+		printf("No replies received\n");
+
+	message_deregister(MSG_WINBIND_ONLINESTATUS);
+
+	return num_replies;
+}
+
+
 static BOOL do_reload_config(const struct process_id pid,
 			     const int argc, const char **argv)
 {
@@ -999,6 +1029,7 @@
 	{ "nodestatus", do_nodestatus, "Ask nmbd to do a node status request"},
 	{ "online", do_winbind_online, "Ask winbind to go into online state"},
 	{ "offline", do_winbind_offline, "Ask winbind to go into offline state"},
+	{ "onlinestatus", do_winbind_onlinestatus, "Request winbind online status"},
 	{ "noop", do_noop, "Do nothing" },
 	{ NULL }
 };

Modified: trunk/source/include/messages.h
===================================================================
--- trunk/source/include/messages.h	2006-05-04 11:01:10 UTC (rev 15427)
+++ trunk/source/include/messages.h	2006-05-04 12:37:13 UTC (rev 15428)
@@ -76,6 +76,7 @@
 #define MSG_WINBIND_FORGET_STATE 4002
 #define MSG_WINBIND_ONLINE       4003
 #define MSG_WINBIND_OFFLINE      4004
+#define MSG_WINBIND_ONLINESTATUS 4005
 
 /* Flags to classify messages - used in message_send_all() */
 /* Sender will filter by flag. */

Modified: trunk/source/nsswitch/winbindd.c
===================================================================
--- trunk/source/nsswitch/winbindd.c	2006-05-04 11:01:10 UTC (rev 15427)
+++ trunk/source/nsswitch/winbindd.c	2006-05-04 12:37:13 UTC (rev 15428)
@@ -1036,6 +1036,7 @@
 	/* Handle online/offline messages. */
 	message_register(MSG_WINBIND_OFFLINE,winbind_msg_offline);
 	message_register(MSG_WINBIND_ONLINE,winbind_msg_online);
+	message_register(MSG_WINBIND_ONLINESTATUS,winbind_msg_onlinestatus);
 
 	poptFreeContext(pc);
 

Modified: trunk/source/nsswitch/winbindd_cache.c
===================================================================
--- trunk/source/nsswitch/winbindd_cache.c	2006-05-04 11:01:10 UTC (rev 15427)
+++ trunk/source/nsswitch/winbindd_cache.c	2006-05-04 12:37:13 UTC (rev 15428)
@@ -2479,6 +2479,11 @@
 	tdb_delete_bystring(wcache->tdb, "WINBINDD_OFFLINE");
 }
 
+BOOL get_global_winbindd_state_online(void)
+{
+	return global_winbindd_offline_state;
+}
+
 /* the cache backend methods are exposed via this structure */
 struct winbindd_methods cache_methods = {
 	True,

Modified: trunk/source/nsswitch/winbindd_dual.c
===================================================================
--- trunk/source/nsswitch/winbindd_dual.c	2006-05-04 11:01:10 UTC (rev 15427)
+++ trunk/source/nsswitch/winbindd_dual.c	2006-05-04 12:37:13 UTC (rev 15428)
@@ -497,6 +497,26 @@
 	}
 }
 
+/* Forward the online/offline messages to our children. */
+void winbind_msg_onlinestatus(int msg_type, struct process_id src, void *buf, size_t len)
+{
+	struct winbindd_child *child;
+
+	DEBUG(10,("winbind_msg_onlinestatus: got onlinestatus message.\n"));
+
+	for (child = children; child != NULL; child = child->next) {
+		if (child->domain && child->domain->primary) {
+			DEBUG(10,("winbind_msg_onlinestatus: "
+				  "sending message to pid %u of primary domain.\n",
+				  (unsigned int)child->pid));
+			message_send_pid(pid_to_procid(child->pid), 
+					 MSG_WINBIND_ONLINESTATUS, buf, len, False);
+			break;
+		}
+	}
+}
+
+
 static void account_lockout_policy_handler(struct timed_event *te,
 					   const struct timeval *now,
 					   void *private_data)
@@ -583,6 +603,60 @@
 	}
 }
 
+static const char *collect_onlinestatus(TALLOC_CTX *mem_ctx)
+{
+	struct winbindd_domain *domain;
+	char *buf = NULL;
+
+	if ((buf = talloc_asprintf(mem_ctx, "global:%s ", 
+				   get_global_winbindd_state_online() ? 
+				   "Offline":"Online")) == NULL) {
+		return NULL;
+	}
+
+	for (domain = domain_list(); domain; domain = domain->next) {
+		if ((buf = talloc_asprintf_append(buf, "%s:%s ", 
+						  domain->name, 
+						  domain->online ?
+						  "Online":"Offline")) == NULL) {
+			return NULL;
+		}
+	}
+
+	buf = talloc_asprintf_append(buf, "\n");
+
+	DEBUG(5,("collect_onlinestatus: %s\n", buf));
+
+	return buf;
+}
+
+static void child_msg_onlinestatus(int msg_type, struct process_id src, void *buf, size_t len)
+{
+	TALLOC_CTX *mem_ctx;
+	const char *message;
+	struct process_id *sender;
+	
+	DEBUG(5,("winbind_msg_onlinestatus received.\n"));
+
+	if (!buf) {
+		return;
+	}
+
+	sender = (struct process_id *)buf;
+
+	mem_ctx = talloc_init("winbind_msg_onlinestatus");
+	if (mem_ctx == NULL) {
+		return;
+	}
+	
+	message = collect_onlinestatus(mem_ctx);
+
+	message_send_pid(*sender, MSG_WINBIND_ONLINESTATUS, 
+			 message, strlen(message) + 1, True);
+
+	talloc_destroy(mem_ctx);
+}
+
 static BOOL fork_domain_child(struct winbindd_child *child)
 {
 	int fdpair[2];
@@ -647,6 +721,7 @@
 	message_deregister(MSG_SHUTDOWN);
 	message_deregister(MSG_WINBIND_OFFLINE);
 	message_deregister(MSG_WINBIND_ONLINE);
+	message_deregister(MSG_WINBIND_ONLINESTATUS);
 
 	/* The child is ok with online/offline messages now. */
 	message_unblock();
@@ -668,6 +743,7 @@
 	/* Handle online/offline messages. */
 	message_register(MSG_WINBIND_OFFLINE,child_msg_offline);
 	message_register(MSG_WINBIND_ONLINE,child_msg_online);
+	message_register(MSG_WINBIND_ONLINESTATUS,child_msg_onlinestatus);
 
 	while (1) {
 

Modified: trunk/source/utils/smbcontrol.c
===================================================================
--- trunk/source/utils/smbcontrol.c	2006-05-04 11:01:10 UTC (rev 15427)
+++ trunk/source/utils/smbcontrol.c	2006-05-04 12:37:13 UTC (rev 15428)
@@ -909,6 +909,36 @@
 	return ret;
 }
 
+static BOOL do_winbind_onlinestatus(const struct process_id pid,
+				    const int argc, const char **argv)
+{
+	struct process_id myid;
+
+	myid = pid_to_procid(sys_getpid());
+
+	if (argc != 1) {
+		fprintf(stderr, "Usage: smbcontrol winbindd onlinestatus\n");
+		return False;
+	}
+
+	message_register(MSG_WINBIND_ONLINESTATUS, print_pid_string_cb);
+
+	if (!send_message(pid, MSG_WINBIND_ONLINESTATUS, &myid, sizeof(myid), False))
+		return False;
+
+	wait_replies(procid_to_pid(&pid) == 0);
+
+	/* No replies were received within the timeout period */
+
+	if (num_replies == 0)
+		printf("No replies received\n");
+
+	message_deregister(MSG_WINBIND_ONLINESTATUS);
+
+	return num_replies;
+}
+
+
 static BOOL do_reload_config(const struct process_id pid,
 			     const int argc, const char **argv)
 {
@@ -999,6 +1029,7 @@
 	{ "nodestatus", do_nodestatus, "Ask nmbd to do a node status request"},
 	{ "online", do_winbind_online, "Ask winbind to go into online state"},
 	{ "offline", do_winbind_offline, "Ask winbind to go into offline state"},
+	{ "onlinestatus", do_winbind_onlinestatus, "Request winbind online status"},
 	{ "noop", do_noop, "Do nothing" },
 	{ NULL }
 };



More information about the samba-cvs mailing list