r15428: Add "smbcontrol winbind onlinestatus" for debugging purpose.
authorGünther Deschner <gd@samba.org>
Thu, 4 May 2006 12:37:13 +0000 (12:37 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 16:16:43 +0000 (11:16 -0500)
Guenther
(This used to be commit 9e15b1659c105b0be846e8f71c27b20eab961bd2)

source3/include/messages.h
source3/nsswitch/winbindd.c
source3/nsswitch/winbindd_cache.c
source3/nsswitch/winbindd_dual.c
source3/utils/smbcontrol.c

index 6a739c0bcc7a321be7938fb3da04281a2f82b6e6..e246123ea9ffd397a23e1e420a2bef540485c49a 100644 (file)
@@ -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. */
index e6c69247f8537fba7db13f2c932f1f17e923f6c4..06b8b93543744216dfaa3e8938861ba50e95df6f 100644 (file)
@@ -1035,6 +1035,7 @@ int main(int argc, char **argv)
        /* 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);
 
index bf76c7f251f025256d74ac84df51b64170f77319..6541e1087775fb7dca6a9906d5a9efeae78d0fb8 100644 (file)
@@ -2357,6 +2357,11 @@ void set_global_winbindd_state_online(void)
        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,
index c5d24f98c1bda84042b359392aba6afbfd1b0b09..05b73a9ddc897fa6ebf0ed7e4472b11bb7c197de 100644 (file)
@@ -496,6 +496,26 @@ void winbind_msg_online(int msg_type, struct process_id src, void *buf, size_t l
        }
 }
 
+/* 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 void child_msg_online(int msg_type, struct process_id src, void *buf, siz
        }
 }
 
+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 @@ static BOOL fork_domain_child(struct winbindd_child *child)
        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 @@ static BOOL fork_domain_child(struct winbindd_child *child)
        /* 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) {
 
index c368ee0ad4cb0428bb794c83fe2036c06fde48d9..ad05f8e94839b2a58db52396cc35457c0fdd52c2 100644 (file)
@@ -909,6 +909,36 @@ static BOOL do_winbind_offline(const struct process_id pid,
        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 @@ static const struct {
        { "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 }
 };