dovecot-2.0: doveadm: Added "proxy list" and "proxy kill" commands.
dovecot at dovecot.org
dovecot at dovecot.org
Fri May 20 18:48:19 EEST 2011
details: http://hg.dovecot.org/dovecot-2.0/rev/f2874eef6b0b
changeset: 12820:f2874eef6b0b
user: Timo Sirainen <tss at iki.fi>
date: Fri May 20 18:47:26 2011 +0300
description:
doveadm: Added "proxy list" and "proxy kill" commands.
diffstat:
src/doveadm/Makefile.am | 1 +
src/doveadm/doveadm-proxy.c | 140 ++++++++++++++++++++++++++++++++++++++++++++
src/doveadm/doveadm.c | 1 +
src/doveadm/doveadm.h | 1 +
4 files changed, 143 insertions(+), 0 deletions(-)
diffs (177 lines):
diff -r e4f7fb3b5a9c -r f2874eef6b0b src/doveadm/Makefile.am
--- a/src/doveadm/Makefile.am Fri May 20 18:47:02 2011 +0300
+++ b/src/doveadm/Makefile.am Fri May 20 18:47:26 2011 +0300
@@ -95,6 +95,7 @@
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 -r e4f7fb3b5a9c -r f2874eef6b0b src/doveadm/doveadm-proxy.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/doveadm/doveadm-proxy.c Fri May 20 18:47:26 2011 +0300
@@ -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]);
+}
diff -r e4f7fb3b5a9c -r f2874eef6b0b src/doveadm/doveadm.c
--- a/src/doveadm/doveadm.c Fri May 20 18:47:02 2011 +0300
+++ b/src/doveadm/doveadm.c Fri May 20 18:47:26 2011 +0300
@@ -316,6 +316,7 @@
} else {
quick_init = FALSE;
doveadm_register_director_commands();
+ doveadm_register_proxy_commands();
doveadm_register_log_commands();
doveadm_dump_init();
doveadm_mail_init();
diff -r e4f7fb3b5a9c -r f2874eef6b0b src/doveadm/doveadm.h
--- a/src/doveadm/doveadm.h Fri May 20 18:47:02 2011 +0300
+++ b/src/doveadm/doveadm.h Fri May 20 18:47:26 2011 +0300
@@ -34,6 +34,7 @@
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
More information about the dovecot-cvs
mailing list