From 676d5601a8e087b25eb4dd5509079ab832e66831 Mon Sep 17 00:00:00 2001 From: Aki Tuomi Date: Mon, 15 Feb 2016 15:14:25 +0200 Subject: [PATCH] doveadm-stats: Use ver2 structures --- src/doveadm/doveadm-cmd.c | 5 +-- src/doveadm/doveadm-cmd.h | 6 ++-- src/doveadm/doveadm-stats.c | 69 +++++++++++++++++++++++-------------- src/doveadm/doveadm.c | 5 +-- 4 files changed, 53 insertions(+), 32 deletions(-) diff --git a/src/doveadm/doveadm-cmd.c b/src/doveadm/doveadm-cmd.c index 4f565a296a..04f9e901e8 100644 --- a/src/doveadm/doveadm-cmd.c +++ b/src/doveadm/doveadm-cmd.c @@ -18,12 +18,13 @@ static struct doveadm_cmd *doveadm_commands[] = { &doveadm_cmd_mailbox_mutf7, &doveadm_cmd_sis_deduplicate, &doveadm_cmd_sis_find, - &doveadm_cmd_stats_dump }; static struct doveadm_cmd_ver2 *doveadm_commands_ver2[] = { &doveadm_cmd_stop_ver2, - &doveadm_cmd_reload_ver2 + &doveadm_cmd_reload_ver2, + &doveadm_cmd_stats_dump_ver2, + &doveadm_cmd_stats_reset_ver2 }; ARRAY_TYPE(doveadm_cmd) doveadm_cmds; diff --git a/src/doveadm/doveadm-cmd.h b/src/doveadm/doveadm-cmd.h index 70b2345dde..9b368d7fa0 100644 --- a/src/doveadm/doveadm-cmd.h +++ b/src/doveadm/doveadm-cmd.h @@ -72,9 +72,6 @@ extern struct doveadm_cmd doveadm_cmd_kick; extern struct doveadm_cmd doveadm_cmd_mailbox_mutf7; extern struct doveadm_cmd doveadm_cmd_sis_deduplicate; extern struct doveadm_cmd doveadm_cmd_sis_find; -extern struct doveadm_cmd doveadm_cmd_stats_dump; -extern struct doveadm_cmd doveadm_cmd_stats_top; -extern struct doveadm_cmd doveadm_cmd_stats_reset; extern struct doveadm_cmd doveadm_cmd_zlibconnect; void doveadm_register_cmd(const struct doveadm_cmd *cmd); @@ -118,5 +115,8 @@ bool doveadm_cmd_param_istream(int argc, struct doveadm_cmd_param* params, const extern struct doveadm_cmd_ver2 doveadm_cmd_stop_ver2; extern struct doveadm_cmd_ver2 doveadm_cmd_reload_ver2; +extern struct doveadm_cmd_ver2 doveadm_cmd_stats_reset_ver2; +extern struct doveadm_cmd_ver2 doveadm_cmd_stats_dump_ver2; +extern struct doveadm_cmd_ver2 doveadm_cmd_stats_top_ver2; #endif diff --git a/src/doveadm/doveadm-stats.c b/src/doveadm/doveadm-stats.c index 0b4fbd0ca2..3d9d708b91 100644 --- a/src/doveadm/doveadm-stats.c +++ b/src/doveadm/doveadm-stats.c @@ -115,30 +115,29 @@ static void stats_dump(const char *path, const char *cmd) i_stream_destroy(&input); } -static void cmd_stats_dump(int argc, char *argv[]) +static int +cmd2_stats_dump(const struct doveadm_cmd_ver2* dcmd ATTR_UNUSED, int argc, const struct doveadm_cmd_param *argv) { const char *path, *cmd; - int c; + const char *args[3] = {0}; - path = t_strconcat(doveadm_settings->base_dir, "/stats", NULL); + if (!doveadm_cmd_param_str(argc, argv, "socket-path", &path)) + path = t_strconcat(doveadm_settings->base_dir, "/stats", NULL); - while ((c = getopt(argc, argv, "s:")) > 0) { - switch (c) { - case 's': - path = optarg; - break; - default: - help(&doveadm_cmd_stats_dump); - } + if (!doveadm_cmd_param_str(argc, argv, "type", &args[0])) { + i_error("Missing type parameter"); + return -1; } - argv += optind - 1; - if (argv[1] == NULL) - help(&doveadm_cmd_stats_dump); - cmd = t_strdup_printf("EXPORT\t%s\n", - t_strarray_join((const void *)(argv+1), "\t")); + + /* purely optional */ + doveadm_cmd_param_str(argc, argv, "filter", &args[1]); + args[2] = NULL; + + cmd = t_strdup_printf("EXPORT\t%s\n", t_strarray_join(args, "\t")); doveadm_print_init(DOVEADM_PRINT_TYPE_TAB); stats_dump(path, cmd); + return 0; } static void @@ -558,14 +557,14 @@ static void cmd_stats_top(int argc, char *argv[]) path = optarg; break; default: - help(&doveadm_cmd_stats_top); + help_ver2(&doveadm_cmd_stats_top_ver2); } } argv += optind - 1; if (argv[1] == NULL) sort_type = "disk"; else if (argv[2] != NULL) - help(&doveadm_cmd_stats_top); + help_ver2(&doveadm_cmd_stats_top_ver2); else sort_type = argv[1]; @@ -585,7 +584,7 @@ static void cmd_stats_reset(int argc, char *argv[]) path = optarg; break; default: - help(&doveadm_cmd_stats_reset); + help_ver2(&doveadm_cmd_stats_reset_ver2); } } argv += optind - 1; @@ -597,14 +596,34 @@ static void cmd_stats_reset(int argc, char *argv[]) stats_reset(path, (const char**)argv); } -struct doveadm_cmd doveadm_cmd_stats_dump = { - cmd_stats_dump, "stats dump", "[-s ] []" +struct doveadm_cmd_ver2 doveadm_cmd_stats_dump_ver2 = { + .cmd = cmd2_stats_dump, + .name = "stats dump", + .usage = "[-s ] []", +DOVEADM_CMD_PARAMS_START +DOVEADM_CMD_PARAM('s', "socket-path", CMD_PARAM_STR, 0) +DOVEADM_CMD_PARAM('\0', "type", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL) +DOVEADM_CMD_PARAM('\0', "filter", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL) +DOVEADM_CMD_PARAMS_END }; -struct doveadm_cmd doveadm_cmd_stats_top = { - cmd_stats_top, "stats top", "[-s ] [-b] []" +struct doveadm_cmd_ver2 doveadm_cmd_stats_top_ver2 = { + .old_cmd = cmd_stats_top, + .name = "stats top", + .usage = "[-s ] [-b] []", +DOVEADM_CMD_PARAMS_START +DOVEADM_CMD_PARAM('s', "socket-path", CMD_PARAM_STR, 0) +DOVEADM_CMD_PARAM('b', "bytes", CMD_PARAM_BOOL, 0) +DOVEADM_CMD_PARAM('\0', "field", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL) +DOVEADM_CMD_PARAMS_END }; -struct doveadm_cmd doveadm_cmd_stats_reset = { - cmd_stats_reset, "stats reset", "[-s ]" + +struct doveadm_cmd_ver2 doveadm_cmd_stats_reset_ver2 = { + .old_cmd = cmd_stats_reset, + .name = "stats reset", + .usage = "[-s ]", +DOVEADM_CMD_PARAMS_START +DOVEADM_CMD_PARAM('s', "socket-path", CMD_PARAM_STR, 0) +DOVEADM_CMD_PARAMS_END }; diff --git a/src/doveadm/doveadm.c b/src/doveadm/doveadm.c index 0b7d991a59..4eef1456ce 100644 --- a/src/doveadm/doveadm.c +++ b/src/doveadm/doveadm.c @@ -265,8 +265,6 @@ static struct doveadm_cmd *doveadm_cmdline_commands[] = { &doveadm_cmd_exec, &doveadm_cmd_dump, &doveadm_cmd_pw, - &doveadm_cmd_stats_top, - &doveadm_cmd_stats_reset, &doveadm_cmd_zlibconnect }; @@ -320,6 +318,9 @@ int main(int argc, char *argv[]) doveadm_cmds_init(); for (i = 0; i < N_ELEMENTS(doveadm_cmdline_commands); i++) doveadm_register_cmd(doveadm_cmdline_commands[i]); + + doveadm_cmd_register_ver2(&doveadm_cmd_stats_top_ver2); + if (cmd_name != NULL && (quick_init || strcmp(cmd_name, "config") == 0 || strcmp(cmd_name, "stop") == 0 ||