From: Timo Sirainen Date: Fri, 20 May 2011 15:47:26 +0000 (+0300) Subject: doveadm: Added "proxy list" and "proxy kill" commands. X-Git-Tag: 2.0.14~73 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=02aedbc20af0160091670233383d228f10b168af;p=thirdparty%2Fdovecot%2Fcore.git doveadm: Added "proxy list" and "proxy kill" commands. --- diff --git a/src/doveadm/Makefile.am b/src/doveadm/Makefile.am index b05250b9b8..faa030bcdc 100644 --- a/src/doveadm/Makefile.am +++ b/src/doveadm/Makefile.am @@ -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 index 0000000000..35bfa65f99 --- /dev/null +++ b/src/doveadm/doveadm-proxy.c @@ -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 +#include + +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 ]" }, + { cmd_proxy_kill, "proxy kill", + "[-a ] " } +}; + +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 --git a/src/doveadm/doveadm.c b/src/doveadm/doveadm.c index ddeb4377f8..6aedced609 100644 --- a/src/doveadm/doveadm.c +++ b/src/doveadm/doveadm.c @@ -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(); diff --git a/src/doveadm/doveadm.h b/src/doveadm/doveadm.h index c9daffae0c..e8d0273eb0 100644 --- a/src/doveadm/doveadm.h +++ b/src/doveadm/doveadm.h @@ -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