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/300-quota_notify.inc.php | 339 ++++++++++++++++++++++++++++++++------------------------ 1 files changed, 194 insertions(+), 145 deletions(-) diff --git a/server/lib/classes/cron.d/300-quota_notify.inc.php b/server/lib/classes/cron.d/300-quota_notify.inc.php index 1d24e7c..d250fe7 100644 --- a/server/lib/classes/cron.d/300-quota_notify.inc.php +++ b/server/lib/classes/cron.d/300-quota_notify.inc.php @@ -49,64 +49,11 @@ public function onRunJob() { global $app, $conf; - - //######## - // function for sending notification emails - //######## - function send_notification_email($template, $placeholders, $recipients) { - global $conf; - - if(!is_array($recipients) || count($recipients) < 1) return false; - if(!is_array($placeholders)) $placeholders = array(); - - if(file_exists($conf['rootpath'].'/conf-custom/mail/' . $template . '_'.$conf['language'].'.txt')) { - $lines = file($conf['rootpath'].'/conf-custom/mail/' . $template . '_'.$conf['language'].'.txt'); - } elseif(file_exists($conf['rootpath'].'/conf-custom/mail/' . $template . '_en.txt')) { - $lines = file($conf['rootpath'].'/conf-custom/mail/' . $template . '_en.txt'); - } elseif(file_exists($conf['rootpath'].'/conf/mail/' . $template . '_'.$conf['language'].'.txt')) { - $lines = file($conf['rootpath'].'/conf/mail/' . $template . '_'.$conf['language'].'.txt'); - } else { - $lines = file($conf['rootpath'].'/conf/mail/' . $template . '_en.txt'); - } - - //* get mail headers, subject and body - $mailHeaders = ''; - $mailBody = ''; - $mailSubject = ''; - $inHeader = true; - for($l = 0; $l < count($lines); $l++) { - if($lines[$l] == '') { - $inHeader = false; - continue; - } - if($inHeader == true) { - $parts = explode(':', $lines[$l], 2); - if(strtolower($parts[0]) == 'subject') $mailSubject = trim($parts[1]); - unset($parts); - $mailHeaders .= trim($lines[$l]) . "\n"; - } else { - $mailBody .= trim($lines[$l]) . "\n"; - } - } - $mailBody = trim($mailBody); - - //* Replace placeholders - $mailHeaders = strtr($mailHeaders, $placeholders); - $mailSubject = strtr($mailSubject, $placeholders); - $mailBody = strtr($mailBody, $placeholders); - - for($r = 0; $r < count($recipients); $r++) { - mail($recipients[$r], $mailSubject, $mailBody, $mailHeaders); - } - - unset($mailSubject); - unset($mailHeaders); - unset($mailBody); - unset($lines); - - return true; - } - + + /* used for all monitor cronjobs */ + $app->load('monitor_tools'); + $this->_tools = new monitor_tools(); + /* end global section for monitor cronjobs */ //###################################################################################################### // enforce traffic quota (run only on the "master-server") @@ -127,26 +74,12 @@ $web_traffic_quota = $rec['traffic_quota']; $domain = $rec['domain']; - // get the client - /* - $client_group_id = $rec["sys_groupid"]; - $client = $app->db->queryOneRecord("SELECT limit_traffic_quota,parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); - $reseller = $app->db->queryOneRecord("SELECT limit_traffic_quota FROM client WHERE client_id = ".intval($client['parent_client_id'])); - - $client_traffic_quota = intval($client['limit_traffic_quota']); - $reseller_traffic_quota = intval($reseller['limit_traffic_quota']); - */ - //* get the traffic $tmp = $app->db->queryOneRecord("SELECT SUM(traffic_bytes) As total_traffic_bytes FROM web_traffic WHERE traffic_date like '$current_month%' AND hostname = '$domain'"); $web_traffic = round($tmp['total_traffic_bytes']/1024/1024); - //* Website is over quota, we will disable it - /*if( ($web_traffic_quota > 0 && $web_traffic > $web_traffic_quota) || - ($client_traffic_quota > 0 && $web_traffic > $client_traffic_quota) || - ($reseller_traffic_quota > 0 && $web_traffic > $reseller_traffic_quota)) {*/ if($web_traffic_quota > 0 && $web_traffic > $web_traffic_quota) { - $app->dbmaster->datalogUpdate('web_domain', "traffic_quota_lock = 'y',active = 'n'", 'domain_id', $rec['domain_id']); + $app->dbmaster->datalogUpdate('web_domain', array("traffic_quota_lock" => 'y', "active" => 'n'), 'domain_id', $rec['domain_id']); $app->log('Traffic quota for '.$rec['domain'].' exceeded. Disabling website.', LOGLEVEL_DEBUG); //* Send traffic notifications @@ -164,19 +97,19 @@ //* Send email to client if($web_config['overtraffic_notify_client'] == 'y') { $client_group_id = $rec["sys_groupid"]; - $client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + $client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); if($client['email'] != '') { $recipients[] = $client['email']; } } - send_notification_email('web_traffic_notification', $placeholders, $recipients); + $this->_tools->send_notification_email('web_traffic_notification', $placeholders, $recipients); } } else { //* unlock the website, if traffic is lower then quota if($rec['traffic_quota_lock'] == 'y') { - $app->dbmaster->datalogUpdate('web_domain', "traffic_quota_lock = 'n',active = 'y'", 'domain_id', $rec['domain_id']); + $app->dbmaster->datalogUpdate('web_domain', array("traffic_quota_lock" => 'n', "active" => 'y'), 'domain_id', $rec['domain_id']); $app->log('Traffic quota for '.$rec['domain'].' ok again. Re-enabling website.', LOGLEVEL_DEBUG); } } @@ -214,10 +147,10 @@ $domain = $rec['domain']; $username = $rec['system_user']; - $rec['used'] = $monitor_data['user'][$username]['used']; - $rec['soft'] = $monitor_data['user'][$username]['soft']; - $rec['hard'] = $monitor_data['user'][$username]['hard']; - $rec['files'] = $monitor_data['user'][$username]['files']; + $rec['used'] = @$monitor_data['user'][$username]['used']; + $rec['soft'] = @$monitor_data['user'][$username]['soft']; + $rec['hard'] = @$monitor_data['user'][$username]['hard']; + $rec['files'] = @$monitor_data['user'][$username]['files']; if (!is_numeric($rec['used'])){ if ($rec['used'][0] > $rec['used'][1]){ @@ -264,7 +197,7 @@ // send notifications only if 90% or more of the quota are used if($used_ratio < 0.9) { // reset notification date - if($rec['last_quota_notification']) $app->dbmaster->datalogUpdate('web_domain', "last_quota_notification = NULL", 'domain_id', $rec['domain_id']); + if($rec['last_quota_notification']) $app->dbmaster->datalogUpdate('web_domain', array("last_quota_notification" => null), 'domain_id', $rec['domain_id']); // send notification - everything ok again if($rec['last_quota_notification'] && $web_config['overquota_notify_onok'] == 'y' && ($web_config['overquota_notify_admin'] == 'y' || $web_config['overquota_notify_client'] == 'y')) { @@ -285,49 +218,48 @@ //* Send email to client if($web_config['overquota_notify_client'] == 'y') { $client_group_id = $rec["sys_groupid"]; - $client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + $client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); if($client['email'] != '') { $recipients[] = $client['email']; } } - send_notification_email('web_quota_ok_notification', $placeholders, $recipients); + $this->_tools->send_notification_email('web_quota_ok_notification', $placeholders, $recipients); } + } else { - continue; - } + // could a notification be sent? + $send_notification = false; + if(!$rec['last_quota_notification']) $send_notification = true; // not yet notified + elseif($web_config['overquota_notify_freq'] > 0 && $rec['notified_before'] >= $web_config['overquota_notify_freq']) $send_notification = true; - // could a notification be sent? - $send_notification = false; - if(!$rec['last_quota_notification']) $send_notification = true; // not yet notified - elseif($web_config['overquota_notify_freq'] > 0 && $rec['notified_before'] >= $web_config['overquota_notify_freq']) $send_notification = true; + //* Send quota notifications + if(($web_config['overquota_notify_admin'] == 'y' || $web_config['overquota_notify_client'] == 'y') && $send_notification == true) { + $app->dbmaster->datalogUpdate('web_domain', array("last_quota_notification" => array("SQL" => "CURDATE()")), 'domain_id', $rec['domain_id']); - //* Send quota notifications - if(($web_config['overquota_notify_admin'] == 'y' || $web_config['overquota_notify_client'] == 'y') && $send_notification == true) { - $app->dbmaster->datalogUpdate('web_domain', "last_quota_notification = CURDATE()", 'domain_id', $rec['domain_id']); + $placeholders = array('{domain}' => $rec['domain'], + '{admin_mail}' => ($global_config['admin_mail'] != ''? $global_config['admin_mail'] : 'root'), + '{used}' => $rec['used'], + '{soft}' => $rec['soft'], + '{hard}' => $rec['hard'], + '{ratio}' => $rec['ratio']); - $placeholders = array('{domain}' => $rec['domain'], - '{admin_mail}' => ($global_config['admin_mail'] != ''? $global_config['admin_mail'] : 'root'), - '{used}' => $rec['used'], - '{soft}' => $rec['soft'], - '{hard}' => $rec['hard'], - '{ratio}' => $rec['ratio']); + $recipients = array(); - $recipients = array(); - - //* send email to admin - if($global_config['admin_mail'] != '' && $web_config['overquota_notify_admin'] == 'y') { - $recipients[] = $global_config['admin_mail']; - } - - //* Send email to client - if($web_config['overquota_notify_client'] == 'y') { - $client_group_id = $rec["sys_groupid"]; - $client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); - if($client['email'] != '') { - $recipients[] = $client['email']; + //* send email to admin + if($global_config['admin_mail'] != '' && $web_config['overquota_notify_admin'] == 'y') { + $recipients[] = $global_config['admin_mail']; } + + //* Send email to client + if($web_config['overquota_notify_client'] == 'y') { + $client_group_id = $rec["sys_groupid"]; + $client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); + if($client['email'] != '') { + $recipients[] = $client['email']; + } + } + $this->_tools->send_notification_email('web_quota_notification', $placeholders, $recipients); } - send_notification_email('web_quota_notification', $placeholders, $recipients); } } } @@ -394,7 +326,7 @@ // send notifications only if 90% or more of the quota are used if($used_ratio < 0.9) { // reset notification date - if($rec['last_quota_notification']) $app->dbmaster->datalogUpdate('mail_user', "last_quota_notification = NULL", 'mailuser_id', $rec['mailuser_id']); + if($rec['last_quota_notification']) $app->dbmaster->datalogUpdate('mail_user', array("last_quota_notification" => null), 'mailuser_id', $rec['mailuser_id']); // send notification - everything ok again if($rec['last_quota_notification'] && $mail_config['overquota_notify_onok'] == 'y' && ($mail_config['overquota_notify_admin'] == 'y' || $mail_config['overquota_notify_client'] == 'y')) { @@ -414,56 +346,173 @@ //* Send email to client if($mail_config['overquota_notify_client'] == 'y') { $client_group_id = $rec["sys_groupid"]; - $client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); + $client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); if($client['email'] != '') { $recipients[] = $client['email']; } } - send_notification_email('mail_quota_ok_notification', $placeholders, $recipients); + $this->_tools->send_notification_email('mail_quota_ok_notification', $placeholders, $recipients); } + } else { - continue; - } + //* Send quota notifications + // could a notification be sent? + $send_notification = false; + if(!$rec['last_quota_notification']) $send_notification = true; // not yet notified + elseif($mail_config['overquota_notify_freq'] > 0 && $rec['notified_before'] >= $mail_config['overquota_notify_freq']) $send_notification = true; - //* Send quota notifications - // could a notification be sent? - $send_notification = false; - if(!$rec['last_quota_notification']) $send_notification = true; // not yet notified - elseif($mail_config['overquota_notify_freq'] > 0 && $rec['notified_before'] >= $mail_config['overquota_notify_freq']) $send_notification = true; + if(($mail_config['overquota_notify_admin'] == 'y' || $mail_config['overquota_notify_client'] == 'y') && $send_notification == true) { + $app->dbmaster->datalogUpdate('mail_user', array("last_quota_notification" => array("SQL" => "CURDATE()")), 'mailuser_id', $rec['mailuser_id']); - if(($mail_config['overquota_notify_admin'] == 'y' || $mail_config['overquota_notify_client'] == 'y') && $send_notification == true) { - $app->dbmaster->datalogUpdate('mail_user', "last_quota_notification = CURDATE()", 'mailuser_id', $rec['mailuser_id']); + $placeholders = array('{email}' => $rec['email'], + '{admin_mail}' => ($global_config['admin_mail'] != ''? $global_config['admin_mail'] : 'root'), + '{used}' => $rec['used'], + '{name}' => $rec['name'], + '{quota}' => $rec['quota'], + '{ratio}' => $rec['ratio']); - $placeholders = array('{email}' => $rec['email'], - '{admin_mail}' => ($global_config['admin_mail'] != ''? $global_config['admin_mail'] : 'root'), - '{used}' => $rec['used'], - '{name}' => $rec['name'], - '{quota}' => $rec['quota'], - '{ratio}' => $rec['ratio']); - - $recipients = array(); - //* send email to admin - if($global_config['admin_mail'] != '' && $mail_config['overquota_notify_admin'] == 'y') { - $recipients[] = $global_config['admin_mail']; - } - - //* Send email to client - if($mail_config['overquota_notify_client'] == 'y') { - $client_group_id = $rec["sys_groupid"]; - $client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id"); - if($client['email'] != '') { - $recipients[] = $client['email']; + $recipients = array(); + //* send email to admin + if($global_config['admin_mail'] != '' && $mail_config['overquota_notify_admin'] == 'y') { + $recipients[] = $global_config['admin_mail']; } - } - send_notification_email('mail_quota_notification', $placeholders, $recipients); + //* Send email to client + if($mail_config['overquota_notify_client'] == 'y') { + $client_group_id = $rec["sys_groupid"]; + $client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); + if($client['email'] != '') { + $recipients[] = $client['email']; + } + } + + $this->_tools->send_notification_email('mail_quota_notification', $placeholders, $recipients); + } } } } } + //###################################################################################################### + // send database quota warnings by email + //###################################################################################################### + if ($app->dbmaster == $app->db) { + + $global_config = $app->getconf->get_global_config('mail'); + + //* get monitor-data + $tmp_rec = $app->db->queryAllRecords("SELECT data from monitor_data WHERE type = 'database_size' ORDER BY created DESC"); + if(is_array($tmp_rec)) { + $monitor_data = array(); + foreach ($tmp_rec as $tmp_mon) { + $tmp_array = unserialize($app->db->unquote($tmp_mon['data'])); + if(is_array($tmp_array)) + foreach($tmp_array as $sys_groupid => $data) + $monitor_data[$data['sys_groupid']][] = $data; + } + //* remove duplicates from monitor-data + foreach($monitor_data as $_monitor_data) + $monitor_data[$_monitor_data[0]['sys_groupid']]=array_map("unserialize", array_unique(array_map("serialize", $_monitor_data))); + } + + //* get databases + $database_records = $app->db->queryAllRecords("SELECT database_id,sys_groupid,database_name,database_quota,last_quota_notification,DATEDIFF(CURDATE(), last_quota_notification) as `notified_before` FROM web_database"); + + if(is_array($database_records) && !empty($database_records) && is_array($monitor_data) && !empty($monitor_data)) { + //* check database-quota + foreach($database_records as $rec) { + $database = $rec['database_name']; + $quota = $rec['database_quota'] * 1024 * 1024; + if (!is_numeric($quota)) break; + + foreach ($monitor_data as $cid) { + + foreach($cid_data as $monitor) { + + if ($monitor['database_name'] == $database) { + //* get the client + $client = $app->db->queryOneRecord("SELECT client.username, client.email FROM web_database, sys_group, client WHERE web_database.sys_groupid = sys_group.groupid AND sys_group.client_id = client.client_id AND web_database.database_name=?", $database); + + //* check quota + if ($quota > 0) $used_ratio = $monitor['size'] / $quota; + else $used_ratio = 0; + + //* send notifications only if 90% or more of the quota are used + if($used_ratio > 0.9) { + + //* reset notification date + if($rec['last_quota_notification']) $app->dbmaster->datalogUpdate('web_database', array("last_quota_notification" => null), 'database_id', $rec['database_id']); + + $app->dbmaster->datalogUpdate('web_database', array("last_quota_notification" => array("SQL" => "CURDATE()")), 'database_id', $rec['database_id']); + + // send notification - everything ok again + if($rec['last_quota_notification'] && $web_config['overquota_notify_onok'] == 'y' && ($web_config['overquota_db_notify_admin'] == 'y' || $web_config['overquota_db_notify_client'] == 'y')) { + $placeholders = array( + '{database_name}' => $rec['database_name'], + '{admin_mail}' => ($global_config['admin_mail'] != ''? $global_config['admin_mail'] : 'root'), + '{used}' => $app->functions->formatBytes($monitor['size']), + '{quota}' => $quota.' MB', + '{ratio}' => number_format($used_ratio * 100, 2, '.', '').'%' + ); + + $recipients = array(); + + //* send email to admin + if($global_config['admin_mail'] != '' && $web_config['overquota_db_notify_admin'] == 'y') + $recipients[] = $global_config['admin_mail']; + + //* Send email to client + if($web_config['overquota_db_notify_client'] == 'y' && $client['email'] != '') + $recipients[] = $client['email']; + + $this->_tools->send_notification_email('db_quota_ok_notification', $placeholders, $recipients); + + } + + } + + //* could a notification be sent? + $send_notification = false; + if(!$rec['last_quota_notification']) $send_notification = true; //* not yet notified + elseif($web_config['overquota_notify_freq'] > 0 && $rec['notified_before'] >= $web_config['overquota_notify_freq']) $send_notification = true; + + //* Send quota notifications + if(($web_config['overquota_db_notify_admin'] == 'y' || $web_config['overquota_db_notify_client'] == 'y') && $send_notification == true) { + $app->dbmaster->datalogUpdate('web_database', array("last_quota_notification" => array("SQL" => "CURDATE()")), 'database_id', $rec['database_id']); + $placeholders = array( + '{database_name}' => $rec['database_name'], + '{admin_mail}' => ($global_config['admin_mail'] != ''? $global_config['admin_mail'] : 'root'), + '{used}' => $app->functions->formatBytes($monitor['size']), + '{quota}' => $quota.' MB', + '{ratio}' => number_format($used_ratio * 100, 2, '.', '').'%' + ); + + $recipients = array(); + + //* send email to admin + if($global_config['admin_mail'] != '' && $web_config['overquota_db_notify_admin'] == 'y') + $recipients[] = $global_config['admin_mail']; + + //* Send email to client + if($web_config['overquota_db_notify_client'] == 'y' && $client['email'] != '') + $recipients[] = $client['email']; + + $this->_tools->send_notification_email('db_quota_notification', $placeholders, $recipients); + + } + + } + + } + + } + + } + + } + } parent::onRunJob(); } -- Gitblit v1.9.1