cron_daily.php 40.6 KB
Newer Older
1
2
3
<?php

/*
4
Copyright (c) 2007-2012, Till Brehm, projektfarm Gmbh
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice,
      this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
    * Neither the name of ISPConfig nor the names of its contributors
      may be used to endorse or promote products derived from this software without
      specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

31
32
33
define('SCRIPT_PATH', dirname($_SERVER["SCRIPT_FILENAME"]));
require(SCRIPT_PATH."/lib/config.inc.php");
require(SCRIPT_PATH."/lib/app.inc.php");
34
35
36
37

set_time_limit(0);

// make sure server_id is always an int
38
$conf['server_id'] = intval($conf['server_id']);
39

40

41
// Load required base-classes
42
$app->uses('ini_parser,file,services,getconf,system');
43
44
45
46
47
48


#######################################################################################################
// store the mailbox statistics in the database
#######################################################################################################

49
$parse_mail_log = false;
50
$sql = "SELECT mailuser_id,maildir FROM mail_user WHERE server_id = ".$conf['server_id'];
51
$records = $app->db->queryAllRecords($sql);
52
53
if(count($records) > 0) $parse_mail_log = true;

54
foreach($records as $rec) {
55
	if(@is_file($rec['maildir'].'/ispconfig_mailsize')) {
56
57
        $parse_mail_log = false;
        
58
		// rename file
59
		rename($rec['maildir'].'/ispconfig_mailsize',$rec['maildir'].'/ispconfig_mailsize_save');
60

61
		// Read the file
62
		$lines = file($rec['maildir'].'/ispconfig_mailsize_save');
63
64
65
66
67
		$mail_traffic = 0;
		foreach($lines as $line) {
			$mail_traffic += intval($line);
		}
		unset($lines);
68

69
		// Delete backup file
70
		if(@is_file($rec['maildir'].'/ispconfig_mailsize_save')) unlink($rec['maildir'].'/ispconfig_mailsize_save');
71

72
		// Save the traffic stats in the sql database
73
		$tstamp = date('Y-m');
74

75
		$sql = "SELECT * FROM mail_traffic WHERE month = '$tstamp' AND mailuser_id = ".$rec['mailuser_id'];
76
		$tr = $app->dbmaster->queryOneRecord($sql);
77

78
79
80
		$mail_traffic += $tr['traffic'];
		if($tr['traffic_id'] > 0) {
			$sql = "UPDATE mail_traffic SET traffic = $mail_traffic WHERE traffic_id = ".$tr['traffic_id'];
81
		} else {
82
			$sql = "INSERT INTO mail_traffic (month,mailuser_id,traffic) VALUES ('$tstamp',".$rec['mailuser_id'].",$mail_traffic)";
83
		}
84
		$app->dbmaster->query($sql);
85
		//echo $sql;
86

87
	}
88

89
90
}

91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
if($parse_mail_log == true) {
    $mailbox_traffic = array();
    $mail_boxes = array();
    $mail_rewrites = array(); // we need to read all mail aliases and forwards because the address in amavis is not always the mailbox address
    
    function parse_mail_log_line($line) {
        //Oct 31 17:35:48 mx01 amavis[32014]: (32014-05) Passed CLEAN, [IPv6:xxxxx] [IPv6:xxxxx] <xxx@yyyy> -> <aaaa@bbbb>, Message-ID: <xxxx@yyyyy>, mail_id: xxxxxx, Hits: -1.89, size: 1591, queued_as: xxxxxxx, 946 ms
        
        if(preg_match('/^(\w+\s+\d+\s+\d+:\d+:\d+)\s+[^ ]+\s+amavis.* <([^>]+)>\s+->\s+((<[^>]+>,)+) .*Message-ID:\s+<([^>]+)>.* size:\s+(\d+),.*$/', $line, $matches) == false) return false;
        
        $timestamp = strtotime($matches[1]);
        if(!$timestamp) return false;
        
        $to = array();
        $recipients = explode(',', $matches[3]);
        foreach($recipients as $recipient) {
            $recipient = substr($recipient, 1, -1);
            if(!$recipient || $recipient == $matches[2]) continue;
            $to[] = $recipient;
        }
        
        return array('line' => $line, 'timestamp' => $timestamp, 'size' => $matches[6], 'from' => $matches[2], 'to' => $to, 'message-id' => $matches[5]);
    }

    function add_mailbox_traffic(&$traffic_array, $address, $traffic) {
        global $mail_boxes, $mail_rewrites;
        
        $address = strtolower($address);
        
        if(in_array($address, $mail_boxes) == true) {
            if(!isset($traffic_array[$address])) $traffic_array[$address] = 0;
            $traffic_array[$address] += $traffic;
        } elseif(array_key_exists($address, $mail_rewrites)) {
            foreach($mail_rewrites[$address] as $address) {
                if(!isset($traffic_array[$address])) $traffic_array[$address] = 0;
                $traffic_array[$address] += $traffic;
            }
        } else {
            // this is not a local address - skip it
        }
    }

    $sql = "SELECT email FROM mail_user WHERE server_id = ".$conf['server_id'];
    $records = $app->db->queryAllRecords($sql);
    foreach($records as $record) {
        $mail_boxes[] = $record['email'];
    }
    $sql = "SELECT source, destination FROM mail_forwarding WHERE server_id = ".$conf['server_id'];
    $records = $app->db->queryAllRecords($sql);
    foreach($records as $record) {
        $targets = preg_split('/[\n,]+/', $record['destination']);
        foreach($targets as $target) {
            if(in_array($target, $mail_boxes)) {
                if(isset($mail_rewrites[$record['source']])) $mail_rewrites[$record['source']][] = $target;
                else $mail_rewrites[$record['source']] = array($target);
            }
        }
    }
    
    $state_file = dirname(__FILE__) . '/mail_log_parser.state';
    $prev_line = false;
    $last_line = false;
    $cur_line = false;
    
    if(file_exists($state_file)) {
        $prev_line = parse_mail_log_line(trim(file_get_contents($state_file)));
        //if($prev_line) echo "continuing from previous run, log position: " . $prev_line['message-id'] . " at " . strftime('%d.%m.%Y %H:%M:%S', $prev_line['timestamp']) . "\n";
    }
    
    if(file_exists('/var/log/mail.log')) {
        $fp = fopen('/var/log/mail.log', 'r');
        //echo "Parsing mail.log...\n";
        $l = 0;
        while($line = fgets($fp, 8192)) {
            $l++;
            //if($l % 1000 == 0) echo "\rline $l";
            $cur_line = parse_mail_log_line($line);
            if(!$cur_line) continue;
            
            if($prev_line) {
                // check if this line has to be processed
                if($cur_line['timestamp'] < $prev_line['timestamp']) {
                    $parse_mail_log = false; // we do not need to parse the second file!
                    continue; // already processed
                } elseif($cur_line['timestamp'] == $prev_line['timestamp'] && $cur_line['message-id'] == $prev_line['message-id']) {
                    $parse_mail_log = false; // we do not need to parse the second file!
                    $prev_line = false; // this line has already been processed but the next one has to be!
                    continue;
                }
            }
            
            add_mailbox_traffic($mailbox_traffic, $cur_line['from'], $cur_line['size']);
            foreach($cur_line['to'] as $to) {
                add_mailbox_traffic($mailbox_traffic, $to, $cur_line['size']);
            }
            $last_line = $line; // store for the state file
        }
        fclose($fp);
        //echo "\n";
    }
    
    if($parse_mail_log == true && file_exists('/var/log/mail.log.1')) {
        $fp = fopen('/var/log/mail.log.1', 'r');
        //echo "Parsing mail.log.1...\n";
        $l = 0;
        while($line = fgets($fp, 8192)) {
            $l++;
            //if($l % 1000 == 0) echo "\rline $l";
            $cur_line = parse_mail_log_line($line);
            if(!$cur_line) continue;
            
            if($prev_line) {
                // check if this line has to be processed
                if($cur_line['timestamp'] < $prev_line['timestamp']) continue; // already processed
                if($cur_line['timestamp'] == $prev_line['timestamp'] && $cur_line['message-id'] == $prev_line['message-id']) {
                    $prev_line = false; // this line has already been processed but the next one has to be!
                    continue;
                }
            }
            
            add_mailbox_traffic($mailbox_traffic, $cur_line['from'], $cur_line['size']);
            foreach($cur_line['to'] as $to) {
                add_mailbox_traffic($mailbox_traffic, $to, $cur_line['size']);
            }
        }
        fclose($fp);
        //echo "\n";
    }
    unset($mail_rewrites);
    unset($mail_boxes);
    
    // Save the traffic stats in the sql database
    $tstamp = date('Y-m');
    $sql = "SELECT mailuser_id,email FROM mail_user WHERE server_id = ".$conf['server_id'];
    $records = $app->db->queryAllRecords($sql);
    foreach($records as $rec) {
        if(array_key_exists($rec['email'], $mailbox_traffic)) {
            $sql = "SELECT * FROM mail_traffic WHERE month = '$tstamp' AND mailuser_id = ".$rec['mailuser_id'];
            $tr = $app->dbmaster->queryOneRecord($sql);

            $mail_traffic = $tr['traffic'] + $mailbox_traffic[$rec['email']];
            if($tr['traffic_id'] > 0) {
                $sql = "UPDATE mail_traffic SET traffic = $mail_traffic WHERE traffic_id = ".$tr['traffic_id'];
            } else {
                $sql = "INSERT INTO mail_traffic (month,mailuser_id,traffic) VALUES ('$tstamp',".$rec['mailuser_id'].",$mail_traffic)";
            }
            $app->dbmaster->query($sql);
            //echo $sql;
        }
    }
    
    unset($mailbox_traffic);
    if($last_line) file_put_contents($state_file, $last_line);
}

246
247
248
249
#######################################################################################################
// Create webalizer statistics
#######################################################################################################

250
251
252
253
254
function setConfigVar( $filename, $varName, $varValue ) {
	if($lines = @file($filename)) {
		$out = '';
		$found = 0;
		foreach($lines as $line) {
255
			@list($key, $value) = preg_split('/[\t= ]+/', $line, 2);
256
			if($key == $varName) {
257
				$out .= $varName.' '.$varValue."\n";
258
259
260
261
262
263
264
265
266
				$found = 1;
			} else {
				$out .= $line;
			}
		}
		if($found == 0) {
			//* add \n if the last line does not end with \n or \r
			if(substr($out,-1) != "\n" && substr($out,-1) != "\r") $out .= "\n";
			//* add the new line at the end of the file
267
			if($append == 1) $out .= $varName.' '.$varValue."\n";
268
269
270
271
272
273
		}

		file_put_contents($filename,$out);
	}
}

274

275
$sql = "SELECT domain_id, domain, document_root, web_folder, type FROM web_domain WHERE (type = 'vhost' or type = 'vhostsubdomain') and stats_type = 'webalizer' AND server_id = ".$conf['server_id'];
276
$records = $app->db->queryAllRecords($sql);
277

278
foreach($records as $rec) {
279
280
	//$yesterday = date('Ymd',time() - 86400);
	$yesterday = date('Ymd',strtotime("-1 day", time()));
281
	$logfile = escapeshellcmd($rec['document_root'].'/log/'.$yesterday.'-access.log');
282
	if(!@is_file($logfile)) {
283
		$logfile = escapeshellcmd($rec['document_root'].'/log/'.$yesterday.'-access.log.gz');
284
285
286
		if(!@is_file($logfile)) {
			continue;
		}
287
	}
288

289
	$domain = escapeshellcmd($rec['domain']);
290
	$statsdir = escapeshellcmd($rec['document_root'].'/'.($rec['type'] == 'vhostsubdomain' ? $rec['web_folder'] : 'web').'/stats');
291
292
	$webalizer = '/usr/bin/webalizer';
	$webalizer_conf_main = '/etc/webalizer/webalizer.conf';
293
	$webalizer_conf = escapeshellcmd($rec['document_root'].'/log/webalizer.conf');
maddinxx's avatar
maddinxx committed
294

295
	if(is_file($statsdir.'/index.php')) unlink($statsdir.'/index.php');
296

297
	if(!@is_file($webalizer_conf)) {
298
		copy($webalizer_conf_main,$webalizer_conf);
299
	}
300

301
302
303
304
305
	if(@is_file($webalizer_conf)) {
		setConfigVar($webalizer_conf, 'Incremental', 'yes');
		setConfigVar($webalizer_conf, 'IncrementalName', $statsdir.'/webalizer.current');
		setConfigVar($webalizer_conf, 'HistoryName', $statsdir.'/webalizer.hist');
	}
306

307

308
	if(!@is_dir($statsdir)) mkdir($statsdir);
309
	exec("$webalizer -c $webalizer_conf -n $domain -s $domain -r $domain -q -T -p -o $statsdir $logfile");
310
311
}

312
313
314
315
#######################################################################################################
// Create awstats statistics
#######################################################################################################

316
$sql = "SELECT domain_id, domain, document_root, web_folder, type, system_user, system_group FROM web_domain WHERE (type = 'vhost' or type = 'vhostsubdomain') and stats_type = 'awstats' AND server_id = ".$conf['server_id'];
317
318
$records = $app->db->queryAllRecords($sql);

319
$web_config = $app->getconf->get_server_config($conf['server_id'], 'web');
320
321

foreach($records as $rec) {
322
323
	//$yesterday = date('Ymd',time() - 86400);
	$yesterday = date('Ymd',strtotime("-1 day", time()));
324
	$logfile = escapeshellcmd($rec['document_root'].'/log/'.$yesterday.'-access.log');
325
	if(!@is_file($logfile)) {
326
		$logfile = escapeshellcmd($rec['document_root'].'/log/'.$yesterday.'-access.log.gz');
327
328
329
330
		if(!@is_file($logfile)) {
			continue;
		}
	}
331
    $web_folder = ($rec['type'] == 'vhostsubdomain' ? $rec['web_folder'] : 'web');
332
	$domain = escapeshellcmd($rec['domain']);
333
	$statsdir = escapeshellcmd($rec['document_root'].'/'.$web_folder.'/stats');
334
	$awstats_pl = $web_config['awstats_pl'];
tbrehm's avatar
tbrehm committed
335
	$awstats_buildstaticpages_pl = $web_config['awstats_buildstaticpages_pl'];
maddinxx's avatar
maddinxx committed
336

337
338
	$awstats_conf_dir = $web_config['awstats_conf_dir'];
	$awstats_website_conf_file = $web_config['awstats_conf_dir'].'/awstats.'.$domain.'.conf';
maddinxx's avatar
maddinxx committed
339

340
	if(is_file($awstats_website_conf_file)) unlink($awstats_website_conf_file);
maddinxx's avatar
maddinxx committed
341

342
	$sql = "SELECT domain FROM web_domain WHERE (type = 'alias' OR type = 'subdomain') AND parent_domain_id = ".$rec['domain_id'];
343
344
	$aliases = $app->db->queryAllRecords($sql);
	$aliasdomain = '';
maddinxx's avatar
maddinxx committed
345

346
347
348
349
350
	if(is_array($aliases)) {
		foreach ($aliases as $alias) {
			$aliasdomain.= ' '.$alias['domain']. ' www.'.$alias['domain'];
		}
	}
maddinxx's avatar
maddinxx committed
351

352
353
	if(!is_file($awstats_website_conf_file)) {
		$awstats_conf_file_content = 'Include "'.$awstats_conf_dir.'/awstats.conf"
354
LogFile="/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log"
355
SiteDomain="'.$domain.'"
356
HostAliases="www.'.$domain.' localhost 127.0.0.1'.$aliasdomain.'"';
357
358
		file_put_contents($awstats_website_conf_file,$awstats_conf_file_content);
	}
maddinxx's avatar
maddinxx committed
359

360
	if(!@is_dir($statsdir)) mkdir($statsdir);
361
	if(is_link('/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log')) unlink('/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log');
362
	symlink($logfile,'/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log');
maddinxx's avatar
maddinxx committed
363

364
	$awmonth = date("n");
365
	$awyear = date("Y");
366
367
368
369
370
371
372

	if (date("d") == 1) {
		$awmonth = date("m")-1;
		if (date("m") == 1) {
			$awyear = date("Y")-1;
			$awmonth = "12";
		}
373
	}
maddinxx's avatar
maddinxx committed
374

375
	// awstats_buildstaticpages.pl -update -config=mydomain.com -lang=en -dir=/var/www/domain.com/'.$web_folder.'/stats -awstatsprog=/path/to/awstats.pl
376
	// $command = "$awstats_buildstaticpages_pl -update -config='$domain' -lang=".$conf['language']." -dir='$statsdir' -awstatsprog='$awstats_pl'";
maddinxx's avatar
maddinxx committed
377

378
379
380
381
382
383
384
385
386
387
388
389
390
	$command = "$awstats_buildstaticpages_pl -month='$awmonth' -year='$awyear' -update -config='$domain' -lang=".$conf['language']." -dir='$statsdir' -awstatsprog='$awstats_pl'";

	if (date("d") == 2) {
		$awmonth = date("m")-1;
		if (date("m") == 1) {
			$awyear = date("Y")-1;
			$awmonth = "12";
		}

		$statsdirold = $statsdir."/".$awyear."-".$awmonth."/";
		mkdir($statsdirold);
		$files = scandir($statsdir);
		foreach ($files as $file) {
391
			if (substr($file,0,1) != "." && !is_dir("$statsdir"."/"."$file") && substr($file,0,1) != "w" && substr($file,0,1) != "i") copy("$statsdir"."/"."$file","$statsdirold"."$file");
392
393
		}
	}
maddinxx's avatar
maddinxx committed
394
395


tbrehm's avatar
tbrehm committed
396
	if($awstats_pl != '' && $awstats_buildstaticpages_pl != '' && fileowner($awstats_pl) == 0 && fileowner($awstats_buildstaticpages_pl) == 0) {
397
		exec($command);
398
399
		if(is_file($rec['document_root'].'/'.$web_folder.'/stats/index.html')) unlink($rec['document_root'].'/'.$web_folder.'/stats/index.html');
		rename($rec['document_root'].'/'.$web_folder.'/stats/awstats.'.$domain.'.html',$rec['document_root'].'/'.$web_folder.'/stats/awsindex.html');
400
401
402
403
404
405
406
		if(!is_file($rec['document_root']."/".$web_folder."/stats/index.php")) {
			if(file_exists("/usr/local/ispconfig/server/conf-custom/awstats_index.php.master")) {
				copy("/usr/local/ispconfig/server/conf-custom/awstats_index.php.master",$rec['document_root']."/".$web_folder."/stats/index.php");
			} else {
				copy("/usr/local/ispconfig/server/conf/awstats_index.php.master",$rec['document_root']."/".$web_folder."/stats/index.php");
			}
		}
maddinxx's avatar
maddinxx committed
407

408
		$app->log('Created awstats statistics with command: '.$command,LOGLEVEL_DEBUG);
409
	} else {
tbrehm's avatar
tbrehm committed
410
		$app->log("No awstats statistics created. Either $awstats_pl or $awstats_buildstaticpages_pl is not owned by root user.",LOGLEVEL_WARN);
411
	}
maddinxx's avatar
maddinxx committed
412

413
414
415
	if(is_file($rec['document_root']."/".$web_folder."/stats/index.php")) {
		chown($rec['document_root']."/".$web_folder."/stats/index.php",$rec['system_user']);
		chgrp($rec['document_root']."/".$web_folder."/stats/index.php",$rec['system_group']);
416
	}
maddinxx's avatar
maddinxx committed
417

418
419
420
}


421
422
423
424
#######################################################################################################
// Make the web logfiles directories world readable to enable ftp access
#######################################################################################################

425
if(is_dir('/var/log/ispconfig/httpd')) exec('chmod +r /var/log/ispconfig/httpd/*');
426

427
#######################################################################################################
428
// Manage and compress web logfiles and create traffic statistics
429
430
#######################################################################################################

431
$sql = "SELECT domain_id, domain, document_root FROM web_domain WHERE (type = 'vhost' or type = 'vhostsubdomain') AND server_id = ".$conf['server_id'];
432
433
$records = $app->db->queryAllRecords($sql);
foreach($records as $rec) {
maddinxx's avatar
maddinxx committed
434

435
436
437
438
	//* create traffic statistics based on yesterdays access log file
	$yesterday = date('Ymd',time() - 86400);
	$logfile = $rec['document_root'].'/log/'.$yesterday.'-access.log';
	$total_bytes = 0;
maddinxx's avatar
maddinxx committed
439

440
441
442
443
444
445
446
	$handle = @fopen($logfile, "r");
	if ($handle) {
		while (($line = fgets($handle, 4096)) !== false) {
			if (preg_match('/^\S+ \S+ \S+ \[.*?\] "\S+.*?" \d+ (\d+) ".*?" ".*?"/', $line, $m)) {
				$total_bytes += intval($m[1]);
			}
		}
maddinxx's avatar
maddinxx committed
447

448
449
450
451
452
453
454
455
456
457
458
459
		//* Insert / update traffic in master database
		$traffic_date = date('Y-m-d',time() - 86400);
		$tmp = $app->dbmaster->queryOneRecord("select hostname from web_traffic where hostname='".$rec['domain']."' and traffic_date='".$traffic_date."'");
		if(is_array($tmp) && count($tmp) > 0) {
			$sql = "update web_traffic set traffic_bytes=traffic_bytes+"
                  . $total_bytes
                  . " where hostname='" . $rec['domain']
                  . "' and traffic_date='" . $traffic_date . "'";
		} else {
			$sql = "insert into web_traffic (hostname, traffic_date, traffic_bytes) values ('".$rec['domain']."', '".$traffic_date."', '".$total_bytes."')";
		}
		$app->dbmaster->query($sql);
maddinxx's avatar
maddinxx committed
460

461
462
		fclose($handle);
	}
maddinxx's avatar
maddinxx committed
463

464
465
	$yesterday2 = date('Ymd',time() - 86400*2);
	$logfile = escapeshellcmd($rec['document_root'].'/log/'.$yesterday2.'-access.log');
maddinxx's avatar
maddinxx committed
466

467
	//* Compress logfile
468
469
470
	if(@is_file($logfile)) {
		// Compress yesterdays logfile
		exec("gzip -c $logfile > $logfile.gz");
tbrehm's avatar
tbrehm committed
471
		unlink($logfile);
472
	}
maddinxx's avatar
maddinxx committed
473

474
	// rotate and compress the error.log when it exceeds a size of 10 MB
475
	$logfile = escapeshellcmd($rec['document_root'].'/log/error.log');
476
477
478
479
	if(is_file($logfile) && filesize($logfile) > 10000000) {
		exec("gzip -c $logfile > $logfile.1.gz");
		exec("cat /dev/null > $logfile");
	}
480

481
	// delete logfiles after 30 days
482
483
	$month_ago = date('Ymd',time() - 86400 * 30);
	$logfile = escapeshellcmd($rec['document_root'].'/log/'.$month_ago.'-access.log.gz');
484
485
486
	if(@is_file($logfile)) {
		unlink($logfile);
	}
maddinxx's avatar
maddinxx committed
487

488
489
	//* Delete older Log files, in case that we missed them before due to serverdowntimes.
	$datepart = date('Ym',time() - 86400 * 31 * 2);
maddinxx's avatar
maddinxx committed
490

491
492
	$logfile = escapeshellcmd($rec['document_root']).'/log/'.$datepart.'*-access.log.gz';
	exec('rm -f '.$logfile);
maddinxx's avatar
maddinxx committed
493

494
495
	$logfile = escapeshellcmd($rec['document_root']).'/log/'.$datepart.'*-access.log';
	exec('rm -f '.$logfile);
496
497
}

498
#######################################################################################################
499
500
501
502
// Rotate the ispconfig.log file
#######################################################################################################

// rotate the ispconfig.log when it exceeds a size of 10 MB
503
$logfile = $conf['ispconfig_log_dir'].'/ispconfig.log';
504
505
506
507
508
if(is_file($logfile) && filesize($logfile) > 10000000) {
	exec("gzip -c $logfile > $logfile.1.gz");
	exec("cat /dev/null > $logfile");
}

509
// rotate the cron.log when it exceeds a size of 10 MB
510
$logfile = $conf['ispconfig_log_dir'].'/cron.log';
511
512
513
514
515
if(is_file($logfile) && filesize($logfile) > 10000000) {
	exec("gzip -c $logfile > $logfile.1.gz");
	exec("cat /dev/null > $logfile");
}

maddinxx's avatar
maddinxx committed
516
517
518
519
520
521
522
// rotate the auth.log when it exceeds a size of 10 MB
$logfile = $conf['ispconfig_log_dir'].'/auth.log';
if(is_file($logfile) && filesize($logfile) > 10000000) {
	exec("gzip -c $logfile > $logfile.1.gz");
	exec("cat /dev/null > $logfile");
}

523
#######################################################################################################
524
525
526
// Cleanup website tmp directories
#######################################################################################################

527
$sql = "SELECT domain_id, domain, document_root, system_user FROM web_domain WHERE server_id = ".$conf['server_id'];
528
529
530
531
$records = $app->db->queryAllRecords($sql);
$app->uses('system');
if(is_array($records)) {
	foreach($records as $rec){
532
		$tmp_path = realpath(escapeshellcmd($rec['document_root'].'/tmp'));
533
		if($tmp_path != '' && strlen($tmp_path) > 10 && is_dir($tmp_path) && $app->system->is_user($rec['system_user'])){
534
			exec('cd '.$tmp_path."; find . -mtime +1 -name 'sess_*' | grep -v -w .no_delete | xargs rm > /dev/null 2> /dev/null");
535
536
537
		}
	}
}
538

tbrehm's avatar
tbrehm committed
539
#######################################################################################################
vogelor's avatar
vogelor committed
540
// Cleanup logs in master database (only the "master-server")
tbrehm's avatar
tbrehm committed
541
#######################################################################################################
542

vogelor's avatar
vogelor committed
543
544
545
546
547
548
549
550
551
552
if ($app->dbmaster == $app->db) {
	/** 7 days */
	$tstamp = time() - (60*60*24*7);

	/*
	 *  Keep 7 days in sys_log
	 * (we can delete the old items, because if they are OK, they don't interrest anymore
	 * if they are NOT ok, the server will try to process them in 1 minute and so the
	 * error appears again after 1 minute. So it is no problem to delete the old one!
	 */
