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 |  783 +++++++++++++++++++++++++++++--------------------------
 1 files changed, 416 insertions(+), 367 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 c2ce895..d250fe7 100644
--- a/server/lib/classes/cron.d/300-quota_notify.inc.php
+++ b/server/lib/classes/cron.d/300-quota_notify.inc.php
@@ -29,450 +29,499 @@
 */
 
 class cronjob_quota_notify extends cronjob {
-    
-    // job schedule
-    protected $_schedule = '0 0 * * *';
-    
-    /* 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;
-        
-        #########
-        // 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();
+	// job schedule
+	protected $_schedule = '0 0 * * *';
 
-            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');
-            }
+	/* this function is optional if it contains no custom code */
+	public function onPrepare() {
+		global $app;
 
-            //* 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);
+		parent::onPrepare();
+	}
 
-            //* Replace placeholders
-            $mailHeaders = strtr($mailHeaders, $placeholders);
-            $mailSubject = strtr($mailSubject, $placeholders);
-            $mailBody = strtr($mailBody, $placeholders);
+	/* this function is optional if it contains no custom code */
+	public function onBeforeRun() {
+		global $app;
 
-            for($r = 0; $r < count($recipients); $r++) {
-                mail($recipients[$r], $mailSubject, $mailBody, $mailHeaders);
-            }
+		return parent::onBeforeRun();
+	}
 
-            unset($mailSubject);
-            unset($mailHeaders);
-            unset($mailBody);
-            unset($lines);
+	public function onRunJob() {
+		global $app, $conf;
+		
+		/* used for all monitor cronjobs */
+		$app->load('monitor_tools');
+		$this->_tools = new monitor_tools();
+		/* end global section for monitor cronjobs */
 
-            return true;
-        }
+		//######################################################################################################
+		// enforce traffic quota (run only on the "master-server")
+		//######################################################################################################
 
+		if ($app->dbmaster == $app->db) {
 
-        #######################################################################################################
-        // enforce traffic quota (run only on the "master-server")
-        #######################################################################################################
+			$global_config = $app->getconf->get_global_config('mail');
 
-        if ($app->dbmaster == $app->db) {
+			$current_month = date('Y-m');
 
-            $global_config = $app->getconf->get_global_config('mail');
+			//* Check website traffic quota
+			$sql = "SELECT sys_groupid,domain_id,domain,traffic_quota,traffic_quota_lock FROM web_domain WHERE (traffic_quota > 0 or traffic_quota_lock = 'y') and (type = 'vhost' OR type = 'vhostsubdomain' OR type = 'vhostalias')";
+			$records = $app->db->queryAllRecords($sql);
+			if(is_array($records)) {
+				foreach($records as $rec) {
 
-            $current_month = date('Y-m');
+					$web_traffic_quota = $rec['traffic_quota'];
+					$domain = $rec['domain'];
 
-            //* Check website traffic quota
-            $sql = "SELECT sys_groupid,domain_id,domain,traffic_quota,traffic_quota_lock FROM web_domain WHERE (traffic_quota > 0 or traffic_quota_lock = 'y') and (type = 'vhost' OR type = 'vhostsubdomain')";
-            $records = $app->db->queryAllRecords($sql);
-            if(is_array($records)) {
-                foreach($records as $rec) {
+					//* 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);
 
-                    $web_traffic_quota = $rec['traffic_quota'];
-                    $domain = $rec['domain'];
+					if($web_traffic_quota > 0 && $web_traffic > $web_traffic_quota) {
+						$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);
 
-                    // 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']));
+						//* Send traffic notifications
+						if($rec['traffic_quota_lock'] != 'y' && ($web_config['overtraffic_notify_admin'] == 'y' || $web_config['overtraffic_notify_client'] == 'y')) {
 
-                    $client_traffic_quota = intval($client['limit_traffic_quota']);
-                    $reseller_traffic_quota = intval($reseller['limit_traffic_quota']);
-                    */
+							$placeholders = array('{domain}' => $rec['domain'],
+								'{admin_mail}' => ($global_config['admin_mail'] != ''? $global_config['admin_mail'] : 'root'));
 
-                    //* 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);
+							$recipients = array();
+							//* send email to admin
+							if($global_config['admin_mail'] != '' && $web_config['overtraffic_notify_admin'] == 'y') {
+								$recipients[] = $global_config['admin_mail'];
+							}
 
-                    //* 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->log('Traffic quota for '.$rec['domain'].' exceeded. Disabling website.',LOGLEVEL_DEBUG);
+							//* 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);
+								if($client['email'] != '') {
+									$recipients[] = $client['email'];
+								}
+							}
 
-                        //* Send traffic notifications
-                        if($rec['traffic_quota_lock'] != 'y' && ($web_config['overtraffic_notify_admin'] == 'y' || $web_config['overtraffic_notify_client'] == 'y')) {
-                            
-                            $placeholders = array('{domain}' => $rec['domain'],
-                                                  '{admin_mail}' => ($global_config['admin_mail'] != ''? $global_config['admin_mail'] : 'root'));
-                            
-                            $recipients = array();
-                            //* send email to admin
-                            if($global_config['admin_mail'] != '' && $web_config['overtraffic_notify_admin'] == 'y') {
-                                $recipients[] = $global_config['admin_mail'];
-                            }
+							$this->_tools->send_notification_email('web_traffic_notification', $placeholders, $recipients);
+						}
 
-                            //* 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");
-                                if($client['email'] != '') {
-                                    $recipients[] = $client['email'];
-                                }
-                            }
+					} else {
+						//* unlock the website, if traffic is lower then quota
+						if($rec['traffic_quota_lock'] == 'y') {
+							$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);
+						}
+					}
+				}
+			}
 
-                            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->log('Traffic quota for '.$rec['domain'].' ok again. Re-enabling website.',LOGLEVEL_DEBUG);
-                        }
-                    }
-                }
-            }
+		}
 
 
-        }
+		//######################################################################################################
+		// send website quota warnings by email
+		//######################################################################################################
 
