s4:messaging: add support 'smbcontrol <pid> debug/debuglevel'
authorStefan Metzmacher <metze@samba.org>
Tue, 15 Jan 2019 00:39:06 +0000 (01:39 +0100)
committerKarolin Seeger <kseeger@samba.org>
Tue, 5 Feb 2019 19:41:25 +0000 (20:41 +0100)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=13752

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Björn Baumbach <bbaumbach@samba.org>
(cherry picked from commit 3a0c1da432c53de234b54bac90a3fb84534994eb)

source4/lib/messaging/messaging.c

index 6c10289515f55d53e2645fdae96ae8d749ada1f6..6cf58539a750dec927fadbecced71a9720e5d93a 100644 (file)
@@ -121,6 +121,68 @@ static void ringbuf_log_msg(struct imessaging_context *msg,
        imessaging_send(msg, src, MSG_RINGBUF_LOG, &blob);
 }
 
+/****************************************************************************
+ Receive a "set debug level" message.
+****************************************************************************/
+
+static void debug_imessage(struct imessaging_context *msg_ctx,
+                          void *private_data,
+                          uint32_t msg_type,
+                          struct server_id src,
+                          DATA_BLOB *data)
+{
+       const char *params_str = (const char *)data->data;
+       struct server_id_buf src_buf;
+       struct server_id dst = imessaging_get_server_id(msg_ctx);
+       struct server_id_buf dst_buf;
+
+       /* Check, it's a proper string! */
+       if (params_str[(data->length)-1] != '\0') {
+               DBG_ERR("Invalid debug message from pid %s to pid %s\n",
+                       server_id_str_buf(src, &src_buf),
+                       server_id_str_buf(dst, &dst_buf));
+               return;
+       }
+
+       DBG_ERR("INFO: Remote set of debug to `%s' (pid %s from pid %s)\n",
+               params_str,
+               server_id_str_buf(dst, &dst_buf),
+               server_id_str_buf(src, &src_buf));
+
+       debug_parse_levels(params_str);
+}
+
+/****************************************************************************
+ Return current debug level.
+****************************************************************************/
+
+static void debuglevel_imessage(struct imessaging_context *msg_ctx,
+                               void *private_data,
+                               uint32_t msg_type,
+                               struct server_id src,
+                               DATA_BLOB *data)
+{
+       char *message = debug_list_class_names_and_levels();
+       DATA_BLOB blob = data_blob_null;
+       struct server_id_buf src_buf;
+       struct server_id dst = imessaging_get_server_id(msg_ctx);
+       struct server_id_buf dst_buf;
+
+       DBG_DEBUG("Received REQ_DEBUGLEVEL message (pid %s from pid %s)\n",
+                 server_id_str_buf(dst, &dst_buf),
+                 server_id_str_buf(src, &src_buf));
+
+       if (message == NULL) {
+               DBG_ERR("debug_list_class_names_and_levels returned NULL\n");
+               return;
+       }
+
+       blob = data_blob_string_const_null(message);
+       imessaging_send(msg_ctx, src, MSG_DEBUGLEVEL, &blob);
+
+       TALLOC_FREE(message);
+}
+
 /*
   return uptime of messaging server via irpc
 */
@@ -460,6 +522,16 @@ struct imessaging_context *imessaging_init(TALLOC_CTX *mem_ctx,
        if (!NT_STATUS_IS_OK(status)) {
                goto fail;
        }
+       status = imessaging_register(msg, NULL, MSG_DEBUG,
+                                    debug_imessage);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto fail;
+       }
+       status = imessaging_register(msg, NULL, MSG_REQ_DEBUGLEVEL,
+                                    debuglevel_imessage);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto fail;
+       }
        status = IRPC_REGISTER(msg, irpc, IRPC_UPTIME, irpc_uptime, msg);
        if (!NT_STATUS_IS_OK(status)) {
                goto fail;