doveadm-mail.c revision 1c846dfafac3093058d5b7c60f9bcef1d17c4783
76b43e4417bab52e913da39b5f5bc2a130d3f149Timo Sirainen/* Copyright (c) 2009 Dovecot authors, see the included COPYING file */
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen#include "lib.h"
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainen#include "array.h"
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen#include "lib-signals.h"
58be9d6bcc3800f5b3d76a064ee767fbe31a5a8aTimo Sirainen#include "ioloop.h"
58be9d6bcc3800f5b3d76a064ee767fbe31a5a8aTimo Sirainen#include "master-service.h"
58be9d6bcc3800f5b3d76a064ee767fbe31a5a8aTimo Sirainen#include "mail-user.h"
13c6532dc104d23061e6901783ceb1ff8872c206Timo Sirainen#include "mail-namespace.h"
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen#include "mail-storage.h"
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen#include "mail-storage-settings.h"
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen#include "mail-storage-service.h"
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen#include "doveadm.h"
d22390f33eedbd2413debabc0662dde5241b1aa6Timo Sirainen#include "doveadm-mail.h"
d22390f33eedbd2413debabc0662dde5241b1aa6Timo Sirainen
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen#include <stdio.h>
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo SirainenARRAY_TYPE(doveadm_mail_cmd) doveadm_mail_cmds;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainenstatic int killed_signo = 0;
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainenstatic void cmd_purge(struct mail_user *user, const char *args[] ATTR_UNUSED)
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen{
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen struct mail_namespace *ns;
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen for (ns = user->namespaces; ns != NULL; ns = ns->next) {
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen if (ns->type != NAMESPACE_PRIVATE || ns->alias_for != NULL)
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen continue;
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen if (mail_storage_purge(ns->storage) < 0) {
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen i_error("Purging namespace '%s' failed: %s", ns->prefix,
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen mail_storage_get_last_error(ns->storage, NULL));
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen }
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen }
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen}
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainenstatic struct mailbox *
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainenmailbox_find_and_open(struct mail_user *user, const char *mailbox)
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen{
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen struct mail_namespace *ns;
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen struct mailbox *box;
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen const char *orig_mailbox = mailbox;
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen ns = mail_namespace_find(user->namespaces, &mailbox);
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen if (ns == NULL)
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen i_fatal("Can't find namespace for mailbox %s", mailbox);
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen box = mailbox_alloc(ns->list, mailbox, NULL, MAILBOX_FLAG_KEEP_RECENT |
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen MAILBOX_FLAG_IGNORE_ACLS);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen if (mailbox_open(box) < 0) {
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen i_fatal("Opening mailbox %s failed: %s", orig_mailbox,
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen mail_storage_get_last_error(mailbox_get_storage(box),
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen NULL));
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen }
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen return box;
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen}
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainenstatic void cmd_force_resync(struct mail_user *user, const char *args[])
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen{
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen const char *mailbox = args[0];
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen struct mail_storage *storage;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen struct mailbox *box;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen if (mailbox == NULL)
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen usage();
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen box = mailbox_find_and_open(user, mailbox);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen storage = mailbox_get_storage(box);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen if (mailbox_sync(box, MAILBOX_SYNC_FLAG_FORCE_RESYNC |
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen MAILBOX_SYNC_FLAG_FIX_INCONSISTENT, 0, NULL) < 0) {
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen i_fatal("Forcing a resync on mailbox %s failed: %s", mailbox,
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen mail_storage_get_last_error(storage, NULL));
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen }
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen mailbox_close(&box);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen}
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainenstatic void
1171f0abf442638bac1827bb24a0b6b8eb682a82Timo Sirainendoveadm_mail_single_user(doveadm_mail_command_t *cmd, const char *username,
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen enum mail_storage_service_flags service_flags,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char *args[])
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen{
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen struct mail_storage_service_ctx *storage_service;
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen struct mail_storage_service_user *service_user;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_storage_service_input input;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct mail_user *mail_user;
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen const char *error;
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen if (username == NULL)
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen i_fatal("USER environment is missing and -u option not used");
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen memset(&input, 0, sizeof(input));
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen input.username = username;
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen storage_service = mail_storage_service_init(master_service, NULL,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen service_flags);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (mail_storage_service_lookup_next(storage_service, &input,
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen &service_user, &mail_user,
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen &error) <= 0)
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen i_fatal("%s", error);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen cmd(mail_user, args);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen mail_user_unref(&mail_user);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen mail_storage_service_user_free(&service_user);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen mail_storage_service_deinit(&storage_service);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen}
6237f743bbaf74de5a2d2051672baed87023657bTimo Sirainen
6237f743bbaf74de5a2d2051672baed87023657bTimo Sirainenstatic int
6237f743bbaf74de5a2d2051672baed87023657bTimo Sirainendoveadm_mail_next_user(doveadm_mail_command_t *cmd,
6237f743bbaf74de5a2d2051672baed87023657bTimo Sirainen struct mail_storage_service_ctx *storage_service,
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen const struct mail_storage_service_input *input,
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen const char *args[])
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen{
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen struct mail_storage_service_user *service_user;
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen struct mail_user *mail_user;
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen const char *error;
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen int ret;
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen
fd44baee6e92f13d42ff711895d6510067f70955Timo Sirainen i_set_failure_prefix(t_strdup_printf("doveadm(%s): ", input->username));
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen ret = mail_storage_service_lookup(storage_service, input,
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen &service_user, &error);
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen if (ret <= 0) {
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen if (ret == 0) {
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen i_info("User no longer exists, skipping");
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen return 0;
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen } else {
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen i_error("User lookup failed: %s", error);
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen return -1;
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen }
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen }
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen if (mail_storage_service_next(storage_service, service_user,
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen &mail_user, &error) < 0) {
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen i_error("User init failed: %s", error);
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen mail_storage_service_user_free(&service_user);
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen return -1;
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen }
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen cmd(mail_user, args);
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen mail_storage_service_user_free(&service_user);
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen mail_user_unref(&mail_user);
fd44baee6e92f13d42ff711895d6510067f70955Timo Sirainen return 0;
fd44baee6e92f13d42ff711895d6510067f70955Timo Sirainen}
fd44baee6e92f13d42ff711895d6510067f70955Timo Sirainen
fd44baee6e92f13d42ff711895d6510067f70955Timo Sirainenstatic void sig_die(const siginfo_t *si, void *context ATTR_UNUSED)
fd44baee6e92f13d42ff711895d6510067f70955Timo Sirainen{
fd44baee6e92f13d42ff711895d6510067f70955Timo Sirainen killed_signo = si->si_signo;
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen}
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainenstatic void
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainendoveadm_mail_all_users(doveadm_mail_command_t *cmd,
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen enum mail_storage_service_flags service_flags,
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen const char *args[])
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen{
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen struct mail_storage_service_input input;
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainen struct mail_storage_service_ctx *storage_service;
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainen unsigned int user_idx, user_count, interval, n;
c740209eb3db031022c6fd436fa2ef1aa0ec46b8Timo Sirainen const char *user;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int ret;
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen service_flags |= MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainen memset(&input, 0, sizeof(input));
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen input.service = "doveadm";
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen storage_service = mail_storage_service_init(master_service, NULL,
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen service_flags);
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen lib_signals_set_handler(SIGINT, FALSE, sig_die, NULL);
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen lib_signals_set_handler(SIGTERM, FALSE, sig_die, NULL);
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainen user_count = mail_storage_service_all_init(storage_service);
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainen n = user_count / 10000;
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen for (interval = 10; n > 0 && interval < 1000; interval *= 10)
93fa87cf1a96c4f279ec4f5c311820313ba12c34Timo Sirainen n /= 10;
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen user_idx = 0;
a40d26f83af808a0ea1e212c001d682a96d870b0Timo Sirainen while ((ret = mail_storage_service_all_next(storage_service,
811f2e26d9782d9cb99fdf82e18ffa0a77564fe2Timo Sirainen &user)) > 0) {
2d49f150b4bce6f2f59a84e268e4777901c3e42cTimo Sirainen input.username = user;
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen T_BEGIN {
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen ret = doveadm_mail_next_user(cmd, storage_service,
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen &input, args);
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen } T_END;
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen if (ret < 0)
4b058f90f9e8a2c6b2eed275de4eb8cc5195a71dTimo Sirainen break;
4b058f90f9e8a2c6b2eed275de4eb8cc5195a71dTimo Sirainen if ((service_flags & MAIL_STORAGE_SERVICE_FLAG_DEBUG) != 0) {
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen if (++user_idx % interval == 0) {
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen printf("\r%d / %d", user_idx, user_count);
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen fflush(stdout);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen }
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen if (killed_signo != 0) {
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen i_warning("Killed with signal %d", killed_signo);
8d77ab87a57ae98532c62e5d1548bd131dee3074Timo Sirainen ret = -1;
8d77ab87a57ae98532c62e5d1548bd131dee3074Timo Sirainen break;
6157a322f2ac1ea1332d9003ecb0b11466aa8fe7Timo Sirainen }
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen }
fe6cf42464c36ab281c0e0740f0255be77453670Timo Sirainen if ((service_flags & MAIL_STORAGE_SERVICE_FLAG_DEBUG) != 0)
fe6cf42464c36ab281c0e0740f0255be77453670Timo Sirainen printf("\n");
fe6cf42464c36ab281c0e0740f0255be77453670Timo Sirainen i_set_failure_prefix("doveadm: ");
fe6cf42464c36ab281c0e0740f0255be77453670Timo Sirainen if (ret < 0)
fe6cf42464c36ab281c0e0740f0255be77453670Timo Sirainen i_error("Failed to iterate through some users");
fe6cf42464c36ab281c0e0740f0255be77453670Timo Sirainen mail_storage_service_deinit(&storage_service);
fe6cf42464c36ab281c0e0740f0255be77453670Timo Sirainen}
b8d232d88018c5cafd2f3be5a181d318137a45f2Timo Sirainen
ddbad7a661c0663fafd2b79393efa85f840d6af6Timo Sirainenstatic void
cc3ccdab8a510d88fecedf95187465bf84833711Timo Sirainendoveadm_mail_cmd(doveadm_mail_command_t *cmd, int argc, char *argv[])
b8d232d88018c5cafd2f3be5a181d318137a45f2Timo Sirainen{
cc3ccdab8a510d88fecedf95187465bf84833711Timo Sirainen enum mail_storage_service_flags service_flags = 0;
cc3ccdab8a510d88fecedf95187465bf84833711Timo Sirainen const char *username;
cc3ccdab8a510d88fecedf95187465bf84833711Timo Sirainen bool all_users = FALSE;
cc3ccdab8a510d88fecedf95187465bf84833711Timo Sirainen int c;
b8d232d88018c5cafd2f3be5a181d318137a45f2Timo Sirainen
b8d232d88018c5cafd2f3be5a181d318137a45f2Timo Sirainen while ((c = getopt(argc, argv, "av")) > 0) {
ddbad7a661c0663fafd2b79393efa85f840d6af6Timo Sirainen switch (c) {
b8d232d88018c5cafd2f3be5a181d318137a45f2Timo Sirainen case 'a':
ddbad7a661c0663fafd2b79393efa85f840d6af6Timo Sirainen all_users = TRUE;
ddbad7a661c0663fafd2b79393efa85f840d6af6Timo Sirainen break;
ddbad7a661c0663fafd2b79393efa85f840d6af6Timo Sirainen case 'v':
ddbad7a661c0663fafd2b79393efa85f840d6af6Timo Sirainen service_flags |= MAIL_STORAGE_SERVICE_FLAG_DEBUG;
b8d232d88018c5cafd2f3be5a181d318137a45f2Timo Sirainen break;
b8d232d88018c5cafd2f3be5a181d318137a45f2Timo Sirainen default:
b8d232d88018c5cafd2f3be5a181d318137a45f2Timo Sirainen usage();
ddbad7a661c0663fafd2b79393efa85f840d6af6Timo Sirainen }
ddbad7a661c0663fafd2b79393efa85f840d6af6Timo Sirainen }
b8d232d88018c5cafd2f3be5a181d318137a45f2Timo Sirainen if (!all_users) {
fe6cf42464c36ab281c0e0740f0255be77453670Timo Sirainen if (optind == argc)
fe6cf42464c36ab281c0e0740f0255be77453670Timo Sirainen usage();
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen service_flags |= MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen username = argv[optind++];
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen doveadm_mail_single_user(cmd, username, service_flags,
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen (const char **)argv + optind);
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen } else {
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen service_flags |= MAIL_STORAGE_SERVICE_FLAG_TEMP_PRIV_DROP;
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen doveadm_mail_all_users(cmd, service_flags,
3140537477eecdc5ea0a99f77df233c297dae58dTimo Sirainen (const char **)argv + optind);
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen }
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainen}
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainen
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainenbool doveadm_mail_try_run(const char *cmd_name, int argc, char *argv[])
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainen{
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainen const struct doveadm_mail_cmd *cmd;
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen array_foreach(&doveadm_mail_cmds, cmd) {
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen if (strcmp(cmd->name, cmd_name) == 0) {
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen doveadm_mail_cmd(cmd->cmd, argc, argv);
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen return TRUE;
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen }
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen }
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen return FALSE;
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen}
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainenvoid doveadm_mail_register_cmd(const struct doveadm_mail_cmd *cmd)
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen{
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen /* for now we'll just assume that cmd will be permanently in memory */
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen array_append(&doveadm_mail_cmds, cmd, 1);
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
aff7542e1d2f48b030560a4f01096a2cc3f671ceTimo Sirainenvoid doveadm_mail_usage(void)
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainen{
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainen const struct doveadm_mail_cmd *cmd;
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainen
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainen array_foreach(&doveadm_mail_cmds, cmd) {
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainen fprintf(stderr, USAGE_CMDNAME_FMT" <user>|-a", cmd->name);
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainen if (cmd->usage_args != NULL)
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainen fprintf(stderr, " %s", cmd->usage_args);
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainen fputc('\n', stderr);
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainen }
aff7542e1d2f48b030560a4f01096a2cc3f671ceTimo Sirainen}
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic struct doveadm_mail_cmd mail_commands[] = {
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen { cmd_purge, "purge", NULL },
4edf90751f075cc6ab3d6f53fc78b656efa80922Timo Sirainen { cmd_force_resync, "force-resync", "<mailbox>" }
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen};
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainenvoid doveadm_mail_init(void)
4edf90751f075cc6ab3d6f53fc78b656efa80922Timo Sirainen{
a40d26f83af808a0ea1e212c001d682a96d870b0Timo Sirainen unsigned int i;
0f66f12eb4cdbf47670975044c88d8f388bf92dfTimo Sirainen
0f66f12eb4cdbf47670975044c88d8f388bf92dfTimo Sirainen i_array_init(&doveadm_mail_cmds, 32);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen for (i = 0; i < N_ELEMENTS(mail_commands); i++)
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen doveadm_mail_register_cmd(&mail_commands[i]);
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen}
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainenvoid doveadm_mail_deinit(void)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen array_free(&doveadm_mail_cmds);
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen}
fd2f5fbc1f07aa93e2214a28cdf02437fb7d06c8Timo Sirainen