Marius Cramer
2015-08-06 37b29231e47a0c4458dc1c15d98588f16f07e1e2
commit | author | age
5de2af 1 <?php
M 2
3 /*
4 Copyright (c) 2013, Marius Cramer, pixcept KG
5 All rights reserved.
6
7 Redistribution and use in source and binary forms, with or without modification,
8 are permitted provided that the following conditions are met:
9
10     * Redistributions of source code must retain the above copyright notice,
11       this list of conditions and the following disclaimer.
12     * Redistributions in binary form must reproduce the above copyright notice,
13       this list of conditions and the following disclaimer in the documentation
14       and/or other materials provided with the distribution.
15     * Neither the name of ISPConfig nor the names of its contributors
16       may be used to endorse or promote products derived from this software without
17       specific prior written permission.
18
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22 IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
23 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
26 OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
28 EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 class cronjob_monitor_email_quota extends cronjob {
b1a6a5 32
MC 33     // job schedule
34     protected $_schedule = '*/15 * * * *';
35     protected $_run_at_new = true;
36
37     private $_tools = null;
38
39     /* this function is optional if it contains no custom code */
40     public function onPrepare() {
41         global $app;
42
43         parent::onPrepare();
44     }
45
46     /* this function is optional if it contains no custom code */
47     public function onBeforeRun() {
48         global $app;
49
50         return parent::onBeforeRun();
51     }
52
53     public function onRunJob() {
54         global $app, $conf;
55
5de2af 56         $app->uses('getconf');
M 57         $mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail');
58         if($mail_config['mailbox_quota_stats'] == 'n') return;
59
b1a6a5 60         /* used for all monitor cronjobs */
MC 61         $app->load('monitor_tools');
62         $this->_tools = new monitor_tools();
63         /* end global section for monitor cronjobs */
64
65
5de2af 66         //* Initialize data array
M 67         $data = array();
68
69         //* the id of the server as int
70         $server_id = intval($conf['server_id']);
71
72         //* The type of the data
73         $type = 'email_quota';
74
75         //* The state of the email_quota.
76         $state = 'ok';
77
cc7a82 78         $mailboxes = $app->db->queryAllRecords("SELECT email,maildir FROM mail_user WHERE server_id = ?", $server_id);
5de2af 79         if(is_array($mailboxes)) {
58023f 80
FS 81             //* with dovecot we can use doveadm instead of 'du -s'
82             $dovecot = false;
83             if (isset($mail_config['pop3_imap_daemon']) && $mail_config ['pop3_imap_daemon'] = 'dovecot' && is_executable('doveadm')) {
56ae25 84                 exec('doveadm quota 2>&1', $tmp_output, $tmp_retval); // with dovecot 2.2.x 'doveadm quota' is unuseable
FS 85                 if ($retval = 64) $dovecot = true;
58023f 86             }
FS 87
5de2af 88             foreach($mailboxes as $mb) {
M 89                 $email = $mb['email'];
b1a6a5 90                 $email_parts = explode('@', $mb['email']);
5de2af 91                 $filename = $mb['maildir'].'/.quotausage';
58023f 92                 if(!file_exists($filename) && $dovecot) {
FS 93                     exec('doveadm quota recalc -u '.$email);
94                 }
5de2af 95                 if(file_exists($filename) && !is_link($filename)) {
M 96                     $quotafile = file($filename);
ebbe63 97                     preg_match('/storage.*?([0-9]+)/s', implode('',$quotafile), $storage_value);
MC 98                     $data[$email]['used'] = $storage_value[1];
99                     $app->log("Mail storage $email: " . $storage_value[1], LOGLEVEL_DEBUG);
5de2af 100                     unset($quotafile);
M 101                 } else {
b1a6a5 102                     exec('du -s '.escapeshellcmd($mb['maildir']), $out);
MC 103                     $parts = explode(' ', $out[0]);
5de2af 104                     $data[$email]['used'] = intval($parts[0])*1024;
M 105                     unset($out);
106                     unset($parts);
107                 }
108             }
109         }
110
111         unset($mailboxes);
112
b1a6a5 113         //* Dovecot quota check Courier in progress lathama@gmail.com
5de2af 114         /*
M 115                 if($dir = opendir("/var/vmail")){
116                         while (($quotafiles = readdir($dir)) !== false){
117                                 if(preg_match('/.\_quota$/', $quotafiles)){
118                                         $quotafile = (file("/var/vmail/" . $quotafiles));
119                                         $emailaddress = preg_replace('/_quota/',"", $quotafiles);
120                                         $emailaddress = preg_replace('/_/',"@", $emailaddress);
121                                         $data[$emailaddress]['used'] = trim($quotafile['1']);
122                                 }
123                         }
124                         closedir($dir);
125                 }
126         */
b1a6a5 127         $res = array();
5de2af 128         $res['server_id'] = $server_id;
M 129         $res['type'] = $type;
130         $res['data'] = $data;
131         $res['state'] = $state;
132
b1a6a5 133         /*
5de2af 134          * Insert the data into the database
M 135          */
b1a6a5 136         $sql = 'REPLACE INTO monitor_data (server_id, type, created, data, state) ' .
cc7a82 137             'VALUES (?, ?, UNIX_TIMESTAMP(), ?, ?)';
MC 138         $app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
5de2af 139
b1a6a5 140         /* The new data is written, now we can delete the old one */
MC 141         $this->_tools->delOldRecords($res['type'], $res['server_id']);
5de2af 142
b1a6a5 143
MC 144         parent::onRunJob();
145     }
146
147     /* this function is optional if it contains no custom code */
148     public function onAfterRun() {
149         global $app;
150
151         parent::onAfterRun();
152     }
5de2af 153
M 154 }
155
156 ?>