r24843: Add a "validate-cache" control message to winbindd.
authorMichael Adam <obnox@samba.org>
Fri, 31 Aug 2007 15:24:43 +0000 (15:24 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:30:27 +0000 (12:30 -0500)
So there is a new subcommand "smbcontrol winbindd validate-cache" now.

This change provides the infrastructure:
The function currently returns "true" unconditionally.
The call of a real cache validation function will be incorporated
in subsequent changes.

Michael
(This used to be commit ef92d505c04397614cb0dd5ede967e9017a5e302)

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

index 7818446a09922e6d09e06fcbbd4d94d6aae1e308..b3ae85ec9c4400a18b8698bbc6f034b67b0ab82a 100644 (file)
@@ -96,6 +96,7 @@
 #define MSG_WINBIND_ONLINESTATUS       0x0405
 #define MSG_WINBIND_TRY_TO_GO_ONLINE   0x0406
 #define MSG_WINBIND_FAILED_TO_GO_ONLINE 0x0407
+#define MSG_WINBIND_VALIDATE_CACHE     0x0408
 
 /* event messages */
 #define MSG_DUMP_EVENT_LIST            0x0500
index d7368a3d34330a08a9be79e2cea7493d180d3d00..913ad04c6d9fa26947ccf54a7f9923523942490c 100644 (file)
@@ -202,6 +202,28 @@ static void msg_shutdown(struct messaging_context *msg,
        do_sigterm = True;
 }
 
+
+static void winbind_msg_validate_cache(struct messaging_context *msg_ctx,
+                                      void *private_data,
+                                      uint32_t msg_type,
+                                      struct server_id server_id,
+                                      DATA_BLOB *data)
+{
+       uint8 ret;
+
+       DEBUG(10, ("winbindd_msg_validate_cache: got validate-cache "
+                  "message.\n"));
+
+#if 0
+       ret = (uint8)winbindd_validate_cache_nobackup();
+       DEBUG(10, ("winbindd_msg_validata_cache: got return value %d\n", ret));
+#else
+       ret = 0;
+#endif
+       messaging_send_buf(msg_ctx, server_id, MSG_WINBIND_VALIDATE_CACHE, &ret,
+                          (size_t)1);
+}
+
 static struct winbindd_dispatch_table {
        enum winbindd_cmd cmd;
        void (*fn)(struct winbindd_cli_state *state);
@@ -1170,6 +1192,10 @@ int main(int argc, char **argv, char **envp)
        messaging_register(winbind_messaging_context(), NULL,
                           MSG_DUMP_EVENT_LIST, winbind_msg_dump_event_list);
 
+       messaging_register(winbind_messaging_context(), NULL,
+                          MSG_WINBIND_VALIDATE_CACHE,
+                          winbind_msg_validate_cache);
+
        netsamlogon_cache_init(); /* Non-critical */
        
        /* clear the cached list of trusted domains */
index 2a435945e62ccbbb8020063a60a71a42b73c88c8..8255a41c9607eba2fd4165d92082f5a483ea9f1a 100644 (file)
@@ -1012,6 +1012,48 @@ static BOOL do_dump_event_list(struct messaging_context *msg_ctx,
        return send_message(msg_ctx, pid, MSG_DUMP_EVENT_LIST, NULL, 0);
 }
 
+static void winbind_validate_cache_cb(struct messaging_context *msg,
+                                     void *private_data,
+                                     uint32_t msg_type,
+                                     struct server_id pid,
+                                     DATA_BLOB *data)
+{
+       char *src_string = procid_str(NULL, &pid);
+       printf("Winbindd cache is %svalid. (answer from pid %s)\n",
+              (*(data->data) == 0 ? "" : "NOT "), src_string);
+       TALLOC_FREE(src_string);
+       num_replies++;
+}
+
+static BOOL do_winbind_validate_cache(struct messaging_context *msg_ctx,
+                                     const struct server_id pid,
+                                     const int argc, const char **argv)
+{
+       struct server_id myid = pid_to_procid(sys_getpid());
+
+       if (argc != 1) {
+               fprintf(stderr, "Usage: smbcontrol winbindd validate-cache\n");
+               return False;
+       }
+
+       messaging_register(msg_ctx, NULL, MSG_WINBIND_VALIDATE_CACHE,
+                          winbind_validate_cache_cb);
+
+       if (!send_message(msg_ctx, pid, MSG_WINBIND_VALIDATE_CACHE, &myid,
+                         sizeof(myid))) {
+               return False;
+       }
+
+       wait_replies(msg_ctx, procid_to_pid(&pid) == 0);
+
+       if (num_replies == 0) {
+               printf("No replies received\n");
+       }
+
+       messaging_deregister(msg_ctx, MSG_WINBIND_VALIDATE_CACHE, NULL);
+
+       return num_replies;
+}
 
 static BOOL do_reload_config(struct messaging_context *msg_ctx,
                             const struct server_id pid,
@@ -1110,6 +1152,8 @@ static const struct {
        { "offline", do_winbind_offline, "Ask winbind to go into offline state"},
        { "onlinestatus", do_winbind_onlinestatus, "Request winbind online status"},
        { "dump-event-list", do_dump_event_list, "Dump event list"},
+       { "validate-cache" , do_winbind_validate_cache,
+         "Validate winbind's credential cache" },
        { "noop", do_noop, "Do nothing" },
        { NULL }
 };