+		if ($app->dbmaster == $app->db) {
 
-        #######################################################################################################
-        // send website quota warnings by email
-        #######################################################################################################
+			$global_config = $app->getconf->get_global_config('mail');
 
-        if ($app->dbmaster == $app->db) {
+			//* Check website disk quota
+			$sql = "SELECT domain_id,sys_groupid,domain,system_user,last_quota_notification,DATEDIFF(CURDATE(), last_quota_notification) as `notified_before` FROM web_domain WHERE (type = 'vhost' OR type = 'vhostsubdomain' OR type = 'vhostalias')";
+			$records = $app->db->queryAllRecords($sql);
+			if(is_array($records) && !empty($records)) {
 
-            $global_config = $app->getconf->get_global_config('mail');
+				$tmp_rec =  $app->db->queryAllRecords("SELECT data from monitor_data WHERE type = 'harddisk_quota' ORDER BY created DESC");
+				$monitor_data = array();
+				if(is_array($tmp_rec)) {
+					foreach ($tmp_rec as $tmp_mon) {
+						$monitor_data = array_merge_recursive($monitor_data, unserialize($app->db->unquote($tmp_mon['data'])));
+					}
+				}
 
-            //* Check website disk quota
-            $sql = "SELECT domain_id,sys_groupid,domain,system_user,last_quota_notification,DATEDIFF(CURDATE(), last_quota_notification) as `notified_before` FROM web_domain WHERE (type = 'vhost' OR type = 'vhostsubdomain')";
-            $records = $app->db->queryAllRecords($sql);
-            if(is_array($records) && !empty($records)) {
+				foreach($records as $rec) {
 
-                $tmp_rec =  $app->db->queryAllRecords("SELECT data from monitor_data WHERE type = 'harddisk_quota' ORDER BY created DESC");
-                $monitor_data = array();
-                if(is_array($tmp_rec)) {
-                    foreach ($tmp_rec as $tmp_mon) {
-                        $monitor_data = array_merge_recursive($monitor_data,unserialize($app->db->unquote($tmp_mon['data'])));
-                    }
-                }
+					//$web_hd_quota = $rec['hd_quota'];
+					$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'];
+
+					if (!is_numeric($rec['used'])){
+						if ($rec['used'][0] > $rec['used'][1]){
+							$rec['used'] = $rec['used'][0];
+						} else {
+							$rec['used'] = $rec['used'][1];
+						}
+					}
+					if (!is_numeric($rec['soft'])) $rec['soft']=$rec['soft'][1];
+					if (!is_numeric($rec['hard'])) $rec['hard']=$rec['hard'][1];
+					if (!is_numeric($rec['files'])) $rec['files']=$rec['files'][1];
+
+					// used space ratio
+					if($rec['soft'] > 0){
+						$used_ratio = $rec['used']/$rec['soft'];
+					} else {
+						$used_ratio = 0;
+					}
+
+					$rec['ratio'] = number_format($used_ratio * 100, 2, '.', '').'%';
+
+					if($rec['used'] > 1024) {
+						$rec['used'] = round($rec['used'] / 1024, 2).' MB';
+					} else {
+						if ($rec['used'] != '') $rec['used'] .= ' KB';
+					}
+
+					if($rec['soft'] > 1024) {
+						$rec['soft'] = round($rec['soft'] / 1024, 2).' MB';
+					} elseif($rec['soft'] == 0){
+						$rec['soft'] = '----';
+					} else {
+						$rec['soft'] .= ' KB';
+					}
+
+					if($rec['hard'] > 1024) {
+						$rec['hard'] = round($rec['hard'] / 1024, 2).' MB';
+					} elseif($rec['hard'] == 0){
+						$rec['hard'] = '----';
+					} else {
+						$rec['hard'] .= ' KB';
+					}
+
+					// 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', 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')) {
+							$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();
+
+							//* 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_ok_notification', $placeholders, $recipients);
+						}
+					} else {
+
+						// 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']);
+
+							$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();
+
+							//* 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 mail quota warnings by email
+		//######################################################################################################
+
+		if ($app->dbmaster == $app->db) {
+
+			$global_config = $app->getconf->get_global_config('mail');
+			$mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail');
+
+			//* Check email quota
+			$sql = "SELECT mailuser_id,sys_groupid,email,name,quota,last_quota_notification,DATEDIFF(CURDATE(), last_quota_notification) as `notified_before` FROM mail_user";
+			$records = $app->db->queryAllRecords($sql);
+			if(is_array($records) && !empty($records)) {
+
+				$tmp_rec =  $app->db->queryAllRecords("SELECT data from monitor_data WHERE type = 'email_quota' ORDER BY created DESC");
+				$monitor_data = array();
+				if(is_array($tmp_rec)) {
+					foreach ($tmp_rec as $tmp_mon) {
+						//$monitor_data = array_merge_recursive($monitor_data,unserialize($app->db->unquote($tmp_mon['data'])));
+						$tmp_array = unserialize($app->db->unquote($tmp_mon['data']));
+						if(is_array($tmp_array)) {
+							foreach($tmp_array as $username => $data) {
+								if(@!$monitor_data[$username]['used']) $monitor_data[$username]['used'] = $data['used'];
+							}
+						}
+					}
+				}
+
+				foreach($records as $rec) {
+
+					$email = $rec['email'];
+
+					$rec['used'] = isset($monitor_data[$email]['used']) ? $monitor_data[$email]['used'] : array(1 => 0);
+
+					if (!is_numeric($rec['used'])) $rec['used']=$rec['used'][1];
+
+					// used space ratio
+					if($rec['quota'] > 0){
+						$used_ratio = $rec['used']/$rec['quota'];
+					} else {
+						$used_ratio = 0;
+					}
+
+					$rec['ratio'] = number_format($used_ratio * 100, 2, '.', '').'%';
 
-                foreach($records as $rec) {
+					if($rec['quota'] > 0){
+						$rec['quota'] = round($rec['quota'] / 1048576, 4).' MB';
+					} else {
+						$rec['quota'] = '----';
+					}
 
-                    //$web_hd_quota = $rec['hd_quota'];
-                    $domain = $rec['domain'];
+					if($rec['used'] < 1544000) {
+						$rec['used'] = round($rec['used'] / 1024, 4).' KB';
+					} else {
+						$rec['used'] = round($rec['used'] / 1048576, 4).' MB';
+					}
 
-                    $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'];
+					// 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', array("last_quota_notification" => null), 'mailuser_id', $rec['mailuser_id']);
 
-                    if (!is_numeric($rec['used'])){
-                        if ($rec['used'][0] > $rec['used'][1]){
-                            $rec['used'] = $rec['used'][0];
-                        } else {
-                            $rec['used'] = $rec['used'][1];
-                        }
-                    }
-                    if (!is_numeric($rec['soft'])) $rec['soft']=$rec['soft'][1];
-                    if (!is_numeric($rec['hard'])) $rec['hard']=$rec['hard'][1];
-                    if (!is_numeric($rec['files'])) $rec['files']=$rec['files'][1];
+						// 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')) {
+							$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']);
 
-                    // used space ratio
-                    if($rec['soft'] > 0){
-                        $used_ratio = $rec['used']/$rec['soft'];
-                    } else {
-                        $used_ratio = 0;
-                    }
+							$recipients = array();
+							//* send email to admin
+							if($global_config['admin_mail'] != '' && $mail_config['overquota_notify_admin'] == 'y') {
+								$recipients[] = $global_config['admin_mail'];
+							}
 
-                    $rec['ratio'] = number_format($used_ratio * 100, 2, '.', '').'%';
+							//* 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'];
+								}
+							}
 
-                    if($rec['used'] > 1024) {
-                        $rec['used'] = round($rec['used'] / 1024,2).' MB';
-                    } else {
-                        if ($rec['used'] != '') $rec['used'] .= ' KB';
-                    }
+							$this->_tools->send_notification_email('mail_quota_ok_notification', $placeholders, $recipients);
+						}
+					} else {
 
-                    if($rec['soft'] > 1024) {
-                        $rec['soft'] = round($rec['soft'] / 1024,2).' MB';
-                    } elseif($rec['soft'] == 0){
-                        $rec['soft'] = '----';
-                    } else {
-                        $rec['soft'] .= ' KB';
-                    }
+						//* 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($rec['hard'] > 1024) {
-                        $rec['hard'] = round($rec['hard'] / 1024,2).' MB';
-                    } elseif($rec['hard'] == 0){
-                        $rec['hard'] = '----';
-                    } else {
-                        $rec['hard'] .= ' KB';
-                    }
+						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']);
 
-                    // 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']);
+							$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']);
 
-                        // 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')) {
-                            $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();
+							//* send email to admin
+							if($global_config['admin_mail'] != '' && $mail_config['overquota_notify_admin'] == 'y') {
+								$recipients[] = $global_config['admin_mail'];
+							}
 
-                            $recipients = array();
+							//* 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'];
+								}
+							}
 
-                            //* send email to admin
-                            if($global_config['admin_mail'] != '' && $web_config['overquota_notify_admin'] == 'y') {
-                                $recipients[] = $global_config['admin_mail'];
-                            }
+							$this->_tools->send_notification_email('mail_quota_notification', $placeholders, $recipients);
+						}
+					}
+				}
+			}
+		}
 
