dovecot-2.0: doveadm: Added support for plugins.

dovecot at dovecot.org dovecot at dovecot.org
Mon Mar 8 17:29:24 EET 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/b06d874708d4
changeset: 10859:b06d874708d4
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Mar 08 17:28:29 2010 +0200
description:
doveadm: Added support for plugins.

diffstat:

 src/doveadm/Makefile.am        |   26 +++++++-
 src/doveadm/doveadm-mail.c     |  102 ++++++++++++++++++++--------------
 src/doveadm/doveadm-settings.c |   34 +++++++++++
 src/doveadm/doveadm-settings.h |   12 ++++
 src/doveadm/doveadm.c          |   60 +++++++++++++++----
 5 files changed, 174 insertions(+), 60 deletions(-)

diffs (truncated from 414 to 300 lines):

diff -r c9dc5c447db5 -r b06d874708d4 src/doveadm/Makefile.am
--- a/src/doveadm/Makefile.am	Mon Mar 08 17:28:04 2010 +0200
+++ b/src/doveadm/Makefile.am	Mon Mar 08 17:28:29 2010 +0200
@@ -1,7 +1,10 @@
+doveadm_moduledir = $(moduledir)/doveadm
+
 bin_PROGRAMS = doveadm
 
 AM_CPPFLAGS = \
 	-I$(top_srcdir)/src/lib \
+	-I$(top_srcdir)/src/lib-settings \
 	-I$(top_srcdir)/src/lib-auth \
 	-I$(top_srcdir)/src/lib-dict \
 	-I$(top_srcdir)/src/lib-master \
@@ -10,21 +13,32 @@
 	-I$(top_srcdir)/src/lib-index \
 	-I$(top_srcdir)/src/lib-storage \
 	-I$(top_srcdir)/src/auth \
+	-DMODULEDIR=\""$(moduledir)"\" \
+	-DDOVEADM_MODULEDIR=\""$(doveadm_moduledir)"\" \
 	-DPKG_RUNDIR=\""$(rundir)"\"
 
+if !BUILD_SHARED_LIBS
+unused_objects = \
+	../lib/mountpoint.o \
+	../lib-imap/imap-util.o
+endif
+
 cmd_pw_libs = \
 	../auth/libpassword.a \
 	../lib-ntlm/libntlm.a \
 	../lib-otp/libotp.a
 
+libs = \
+	$(LIBDOVECOT_STORAGE) \
+	$(cmd_pw_libs) \
+	$(unused_objects)
+
 doveadm_LDADD = \
-	$(cmd_pw_libs) $(AUTH_LIBS) \
-	$(LIBDOVECOT_STORAGE) \
+	$(libs) $(AUTH_LIBS) \
 	$(LIBDOVECOT) \
 	$(MODULE_LIBS)
 doveadm_DEPENDENCIES = \
-	$(cmd_pw_libs) \
-	$(LIBDOVECOT_STORAGE) \
+	$(libs) \
 	$(LIBDOVECOT_DEPS)
 
 doveadm_SOURCES = \
@@ -38,9 +52,11 @@
 	doveadm-mail.c \
 	doveadm-penalty.c \
 	doveadm-pw.c \
+	doveadm-settings.c \
 	doveadm-who.c
 
 noinst_HEADERS = \
 	doveadm.h \
 	doveadm-dump.h \
-	doveadm-mail.h
+	doveadm-mail.h \
+	doveadm-settings.h
diff -r c9dc5c447db5 -r b06d874708d4 src/doveadm/doveadm-mail.c
--- a/src/doveadm/doveadm-mail.c	Mon Mar 08 17:28:04 2010 +0200
+++ b/src/doveadm/doveadm-mail.c	Mon Mar 08 17:28:29 2010 +0200
@@ -4,6 +4,7 @@
 #include "array.h"
 #include "lib-signals.h"
 #include "ioloop.h"
+#include "module-dir.h"
 #include "master-service.h"
 #include "mail-user.h"
 #include "mail-namespace.h"
