doveadm-fts.c revision 5fbccc935e3f7b916aa7c6e302a212821072e83a
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/* Copyright (c) 2011-2012 Dovecot authors, see the included COPYING file */
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen#include "lib.h"
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen#include "mail-namespace.h"
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen#include "fts-storage.h"
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen#include "doveadm-mail.h"
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen#include "doveadm-fts.h"
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainenconst char *doveadm_fts_plugin_version = DOVECOT_VERSION;
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainenstatic int
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainenfts_namespace_find(struct mail_user *user, const char *ns_prefix,
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen struct mail_namespace **ns_r)
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen{
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen struct mail_namespace *ns;
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen if (ns_prefix == NULL)
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen ns = mail_namespace_find_inbox(user->namespaces);
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen else {
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen ns = mail_namespace_find_prefix(user->namespaces, ns_prefix);
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen if (ns == NULL) {
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen i_error("Namespace prefix not found: %s", ns_prefix);
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen return -1;
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen }
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen }
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen if (fts_list_backend(ns->list) == NULL) {
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen i_error("fts not enabled for user's namespace %s", ns_prefix);
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen return -1;
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen }
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen *ns_r = ns;
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen return 0;
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen}
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainenstatic int
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainencmd_fts_optimize_run(struct doveadm_mail_cmd_context *ctx,
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen struct mail_user *user)
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen{
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen const char *ns_prefix = ctx->args[0];
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen struct mail_namespace *ns;
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen struct fts_backend *backend;
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen if (fts_namespace_find(user, ns_prefix, &ns) < 0) {
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen doveadm_mail_failed_error(ctx, MAIL_ERROR_NOTFOUND);
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen return -1;
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen }
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen backend = fts_list_backend(ns->list);
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen if (fts_backend_optimize(backend) < 0) {
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen i_error("fts optimize failed");
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen doveadm_mail_failed_error(ctx, MAIL_ERROR_TEMP);
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen return -1;
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen }
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen return 0;
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen}
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainenstatic void
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainencmd_fts_optimize_init(struct doveadm_mail_cmd_context *ctx ATTR_UNUSED,
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen const char *const args[])
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen{
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen if (str_array_length(args) > 1)
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen doveadm_mail_help_name("fts optimize");
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen}
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainenstatic struct doveadm_mail_cmd_context *
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainencmd_fts_optimize_alloc(void)
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen{
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen struct doveadm_mail_cmd_context *ctx;
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen ctx = doveadm_mail_cmd_alloc(struct doveadm_mail_cmd_context);
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen ctx->v.run = cmd_fts_optimize_run;
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen ctx->v.init = cmd_fts_optimize_init;
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen return ctx;
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen}
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainenstatic int
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainencmd_fts_rescan_run(struct doveadm_mail_cmd_context *ctx, struct mail_user *user)
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen{
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen const char *ns_prefix = ctx->args[0];
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen struct mail_namespace *ns;
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen struct fts_backend *backend;
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen if (fts_namespace_find(user, ns_prefix, &ns) < 0) {
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen doveadm_mail_failed_error(ctx, MAIL_ERROR_NOTFOUND);
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen return -1;
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen }
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen backend = fts_list_backend(ns->list);
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen if (fts_backend_rescan(backend) < 0) {
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen i_error("fts rescan failed");
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen doveadm_mail_failed_error(ctx, MAIL_ERROR_TEMP);
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen return -1;
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen }
5fbccc935e3f7b916aa7c6e302a212821072e83aTimo Sirainen return 0;
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen}
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainenstatic void
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainencmd_fts_rescan_init(struct doveadm_mail_cmd_context *ctx ATTR_UNUSED,
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen const char *const args[])
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen{
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen if (str_array_length(args) > 1)
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen doveadm_mail_help_name("fts rescan");
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen}
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainenstatic struct doveadm_mail_cmd_context *
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainencmd_fts_rescan_alloc(void)
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen{
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen struct doveadm_mail_cmd_context *ctx;
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen ctx = doveadm_mail_cmd_alloc(struct doveadm_mail_cmd_context);
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen ctx->v.run = cmd_fts_rescan_run;
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen ctx->v.init = cmd_fts_rescan_init;
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen return ctx;
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen}
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainenstatic struct doveadm_mail_cmd fts_commands[] = {
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen { cmd_fts_optimize_alloc, "fts optimize", "[<namespace>]" },
3dfa8c707590b8a37a99095dc617d0b4eac3cf87Timo Sirainen { cmd_fts_rescan_alloc, "fts rescan", "[<namespace>]" }
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen};
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainenvoid doveadm_fts_plugin_init(struct module *module ATTR_UNUSED)
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen{
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen unsigned int i;
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen for (i = 0; i < N_ELEMENTS(fts_commands); i++)
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen doveadm_mail_register_cmd(&fts_commands[i]);
cc2954ad6d8ba0509b870d773ba4b6b16353763cTimo Sirainen doveadm_dump_fts_expunge_log_init();
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen}
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainenvoid doveadm_fts_plugin_deinit(void)
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen{
d3380f13cb3e398bb5e7acbd4d04582397f62ec2Timo Sirainen}