From: Aki Tuomi Date: Mon, 11 Jan 2016 13:46:35 +0000 (+0200) Subject: doveadm-stats: Add stats reset command line X-Git-Tag: 2.2.22.rc1~344 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f970f2afa1dad882b7fc0f97f9315e01309cef03;p=thirdparty%2Fdovecot%2Fcore.git doveadm-stats: Add stats reset command line --- diff --git a/src/doveadm/doveadm-cmd.h b/src/doveadm/doveadm-cmd.h index dbed044007..596313d489 100644 --- a/src/doveadm/doveadm-cmd.h +++ b/src/doveadm/doveadm-cmd.h @@ -23,6 +23,7 @@ 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); diff --git a/src/doveadm/doveadm-stats.c b/src/doveadm/doveadm-stats.c index ad556a5433..0b4fbd0ca2 100644 --- a/src/doveadm/doveadm-stats.c +++ b/src/doveadm/doveadm-stats.c @@ -495,6 +495,52 @@ static void stats_top(const char *path, const char *sort_type) i_close_fd(&ctx.fd); } +static void stats_reset(const char *path, const char **items ATTR_UNUSED) +{ + const char **ptr ATTR_UNUSED; + int fd,ret; + string_t *cmd; + struct istream *input; + const char *line; + + fd = doveadm_connect(path); + net_set_nonblock(fd, FALSE); + input = i_stream_create_fd(fd, (size_t)-1, FALSE); + + cmd = t_str_new(10); + str_append(cmd, "RESET"); +/* XXX: Not supported yet. + for(ptr = items; *ptr; ptr++) + { + str_append_c(cmd, '\t'); + str_append(cmd, *ptr); + } +*/ + str_append_c(cmd, '\n'); + + /* send command */ + ret = write_full(fd, str_c(cmd), str_len(cmd)); + + if (ret < 0) { + i_close_fd(&fd); + i_error("write(%s) failed: %m", path); + return; + } + + line = i_stream_read_next_line(input); + + if (line == NULL) { + i_error("read(%s) failed: %s", path, i_stream_get_error(input)); + } else if (strncmp(line, "OK", 2) != 0) { + i_error("%s",line); + } else { + i_info("Stats reset"); + } + + i_stream_destroy(&input); + i_close_fd(&fd); +} + static void cmd_stats_top(int argc, char *argv[]) { const char *path, *sort_type; @@ -527,6 +573,30 @@ static void cmd_stats_top(int argc, char *argv[]) stats_top(path, sort_type); } +static void cmd_stats_reset(int argc, char *argv[]) +{ + const char *path; + int c; + + 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_reset); + } + } + argv += optind - 1; + /* items is now argv */ +/* if (optind >= argc) { + i_fatal("missing item(s) to reset"); + } +*/ + stats_reset(path, (const char**)argv); +} + struct doveadm_cmd doveadm_cmd_stats_dump = { cmd_stats_dump, "stats dump", "[-s ] []" }; @@ -534,3 +604,7 @@ struct doveadm_cmd doveadm_cmd_stats_dump = { struct doveadm_cmd doveadm_cmd_stats_top = { cmd_stats_top, "stats top", "[-s ] [-b] []" }; + +struct doveadm_cmd doveadm_cmd_stats_reset = { + cmd_stats_reset, "stats reset", "[-s ]" +}; diff --git a/src/doveadm/doveadm.c b/src/doveadm/doveadm.c index 15d96b017b..78903d41ea 100644 --- a/src/doveadm/doveadm.c +++ b/src/doveadm/doveadm.c @@ -252,6 +252,7 @@ static struct doveadm_cmd *doveadm_cmdline_commands[] = { &doveadm_cmd_dump, &doveadm_cmd_pw, &doveadm_cmd_stats_top, + &doveadm_cmd_stats_reset, &doveadm_cmd_zlibconnect };