doveadm-proxy.c (dovecot-2.3.16) | : | doveadm-proxy.c (dovecot-2.3.17) | ||
---|---|---|---|---|
skipping to change at line 22 | skipping to change at line 22 | |||
#include <unistd.h> | #include <unistd.h> | |||
struct proxy_context { | struct proxy_context { | |||
struct ipc_client *ipc; | struct ipc_client *ipc; | |||
const char *username_field; | const char *username_field; | |||
const char *kick_hosts; | const char *kick_hosts; | |||
}; | }; | |||
extern struct doveadm_cmd_ver2 doveadm_cmd_proxy[]; | extern struct doveadm_cmd_ver2 doveadm_cmd_proxy[]; | |||
static void proxy_cmd_help(doveadm_command_t *cmd) ATTR_NORETURN; | static void proxy_cmd_help(struct doveadm_cmd_context *cctx) ATTR_NORETURN; | |||
static struct proxy_context * | static struct proxy_context * | |||
cmd_proxy_init(int argc, char *argv[], const char *getopt_args, | cmd_proxy_init(struct doveadm_cmd_context *cctx) | |||
doveadm_command_t *cmd) | ||||
{ | { | |||
struct proxy_context *ctx; | struct proxy_context *ctx; | |||
const char *socket_path; | const char *socket_path; | |||
int c; | ||||
ctx = t_new(struct proxy_context, 1); | ctx = t_new(struct proxy_context, 1); | |||
socket_path = t_strconcat(doveadm_settings->base_dir, "/ipc", NULL); | if (!doveadm_cmd_param_str(cctx, "socket-path", &socket_path)) { | |||
socket_path = t_strconcat(doveadm_settings->base_dir, | ||||
while ((c = getopt(argc, argv, getopt_args)) > 0) { | "/ipc", NULL); | |||
switch (c) { | ||||
case 'a': | ||||
socket_path = optarg; | ||||
break; | ||||
case 'f': | ||||
ctx->username_field = optarg; | ||||
break; | ||||
case 'h': | ||||
ctx->kick_hosts = optarg; | ||||
break; | ||||
default: | ||||
proxy_cmd_help(cmd); | ||||
} | ||||
} | } | |||
(void)doveadm_cmd_param_str(cctx, "passdb-field", &ctx->username_field); | ||||
(void)doveadm_cmd_param_str(cctx, "host", &ctx->kick_hosts); | ||||
ctx->ipc = ipc_client_init(socket_path); | ctx->ipc = ipc_client_init(socket_path); | |||
return ctx; | return ctx; | |||
} | } | |||
static void cmd_proxy_list_header(const char *const *args) | static void cmd_proxy_list_header(const char *const *args) | |||
{ | { | |||
struct { | struct { | |||
const char *key; | const char *key; | |||
const char *title; | const char *title; | |||
} header_map[] = { | } header_map[] = { | |||
skipping to change at line 112 | skipping to change at line 99 | |||
} | } | |||
case IPC_CLIENT_CMD_STATE_OK: | case IPC_CLIENT_CMD_STATE_OK: | |||
break; | break; | |||
case IPC_CLIENT_CMD_STATE_ERROR: | case IPC_CLIENT_CMD_STATE_ERROR: | |||
i_error("LIST-FULL failed: %s", data); | i_error("LIST-FULL failed: %s", data); | |||
break; | break; | |||
} | } | |||
io_loop_stop(current_ioloop); | io_loop_stop(current_ioloop); | |||
} | } | |||
static void cmd_proxy_list(int argc, char *argv[]) | static void cmd_proxy_list(struct doveadm_cmd_context *cctx) | |||
{ | { | |||
struct proxy_context *ctx; | struct proxy_context *ctx; | |||
bool seen_header = FALSE; | bool seen_header = FALSE; | |||
ctx = cmd_proxy_init(argc, argv, "a:", cmd_proxy_list); | ctx = cmd_proxy_init(cctx); | |||
doveadm_print_init(DOVEADM_PRINT_TYPE_TABLE); | doveadm_print_init(DOVEADM_PRINT_TYPE_TABLE); | |||
io_loop_set_running(current_ioloop); | io_loop_set_running(current_ioloop); | |||
ipc_client_cmd(ctx->ipc, "proxy\t*\tLIST-FULL", | ipc_client_cmd(ctx->ipc, "proxy\t*\tLIST-FULL", | |||
cmd_proxy_list_callback, &seen_header); | cmd_proxy_list_callback, &seen_header); | |||
if (io_loop_is_running(current_ioloop)) | if (io_loop_is_running(current_ioloop)) | |||
io_loop_run(current_ioloop); | io_loop_run(current_ioloop); | |||
ipc_client_deinit(&ctx->ipc); | ipc_client_deinit(&ctx->ipc); | |||
} | } | |||
skipping to change at line 148 | skipping to change at line 135 | |||
doveadm_print(data); | doveadm_print(data); | |||
break; | break; | |||
case IPC_CLIENT_CMD_STATE_ERROR: | case IPC_CLIENT_CMD_STATE_ERROR: | |||
i_error("KICK failed: %s", data); | i_error("KICK failed: %s", data); | |||
doveadm_exit_code = EX_TEMPFAIL; | doveadm_exit_code = EX_TEMPFAIL; | |||
break; | break; | |||
} | } | |||
io_loop_stop(current_ioloop); | io_loop_stop(current_ioloop); | |||
} | } | |||
static void cmd_proxy_kick(int argc, char *argv[]) | static void cmd_proxy_kick(struct doveadm_cmd_context *cctx) | |||
{ | { | |||
struct proxy_context *ctx; | struct proxy_context *ctx; | |||
const char *const *users = NULL; | ||||
string_t *cmd; | string_t *cmd; | |||
ctx = cmd_proxy_init(argc, argv, "a:f:h:", cmd_proxy_kick); | ctx = cmd_proxy_init(cctx); | |||
(void)doveadm_cmd_param_array(cctx, "user", &users); | ||||
if (argv[optind] == NULL && ctx->kick_hosts == NULL) { | if (users == NULL && ctx->kick_hosts == NULL) { | |||
proxy_cmd_help(cmd_proxy_kick); | proxy_cmd_help(cctx); | |||
return; | return; | |||
} | } | |||
doveadm_print_init(DOVEADM_PRINT_TYPE_FORMATTED); | doveadm_print_init(DOVEADM_PRINT_TYPE_FORMATTED); | |||
doveadm_print_formatted_set_format("%{count} connections kicked\n"); | doveadm_print_formatted_set_format("%{count} connections kicked\n"); | |||
doveadm_print_header_simple("count"); | doveadm_print_header_simple("count"); | |||
cmd = t_str_new(128); | cmd = t_str_new(128); | |||
str_append(cmd, "proxy\t*\t"); | str_append(cmd, "proxy\t*\t"); | |||
if (ctx->kick_hosts != NULL) { | if (ctx->kick_hosts != NULL) { | |||
str_append(cmd, "KICK-HOST\t"); | str_append(cmd, "KICK-HOST\t"); | |||
str_append(cmd, ctx->kick_hosts); | str_append(cmd, ctx->kick_hosts); | |||
} | } | |||
else if (ctx->username_field == NULL) | else if (ctx->username_field == NULL) | |||
str_append(cmd, "KICK"); | str_append(cmd, "KICK"); | |||
else { | else { | |||
str_append(cmd, "KICK-ALT\t"); | str_append(cmd, "KICK-ALT\t"); | |||
str_append_tabescaped(cmd, ctx->username_field); | str_append_tabescaped(cmd, ctx->username_field); | |||
} | } | |||
for (; argv[optind] != NULL; optind++) { | if (users != NULL) { | |||
str_append_c(cmd, '\t'); | for (unsigned int i = 0; users[i] != NULL; i++) { | |||
str_append_tabescaped(cmd, argv[optind]); | str_append_c(cmd, '\t'); | |||
str_append_tabescaped(cmd, users[i]); | ||||
} | ||||
} | } | |||
ipc_client_cmd(ctx->ipc, str_c(cmd), cmd_proxy_kick_callback, NULL); | ipc_client_cmd(ctx->ipc, str_c(cmd), cmd_proxy_kick_callback, NULL); | |||
io_loop_run(current_ioloop); | io_loop_run(current_ioloop); | |||
ipc_client_deinit(&ctx->ipc); | ipc_client_deinit(&ctx->ipc); | |||
} | } | |||
struct doveadm_cmd_ver2 doveadm_cmd_proxy[] = { | struct doveadm_cmd_ver2 doveadm_cmd_proxy[] = { | |||
{ | { | |||
.name = "proxy list", | .name = "proxy list", | |||
.usage = "[-a <ipc socket path>]", | .usage = "[-a <ipc socket path>]", | |||
.old_cmd = cmd_proxy_list, | .cmd = cmd_proxy_list, | |||
DOVEADM_CMD_PARAMS_START | DOVEADM_CMD_PARAMS_START | |||
DOVEADM_CMD_PARAM('a', "socket-path", CMD_PARAM_STR, 0) | DOVEADM_CMD_PARAM('a', "socket-path", CMD_PARAM_STR, 0) | |||
DOVEADM_CMD_PARAMS_END | DOVEADM_CMD_PARAMS_END | |||
}, | }, | |||
{ | { | |||
.name = "proxy kick", | .name = "proxy kick", | |||
.usage = "[-a <ipc socket path>] [-f <passdb field>] [-h <host> [...] | < user> [...]]", | .usage = "[-a <ipc socket path>] [-f <passdb field>] [-h <host> [...] | < user> [...]]", | |||
.old_cmd = cmd_proxy_kick, | .cmd = cmd_proxy_kick, | |||
DOVEADM_CMD_PARAMS_START | DOVEADM_CMD_PARAMS_START | |||
DOVEADM_CMD_PARAM('a', "socket-path", CMD_PARAM_STR, 0) | DOVEADM_CMD_PARAM('a', "socket-path", CMD_PARAM_STR, 0) | |||
DOVEADM_CMD_PARAM('f', "passdb-field", CMD_PARAM_STR, 0) | DOVEADM_CMD_PARAM('f', "passdb-field", CMD_PARAM_STR, 0) | |||
DOVEADM_CMD_PARAM('h', "host", CMD_PARAM_STR, 0) | DOVEADM_CMD_PARAM('h', "host", CMD_PARAM_STR, 0) | |||
DOVEADM_CMD_PARAM('\0', "user", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL) | DOVEADM_CMD_PARAM('\0', "user", CMD_PARAM_ARRAY, CMD_PARAM_FLAG_POSITIONAL) | |||
DOVEADM_CMD_PARAMS_END | DOVEADM_CMD_PARAMS_END | |||
} | } | |||
}; | }; | |||
static void proxy_cmd_help(doveadm_command_t *cmd) | static void proxy_cmd_help(struct doveadm_cmd_context *cctx) | |||
{ | { | |||
unsigned int i; | unsigned int i; | |||
for (i = 0; i < N_ELEMENTS(doveadm_cmd_proxy); i++) { | for (i = 0; i < N_ELEMENTS(doveadm_cmd_proxy); i++) { | |||
if (doveadm_cmd_proxy[i].old_cmd == cmd) | if (doveadm_cmd_proxy[i].cmd == cctx->cmd->cmd) | |||
help_ver2(&doveadm_cmd_proxy[i]); | help_ver2(&doveadm_cmd_proxy[i]); | |||
} | } | |||
i_unreached(); | i_unreached(); | |||
} | } | |||
void doveadm_register_proxy_commands(void) | void doveadm_register_proxy_commands(void) | |||
{ | { | |||
unsigned int i; | unsigned int i; | |||
for (i = 0; i < N_ELEMENTS(doveadm_cmd_proxy); i++) | for (i = 0; i < N_ELEMENTS(doveadm_cmd_proxy); i++) | |||
End of changes. 15 change blocks. | ||||
34 lines changed or deleted | 24 lines changed or added |