dovecot-2.0: doveadm: Added penalty command to dump auth penalty...

dovecot at dovecot.org dovecot at dovecot.org
Sat Feb 20 09:46:47 EET 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/f69f32ffa9c6
changeset: 10780:f69f32ffa9c6
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Feb 20 09:33:01 2010 +0200
description:
doveadm: Added penalty command to dump auth penalty state.

diffstat:

 src/doveadm/Makefile.am       |    1 +
 src/doveadm/doveadm-penalty.c |  126 ++++++++++++++++++++++++++++++++++++++++++
 src/doveadm/doveadm.c         |    1 +
 src/doveadm/doveadm.h         |    1 +
 4 files changed, 129 insertions(+), 0 deletions(-)

diffs (163 lines):

diff -r 1282d027ce67 -r f69f32ffa9c6 src/doveadm/Makefile.am
--- a/src/doveadm/Makefile.am	Sat Feb 20 09:32:48 2010 +0200
+++ b/src/doveadm/Makefile.am	Sat Feb 20 09:33:01 2010 +0200
@@ -36,6 +36,7 @@
 	doveadm-dump-mailboxlog.c \
 	doveadm-dump-thread.c \
 	doveadm-mail.c \
+	doveadm-penalty.c \
 	doveadm-pw.c \
 	doveadm-who.c
 
diff -r 1282d027ce67 -r f69f32ffa9c6 src/doveadm/doveadm-penalty.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/doveadm/doveadm-penalty.c	Sat Feb 20 09:33:01 2010 +0200
@@ -0,0 +1,126 @@
+/* Copyright (c) 2009-2010 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "array.h"
+#include "network.h"
+#include "istream.h"
+#include "hash.h"
+#include "doveadm.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <time.h>
+
+struct penalty_line {
+	struct ip_addr ip;
+	unsigned int penalty;
+	time_t last_penalty, last_update;
+};
+
+struct penalty_context {
+	const char *anvil_path;
+
+	struct ip_addr net_ip;
+	unsigned int net_bits;
+};
+
+static void penalty_parse_line(const char *line, struct penalty_line *line_r)
+{
+	const char *const *args = t_strsplit(line, "\t");
+	const char *ident = args[0];
+	const char *penalty_str = args[1];
+	const char *last_penalty_str = args[2];
+	const char *last_update_str = args[3];
+
+	memset(line_r, 0, sizeof(*line_r));
+
+	net_addr2ip(ident, &line_r->ip);
+	line_r->penalty = strtoul(penalty_str, NULL, 10);
+	line_r->last_penalty = strtoul(last_penalty_str, NULL, 10);
+	line_r->last_update = strtoul(last_update_str, NULL, 10);
+}
+
+static void
+penalty_print_line(struct penalty_context *ctx,
+		   const struct penalty_line *line)
+{
+	const struct tm *tm;
+	char buf[10];
+
+	if (ctx->net_bits > 0) {
+		if (!net_is_in_network(&line->ip, &ctx->net_ip, ctx->net_bits))
+			return;
+	}
+
+	tm = localtime(&line->last_update);
+	strftime(buf, sizeof(buf), "%H:%M:%S", tm);
+
+	printf("%-16s %7u %s %s\n", net_ip2addr(&line->ip), line->penalty,
+	       unixdate2str(line->last_penalty), buf);
+}
+
+static void penalty_lookup(struct penalty_context *ctx)
+{
+#define ANVIL_HANDSHAKE "VERSION\tanvil\t1\t0\n"
+#define ANVIL_CMD ANVIL_HANDSHAKE"PENALTY-DUMP\n"
+	struct istream *input;
+	const char *line;
+	int fd;
+
+	fd = net_connect_unix(ctx->anvil_path);
+	if (fd == -1)
+		i_fatal("net_connect_unix(%s) failed: %m", ctx->anvil_path);
+	net_set_nonblock(fd, FALSE);
+
+	input = i_stream_create_fd(fd, (size_t)-1, TRUE);
+	if (write(fd, ANVIL_CMD, strlen(ANVIL_CMD)) < 0)
+		i_fatal("write(%s) failed: %m", ctx->anvil_path);
+	while ((line = i_stream_read_next_line(input)) != NULL) {
+		if (*line == '\0')
+			break;
+		T_BEGIN {
+			struct penalty_line penalty_line;
+
+			penalty_parse_line(line, &penalty_line);
+			penalty_print_line(ctx, &penalty_line);
+		} T_END;
+	}
+	if (input->stream_errno != 0)
+		i_fatal("read(%s) failed: %m", ctx->anvil_path);
+
+	i_stream_destroy(&input);
+}
+
+static void cmd_penalty(int argc, char *argv[])
+{
+	struct penalty_context ctx;
+	int c;
+
+	memset(&ctx, 0, sizeof(ctx));
+	ctx.anvil_path = PKG_RUNDIR"/anvil";
+	while ((c = getopt(argc, argv, "a:")) > 0) {
+		switch (c) {
+		case 'a':
+			ctx.anvil_path = optarg;
+			break;
+		default:
+			help(&doveadm_cmd_penalty);
+		}
+	}
+
+	if (argv[1] != NULL) {
+		if (net_parse_range(argv[1], &ctx.net_ip, &ctx.net_bits) == 0)
+			argv++;
+	}
+	if (argv[1] != NULL)
+		help(&doveadm_cmd_penalty);
+
+	fprintf(stderr, "%-16s penalty last_penalty        last_update\n", "IP");
+	penalty_lookup(&ctx);
+}
+
+struct doveadm_cmd doveadm_cmd_penalty = {
+	cmd_penalty, "penalty",
+	"[-a <anvil socket path>] [<ip/bits>]", NULL
+};
diff -r 1282d027ce67 -r f69f32ffa9c6 src/doveadm/doveadm.c
--- a/src/doveadm/doveadm.c	Sat Feb 20 09:32:48 2010 +0200
+++ b/src/doveadm/doveadm.c	Sat Feb 20 09:33:01 2010 +0200
@@ -101,6 +101,7 @@
 	doveadm_register_cmd(&doveadm_cmd_dump);
 	doveadm_register_cmd(&doveadm_cmd_pw);
 	doveadm_register_cmd(&doveadm_cmd_who);
+	doveadm_register_cmd(&doveadm_cmd_penalty);
 
 	while ((c = master_getopt(master_service)) > 0) {
 		switch (c) {
diff -r 1282d027ce67 -r f69f32ffa9c6 src/doveadm/doveadm.h
--- a/src/doveadm/doveadm.h	Sat Feb 20 09:32:48 2010 +0200
+++ b/src/doveadm/doveadm.h	Sat Feb 20 09:33:01 2010 +0200
@@ -17,6 +17,7 @@
 extern struct doveadm_cmd doveadm_cmd_dump;
 extern struct doveadm_cmd doveadm_cmd_pw;
 extern struct doveadm_cmd doveadm_cmd_who;
+extern struct doveadm_cmd doveadm_cmd_penalty;
 
 extern bool doveadm_verbose, doveadm_debug;
 


More information about the dovecot-cvs mailing list