-                            //* 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_notification_email('web_quota_ok_notification', $placeholders, $recipients);
-                        }
+		//######################################################################################################
+		// send database quota warnings by email
+		//######################################################################################################
 
-                        continue;
-                    }
+		if ($app->dbmaster == $app->db) {
 
-                    // 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;
+			$global_config = $app->getconf->get_global_config('mail');
 
-                    //* 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']);
+			//* 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)));
+			}
 
-                        $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']);
+			//* 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");
 
-                        $recipients = array();
+			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;
 
-                        //* send email to admin
-                        if($global_config['admin_mail'] != '' && $web_config['overquota_notify_admin'] == 'y') {
-                            $recipients[] = $global_config['admin_mail'];
-                        }
+					foreach ($monitor_data as $cid) {
 
-                        //* 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_notification_email('web_quota_notification', $placeholders, $recipients);
-                    }
-                }
-            }
-        }
+						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);
 
-        #######################################################################################################
-        // send mail quota warnings by email
-        #######################################################################################################
+								//* check quota
+								if ($quota > 0) $used_ratio = $monitor['size'] / $quota;
+								else $used_ratio = 0;
 
-        if ($app->dbmaster == $app->db) {
+								//* send notifications only if 90% or more of the quota are used
+								if($used_ratio > 0.9) {
 
-            $global_config = $app->getconf->get_global_config('mail');
-            $mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail');
+									//* reset notification date
+									if($rec['last_quota_notification']) $app->dbmaster->datalogUpdate('web_database', array("last_quota_notification" => null), 'database_id', $rec['database_id']);
 
-            //* Check email quota
-            $sql = "SELECT mailuser_id,sys_groupid,email,name,quota,last_quota_notification,DATEDIFF(CURDATE(), last_quota_notification) as `notified_before` FROM mail_user";
-            $records = $app->db->queryAllRecords($sql);
-            if(is_array($records) && !empty($records)) {
+									$app->dbmaster->datalogUpdate('web_database', array("last_quota_notification" => array("SQL" => "CURDATE()")), 'database_id', $rec['database_id']);
 
-                $tmp_rec =  $app->db->queryAllRecords("SELECT data from monitor_data WHERE type = 'email_quota' ORDER BY created DESC");
-                $monitor_data = array();
-                if(is_array($tmp_rec)) {
-                    foreach ($tmp_rec as $tmp_mon) {
-                        //$monitor_data = array_merge_recursive($monitor_data,unserialize($app->db->unquote($tmp_mon['data'])));
-                        $tmp_array = unserialize($app->db->unquote($tmp_mon['data']));
-                        if(is_array($tmp_array)) {
-                            foreach($tmp_array as $username => $data) {
-                                if(@!$monitor_data[$username]['used']) $monitor_data[$username]['used'] = $data['used'];
-                            }
-                        }
-                    }
-                }
+									// 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, '.', '').'%'
+										);
 
-                foreach($records as $rec) {
+										$recipients = array();
 
-                    $email = $rec['email'];
+										//* send email to admin
+										if($global_config['admin_mail'] != '' && $web_config['overquota_db_notify_admin'] == 'y') 
+											$recipients[] = $global_config['admin_mail'];
 
-                    $rec['used'] = isset($monitor_data[$email]['used']) ? $monitor_data[$email]['used'] : array(1 => 0);
+										//* Send email to client
+										if($web_config['overquota_db_notify_client'] == 'y' && $client['email'] != '') 
+											$recipients[] = $client['email'];
 
-                    if (!is_numeric($rec['used'])) $rec['used']=$rec['used'][1];
+										$this->_tools->send_notification_email('db_quota_ok_notification', $placeholders, $recipients);
 
-                    // used space ratio
-                    if($rec['quota'] > 0){
-                        $used_ratio = $rec['used']/$rec['quota'];
-                    } else {
-                        $used_ratio = 0;
-                    }
+									}
 
-                    $rec['ratio'] = number_format($used_ratio * 100, 2, '.', '').'%';
+								}
 
-                    if($rec['quota'] > 0){
-                        $rec['quota'] = round($rec['quota'] / 1048576,4).' MB';
-                    } else {
-                        $rec['quota'] = '----';
-                    }
+								//* 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;
 
-                    if($rec['used'] < 1544000) {
-                        $rec['used'] = round($rec['used'] / 1024,4).' KB';
-                    } else {
-                        $rec['used'] = round($rec['used'] / 1048576,4).' MB';
-                    }
+								//* 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, '.', '').'%'
+									);
 
