doveadm-mail.c revision 4fecb0a09c4d5d0300b047bfd9df5166ee555c9b
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (c) 2009-2016 Dovecot authors, see the included COPYING file */
542e28b384a6b26695f3e8de38fd5727d06f3333Timo Sirainen#define DOVEADM_MAIL_CMD_INPUT_TIMEOUT_MSECS (5*60*1000)
c3a636e4c9ae776e0eed06b6d7ad1ccfb6003afdTimo SirainenARRAY_TYPE(doveadm_mail_cmd) doveadm_mail_cmds;
c3a636e4c9ae776e0eed06b6d7ad1ccfb6003afdTimo Sirainenvoid (*hook_doveadm_mail_init)(struct doveadm_mail_cmd_context *ctx);
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainenvoid doveadm_mail_failed_error(struct doveadm_mail_cmd_context *ctx,
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen /* tempfail overrides all other exit codes, otherwise use whatever
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen error happened first */
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen if (ctx->exit_code == 0 || exit_code == EX_TEMPFAIL)
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainenvoid doveadm_mail_failed_storage(struct doveadm_mail_cmd_context *ctx,
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenvoid doveadm_mail_failed_mailbox(struct doveadm_mail_cmd_context *ctx,
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen doveadm_mail_failed_storage(ctx, mailbox_get_storage(box));
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainenvoid doveadm_mail_failed_list(struct doveadm_mail_cmd_context *ctx,
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen i_assert(size >= sizeof(struct doveadm_mail_cmd_context));
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen pool = pool_alloconly_create("doveadm mail cmd", 1024);
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainencmd_purge_run(struct doveadm_mail_cmd_context *ctx, struct mail_user *user)
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen for (ns = user->namespaces; ns != NULL; ns = ns->next) {
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen if (ns->type != MAIL_NAMESPACE_TYPE_PRIVATE ||
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen storage = mail_namespace_get_default_storage(ns);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen i_error("Purging namespace '%s' failed: %s", ns->prefix,
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_purge_alloc(void)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen ctx = doveadm_mail_cmd_alloc(struct doveadm_mail_cmd_context);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic void doveadm_mail_cmd_input_input(struct doveadm_mail_cmd_context *ctx)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen i_stream_skip(ctx->cmd_input, i_stream_get_data_size(ctx->cmd_input));
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainenstatic void doveadm_mail_cmd_input_timeout(struct doveadm_mail_cmd_context *ctx)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen input = i_stream_create_error_str(ETIMEDOUT, "Timed out in %u secs",
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen i_stream_set_name(input, i_stream_get_name(ctx->cmd_input));
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic void doveadm_mail_cmd_input_read(struct doveadm_mail_cmd_context *ctx)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen to = timeout_add(DOVEADM_MAIL_CMD_INPUT_TIMEOUT_MSECS,
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen /* read the pending input from stream. */
18c209a06941ef583b08b173dadfbe4571995bf9Timo Sirainenvoid doveadm_mail_get_input(struct doveadm_mail_cmd_context *ctx)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen inputs[0] = i_stream_create_dot(ctx->conn->input, FALSE);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen inputs[0] = i_stream_create_fd(STDIN_FILENO, 1024*1024, FALSE);
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen ctx->cmd_input_fd = i_stream_get_fd(inputs[0]);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen ctx->cmd_input = i_stream_create_seekable_path(inputs, 1024*256,
fc464e5b2b2ab4d415a5d5b90ce4475d34620a75Timo Sirainen i_stream_set_name(ctx->cmd_input, i_stream_get_name(inputs[0]));
fc464e5b2b2ab4d415a5d5b90ce4475d34620a75Timo Sirainendoveadm_mailbox_find(struct mail_user *user, const char *mailbox)
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen ns = mail_namespace_find(user->namespaces, mailbox);
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen return mailbox_alloc(ns->list, mailbox, MAILBOX_FLAG_IGNORE_ACLS);
3b22894b8805b186c73d8b754001e8d7e944be85Timo Sirainendoveadm_mail_build_search_args(const char *const args[])
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen parser = mail_search_parser_init_cmdline(args);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen if (mail_search_build(mail_search_register_get_human(),
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic int cmd_force_resync_box(struct doveadm_mail_cmd_context *ctx,
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen box = mailbox_alloc(info->ns->list, info->vname,
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen i_error("Opening mailbox %s failed: %s", info->vname,
9261dbf0675204898c6557591c7aa376e23a52b2Timo Sirainen } else if (mailbox_sync(box, MAILBOX_SYNC_FLAG_FORCE_RESYNC |
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen i_error("Forcing a resync on mailbox %s failed: %s",
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen info->vname, mailbox_get_last_error(box, NULL));
c06d6ea0766d0520af1a93e6000c0e73f350e0a2Timo Sirainenstatic int cmd_force_resync_run(struct doveadm_mail_cmd_context *ctx,
f38485358ffc04c3466b917770575e29deef24c3Timo Sirainen const enum mailbox_list_iter_flags iter_flags =
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen const enum mail_namespace_type ns_mask = MAIL_NAMESPACE_TYPE_MASK_ALL;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen iter = mailbox_list_iter_init_namespaces(user->namespaces, ctx->args,
c06d6ea0766d0520af1a93e6000c0e73f350e0a2Timo Sirainen while ((info = mailbox_list_iter_next(iter)) != NULL) {
c06d6ea0766d0520af1a93e6000c0e73f350e0a2Timo Sirainen mailbox_list_get_last_error(user->namespaces->list, NULL));
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen doveadm_mail_failed_list(ctx, user->namespaces->list);
c06d6ea0766d0520af1a93e6000c0e73f350e0a2Timo Sirainencmd_force_resync_init(struct doveadm_mail_cmd_context *_ctx ATTR_UNUSED,
c06d6ea0766d0520af1a93e6000c0e73f350e0a2Timo Sirainen const char *const args[])
c06d6ea0766d0520af1a93e6000c0e73f350e0a2Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_force_resync_alloc(void)
c06d6ea0766d0520af1a93e6000c0e73f350e0a2Timo Sirainen ctx = doveadm_mail_cmd_alloc(struct doveadm_mail_cmd_context);
9aceb071780a949f4e8bf41d3cf80735d9ac7fdfTimo Sirainendoveadm_cctx_to_storage_service_input(const struct doveadm_cmd_context *cctx,
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainendoveadm_mail_next_user(struct doveadm_mail_cmd_context *ctx,
c06d6ea0766d0520af1a93e6000c0e73f350e0a2Timo Sirainen const char **error_r)
47e9fdee55c2074425cf0316f4f64fbbb790301cTimo Sirainen i_set_failure_prefix("doveadm(%s): ", cctx->username);
47e9fdee55c2074425cf0316f4f64fbbb790301cTimo Sirainen i_set_failure_prefix("doveadm(%s,%s): ", ip, cctx->username);
47e9fdee55c2074425cf0316f4f64fbbb790301cTimo Sirainen doveadm_cctx_to_storage_service_input(cctx, &input);
47e9fdee55c2074425cf0316f4f64fbbb790301cTimo Sirainen /* see if we want to execute this command via (another)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen doveadm server */
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen ret = doveadm_mail_server_user(ctx, &input, error_r);
62fc2fe221eccc834ac6b11b94b55335d5027cd1Timo Sirainen ret = mail_storage_service_lookup(ctx->storage_service, &input,
62fc2fe221eccc834ac6b11b94b55335d5027cd1Timo Sirainen *error_r = t_strdup_printf("User lookup failed: %s",
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen if (ctx->v.prerun(ctx, ctx->cur_service_user, error_r) < 0) {
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen mail_storage_service_user_free(&ctx->cur_service_user);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen ret = mail_storage_service_next(ctx->storage_service,
2fb9ae42f9e36388ec6db24188b9108434043fd0Timo Sirainen mail_storage_service_user_free(&ctx->cur_service_user);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen if (ctx->v.run(ctx, ctx->cur_mail_user) < 0) {
fa2a11210f20fb8998ed656f75e163191c8047e6Timo Sirainen mail_storage_service_user_free(&ctx->cur_service_user);
47e9fdee55c2074425cf0316f4f64fbbb790301cTimo Sirainenstatic void sig_die(const siginfo_t *si, void *context ATTR_UNUSED)
47e9fdee55c2074425cf0316f4f64fbbb790301cTimo Sirainenint doveadm_mail_single_user(struct doveadm_mail_cmd_context *ctx,
573085b4b25b0bbae8d27969df2c91702eefa23eTimo Sirainen const char **error_r)
0ee3fdb5e94ae6f34cb873ca3c9858342621e55fTimo Sirainen doveadm_cctx_to_storage_service_input(cctx, &ctx->storage_service_input);
e5acc283bf030b0b5c79ca4e52d315c516a299faPascal Volk ctx->storage_service = mail_storage_service_init(master_service, NULL,
1b04762685272a53643ac2179939537a44c7c044Timo Sirainen lib_signals_set_handler(SIGINT, 0, sig_die, NULL);
1b04762685272a53643ac2179939537a44c7c044Timo Sirainen lib_signals_set_handler(SIGTERM, 0, sig_die, NULL);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen return doveadm_mail_next_user(ctx, cctx, error_r);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainendoveadm_mail_all_users(struct doveadm_mail_cmd_context *ctx,
fa2a11210f20fb8998ed656f75e163191c8047e6Timo Sirainen ctx->service_flags |= MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
fa2a11210f20fb8998ed656f75e163191c8047e6Timo Sirainen doveadm_cctx_to_storage_service_input(cctx, &ctx->storage_service_input);
fa2a11210f20fb8998ed656f75e163191c8047e6Timo Sirainen ctx->storage_service = mail_storage_service_init(master_service, NULL,
d1fff80640050631b06bfab904a34b2ad24601e8Timo Sirainen lib_signals_set_handler(SIGINT, 0, sig_die, NULL);
fa2a11210f20fb8998ed656f75e163191c8047e6Timo Sirainen lib_signals_set_handler(SIGTERM, 0, sig_die, NULL);
fa2a11210f20fb8998ed656f75e163191c8047e6Timo Sirainen mail_storage_service_all_init_mask(ctx->storage_service,
d1fff80640050631b06bfab904a34b2ad24601e8Timo Sirainen while ((ret = ctx->v.get_next_user(ctx, &user)) > 0) {
fa2a11210f20fb8998ed656f75e163191c8047e6Timo Sirainen if (!wildcard_match_icase(user, wildcard_user))
fa2a11210f20fb8998ed656f75e163191c8047e6Timo Sirainen ret = doveadm_mail_next_user(ctx, cctx, &error);
d1fff80640050631b06bfab904a34b2ad24601e8Timo Sirainen else if (ret == 0)
fa2a11210f20fb8998ed656f75e163191c8047e6Timo Sirainen i_warning("Killed with signal %d", killed_signo);
d1fff80640050631b06bfab904a34b2ad24601e8Timo Sirainen i_error("Failed to iterate through some users");
c3a636e4c9ae776e0eed06b6d7ad1ccfb6003afdTimo Sirainendoveadm_mail_cmd_init_noop(struct doveadm_mail_cmd_context *ctx ATTR_UNUSED,
c3a636e4c9ae776e0eed06b6d7ad1ccfb6003afdTimo Sirainendoveadm_mail_cmd_get_next_user(struct doveadm_mail_cmd_context *ctx,
c3a636e4c9ae776e0eed06b6d7ad1ccfb6003afdTimo Sirainen return mail_storage_service_all_next(ctx->storage_service, username_r);
c3a636e4c9ae776e0eed06b6d7ad1ccfb6003afdTimo Sirainen *username_r = i_stream_read_next_line(ctx->users_list_input);
c3a636e4c9ae776e0eed06b6d7ad1ccfb6003afdTimo Sirainen if (ctx->users_list_input->stream_errno != 0) {
c3a636e4c9ae776e0eed06b6d7ad1ccfb6003afdTimo Sirainendoveadm_mail_cmd_deinit_noop(struct doveadm_mail_cmd_context *ctx ATTR_UNUSED)
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainendoveadm_mail_cmd_init(const struct doveadm_mail_cmd *cmd,
c3a636e4c9ae776e0eed06b6d7ad1ccfb6003afdTimo Sirainen ctx->v.get_next_user = doveadm_mail_cmd_get_next_user;
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen p_array_init(&ctx->module_contexts, ctx->pool, 5);
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainendoveadm_mail_cmdline_init(const struct doveadm_mail_cmd *cmd)
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen ctx = doveadm_mail_cmd_init(cmd, doveadm_settings);
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen ctx->service_flags |= MAIL_STORAGE_SERVICE_FLAG_NO_LOG_INIT;
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen ctx->service_flags |= MAIL_STORAGE_SERVICE_FLAG_DEBUG;
b879ed8dd4b5850987e6b89a92f794d87c6be7d7Timo Sirainendoveadm_mail_cmd_exec(struct doveadm_mail_cmd_context *ctx,
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen !ctx->iterate_all_users && wildcard_user == NULL;
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen if (doveadm_print_is_initialized() && !ctx->iterate_single_user) {
2eb0402a28bd0422e0170160808c67d6c7274689Timo Sirainen i_fatal_status(EX_USAGE, "USER environment is missing and -u option not used");
2fb9ae42f9e36388ec6db24188b9108434043fd0Timo Sirainen /* we may access multiple users */
2fb9ae42f9e36388ec6db24188b9108434043fd0Timo Sirainen ctx->service_flags |= MAIL_STORAGE_SERVICE_FLAG_TEMP_PRIV_DROP;
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen ret = doveadm_mail_single_user(ctx, cctx, &error);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen /* user lookup/init failed somehow */
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen } else if (ret == 0) {
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen ctx->service_flags |= MAIL_STORAGE_SERVICE_FLAG_TEMP_PRIV_DROP;
2fb9ae42f9e36388ec6db24188b9108434043fd0Timo Sirainen doveadm_mail_all_users(ctx, cctx, wildcard_user);
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen /* service deinit unloads mail plugins, so do it late */
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen mail_storage_service_deinit(&ctx->storage_service);
674f541b16689c0ed090dac32db94463c5af3977Timo Sirainenstatic void doveadm_mail_cmd_free(struct doveadm_mail_cmd_context *ctx)
674f541b16689c0ed090dac32db94463c5af3977Timo Sirainendoveadm_mail_cmd(const struct doveadm_mail_cmd *cmd, int argc, char *argv[])
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen /* keep context's getopt_args first in case it contains '+' */
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen getopt_args = t_strconcat(ctx->getopt_args, getopt_args, NULL);
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen i_assert(master_getopt_str_is_valid(getopt_args));
9b78c0d5e13141f4df6c6e483f854e5acb861288Timo Sirainen while ((c = getopt(argc, argv, getopt_args)) > 0) {
2fb9ae42f9e36388ec6db24188b9108434043fd0Timo Sirainen doveadm_settings->doveadm_socket_path = optarg;
2fb9ae42f9e36388ec6db24188b9108434043fd0Timo Sirainen if (doveadm_settings->doveadm_worker_count == 0)
48ada47cce07fb7195a3437224c7c25f542326b0Timo Sirainen if (argv[0] != NULL && cmd->usage_args == NULL) {
48ada47cce07fb7195a3437224c7c25f542326b0Timo Sirainen i_fatal_status(EX_USAGE, "doveadm %s: Unknown parameter: %s",
705f6fbad395e6f014838e797b7dbcaceafd2f1dTimo Sirainen doveadm_mail_cmd_exec(ctx, &cctx, wildcard_user);
9ba7e76c20be775f368254e3059a6189fe789f16Timo Sirainendoveadm_mail_cmd_try_find_multi_word(const struct doveadm_mail_cmd *cmd,
9ba7e76c20be775f368254e3059a6189fe789f16Timo Sirainen const char *const **argv)
38f227941bcf673e0e523c1ac7267bca9cbcd2c4Timo Sirainen unsigned int len;
2fb9ae42f9e36388ec6db24188b9108434043fd0Timo Sirainen /* more args */
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen return doveadm_mail_cmd_try_find_multi_word(cmd, cmdname + len + 1,
3b22894b8805b186c73d8b754001e8d7e944be85Timo Sirainendoveadm_mail_cmd_find_from_argv(const char *cmd_name, int *argc,
3b22894b8805b186c73d8b754001e8d7e944be85Timo Sirainen const char *const **argv)
2fb9ae42f9e36388ec6db24188b9108434043fd0Timo Sirainen const char *const *orig_argv;
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen /* see if it matches a multi-word command */
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen if (strncmp(cmd->name, cmd_name, cmd_name_len) == 0 &&
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen const char *subcmd = cmd->name + cmd_name_len + 1;
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen if (doveadm_mail_cmd_try_find_multi_word(cmd, subcmd,
2fb9ae42f9e36388ec6db24188b9108434043fd0Timo Sirainenbool doveadm_mail_try_run(const char *cmd_name, int argc, char *argv[])
abb9b8f14e83baca887cf12210bfe480f6cde7a6Timo Sirainen cmd = doveadm_mail_cmd_find_from_argv(cmd_name, &argc, (void *)&argv);
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainenvoid doveadm_mail_register_cmd(const struct doveadm_mail_cmd *cmd)
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen /* for now we'll just assume that cmd will be permanently in memory */
3b22894b8805b186c73d8b754001e8d7e944be85Timo Sirainenconst struct doveadm_mail_cmd *doveadm_mail_cmd_find(const char *cmd_name)
367e28a16854ee9f7247b2518f36f5e9163fcc10Timo Sirainen if (cmd->usage_args == &doveadm_mail_cmd_hide)
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen str_printfa(out, "%s\t"DOVEADM_CMD_MAIL_USAGE_PREFIX, cmd->name);
c06d6ea0766d0520af1a93e6000c0e73f350e0a2Timo Sirainenvoid doveadm_mail_help(const struct doveadm_mail_cmd *cmd)
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen fprintf(stderr, "doveadm %s "DOVEADM_CMD_MAIL_USAGE_PREFIX" %s\n",
c06d6ea0766d0520af1a93e6000c0e73f350e0a2Timo Sirainen cmd->name, cmd->usage_args == NULL ? "" : cmd->usage_args);
d1fff80640050631b06bfab904a34b2ad24601e8Timo Sirainenvoid doveadm_mail_try_help_name(const char *cmd_name)
d1fff80640050631b06bfab904a34b2ad24601e8Timo Sirainenbool doveadm_mail_has_subcommands(const char *cmd_name)
48ada47cce07fb7195a3437224c7c25f542326b0Timo Sirainenvoid doveadm_mail_help_name(const char *cmd_name)
38f227941bcf673e0e523c1ac7267bca9cbcd2c4Timo Sirainen i_fatal("Missing help for command %s", cmd_name);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic struct doveadm_cmd_ver2 doveadm_cmd_force_resync_ver2 = {
f38485358ffc04c3466b917770575e29deef24c3Timo Sirainen .usage = DOVEADM_CMD_MAIL_USAGE_PREFIX "<mailbox mask>",
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo SirainenDOVEADM_CMD_PARAM('\0', "mailbox-mask", CMD_PARAM_STR, CMD_PARAM_FLAG_POSITIONAL)
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainenstatic struct doveadm_cmd_ver2 doveadm_cmd_purge_ver2 = {
3b22894b8805b186c73d8b754001e8d7e944be85Timo Sirainenstatic struct doveadm_mail_cmd *mail_commands[] = {
62fc2fe221eccc834ac6b11b94b55335d5027cd1Timo Sirainenstatic struct doveadm_cmd_ver2 *mail_commands_ver2[] = {
3b22894b8805b186c73d8b754001e8d7e944be85Timo Sirainen unsigned int i;
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen for (i = 0; i < N_ELEMENTS(mail_commands); i++)
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen for (i = 0; i < N_ELEMENTS(mail_commands_ver2); i++)
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen doveadm_cmd_register_ver2(mail_commands_ver2[i]);
c99fe55d4535d839a6ad0735c4719e076a1adb2cTimo Sirainen /* load all configured mail plugins */
97180ea9c26c4de0807daaad21e03c80643b09fdTimo Sirainen module_dir_load_missing(mail_storage_service_modules,
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainendoveadm_cmd_ver2_to_mail_cmd_wrapper(struct doveadm_cmd_context *cctx)
88b315f36ba082708ab6f53ea1924c54d9be0aefTimo Sirainen cctx->cmd->mail_cmd, cctx->cmd->name, cctx->cmd->usage
c99fe55d4535d839a6ad0735c4719e076a1adb2cTimo Sirainen mctx = doveadm_mail_cmd_init(&mail_cmd, doveadm_settings);
c99fe55d4535d839a6ad0735c4719e076a1adb2cTimo Sirainen /* doveadm-server always does userdb lookups */
97180ea9c26c4de0807daaad21e03c80643b09fdTimo Sirainen mctx->service_flags |= MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
fa2433aebcf3fccfa30ca9eed9b1a9166cf92ee2Timo Sirainen const struct doveadm_cmd_param *arg = &cctx->argv[i];
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen } else if (strcmp(arg->name, "socket-path") == 0) {
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen doveadm_settings->doveadm_socket_path = arg->value.v_string;
c99fe55d4535d839a6ad0735c4719e076a1adb2cTimo Sirainen if (doveadm_settings->doveadm_worker_count == 0)
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen mctx->service_flags |= MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen array_append(&full_args, &arg->value.v_string, 1);
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen if (strchr(mctx->cur_username, '*') != NULL ||
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen } else if (strcmp(arg->name, "user-file") == 0) {
47e9fdee55c2074425cf0316f4f64fbbb790301cTimo Sirainen mctx->service_flags |= MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
47e9fdee55c2074425cf0316f4f64fbbb790301cTimo Sirainen mctx->users_list_input = arg->value.v_istream;
7e95ba7f38b9b421287d36c6152f8a9e6b9f225bTimo Sirainen fieldstr = ""; /* value doesn't really matter */
608bdb7f008cd5cd332d727018a9e8173abec998Timo Sirainen /* mailbox status, fetch, flags: convert an array into a
608bdb7f008cd5cd332d727018a9e8173abec998Timo Sirainen single space-separated parameter (alternative to
608bdb7f008cd5cd332d727018a9e8173abec998Timo Sirainen fieldstr = p_array_const_string_join(mctx->pool,
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen /* input for doveadm_mail_get_input(),
2eb0402a28bd0422e0170160808c67d6c7274689Timo Sirainen used by e.g. save */
2eb0402a28bd0422e0170160808c67d6c7274689Timo Sirainen i_error("Only one file input allowed: %s", arg->name);