]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm-stats: Add stats reset command line
authorAki Tuomi <aki.tuomi@dovecot.net>
Mon, 11 Jan 2016 13:46:35 +0000 (15:46 +0200)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Fri, 15 Jan 2016 17:13:45 +0000 (19:13 +0200)
src/doveadm/doveadm-cmd.h
src/doveadm/doveadm-stats.c
src/doveadm/doveadm.c

index dbed04400721c88b90ae7e96bc2b8bc3b774077d..596313d48931390141e54533e9533fa913ed2b22 100644 (file)
@@ -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);
index ad556a543348e08960b5e0e8ce7682033d0f7826..0b4fbd0ca218784ead0ac257b78f2b5f8fade77b 100644 (file)
@@ -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 <stats socket path>] <type> [<filter>]"
 };
@@ -534,3 +604,7 @@ struct doveadm_cmd doveadm_cmd_stats_dump = {
 struct doveadm_cmd doveadm_cmd_stats_top = {
        cmd_stats_top, "stats top", "[-s <stats socket path>] [-b] [<sort field>]"
 };
+
+struct doveadm_cmd doveadm_cmd_stats_reset = {
+       cmd_stats_reset, "stats reset", "[-s <stats socket path>]"
+};
index 15d96b017b9b875a401b48eb99959e222b0a10d1..78903d41ea6628b10714932258b03a869f92231e 100644 (file)
@@ -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
 };