]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm: Added "proxy list" and "proxy kill" commands.
authorTimo Sirainen <tss@iki.fi>
Fri, 20 May 2011 15:47:26 +0000 (18:47 +0300)
committerTimo Sirainen <tss@iki.fi>
Fri, 20 May 2011 15:47:26 +0000 (18:47 +0300)
src/doveadm/Makefile.am
src/doveadm/doveadm-proxy.c [new file with mode: 0644]
src/doveadm/doveadm.c
src/doveadm/doveadm.h

index b05250b9b85d488996d981169ef542a6eb1dc478..faa030bcdcfb0f2cff805d64adc2a5bb4b2b97ee 100644 (file)
@@ -95,6 +95,7 @@ doveadm_SOURCES = \
        doveadm-print-pager.c \
        doveadm-print-tab.c \
        doveadm-print-table.c \
+       doveadm-proxy.c \
        doveadm-pw.c \
        doveadm-sis.c \
        doveadm-who.c
diff --git a/src/doveadm/doveadm-proxy.c b/src/doveadm/doveadm-proxy.c
new file mode 100644 (file)
index 0000000..35bfa65
--- /dev/null
@@ -0,0 +1,140 @@
+/* Copyright (c) 2011 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "ioloop.h"
+#include "ipc-client.h"
+#include "doveadm.h"
+#include "doveadm-print.h"
+
+#include <stdio.h>
+#include <unistd.h>
+
+struct proxy_context {
+       struct ipc_client *ipc;
+};
+
+extern struct doveadm_cmd doveadm_cmd_proxy[];
+
+static void proxy_cmd_help(doveadm_command_t *cmd) ATTR_NORETURN;
+
+static struct proxy_context *
+cmd_proxy_init(int argc, char *argv[], const char *getopt_args,
+              doveadm_command_t *cmd)
+{
+       struct proxy_context *ctx;
+       const char *socket_path;
+       int c;
+
+       ctx = t_new(struct proxy_context, 1);
+       socket_path = t_strconcat(doveadm_settings->base_dir, "/ipc", NULL);
+
+       while ((c = getopt(argc, argv, getopt_args)) > 0) {
+               switch (c) {
+               case 'a':
+                       socket_path = optarg;
+                       break;
+               default:
+                       proxy_cmd_help(cmd);
+               }
+       }
+       ctx->ipc = ipc_client_init(socket_path);
+       return ctx;
+}
+
+static void cmd_proxy_list_callback(enum ipc_client_cmd_state state,
+                                   const char *data, void *context ATTR_UNUSED)
+{
+       switch (state) {
+       case IPC_CLIENT_CMD_STATE_REPLY:
+               T_BEGIN {
+                       const char *const *args = t_strsplit(data, "\t");
+                       for (; *args != NULL; args++)
+                               doveadm_print(*args);
+               } T_END;
+               return;
+       case IPC_CLIENT_CMD_STATE_OK:
+               break;
+       case IPC_CLIENT_CMD_STATE_ERROR:
+               i_error("LIST failed: %s", data);
+               break;
+       }
+       io_loop_stop(current_ioloop);
+}
+
+static void cmd_proxy_list(int argc, char *argv[])
+{
+       struct proxy_context *ctx;
+
+       ctx = cmd_proxy_init(argc, argv, "a:", cmd_proxy_list);
+
+       doveadm_print_init(DOVEADM_PRINT_TYPE_TABLE);
+       doveadm_print_header_simple("username");
+       doveadm_print_header("service", "proto", 0);
+       doveadm_print_header("src-ip", "src ip", 0);
+       doveadm_print_header("dest-ip", "dest ip", 0);
+       doveadm_print_header("dest-port", "port", 0);
+
+       ipc_client_cmd(ctx->ipc, "proxy\t*\tLIST",
+                      cmd_proxy_list_callback, NULL);
+       io_loop_run(current_ioloop);
+       ipc_client_deinit(&ctx->ipc);
+}
+
+static void cmd_proxy_kill_callback(enum ipc_client_cmd_state state,
+                                   const char *data, void *context ATTR_UNUSED)
+{
+       switch (state) {
+       case IPC_CLIENT_CMD_STATE_REPLY:
+               return;
+       case IPC_CLIENT_CMD_STATE_OK:
+               printf("%s connections killed\n", data);
+               break;
+       case IPC_CLIENT_CMD_STATE_ERROR:
+               i_error("KILL failed: %s", data);
+               break;
+       }
+       io_loop_stop(current_ioloop);
+}
+
+static void cmd_proxy_kill(int argc, char *argv[])
+{
+       struct proxy_context *ctx;
+
+       ctx = cmd_proxy_init(argc, argv, "a:", cmd_proxy_kill);
+
+       if (argv[optind] == NULL) {
+               proxy_cmd_help(cmd_proxy_kill);
+               return;
+       }
+
+       ipc_client_cmd(ctx->ipc, t_strdup_printf("proxy\t*\tKILL\t%s", argv[optind]),
+                      cmd_proxy_kill_callback, NULL);
+       io_loop_run(current_ioloop);
+       ipc_client_deinit(&ctx->ipc);
+}
+
+struct doveadm_cmd doveadm_cmd_proxy[] = {
+       { cmd_proxy_list, "proxy list",
+         "[-a <ipc socket path>]" },
+       { cmd_proxy_kill, "proxy kill",
+         "[-a <ipc socket path>] <user>" }
+};
+
+static void proxy_cmd_help(doveadm_command_t *cmd)
+{
+       unsigned int i;
+
+       for (i = 0; i < N_ELEMENTS(doveadm_cmd_proxy); i++) {
+               if (doveadm_cmd_proxy[i].cmd == cmd)
+                       help(&doveadm_cmd_proxy[i]);
+       }
+       i_unreached();
+}
+
+void doveadm_register_proxy_commands(void)
+{
+       unsigned int i;
+
+       for (i = 0; i < N_ELEMENTS(doveadm_cmd_proxy); i++)
+               doveadm_register_cmd(&doveadm_cmd_proxy[i]);
+}
index ddeb4377f878f109d6e5218eec1c02282811c4f2..6aedced609a266c041c4e778c4fb2a5c1cea52fe 100644 (file)
@@ -316,6 +316,7 @@ int main(int argc, char *argv[])
        } else {
                quick_init = FALSE;
                doveadm_register_director_commands();
+               doveadm_register_proxy_commands();
                doveadm_register_log_commands();
                doveadm_dump_init();
                doveadm_mail_init();
index c9daffae0cb59a7aa40240f0d53c5fbd79837728..e8d0273eb093ae0d36f722f0e460a56058816190 100644 (file)
@@ -34,6 +34,7 @@ void help(const struct doveadm_cmd *cmd) ATTR_NORETURN;
 void doveadm_master_send_signal(int signo);
 
 void doveadm_register_director_commands(void);
+void doveadm_register_proxy_commands(void);
 void doveadm_register_log_commands(void);
 
 #endif