553
554
555
556
	$sql = "DELETE FROM sys_log WHERE tstamp < " . $tstamp . " AND server_id != 0";
	$app->dbmaster->query($sql);

	/*
557
558
559
	 * Delete all remote-actions "done" and older than 7 days
	 * ATTENTION: We have the same problem as described in cleaning the datalog. We must not
	 * delete the last entry
560
	 */
561
562
563
564
565
	$sql = "SELECT max(action_id) FROM sys_remoteaction";
	$res = $app->dbmaster->queryOneRecord($sql);
	$maxId = $res['max(action_id)'];
	$sql =  "DELETE FROM sys_remoteaction " .
			"WHERE tstamp < " . $tstamp . " " .
566
			" AND action_state = 'ok' " .
567
			" AND action_id <" . intval($maxId);
vogelor's avatar
vogelor committed
568
569
570
571
572
573
574
575
576
	$app->dbmaster->query($sql);

	/*
	 * The sys_datalog is more difficult.
	 * 1) We have to keet ALL entries with
	 *    server_id=0, because they depend on ALL servers (even if they are not
	 *    actually in the system (and will be insered in 3 days or so).
	 * 2) We have to keey ALL entries which are not actually precessed by the
	 *    server never mind how old they are!
577
578
579
580
581
582
	 * 3) We have to keep the entry with the highest autoinc-id, because mysql calculates the
	 *    autoinc-id as "new value = max(row) +1" and does not store this in a separate table.
	 *    This means, if we delete to entry with the highest autoinc-value then this value is
	 *    reused as autoinc and so there are more than one entries with the same value (over
	 *    for example 4 Weeks). This is confusing for our system.
	 *    ATTENTION 2) and 3) is in some case NOT the same! so we have to check both!
vogelor's avatar
vogelor committed
583
584
585
586
587
588
	 */

	/* First we need all servers and the last sys_datalog-id they processed */
	$sql = "SELECT server_id, updated FROM server ORDER BY server_id";
	$records = $app->dbmaster->queryAllRecords($sql);

