doveadm-mail.c revision 5fb3f13537dffd15a31e997da133a721c0728af8
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (c) 2009-2010 Dovecot authors, see the included COPYING file */
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo SirainenARRAY_TYPE(doveadm_mail_cmd) doveadm_mail_cmds;
1128c114416bdc4df0b41d3e15429a1522e5cfe4Timo Sirainencmd_purge(struct mail_user *user, const char *const args[] ATTR_UNUSED)
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen for (ns = user->namespaces; ns != NULL; ns = ns->next) {
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen if (ns->type != NAMESPACE_PRIVATE || ns->alias_for != NULL)
f9cf9852b0338910f1a710297374943d66fea480Timo Sirainen i_error("Purging namespace '%s' failed: %s", ns->prefix,
f9cf9852b0338910f1a710297374943d66fea480Timo Sirainen mail_storage_get_last_error(ns->storage, NULL));
01aca4a521410be85e1f39e37c662435d052f48aAki Tuomistatic struct mailbox *
f9cf9852b0338910f1a710297374943d66fea480Timo Sirainenmailbox_find_and_open(struct mail_user *user, const char *mailbox)
f9cf9852b0338910f1a710297374943d66fea480Timo Sirainen ns = mail_namespace_find(user->namespaces, &mailbox);
f9cf9852b0338910f1a710297374943d66fea480Timo Sirainen i_fatal("Can't find namespace for mailbox %s", mailbox);
f9cf9852b0338910f1a710297374943d66fea480Timo Sirainen box = mailbox_alloc(ns->list, mailbox, MAILBOX_FLAG_KEEP_RECENT |
f9cf9852b0338910f1a710297374943d66fea480Timo Sirainen i_fatal("Opening mailbox %s failed: %s", orig_mailbox,
f9cf9852b0338910f1a710297374943d66fea480Timo Sirainen mail_storage_get_last_error(mailbox_get_storage(box),
8a6afcd8a6d9ed69626add85a7b75105ee3cb6a1Timo Sirainendoveadm_mailbox_find_and_sync(struct mail_user *user, const char *mailbox)
1128c114416bdc4df0b41d3e15429a1522e5cfe4Timo Sirainen if (mailbox_sync(box, MAILBOX_SYNC_FLAG_FULL_READ) < 0) {
4db61af2cfe2b206113bcc4b6153521679702bb4Timo Sirainen i_fatal("Syncing mailbox %s failed: %s", mailbox,
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen mail_storage_get_last_error(mailbox_get_storage(box),
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenstatic void cmd_force_resync(struct mail_user *user, const char *const args[])
f9eee365367f37b1692c07db6c23d30243844aaaTimo Sirainen if (mailbox_sync(box, MAILBOX_SYNC_FLAG_FORCE_RESYNC |
7cd055a212d44067e2d94452c05691d696c9f699Timo Sirainen i_fatal("Forcing a resync on mailbox %s failed: %s", mailbox,
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainendoveadm_mail_next_user(doveadm_mail_command_t *cmd,
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen struct mail_storage_service_ctx *storage_service,
f0e416aa42058e7ccc0dc6deec0d4f4a19ee6ebeTimo Sirainen const struct mail_storage_service_input *input,
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen const char *const args[], const char **error_r)
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen struct mail_storage_service_user *service_user;
ba4626cd5be3d225a7a89aa338d92b8fb411fd1cTimo Sirainen i_set_failure_prefix(t_strdup_printf("doveadm(%s): ", input->username));
ba4626cd5be3d225a7a89aa338d92b8fb411fd1cTimo Sirainen ret = mail_storage_service_lookup(storage_service, input,
1128c114416bdc4df0b41d3e15429a1522e5cfe4Timo Sirainen *error_r = t_strdup_printf("User lookup failed: %s",
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen ret = mail_storage_service_next(storage_service, service_user,
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen mail_storage_service_user_free(&service_user);
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen mail_storage_service_user_free(&service_user);
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainendoveadm_mail_single_user(doveadm_mail_command_t *cmd, const char *username,
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen enum mail_storage_service_flags service_flags,
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen const char *const args[])
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen struct mail_storage_service_ctx *storage_service;
caf029d36a826106e48b8682f15ea0fc01fdd8f4Timo Sirainen i_fatal("USER environment is missing and -u option not used");
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen storage_service = mail_storage_service_init(master_service, NULL,
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen ret = doveadm_mail_next_user(cmd, storage_service, &input,
e22ec7998afd426c53c658483ce66b6e404e27c6Timo Sirainen else if (ret == 0)
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen mail_storage_service_deinit(&storage_service);
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenstatic void sig_die(const siginfo_t *si, void *context ATTR_UNUSED)
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainendoveadm_mail_all_users(doveadm_mail_command_t *cmd,
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen enum mail_storage_service_flags service_flags,
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen const char *const args[])
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen struct mail_storage_service_ctx *storage_service;
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen unsigned int user_idx, user_count, interval, n;
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen service_flags |= MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen storage_service = mail_storage_service_init(master_service, NULL,
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen lib_signals_set_handler(SIGINT, FALSE, sig_die, NULL);
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen lib_signals_set_handler(SIGTERM, FALSE, sig_die, NULL);
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen user_count = mail_storage_service_all_init(storage_service);
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen for (interval = 10; n > 0 && interval < 1000; interval *= 10)
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen while ((ret = mail_storage_service_all_next(storage_service,
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen ret = doveadm_mail_next_user(cmd, storage_service,
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen else if (ret == 0)
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen i_warning("Killed with signal %d", killed_signo);
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen i_error("Failed to iterate through some users");
a1044a46a8f3512173f4ea2684ef1fc3e61645c7Timo Sirainen mail_storage_service_deinit(&storage_service);
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainendoveadm_mail_cmd(const struct doveadm_mail_cmd *cmd, int argc, char *argv[])
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen enum mail_storage_service_flags service_flags =
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen service_flags |= MAIL_STORAGE_SERVICE_FLAG_DEBUG;
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen doveadm_mail_single_user(cmd->cmd, username, service_flags,
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen (const void *)argv);
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen service_flags |= MAIL_STORAGE_SERVICE_FLAG_TEMP_PRIV_DROP;
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen doveadm_mail_all_users(cmd->cmd, service_flags,
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen (const void *)argv);
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenbool doveadm_mail_try_run(const char *cmd_name, int argc, char *argv[])
7c04ede0da5749691624a1fb962ac29cd0167050Timo Sirainenvoid doveadm_mail_register_cmd(const struct doveadm_mail_cmd *cmd)
7c04ede0da5749691624a1fb962ac29cd0167050Timo Sirainen /* for now we'll just assume that cmd will be permanently in memory */
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fprintf(stderr, USAGE_CMDNAME_FMT" [-u <user>|-A]", cmd->name);
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenvoid doveadm_mail_help(const struct doveadm_mail_cmd *cmd)
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen fprintf(stderr, "doveadm %s [-u <user>|-A] %s\n", cmd->name,
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen cmd->usage_args == NULL ? "" : cmd->usage_args);
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenvoid doveadm_mail_help_name(const char *cmd_name)
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen i_fatal("Missing help for command %s", cmd_name);
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainenstatic struct doveadm_mail_cmd mail_commands[] = {
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen { cmd_force_resync, "force-resync", "<mailbox>" },
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen { cmd_fetch, "fetch", "<mailbox> <search query>" },
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen unsigned int i;
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen for (i = 0; i < N_ELEMENTS(mail_commands); i++)
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen mod_set.version = master_service_get_version_string(master_service);
b772ddf3cfb606dddaa465b317a0dc01bf06c6e4Timo Sirainen /* load all configured mail plugins */