From 3015ec283d80e01158cd90b7ea02e24d080a06a7 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 2 Jul 2020 13:37:27 -0600 Subject: [PATCH 1/3] add quota recalc to mailbox cleanup --- server/lib/classes/cron.d/500-clean_mailboxes.inc.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/lib/classes/cron.d/500-clean_mailboxes.inc.php b/server/lib/classes/cron.d/500-clean_mailboxes.inc.php index 8617d0d76d..7e8c82da64 100755 --- a/server/lib/classes/cron.d/500-clean_mailboxes.inc.php +++ b/server/lib/classes/cron.d/500-clean_mailboxes.inc.php @@ -57,6 +57,7 @@ class cronjob_clean_mailboxes extends cronjob { $junk_names=array('Junk', 'Junk Email', 'SPAM', 'INBOX.SPAM'); $purge_cmd = 'doveadm expunge -u ? mailbox ? sentbefore '; + $recalc_cmd = 'doveadm quota recalc -u ?'; $server_id = intval($conf['server_id']); $records = $app->db->queryAllRecords("SELECT email, maildir, purge_trash_days, purge_junk_days FROM mail_user WHERE maildir_format = 'maildir' AND disableimap = 'n' AND server_id = ? AND (purge_trash_days > 0 OR purge_junk_days > 0)", $server_id); @@ -77,6 +78,7 @@ class cronjob_clean_mailboxes extends cronjob { } } } + $app->system->exec_safe($recalc_cmd, $email['email']); } } -- GitLab From 0f80900879f9f6d5e277e84cfc6c0284141290e3 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 2 Jul 2020 13:50:05 -0600 Subject: [PATCH 2/3] prefer 'doveadm quota' for quota calculation if supported --- .../cron.d/100-monitor_email_quota.inc.php | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/server/lib/classes/cron.d/100-monitor_email_quota.inc.php b/server/lib/classes/cron.d/100-monitor_email_quota.inc.php index 8adf7c7253..01bc0ee78e 100644 --- a/server/lib/classes/cron.d/100-monitor_email_quota.inc.php +++ b/server/lib/classes/cron.d/100-monitor_email_quota.inc.php @@ -79,30 +79,36 @@ class cronjob_monitor_email_quota extends cronjob { if(is_array($mailboxes)) { //* with dovecot we can use doveadm instead of 'du -s' - $dovecot = false; - if (isset($mail_config['pop3_imap_daemon']) && $mail_config ['pop3_imap_daemon'] = 'dovecot' && is_executable('doveadm')) { - exec('doveadm quota 2>&1', $tmp_output, $tmp_retval); // with dovecot 2.2.x 'doveadm quota' is unuseable - if ($retval = 64) $dovecot = true; + $dovecotQuotaUsage = array(); + if (isset($mail_config['pop3_imap_daemon']) && $mail_config ['pop3_imap_daemon'] = 'dovecot') { + exec("doveadm quota get -A 2>&1", $res, $retval); + if ($retval = 64) { + foreach ($res as $v) { + $s = preg_split('/\s+/', $v); + if ($s[2] == 'STORAGE') $dovecotQuotaUsage[$s[0]] = $s[3] * 1024; // doveadm output is in kB + } + } } foreach($mailboxes as $mb) { $email = $mb['email']; $email_parts = explode('@', $mb['email']); $filename = $mb['maildir'].'/.quotausage'; - if(!file_exists($filename) && $dovecot) { - $app->system->exec_safe('doveadm quota recalc -u ?', $email); - } - if(file_exists($filename) && !is_link($filename)) { + if(count($dovecotQuotaUsage) > 0 && isset($dovecotQuotaUsage[$email])) { + $data[$email]['used'] = $dovecotQuotaUsage[$email]; + $app->log("Mail storage $email: " . $data[$email]['used'], LOGLEVEL_DEBUG); + } elseif(file_exists($filename) && !is_link($filename)) { $quotafile = file($filename); preg_match('/storage.*?([0-9]+)/s', implode('',$quotafile), $storage_value); $data[$email]['used'] = $storage_value[1]; - $app->log("Mail storage $email: " . $storage_value[1], LOGLEVEL_DEBUG); + $app->log("Mail storage $email: " . $data[$email]['used'], LOGLEVEL_DEBUG); unset($quotafile); } else { $app->system->exec_safe('du -s ?', $mb['maildir']); $out = $app->system->last_exec_out(); $parts = explode(' ', $out[0]); $data[$email]['used'] = intval($parts[0])*1024; + $app->log("Mail storage $email: " . $data[$email]['used'], LOGLEVEL_DEBUG); unset($out); unset($parts); } @@ -110,6 +116,7 @@ class cronjob_monitor_email_quota extends cronjob { } unset($mailboxes); + unset($dovecotQuotaUsage); //* Dovecot quota check Courier in progress lathama@gmail.com /* @@ -132,8 +139,8 @@ class cronjob_monitor_email_quota extends cronjob { $res['state'] = $state; /* - * Insert the data into the database - */ + * Insert the data into the database + */ $sql = 'REPLACE INTO monitor_data (server_id, type, created, data, state) ' . 'VALUES (?, ?, UNIX_TIMESTAMP(), ?, ?)'; $app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']); -- GitLab From a4ae330f8720049534997a394846acd32f416743 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 2 Jul 2020 17:45:33 -0600 Subject: [PATCH 3/3] handle doveadm quota output from different versions --- server/lib/classes/cron.d/100-monitor_email_quota.inc.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/lib/classes/cron.d/100-monitor_email_quota.inc.php b/server/lib/classes/cron.d/100-monitor_email_quota.inc.php index 01bc0ee78e..40736a7bac 100644 --- a/server/lib/classes/cron.d/100-monitor_email_quota.inc.php +++ b/server/lib/classes/cron.d/100-monitor_email_quota.inc.php @@ -85,7 +85,11 @@ class cronjob_monitor_email_quota extends cronjob { if ($retval = 64) { foreach ($res as $v) { $s = preg_split('/\s+/', $v); - if ($s[2] == 'STORAGE') $dovecotQuotaUsage[$s[0]] = $s[3] * 1024; // doveadm output is in kB + if ($s[2] == 'STORAGE') { + $dovecotQuotaUsage[$s[0]] = $s[3] * 1024; // doveadm output is in kB + } elseif ($s[3] == 'STORAGE') { + $dovecotQuotaUsage[$s[0]] = $s[4] * 1024; // doveadm output is in kB + } } } } -- GitLab