589
590
591
592
593
	/* Then we need the highest value ever */
	$sql = "SELECT max(datalog_id) FROM sys_datalog";
	$res = $app->dbmaster->queryOneRecord($sql);
	$maxId = $res['max(datalog_id)'];

vogelor's avatar
vogelor committed
594
595
	/* Then delete server by server */
	foreach($records as $server) {
596
597
		$tmp_server_id = intval($server['server_id']);
		if($tmp_server_id > 0) {
598
599
			$sql = 	"DELETE FROM sys_datalog " .
					"WHERE tstamp < " . $tstamp .
600
					" AND server_id = " . intval($server['server_id']) .
601
602
					" AND datalog_id < " . intval($server['updated']) .
					" AND datalog_id < " . intval($maxId);
603
		}
vogelor's avatar
vogelor committed
604
605
606
607
//		echo $sql . "\n";
		$app->dbmaster->query($sql);
	}
}
608

609
#######################################################################################################
610
// enforce traffic quota (run only on the "master-server")
611
612
613
614
#######################################################################################################

if ($app->dbmaster == $app->db) {

615
616
	$global_config = $app->getconf->get_global_config('mail');
	
617
	$current_month = date('Y-m');
618

619
	//* Check website traffic quota
620
	$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')";
621
622
623
	$records = $app->db->queryAllRecords($sql);
	if(is_array($records)) {
		foreach($records as $rec) {
624

625
			$web_traffic_quota = $rec['traffic_quota'];
626
			$domain = $rec['domain'];
627

628
629
630
631
632
			// 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']));
633

634
635
636
			$client_traffic_quota = intval($client['limit_traffic_quota']);
			$reseller_traffic_quota = intval($reseller['limit_traffic_quota']);
			*/
637

638
			//* get the traffic
639
			$tmp = $app->db->queryOneRecord("SELECT SUM(traffic_bytes) As total_traffic_bytes FROM web_traffic WHERE traffic_date like '$current_month%' AND hostname = '$domain'");
640
			$web_traffic = round($tmp['total_traffic_bytes']/1024/1024);
641

642
643
644
645
646
			//* 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) {
647
				$app->dbmaster->datalogUpdate('web_domain', "traffic_quota_lock = 'y',active = 'n'", 'domain_id', $rec['domain_id']);
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
				$app->log('Traffic quota for '.$rec['domain'].' exceeded. Disabling website.',LOGLEVEL_DEBUG);
				
				//* Send traffic notifications
				if($web_config['overtraffic_notify_admin'] == 'y' || $web_config['overtraffic_notify_client'] == 'y') {
					
					if(file_exists($conf['rootpath'].'/conf-custom/mail/web_traffic_notification_'.$conf['language'].'.txt')) {
						$lines = file($conf['rootpath'].'/conf-custom/mail/web_traffic_notification_'.$conf['language'].'.txt');
					} elseif(file_exists($conf['rootpath'].'/conf-custom/mail/web_traffic_notification_en.txt')) {
						$lines = file($conf['rootpath'].'/conf-custom/mail/web_traffic_notification_en.txt');
					} elseif(file_exists($conf['rootpath'].'/conf/mail/web_traffic_notification_'.$conf['language'].'.txt')) {
						$lines = file($conf['rootpath'].'/conf/mail/web_traffic_notification_'.$conf['language'].'.txt');
					} else {
						$lines = file($conf['rootpath'].'/conf/mail/web_traffic_notification_en.txt');
					}
					
					//* Get subject
					$parts = explode(':',trim($lines[0]));
					unset($parts[0]);
					$traffic_mail_subject  = implode(':',$parts);
					unset($lines[0]);
		
					//* Get message
					$traffic_mail_message = trim(implode($lines));
					unset($tmp);
					
					//* Replace placeholders
					$traffic_mail_message = str_replace('{domain}',$rec['domain'],$traffic_mail_message);
						
					$mailHeaders      = "MIME-Version: 1.0" . "\n";
					$mailHeaders     .= "Content-type: text/plain; charset=utf-8" . "\n";
					$mailHeaders     .= "Content-Transfer-Encoding: 8bit" . "\n";
					$mailHeaders     .= "From: ". $global_config['admin_mail'] . "\n";
					$mailHeaders     .= "Reply-To: ". $global_config['admin_mail'] . "\n";
					$mailSubject      = "=?utf-8?B?".base64_encode($traffic_mail_subject)."?=";
					
					//* send email to admin
					if($global_config['admin_mail'] != '' && $web_config['overtraffic_notify_admin'] == 'y') {
						mail($global_config['admin_mail'], $mailSubject, $traffic_mail_message, $mailHeaders);
					}
					
					//* Send email to client
					if($web_config['overtraffic_notify_admin'] == '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'] != '') {
							mail($client['email'], $mailSubject, $traffic_mail_message, $mailHeaders);
						}
					}
					
				}
				
				
700
701
702
			} else {
				//* unlock the website, if traffic is lower then quota
				if($rec['traffic_quota_lock'] == 'y') {
703
					$app->dbmaster->datalogUpdate('web_domain', "traffic_quota_lock = 'n',active = 'y'", 'domain_id', $rec['domain_id']);
704
					$app->log('Traffic quota for '.$rec['domain'].' ok again. Re-enabling website.',LOGLEVEL_DEBUG);
705
706
707
708
				}
			}
		}
	}
