changeset 19576:d9189bd01219

doveadm-stats: Add stats reset command line
author Aki Tuomi <aki.tuomi@dovecot.net>
date Mon, 11 Jan 2016 15:46:35 +0200
parents 845fb37ef972
children d9d60683732f
files src/doveadm/doveadm-cmd.h src/doveadm/doveadm-stats.c src/doveadm/doveadm.c
diffstat 3 files changed, 76 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/doveadm/doveadm-cmd.h	Mon Jan 11 15:46:28 2016 +0200
+++ b/src/doveadm/doveadm-cmd.h	Mon Jan 11 15:46:35 2016 +0200
@@ -23,6 +23,7 @@
 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);
--- a/src/doveadm/doveadm-stats.c	Mon Jan 11 15:46:28 2016 +0200
+++ b/src/doveadm/doveadm-stats.c	Mon Jan 11 15:46:35 2016 +0200
@@ -495,6 +495,52 @@
 	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 @@
 	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_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>]"
+};
--- a/src/doveadm/doveadm.c	Mon Jan 11 15:46:28 2016 +0200
+++ b/src/doveadm/doveadm.c	Mon Jan 11 15:46:35 2016 +0200
@@ -252,6 +252,7 @@
 	&doveadm_cmd_dump,
 	&doveadm_cmd_pw,
 	&doveadm_cmd_stats_top,
+	&doveadm_cmd_stats_reset,
 	&doveadm_cmd_zlibconnect
 };