@@ -11,6 +12,7 @@
 #include "mail-storage-settings.h"
 #include "mail-storage-service.h"
 #include "doveadm.h"
+#include "doveadm-settings.h"
 #include "doveadm-mail.h"
 
 #include <stdio.h>
@@ -75,40 +77,11 @@
 	mailbox_free(&box);
 }
 
-static void
-doveadm_mail_single_user(doveadm_mail_command_t *cmd, const char *username,
-			 enum mail_storage_service_flags service_flags,
-			 const char *args[])
-{
-	struct mail_storage_service_ctx *storage_service;
-	struct mail_storage_service_user *service_user;
-	struct mail_storage_service_input input;
-	struct mail_user *mail_user;
-	const char *error;
-
-	if (username == NULL)
-		i_fatal("USER environment is missing and -u option not used");
-
-	memset(&input, 0, sizeof(input));
-	input.username = username;
-
-	storage_service = mail_storage_service_init(master_service, NULL,
-						    service_flags);
-	if (mail_storage_service_lookup_next(storage_service, &input,
-					     &service_user, &mail_user,
-					     &error) <= 0)
-		i_fatal("%s", error);
-	cmd(mail_user, args);
-	mail_user_unref(&mail_user);
-	mail_storage_service_user_free(&service_user);
-	mail_storage_service_deinit(&storage_service);
-}
-
 static int
 doveadm_mail_next_user(doveadm_mail_command_t *cmd,
 		       struct mail_storage_service_ctx *storage_service,
 		       const struct mail_storage_service_input *input,
-		       const char *args[])
+		       const char *args[], const char **error_r)
 {
 	struct mail_storage_service_user *service_user;
 	struct mail_user *mail_user;
@@ -119,24 +92,51 @@
 	ret = mail_storage_service_lookup(storage_service, input,
 					  &service_user, &error);
 	if (ret <= 0) {
-		if (ret == 0) {
-			i_info("User no longer exists, skipping");
-			return 0;
-		} else {
-			i_error("User lookup failed: %s", error);
-			return -1;
+		if (ret < 0) {
+			*error_r = t_strdup_printf("User lookup failed: %s",
+						   error);
 		}
+		return ret;
 	}
+
 	if (mail_storage_service_next(storage_service, service_user,
 				      &mail_user, &error) < 0) {
-		i_error("User init failed: %s", error);
+		*error_r = t_strdup_printf("User init failed: %s", error);
 		mail_storage_service_user_free(&service_user);
 		return -1;
 	}
+
 	cmd(mail_user, args);
 	mail_storage_service_user_free(&service_user);
 	mail_user_unref(&mail_user);
-	return 0;
+	return 1;
+}
+
+static void
+doveadm_mail_single_user(doveadm_mail_command_t *cmd, const char *username,
+			 enum mail_storage_service_flags service_flags,
+			 const char *args[])
+{
+	struct mail_storage_service_ctx *storage_service;
+	struct mail_storage_service_input input;
+	const char *error;
+	int ret;
+
+	if (username == NULL)
+		i_fatal("USER environment is missing and -u option not used");
+
+	memset(&input, 0, sizeof(input));
+	input.username = username;
+
+	storage_service = mail_storage_service_init(master_service, NULL,
+						    service_flags);
+	ret = doveadm_mail_next_user(cmd, storage_service, &input,
+				     args, &error);
+	if (ret < 0)
+		i_fatal("%s", error);
+	else if (ret == 0)
+		i_fatal("User no longer exists");
+	mail_storage_service_deinit(&storage_service);
 }
 
 static void sig_die(const siginfo_t *si, void *context ATTR_UNUSED)
@@ -152,7 +152,7 @@
 	struct mail_storage_service_input input;
 	struct mail_storage_service_ctx *storage_service;
 	unsigned int user_idx, user_count, interval, n;
-	const char *user;
+	const char *user, *error;
 	int ret;
 
 	service_flags |= MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
@@ -177,7 +177,11 @@
 		input.username = user;
 		T_BEGIN {
 			ret = doveadm_mail_next_user(cmd, storage_service,
-						     &input, args);
+						     &input, args, &error);
+			if (ret < 0)
+				i_error("%s", error);
+			else if (ret == 0)
+				i_info("User no longer exists, skipping");
 		} T_END;
 		if (ret < 0)
 			break;
