doveadm-mail.c revision 1c846dfafac3093058d5b7c60f9bcef1d17c4783
76b43e4417bab52e913da39b5f5bc2a130d3f149Timo Sirainen/* Copyright (c) 2009 Dovecot authors, see the included COPYING file */
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo SirainenARRAY_TYPE(doveadm_mail_cmd) doveadm_mail_cmds;
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainenstatic void cmd_purge(struct mail_user *user, const char *args[] ATTR_UNUSED)
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen for (ns = user->namespaces; ns != NULL; ns = ns->next) {
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen if (ns->type != NAMESPACE_PRIVATE || ns->alias_for != NULL)
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen i_error("Purging namespace '%s' failed: %s", ns->prefix,
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen mail_storage_get_last_error(ns->storage, NULL));
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainenstatic struct mailbox *
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainenmailbox_find_and_open(struct mail_user *user, const char *mailbox)
dd4b5f14b71b01a84af942e720a2d6e5f15ee1a7Timo Sirainen ns = mail_namespace_find(user->namespaces, &mailbox);
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen i_fatal("Can't find namespace for mailbox %s", mailbox);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen box = mailbox_alloc(ns->list, mailbox, NULL, MAILBOX_FLAG_KEEP_RECENT |
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen i_fatal("Opening mailbox %s failed: %s", orig_mailbox,
e015e2f7e7f48874495f9df8b0dd192b7ffcb5ccTimo Sirainen mail_storage_get_last_error(mailbox_get_storage(box),
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainenstatic void cmd_force_resync(struct mail_user *user, const char *args[])
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,
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[])
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen struct mail_storage_service_ctx *storage_service;
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen struct mail_storage_service_user *service_user;
7d75b95c260e58ee5039fa3afd79e9fda3bc8002Timo Sirainen i_fatal("USER environment is missing and -u option not used");
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen storage_service = mail_storage_service_init(master_service, NULL,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (mail_storage_service_lookup_next(storage_service, &input,
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen mail_storage_service_user_free(&service_user);
6a19e109ee8c5a6f688da83a86a7f6abeb71abddTimo Sirainen mail_storage_service_deinit(&storage_service);
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[])
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen struct mail_storage_service_user *service_user;
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 if (mail_storage_service_next(storage_service, service_user,
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen mail_storage_service_user_free(&service_user);
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen mail_storage_service_user_free(&service_user);
fd44baee6e92f13d42ff711895d6510067f70955Timo Sirainenstatic void sig_die(const siginfo_t *si, void *context ATTR_UNUSED)
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainendoveadm_mail_all_users(doveadm_mail_command_t *cmd,
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen enum mail_storage_service_flags service_flags,
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen const char *args[])
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainen struct mail_storage_service_ctx *storage_service;
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainen unsigned int user_idx, user_count, interval, n;
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen service_flags |= MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen storage_service = mail_storage_service_init(master_service, NULL,
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen lib_signals_set_handler(SIGINT, FALSE, sig_die, NULL);
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen lib_signals_set_handler(SIGTERM, FALSE, sig_die, NULL);
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainen user_count = mail_storage_service_all_init(storage_service);
8aacc9e7c84f8376822823ec98c2f551d4919b2eTimo Sirainen for (interval = 10; n > 0 && interval < 1000; interval *= 10)
a40d26f83af808a0ea1e212c001d682a96d870b0Timo Sirainen while ((ret = mail_storage_service_all_next(storage_service,
4bbee99b3aef449a9a2a11a5b5cf1ca486915c49Timo Sirainen ret = doveadm_mail_next_user(cmd, storage_service,
4b058f90f9e8a2c6b2eed275de4eb8cc5195a71dTimo Sirainen if ((service_flags & MAIL_STORAGE_SERVICE_FLAG_DEBUG) != 0) {
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen i_warning("Killed with signal %d", killed_signo);
fe6cf42464c36ab281c0e0740f0255be77453670Timo Sirainen if ((service_flags & MAIL_STORAGE_SERVICE_FLAG_DEBUG) != 0)
fe6cf42464c36ab281c0e0740f0255be77453670Timo Sirainen i_error("Failed to iterate through some users");
fe6cf42464c36ab281c0e0740f0255be77453670Timo Sirainen mail_storage_service_deinit(&storage_service);
cc3ccdab8a510d88fecedf95187465bf84833711Timo Sirainendoveadm_mail_cmd(doveadm_mail_command_t *cmd, int argc, char *argv[])
cc3ccdab8a510d88fecedf95187465bf84833711Timo Sirainen enum mail_storage_service_flags service_flags = 0;
ddbad7a661c0663fafd2b79393efa85f840d6af6Timo Sirainen service_flags |= MAIL_STORAGE_SERVICE_FLAG_DEBUG;
9a583c7a827f7a4d89ee43774f2d51ea6a214543Timo Sirainen service_flags |= MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen doveadm_mail_single_user(cmd, username, service_flags,
956f7778e413d3184d69e7b96e4a6b3cd5570bcdTimo Sirainen service_flags |= MAIL_STORAGE_SERVICE_FLAG_TEMP_PRIV_DROP;
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainenbool doveadm_mail_try_run(const char *cmd_name, int argc, char *argv[])
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainenvoid doveadm_mail_register_cmd(const struct doveadm_mail_cmd *cmd)
6b85bc4b03e552cfaeeae872d63c2d8ac5fcb7c4Timo Sirainen /* for now we'll just assume that cmd will be permanently in memory */
7ca9da144f79317f9a0d3b0b5cc1fe21e44a5bf4Timo Sirainen fprintf(stderr, USAGE_CMDNAME_FMT" <user>|-a", cmd->name);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic struct doveadm_mail_cmd mail_commands[] = {
4edf90751f075cc6ab3d6f53fc78b656efa80922Timo Sirainen { cmd_force_resync, "force-resync", "<mailbox>" }
a40d26f83af808a0ea1e212c001d682a96d870b0Timo Sirainen unsigned int i;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen for (i = 0; i < N_ELEMENTS(mail_commands); i++)