doveadm-mail.c revision 23878bd03d1de531e3261a25598beec621351910
5e0ce63bb65db34d7f48b34bbb5545fa791781c4Timo Sirainen/* Copyright (c) 2009-2010 Dovecot authors, see the included COPYING file */
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo SirainenARRAY_TYPE(doveadm_mail_cmd) doveadm_mail_cmds;
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen i_assert(size >= sizeof(struct doveadm_mail_cmd_context));
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen pool = pool_alloconly_create("doveadm mail cmd", 1024);
daf029d2a627daa39d05507140f385162828172eTimo Sirainencmd_purge_run(struct doveadm_mail_cmd_context *ctx ATTR_UNUSED,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen for (ns = user->namespaces; ns != NULL; ns = ns->next) {
daf029d2a627daa39d05507140f385162828172eTimo Sirainen if (ns->type != NAMESPACE_PRIVATE || ns->alias_for != NULL)
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen i_error("Purging namespace '%s' failed: %s", ns->prefix,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen mail_storage_get_last_error(ns->storage, NULL));
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_purge_alloc(void)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen ctx = doveadm_mail_cmd_alloc(struct doveadm_mail_cmd_context);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstatic struct mailbox *
20344c0e814139e3c365fbb9287478f91512089eTimo Sirainenmailbox_find_and_open(struct mail_user *user, const char *mailbox)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen ns = mail_namespace_find(user->namespaces, &mailbox);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen i_fatal("Can't find namespace for mailbox %s", mailbox);
20344c0e814139e3c365fbb9287478f91512089eTimo Sirainen box = mailbox_alloc(ns->list, mailbox, MAILBOX_FLAG_KEEP_RECENT |
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen i_fatal("Opening mailbox %s failed: %s", orig_mailbox,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen mail_storage_get_last_error(mailbox_get_storage(box),
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainendoveadm_mailbox_find_and_sync(struct mail_user *user, const char *mailbox)
601f5f14c6cde28f0e0c6ca7c5d735315d3d48dfTimo Sirainen if (mailbox_sync(box, MAILBOX_SYNC_FLAG_FULL_READ) < 0) {
601f5f14c6cde28f0e0c6ca7c5d735315d3d48dfTimo Sirainen i_fatal("Syncing mailbox %s failed: %s", mailbox,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen mail_storage_get_last_error(mailbox_get_storage(box),
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainendoveadm_mail_build_search_args(const char *const args[])
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen parser = mail_search_parser_init_cmdline(args);
602a0434db30d8e3292d1c161a803d96a879a74fTimo Sirainen if (mail_search_build(mail_search_register_get_human(),
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainenstatic void cmd_force_resync_run(struct doveadm_mail_cmd_context *_ctx,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen box = mailbox_find_and_open(user, ctx->mailbox);
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen if (mailbox_sync(box, MAILBOX_SYNC_FLAG_FORCE_RESYNC |
7e1f68ad71d3485f1882142837b01f7a98ca8467Timo Sirainen i_fatal("Forcing a resync on mailbox %s failed: %s",
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainenstatic void cmd_force_resync_init(struct doveadm_mail_cmd_context *_ctx,
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen const char *const args[])
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen ctx->mailbox = p_strdup(ctx->ctx.pool, mailbox);
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_force_resync_alloc(void)
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen ctx = doveadm_mail_cmd_alloc(struct force_resync_cmd_context);
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainendoveadm_mail_next_user(struct doveadm_mail_cmd_context *ctx,
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen struct mail_storage_service_ctx *storage_service,
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen const struct mail_storage_service_input *input,
e0c3d5460d1cc0c440cb7723c8c2eef8d0afe9b9Timo Sirainen const char **error_r)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct mail_storage_service_user *service_user;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen i_set_failure_prefix(t_strdup_printf("doveadm(%s): ", input->username));
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen ret = mail_storage_service_lookup(storage_service, input,
0611067f385a37773800225256dcd5cf6aa34212Timo Sirainen *error_r = t_strdup_printf("User lookup failed: %s",
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen ret = mail_storage_service_next(storage_service, service_user,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen mail_storage_service_user_free(&service_user);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen mail_storage_service_user_free(&service_user);
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainendoveadm_mail_single_user(struct doveadm_mail_cmd_context *ctx,
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen enum mail_storage_service_flags service_flags)
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen struct mail_storage_service_ctx *storage_service;
89e195dfb5c4b0efd9b9f459771a4467674e5b1fTimo Sirainen i_fatal("USER environment is missing and -u option not used");
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen storage_service = mail_storage_service_init(master_service, NULL,
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen ret = doveadm_mail_next_user(ctx, storage_service, &input, &error);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen else if (ret == 0)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen mail_storage_service_deinit(&storage_service);
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainenstatic void sig_die(const siginfo_t *si, void *context ATTR_UNUSED)
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainendoveadm_mail_all_users(struct doveadm_mail_cmd_context *ctx,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen enum mail_storage_service_flags service_flags)
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen struct mail_storage_service_ctx *storage_service;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen unsigned int user_idx, user_count, interval, n;
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen service_flags |= MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
37ab3cde96bfa4bc5304c0c348fc420aec79572dTimo Sirainen storage_service = mail_storage_service_init(master_service, NULL,
37ab3cde96bfa4bc5304c0c348fc420aec79572dTimo Sirainen lib_signals_set_handler(SIGINT, FALSE, sig_die, NULL);
37ab3cde96bfa4bc5304c0c348fc420aec79572dTimo Sirainen lib_signals_set_handler(SIGTERM, FALSE, sig_die, NULL);
f4bbeadda12fbd7c219063db68f3e78646d83c2cTimo Sirainen user_count = mail_storage_service_all_init(storage_service);
0b47e9f5e0181053b4d9ca7b426b0e5c185e820eTimo Sirainen for (interval = 10; n > 0 && interval < 1000; interval *= 10)
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen while ((ret = mail_storage_service_all_next(storage_service,
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen ret = doveadm_mail_next_user(ctx, storage_service,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen else if (ret == 0)
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen i_warning("Killed with signal %d", killed_signo);
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen i_error("Failed to iterate through some users");
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen mail_storage_service_deinit(&storage_service);
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainendoveadm_mail_cmd(const struct doveadm_mail_cmd *cmd, int argc, char *argv[])
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen enum mail_storage_service_flags service_flags =
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen service_flags |= MAIL_STORAGE_SERVICE_FLAG_DEBUG;
7ef5ca6fb59a318c821a852ae48a2edbb671d7ddTimo Sirainen if (argv[0] != NULL && cmd->usage_args == NULL) {
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen doveadm_mail_single_user(ctx, username, service_flags);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen service_flags |= MAIL_STORAGE_SERVICE_FLAG_TEMP_PRIV_DROP;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainendoveadm_mail_try_run_multi_word(const struct doveadm_mail_cmd *cmd,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen unsigned int len;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen /* more args */
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen return doveadm_mail_try_run_multi_word(cmd, cmdname + len + 1,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenbool doveadm_mail_try_run(const char *cmd_name, int argc, char *argv[])
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen /* see if it matches a multi-word command */
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen if (strncmp(cmd->name, cmd_name, cmd_name_len) == 0 &&
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen const char *subcmd = cmd->name + cmd_name_len + 1;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen if (doveadm_mail_try_run_multi_word(cmd, subcmd,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenvoid doveadm_mail_register_cmd(const struct doveadm_mail_cmd *cmd)
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen /* for now we'll just assume that cmd will be permanently in memory */
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen fprintf(stderr, USAGE_CMDNAME_FMT" [-u <user>|-A]", cmd->name);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenvoid doveadm_mail_help(const struct doveadm_mail_cmd *cmd)
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen fprintf(stderr, "doveadm %s [-u <user>|-A] %s\n", cmd->name,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen cmd->usage_args == NULL ? "" : cmd->usage_args);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenvoid doveadm_mail_try_help_name(const char *cmd_name)
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenvoid doveadm_mail_help_name(const char *cmd_name)
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen i_fatal("Missing help for command %s", cmd_name);
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstatic struct doveadm_mail_cmd cmd_force_resync = {
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen cmd_force_resync_alloc, "force-resync", "<mailbox>"
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstatic struct doveadm_mail_cmd *mail_commands[] = {
void doveadm_mail_init(void)
&mod_set);
void doveadm_mail_deinit(void)