@@ -204,7 +208,8 @@
 static void
 doveadm_mail_cmd(const struct doveadm_mail_cmd *cmd, int argc, char *argv[])
 {
-	enum mail_storage_service_flags service_flags = 0;
+	enum mail_storage_service_flags service_flags =
+		MAIL_STORAGE_SERVICE_FLAG_NO_LOG_INIT;
 	const char *username;
 	bool all_users = FALSE;
 	int c;
@@ -268,7 +273,7 @@
 
 void doveadm_mail_help(const struct doveadm_mail_cmd *cmd)
 {
-	fprintf(stderr, "doveadm %s %s\n", cmd->name,
+	fprintf(stderr, "doveadm %s <user>|-a %s\n", cmd->name,
 		cmd->usage_args == NULL ? "" : cmd->usage_args);
 	exit(0);
 }
@@ -290,11 +295,24 @@
 
 void doveadm_mail_init(void)
 {
+	struct module_dir_load_settings mod_set;
 	unsigned int i;
 
 	i_array_init(&doveadm_mail_cmds, 32);
 	for (i = 0; i < N_ELEMENTS(mail_commands); i++)
 		doveadm_mail_register_cmd(&mail_commands[i]);
+
+	memset(&mod_set, 0, sizeof(mod_set));
+	mod_set.version = master_service_get_version_string(master_service);
+	mod_set.require_init_funcs = TRUE;
+	mod_set.debug = doveadm_debug;
+
+	/* load all configured mail plugins */
+	mail_storage_service_modules =
+		module_dir_load_missing(mail_storage_service_modules,
+					doveadm_settings->mail_plugin_dir,
+					doveadm_settings->mail_plugins,
+					&mod_set);
 }
 
 void doveadm_mail_deinit(void)
diff -r c9dc5c447db5 -r b06d874708d4 src/doveadm/doveadm-settings.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/doveadm/doveadm-settings.c	Mon Mar 08 17:28:29 2010 +0200
@@ -0,0 +1,34 @@
+/* Copyright (c) 2010 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "settings-parser.h"
+#include "doveadm-settings.h"
+
+#undef DEF
+#define DEF(type, name) \
+	{ type, #name, offsetof(struct doveadm_settings, name), NULL }
+
+static const struct setting_define doveadm_setting_defines[] = {
+	DEF(SET_STR, mail_plugins),
+	DEF(SET_STR, mail_plugin_dir),
+
+	SETTING_DEFINE_LIST_END
+};
+
+const struct doveadm_settings doveadm_default_settings = {
+	.mail_plugins = "",
+	.mail_plugin_dir = MODULEDIR
+};
+
+const struct setting_parser_info doveadm_setting_parser_info = {
+	.module_name = "doveadm",
+	.defines = doveadm_setting_defines,
+	.defaults = &doveadm_default_settings,
+
+	.type_offset = (size_t)-1,
+	.struct_size = sizeof(struct doveadm_settings),
+
+	.parent_offset = (size_t)-1
+};
+
+const struct doveadm_settings *doveadm_settings;
diff -r c9dc5c447db5 -r b06d874708d4 src/doveadm/doveadm-settings.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/doveadm/doveadm-settings.h	Mon Mar 08 17:28:29 2010 +0200
@@ -0,0 +1,12 @@
+#ifndef DOVEADM_SETTINGS_H
+#define DOVEADM_SETTINGS_H
+
+struct doveadm_settings {
+	const char *mail_plugins;
+	const char *mail_plugin_dir;
+};


More information about the dovecot-cvs mailing list