709
710


711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
}


#######################################################################################################
// deactivate virtual servers (run only on the "master-server")
#######################################################################################################

if ($app->dbmaster == $app->db) {
	$current_date = date('Y-m-d');

	//* Check which virtual machines have to be deactivated
	$sql = "SELECT * FROM openvz_vm WHERE active = 'y' AND active_until_date != '0000-00-00' AND active_until_date < '$current_date'";
	$records = $app->db->queryAllRecords($sql);
	if(is_array($records)) {
		foreach($records as $rec) {
			$app->dbmaster->datalogUpdate('openvz_vm', "active = 'n'", 'vm_id', $rec['vm_id']);
			$app->log('Virtual machine active date expired. Disabling VM '.$rec['veid'],LOGLEVEL_DEBUG);
		}
	}


732
733
}

734
735
736
737
#######################################################################################################
// Create website backups
#######################################################################################################

738
$server_config = $app->getconf->get_server_config($conf['server_id'], 'server');
739
$backup_dir = $server_config['backup_dir'];
740
741
742
743
744
$backup_mode = $server_config['backup_mode'];
if($backup_mode == '') $backup_mode = 'userzip';

$web_config = $app->getconf->get_server_config($conf['server_id'], 'web');
$http_server_user = $web_config['user'];
745
746

