doveadm-quota.c revision 18792f1110ecd1fca5306f3be96fcbe887f6dbcc
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen/* Copyright (c) 2005-2010 Dovecot authors, see the included COPYING file */
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen#include "lib.h"
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen#include "module-dir.h"
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen#include "quota-plugin.h"
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen#include "quota-private.h"
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen#include "doveadm-mail.h"
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen#include <stdio.h>
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainenconst char *doveadm_quota_plugin_version = DOVECOT_VERSION;
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainenvoid doveadm_quota_plugin_init(struct module *module);
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainenvoid doveadm_quota_plugin_deinit(void);
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainenstatic void cmd_quota_get_root(struct mail_user *user, struct quota_root *root)
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen{
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen const char *const *res;
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen uint64_t value, limit;
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen int ret;
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen printf("%s(%s): ", user->username, root->set->name);
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen res = quota_root_get_resources(root);
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen for (; *res != NULL; res++) {
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen ret = quota_get_resource(root, "", *res, &value, &limit);
18792f1110ecd1fca5306f3be96fcbe887f6dbccTimo Sirainen printf("%s ", *res);
18792f1110ecd1fca5306f3be96fcbe887f6dbccTimo Sirainen if (ret > 0) {
18792f1110ecd1fca5306f3be96fcbe887f6dbccTimo Sirainen printf("%llu/%llu",
18792f1110ecd1fca5306f3be96fcbe887f6dbccTimo Sirainen (unsigned long long)value,
18792f1110ecd1fca5306f3be96fcbe887f6dbccTimo Sirainen (unsigned long long)limit);
18792f1110ecd1fca5306f3be96fcbe887f6dbccTimo Sirainen } else if (ret == 0)
18792f1110ecd1fca5306f3be96fcbe887f6dbccTimo Sirainen printf("none");
18792f1110ecd1fca5306f3be96fcbe887f6dbccTimo Sirainen else
18792f1110ecd1fca5306f3be96fcbe887f6dbccTimo Sirainen printf("error");
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen if (res[1] != NULL)
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen printf(", ");
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen }
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen printf("\n");
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen}
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainenstatic void cmd_quota_get(struct mail_user *user, struct quota *quota)
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen{
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen struct quota_root *const *root;
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen array_foreach(&quota->roots, root)
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen cmd_quota_get_root(user, *root);
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen}
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainenstatic void cmd_quota_recalc(struct quota *quota)
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen{
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen struct quota_root *const *root;
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen struct quota_transaction_context trans;
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen memset(&trans, 0, sizeof(trans));
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen trans.quota = quota;
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen trans.recalculate = TRUE;
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen array_foreach(&quota->roots, root)
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen (void)(*root)->backend.v.update(*root, &trans);
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen}
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainenstatic void cmd_quota(struct mail_user *user, const char *args[])
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen{
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen struct quota_user *quser = QUOTA_USER_CONTEXT(user);
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen struct quota *quota;
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen const char *subcmd = args[0];
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen if (subcmd == NULL)
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen doveadm_mail_help_name("quota");
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen if (quser == NULL)
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen i_fatal("User has no quota");
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen quota = quser->quota;
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen if (strcmp(subcmd, "get") == 0)
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen cmd_quota_get(user, quota);
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen else if (strcmp(subcmd, "recalc") == 0)
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen cmd_quota_recalc(quota);
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen else
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen doveadm_mail_help_name("quota");
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen}
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainenstatic struct doveadm_mail_cmd quota_cmd = {
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen cmd_quota, "quota", "get|recalc"
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen};
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainenvoid doveadm_quota_plugin_init(struct module *module ATTR_UNUSED)
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen{
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen doveadm_mail_register_cmd(&quota_cmd);
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen}
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainenvoid doveadm_quota_plugin_deinit(void)
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen{
9563e6542b7a8a13b13a0ef62ec68b0383b99293Timo Sirainen}