-                    // 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']);
+									$recipients = array();
 
-                        // 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')) {
-                            $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']);
+									//* send email to admin
+									if($global_config['admin_mail'] != '' && $web_config['overquota_db_notify_admin'] == 'y')
+										$recipients[] = $global_config['admin_mail'];
 
-                            $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($web_config['overquota_db_notify_client'] == 'y' && $client['email'] != '')
+										$recipients[] = $client['email'];
 
-                            //* 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('db_quota_notification', $placeholders, $recipients);
 
-                            send_notification_email('mail_quota_ok_notification', $placeholders, $recipients);
-                        }
+								}
 
-                        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;
+						}   
 
-                    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']);
+				}
 
-                        $recipients = array();
-                        //* send email to admin
-                        if($global_config['admin_mail'] != '' && $mail_config['overquota_notify_admin'] == 'y') {
-                            $recipients[] = $global_config['admin_mail'];
-                        }
+			}
+		}
+		parent::onRunJob();
+	}
 
-                        //* 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 function is optional if it contains no custom code */
+	public function onAfterRun() {
+		global $app;
 
-                        send_notification_email('mail_quota_notification', $placeholders, $recipients);
-                    }
-                }
-            }
-        }
-        
-        
-        parent::onRunJob();
-    }
-    
-    /* this function is optional if it contains no custom code */
-    public function onAfterRun() {
-        global $app;
-        
-        parent::onAfterRun();
-    }
+		parent::onAfterRun();
+	}
 
 }
 

--
Gitblit v1.9.1