From b9a3ef486ebcde18a5ade37865ff8f397185d24f Mon Sep 17 00:00:00 2001 From: Till Brehm <tbrehm@ispconfig.org> Date: Sun, 24 Jul 2016 05:30:59 -0400 Subject: [PATCH] Fixed #3979 Mailbox users unable to save autoresponders --- server/lib/classes/cron.d/100-monitor_email_quota.inc.php | 125 ++++++++++++++++++++++------------------- 1 files changed, 66 insertions(+), 59 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 12bd3fe..75014c3 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 @@ -29,40 +29,40 @@ */ class cronjob_monitor_email_quota extends cronjob { - - // job schedule - protected $_schedule = '*/15 * * * *'; - protected $_run_at_new = true; - - private $_tools = null; - - /* this function is optional if it contains no custom code */ - public function onPrepare() { - global $app; - - parent::onPrepare(); - } - - /* this function is optional if it contains no custom code */ - public function onBeforeRun() { - global $app; - - return parent::onBeforeRun(); - } - - public function onRunJob() { - global $app, $conf; - + + // job schedule + protected $_schedule = '*/15 * * * *'; + protected $_run_at_new = true; + + private $_tools = null; + + /* this function is optional if it contains no custom code */ + public function onPrepare() { + global $app; + + parent::onPrepare(); + } + + /* this function is optional if it contains no custom code */ + public function onBeforeRun() { + global $app; + + return parent::onBeforeRun(); + } + + public function onRunJob() { + global $app, $conf; + $app->uses('getconf'); $mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail'); if($mail_config['mailbox_quota_stats'] == 'n') return; - /* used for all monitor cronjobs */ - $app->load('monitor_tools'); - $this->_tools = new monitor_tools(); - /* end global section for monitor cronjobs */ - - + /* used for all monitor cronjobs */ + $app->load('monitor_tools'); + $this->_tools = new monitor_tools(); + /* end global section for monitor cronjobs */ + + //* Initialize data array $data = array(); @@ -75,19 +75,32 @@ //* The state of the email_quota. $state = 'ok'; - $mailboxes = $app->db->queryAllRecords("SELECT email,maildir FROM mail_user WHERE server_id = $server_id"); + $mailboxes = $app->db->queryAllRecords("SELECT email,maildir FROM mail_user WHERE server_id = ?", $server_id); 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; + } + foreach($mailboxes as $mb) { $email = $mb['email']; - $email_parts = explode('@',$mb['email']); + $email_parts = explode('@', $mb['email']); $filename = $mb['maildir'].'/.quotausage'; + if(!file_exists($filename) && $dovecot) { + exec('doveadm quota recalc -u '.$email); + } if(file_exists($filename) && !is_link($filename)) { $quotafile = file($filename); - $data[$email]['used'] = trim($quotafile['1']); + 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); unset($quotafile); } else { - exec('du -s '.escapeshellcmd($mb['maildir']),$out); - $parts = explode(' ',$out[0]); + exec('du -s '.escapeshellcmd($mb['maildir']), $out); + $parts = explode(' ', $out[0]); $data[$email]['used'] = intval($parts[0])*1024; unset($out); unset($parts); @@ -97,7 +110,7 @@ unset($mailboxes); - //* Dovecot quota check Courier in progress lathama@gmail.com + //* Dovecot quota check Courier in progress lathama@gmail.com /* if($dir = opendir("/var/vmail")){ while (($quotafiles = readdir($dir)) !== false){ @@ -111,38 +124,32 @@ closedir($dir); } */ - $res = array(); + $res = array(); $res['server_id'] = $server_id; $res['type'] = $type; $res['data'] = $data; $res['state'] = $state; - /* + /* * Insert the data into the database */ - $sql = 'REPLACE INTO monitor_data (server_id, type, created, data, state) ' . - 'VALUES (' . - $res['server_id'] . ', ' . - "'" . $app->dbmaster->quote($res['type']) . "', " . - 'UNIX_TIMESTAMP(), ' . - "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " . - "'" . $res['state'] . "'" . - ')'; - $app->dbmaster->query($sql); + $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']); - /* The new data is written, now we can delete the old one */ - $this->_tools->delOldRecords($res['type'], $res['server_id']); + /* The new data is written, now we can delete the old one */ + $this->_tools->delOldRecords($res['type'], $res['server_id']); - - parent::onRunJob(); - } - - /* this function is optional if it contains no custom code */ - public function onAfterRun() { - global $app; - - parent::onAfterRun(); - } + + parent::onRunJob(); + } + + /* this function is optional if it contains no custom code */ + public function onAfterRun() { + global $app; + + parent::onAfterRun(); + } } -- Gitblit v1.9.1