if($backup_dir != '') {
maddinxx's avatar
maddinxx committed
747

748
749
750
751
752
	if(isset($server_config['backup_dir_ftpread']) && $server_config['backup_dir_ftpread'] == 'y') {
		$backup_dir_permissions = 0755;
	} else {
		$backup_dir_permissions = 0750;
	}
maddinxx's avatar
maddinxx committed
753

754
	if(!is_dir($backup_dir)) {
755
756
757
		mkdir(escapeshellcmd($backup_dir), $backup_dir_permissions, true);
	} else {
		chmod(escapeshellcmd($backup_dir), $backup_dir_permissions);
758
	}
maddinxx's avatar
maddinxx committed
759

760
	$sql = "SELECT * FROM web_domain WHERE server_id = '".$conf['server_id']."' AND (type = 'vhost' OR type = 'vhostsubdomain') AND backup_interval != 'none'";
761
762
763
	$records = $app->db->queryAllRecords($sql);
	if(is_array($records)) {
		foreach($records as $rec) {
maddinxx's avatar
maddinxx committed
764

765
			//* Do the website backup
tbrehm's avatar
tbrehm committed
766
			if($rec['backup_interval'] == 'daily' or ($rec['backup_interval'] == 'weekly' && date('w') == 0) or ($rec['backup_interval'] == 'monthly' && date('d') == '01')) {
maddinxx's avatar
maddinxx committed
767

768
769
770
771
772
				$web_path = $rec['document_root'];
				$web_user = $rec['system_user'];
				$web_group = $rec['system_group'];
				$web_id = $rec['domain_id'];
				$web_backup_dir = $backup_dir.'/web'.$web_id;
773
				if(!is_dir($web_backup_dir)) mkdir($web_backup_dir, 0750);
maddinxx's avatar
maddinxx committed
774
				chmod($web_backup_dir, 0750);
775
				//if(isset($server_config['backup_dir_ftpread']) && $server_config['backup_dir_ftpread'] == 'y') {
maddinxx's avatar
maddinxx committed
776
				chown($web_backup_dir, $rec['system_user']);
777
778
				chgrp($web_backup_dir, $rec['system_group']);
				/*} else {
779
780
					chown($web_backup_dir, 'root');
					chgrp($web_backup_dir, 'root');
781
782
783
784
				}*/
				if($backup_mode == 'userzip') {
					//* Create a .zip backup as web user and include also files owned by apache / nginx user
					$web_backup_file = 'web'.$web_id.'_'.date('Y-m-d_H-i').'.zip';
785
786
					exec('cd '.escapeshellarg($web_path).' && sudo -u '.escapeshellarg($web_user).' find . -group '.escapeshellarg($web_group).' -print 2> /dev/null | zip -b /tmp --exclude=backup\* --symlinks '.escapeshellarg($web_backup_dir.'/'.$web_backup_file).' -@');
					exec('cd '.escapeshellarg($web_path).' && sudo -u '.escapeshellarg($web_user).' find . -user '.escapeshellarg($http_server_user).' -print 2> /dev/null | zip -b /tmp --exclude=backup\* --update --symlinks '.escapeshellarg($web_backup_dir.'/'.$web_backup_file).' -@');
787
788
789
790
				} else {
					//* Create a tar.gz backup as root user
					$web_backup_file = 'web'.$web_id.'_'.date('Y-m-d_H-i').'.tar.gz';
					exec('tar pczf '.escapeshellarg($web_backup_dir.'/'.$web_backup_file).' --exclude=backup\* --directory '.escapeshellarg($web_path).' .');
791
				}
maddinxx's avatar
maddinxx committed
792
				chown($web_backup_dir.'/'.$web_backup_file, 'root');
793
794
				chgrp($web_backup_dir.'/'.$web_backup_file, 'root');
				chmod($web_backup_dir.'/'.$web_backup_file, 0750);
maddinxx's avatar
maddinxx committed
795

796
				//* Insert web backup record in database
797
798
799
800
				//$insert_data = "(server_id,parent_domain_id,backup_type,backup_mode,tstamp,filename) VALUES (".$conf['server_id'].",".$web_id.",'web','".$backup_mode."',".time().",'".$app->db->quote($web_backup_file)."')";
				//$app->dbmaster->datalogInsert('web_backup', $insert_data, 'backup_id');
				$sql = "INSERT INTO web_backup (server_id,parent_domain_id,backup_type,backup_mode,tstamp,filename) VALUES (".$conf['server_id'].",".$web_id.",'web','".$backup_mode."',".time().",'".$app->db->quote($web_backup_file)."')";
				$app->db->query($sql);
801
				if($app->db->dbHost != $app->dbmaster->dbHost) $app->dbmaster->query($sql);
802
				
803
				//* Remove old backups
804
				$backup_copies = intval($rec['backup_copies']);
maddinxx's avatar
maddinxx committed
805

806
807
808
809
810
811
				$dir_handle = dir($web_backup_dir);
				$files = array();
				while (false !== ($entry = $dir_handle->read())) {
					if($entry != '.' && $entry != '..' && substr($entry,0,3) == 'web' && is_file($web_backup_dir.'/'.$entry)) {
						$files[] = $entry;
					}
812
				}
813
				$dir_handle->close();
maddinxx's avatar
maddinxx committed
814

815
				rsort($files);
maddinxx's avatar
maddinxx committed
816

817
818
819
				for ($n = $backup_copies; $n <= 10; $n++) {
					if(isset($files[$n]) && is_file($web_backup_dir.'/'.$files[$n])) {
						unlink($web_backup_dir.'/'.$files[$n]);
820
821
						//$sql = "SELECT backup_id FROM web_backup WHERE server_id = ".$conf['server_id']." AND parent_domain_id = $web_id AND filename = '".$app->db->quote($files[$n])."'";
						//$tmp = $app->dbmaster->queryOneRecord($sql);
822
						//$app->dbmaster->datalogDelete('web_backup', 'backup_id', $tmp['backup_id']);
823
824
						//$sql = "DELETE FROM web_backup WHERE backup_id = ".intval($tmp['backup_id']);
						$sql = "DELETE FROM web_backup WHERE server_id = ".$conf['server_id']." AND parent_domain_id = $web_id AND filename = '".$app->db->quote($files[$n])."'";
825
						$app->db->query($sql);
826
						if($app->db->dbHost != $app->dbmaster->dbHost) $app->dbmaster->query($sql);
827
828
					}
				}
maddinxx's avatar
maddinxx committed
829

830
831
				unset($files);
				unset($dir_handle);
maddinxx's avatar
maddinxx committed
832

833
				//* Remove backupdir symlink and create as directory instead
834
835
836
				$app->uses('system');
				$app->system->web_folder_protection($web_path,false);
				
837
838
839
840
841
				if(is_link($web_path.'/backup')) {
					unlink($web_path.'/backup');
				}
				if(!is_dir($web_path.'/backup')) {
					mkdir($web_path.'/backup');
maddinxx's avatar
maddinxx committed
842
					chown($web_path.'/backup', $rec['system_user']);
843
844
					chgrp($web_path.'/backup', $rec['system_group']);
				}
845
846
				
				$app->system->web_folder_protection($web_path,true);
maddinxx's avatar
maddinxx committed
847

848
			}
maddinxx's avatar
maddinxx committed
849
850

			/* If backup_interval is set to none and we have a
851
852
853
854
855
856
			backup directory for the website, then remove the backups */
			if($rec['backup_interval'] == 'none') {
				$web_id = $rec['domain_id'];
				$web_user = $rec['system_user'];
				$web_backup_dir = realpath($backup_dir.'/web'.$web_id);
				if(is_dir($web_backup_dir)) {
857
					exec('sudo -u '.escapeshellarg($web_user).' rm -f '.escapeshellarg($web_backup_dir.'/*'));
858
859
860
861
				}
			}
		}
	}
maddinxx's avatar
maddinxx committed
862

863
864
865
	$sql = "SELECT * FROM web_database WHERE server_id = '".$conf['server_id']."' AND backup_interval != 'none'";
	$records = $app->db->queryAllRecords($sql);
	if(is_array($records)) {
maddinxx's avatar
maddinxx committed
866

867
		include('lib/mysql_clientdb.conf');
maddinxx's avatar
maddinxx committed
868

869
		foreach($records as $rec) {
maddinxx's avatar
maddinxx committed
870

871
872
			//* Do the database backup
			if($rec['backup_interval'] == 'daily' or ($rec['backup_interval'] == 'weekly' && date('w') == 0) or ($rec['backup_interval'] == 'monthly' && date('d') == '01')) {
maddinxx's avatar
maddinxx committed
873

874
875
876
				$web_id = $rec['parent_domain_id'];
				$db_backup_dir = $backup_dir.'/web'.$web_id;
				if(!is_dir($web_backup_dir)) mkdir($web_backup_dir, 0750);
maddinxx's avatar
maddinxx committed
877
				chmod($web_backup_dir, 0750);
878
879
880
881
882
883
884
885
886
				chown($web_backup_dir, 'root');
				chgrp($web_backup_dir, 'root');

				//* Do the mysql database backup with mysqldump
				$db_id = $rec['database_id'];
				$db_name = $rec['database_name'];
				$db_backup_file = 'db_'.$db_name.'_'.date('Y-m-d_H-i').'.sql';
				$command = "mysqldump -h '".escapeshellcmd($clientdb_host)."' -u '".escapeshellcmd($clientdb_user)."' -p'".escapeshellcmd($clientdb_password)."' -c --add-drop-table --create-options --quick --result-file='".$db_backup_dir.'/'.$db_backup_file."' '".$db_name."'";
				exec($command);
maddinxx's avatar
maddinxx committed
887

888
889
890
				//* Compress the backup with gzip
				exec("gzip -c '".escapeshellcmd($db_backup_dir.'/'.$db_backup_file)."' > '".escapeshellcmd($db_backup_dir.'/'.$db_backup_file).".gz'");
				chmod($db_backup_dir.'/'.$db_backup_file.'.gz', 0750);
maddinxx's avatar
maddinxx committed
891
				chown($db_backup_dir.'/'.$db_backup_file.'.gz', fileowner($db_backup_dir));
892
				chgrp($db_backup_dir.'/'.$db_backup_file.'.gz', filegroup($db_backup_dir));
maddinxx's avatar
maddinxx committed
893

894
				//* Insert web backup record in database
895
896
897
898
				//$insert_data = "(server_id,parent_domain_id,backup_type,backup_mode,tstamp,filename) VALUES (".$conf['server_id'].",$web_id,'mysql','sqlgz',".time().",'".$app->db->quote($db_backup_file).".gz')";
				//$app->dbmaster->datalogInsert('web_backup', $insert_data, 'backup_id');
				$sql = "INSERT INTO web_backup (server_id,parent_domain_id,backup_type,backup_mode,tstamp,filename) VALUES (".$conf['server_id'].",$web_id,'mysql','sqlgz',".time().",'".$app->db->quote($db_backup_file).".gz')";
				$app->db->query($sql);
899
				if($app->db->dbHost != $app->dbmaster->dbHost) $app->dbmaster->query($sql);
maddinxx's avatar
maddinxx committed
900

901
902
				//* Remove the uncompressed file
				unlink($db_backup_dir.'/'.$db_backup_file);
maddinxx's avatar
maddinxx committed
903

904
905
				//* Remove old backups
				$backup_copies = intval($rec['backup_copies']);
maddinxx's avatar
maddinxx committed
906

907
908
909
				$dir_handle = dir($db_backup_dir);
				$files = array();
				while (false !== ($entry = $dir_handle->read())) {
910
911
912
					if($entry != '.' && $entry != '..' && preg_match('/^db_(.*?)_\d{4}-\d{2}-\d{2}_\d{2}-\d{2}\.sql.gz$/', $entry, $matches) && is_file($db_backup_dir.'/'.$entry)) {
                        if(array_key_exists($matches[1], $files) == false) $files[$matches[1]] = array();
						$files[$matches[1]][] = $entry;
913
914
915
					}
				}
				$dir_handle->close();
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
                
                reset($files);
                foreach($files as $db_name => $filelist) {
                    rsort($filelist);
                    for ($n = $backup_copies; $n <= 10; $n++) {
                        if(isset($filelist[$n]) && is_file($db_backup_dir.'/'.$filelist[$n])) {
                            unlink($db_backup_dir.'/'.$filelist[$n]);
                            //$sql = "SELECT backup_id FROM web_backup WHERE server_id = ".$conf['server_id']." AND parent_domain_id = $web_id AND filename = '".$app->db->quote($filelist[$n])."'";
                            //$tmp = $app->dbmaster->queryOneRecord($sql);
                            //$sql = "DELETE FROM web_backup WHERE backup_id = ".intval($tmp['backup_id']);
							$sql = "DELETE FROM web_backup WHERE server_id = ".$conf['server_id']." AND parent_domain_id = $web_id AND filename = '".$app->db->quote($filelist[$n])."'";
                            $app->db->query($sql);
                            if($app->db->dbHost != $app->dbmaster->dbHost) $app->dbmaster->query($sql);
                        }
                    }
                }
maddinxx's avatar
maddinxx committed
932

933
934
935
936
				unset($files);
				unset($dir_handle);
			}
		}
maddinxx's avatar
maddinxx committed
937

938
939
940
		unset($clientdb_host);
		unset($clientdb_user);
		unset($clientdb_password);
maddinxx's avatar
maddinxx committed
941

942
	}
943
944
}

945

946
die("finished.\n");
947
?>