Till Brehm
2016-07-24 b9a3ef486ebcde18a5ade37865ff8f397185d24f
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();
   }
}