From 2332b2279d8a8599b4f041370315edc9544b1560 Mon Sep 17 00:00:00 2001
From: tbrehm <t.brehm@ispconfig.org>
Date: Fri, 02 Aug 2013 10:48:38 -0400
Subject: [PATCH] Added support for mongodb. Many thanks to MaddinXx for the patch. http://www.howtoforge.com/forums/showthread.php?t=62691
---
server/cron_daily.php | 248 ++++++++++++++++++++++++++++---------------------
1 files changed, 143 insertions(+), 105 deletions(-)
diff --git a/server/cron_daily.php b/server/cron_daily.php
index 9d7ca00..21d8f84 100644
--- a/server/cron_daily.php
+++ b/server/cron_daily.php
@@ -54,7 +54,7 @@
foreach($records as $rec) {
if(@is_file($rec['maildir'].'/ispconfig_mailsize')) {
$parse_mail_log = false;
-
+
// rename file
rename($rec['maildir'].'/ispconfig_mailsize',$rec['maildir'].'/ispconfig_mailsize_save');
@@ -92,15 +92,15 @@
$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) {
@@ -108,15 +108,15 @@
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;
@@ -146,17 +146,17 @@
}
}
}
-
+
$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";
@@ -166,7 +166,7 @@
//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']) {
@@ -178,7 +178,7 @@
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']);
@@ -188,7 +188,7 @@
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";
@@ -198,7 +198,7 @@
//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
@@ -207,7 +207,7 @@
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']);
@@ -218,7 +218,7 @@
}
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'];
@@ -238,7 +238,7 @@
//echo $sql;
}
}
-
+
unset($mailbox_traffic);
if($last_line) file_put_contents($state_file, $last_line);
}
@@ -278,7 +278,7 @@
foreach($records as $rec) {
//$yesterday = date('Ymd',time() - 86400);
$yesterday = date('Ymd',strtotime("-1 day", time()));
-
+
$log_folder = 'log';
if($rec['type'] == 'vhostsubdomain') {
$tmp = $app->db->queryOneRecord('SELECT `domain` FROM web_domain WHERE domain_id = '.intval($rec['parent_domain_id']));
@@ -330,7 +330,7 @@
foreach($records as $rec) {
//$yesterday = date('Ymd',time() - 86400);
$yesterday = date('Ymd',strtotime("-1 day", time()));
-
+
$log_folder = 'log';
if($rec['type'] == 'vhostsubdomain') {
$tmp = $app->db->queryOneRecord('SELECT `domain` FROM web_domain WHERE domain_id = '.intval($rec['parent_domain_id']));
@@ -452,7 +452,7 @@
//* create traffic statistics based on yesterdays access log file
$yesterday = date('Ymd',time() - 86400);
-
+
$log_folder = 'log';
if($rec['type'] == 'vhostsubdomain') {
$tmp = $app->db->queryOneRecord('SELECT `domain` FROM web_domain WHERE domain_id = '.intval($rec['parent_domain_id']));
@@ -461,7 +461,7 @@
$log_folder .= '/' . $subdomain_host;
unset($tmp);
}
-
+
$logfile = $rec['document_root'].'/' . $log_folder . '/'.$yesterday.'-access.log';
$total_bytes = 0;
@@ -646,10 +646,10 @@
#########
function send_notification_email($template, $placeholders, $recipients) {
global $conf;
-
+
if(!is_array($recipients) || count($recipients) < 1) return false;
if(!is_array($placeholders)) $placeholders = array();
-
+
if(file_exists($conf['rootpath'].'/conf-custom/mail/' . $template . '_'.$conf['language'].'.txt')) {
$lines = file($conf['rootpath'].'/conf-custom/mail/' . $template . '_'.$conf['language'].'.txt');
} elseif(file_exists($conf['rootpath'].'/conf-custom/mail/' . $template . '_en.txt')) {
@@ -659,7 +659,7 @@
} else {
$lines = file($conf['rootpath'].'/conf/mail/' . $template . '_en.txt');
}
-
+
//* get mail headers, subject and body
$mailHeaders = '';
$mailBody = '';
@@ -680,12 +680,12 @@
}
}
$mailBody = trim($mailBody);
-
+
//* Replace placeholders
$mailHeaders = strtr($mailHeaders, $placeholders);
$mailSubject = strtr($mailSubject, $placeholders);
$mailBody = strtr($mailBody, $placeholders);
-
+
for($r = 0; $r < count($recipients); $r++) {
mail($recipients[$r], $mailSubject, $mailBody, $mailHeaders);
}
@@ -694,7 +694,7 @@
unset($mailHeaders);
unset($mailBody);
unset($lines);
-
+
return true;
}
@@ -706,7 +706,7 @@
if ($app->dbmaster == $app->db) {
$global_config = $app->getconf->get_global_config('mail');
-
+
$current_month = date('Y-m');
//* Check website traffic quota
@@ -739,19 +739,19 @@
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 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']);
-
+
+ $placeholders = array('{domain}' => $rec['domain'],
+ '{admin_mail}' => $global_config['admin_mail']);
+
$recipients = array();
- //* send email to admin
+ //* send email to admin
if($global_config['admin_mail'] != '' && $web_config['overtraffic_notify_admin'] == 'y') {
$recipients[] = $global_config['admin_mail'];
}
-
+
//* Send email to client
if($web_config['overtraffic_notify_client'] == 'y') {
$client_group_id = $rec["sys_groupid"];
@@ -760,11 +760,10 @@
$recipients[] = $client['email'];
}
}
-
- send_notification_email('web_traffic_notification', $placeholders, $recipients);
+
+ send_notification_email('web_traffic_notification', $placeholders, $recipients);
}
-
-
+
} else {
//* unlock the website, if traffic is lower then quota
if($rec['traffic_quota_lock'] == 'y') {
@@ -791,7 +790,7 @@
$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)) {
-
+
$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)) {
@@ -799,18 +798,18 @@
$monitor_data = array_merge_recursive($monitor_data,unserialize($app->db->unquote($tmp_mon['data'])));
}
}
-
+
foreach($records as $rec) {
//$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];
@@ -821,22 +820,22 @@
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){
@@ -844,7 +843,7 @@
} else {
$rec['soft'] .= ' KB';
}
-
+
if($rec['hard'] > 1024) {
$rec['hard'] = round($rec['hard'] / 1024,2).' MB';
} elseif($rec['hard'] == 0){
@@ -852,12 +851,12 @@
} 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', "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'],
@@ -868,12 +867,12 @@
'{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"];
@@ -884,19 +883,19 @@
}
send_notification_email('web_quota_ok_notification', $placeholders, $recipients);
}
-
+
continue;
}
-
+
// could a notification be sent?
$send_notification = false;
if(!$rec['last_quota_notification']) $send_notification = true; // not yet notified
elseif($web_config['overquota_notify_freq'] > 0 && $rec['notified_before'] >= $web_config['overquota_notify_freq']) $send_notification = true;
-
+
//* Send quota notifications
if(($web_config['overquota_notify_admin'] == 'y' || $web_config['overquota_notify_client'] == 'y') && $send_notification == true) {
$app->dbmaster->datalogUpdate('web_domain', "last_quota_notification = CURDATE()", 'domain_id', $rec['domain_id']);
-
+
$placeholders = array('{domain}' => $rec['domain'],
'{admin_mail}' => $global_config['admin_mail'],
'{used}' => $rec['used'],
@@ -905,12 +904,12 @@
'{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"];
@@ -939,7 +938,7 @@
$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)) {
@@ -953,24 +952,24 @@
}
}
}
-
+
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, '.', '').'%';
-
+
if($rec['quota'] > 0){
$rec['quota'] = round($rec['quota'] / 1048576,4).' MB';
} else {
@@ -981,8 +980,8 @@
$rec['used'] = round($rec['used'] / 1024,4).' KB';
} else {
$rec['used'] = round($rec['used'] / 1048576,4).' MB';
- }
-
+ }
+
// send notifications only if 90% or more of the quota are used
if($used_ratio < 0.9) {
// reset notification date
@@ -996,13 +995,13 @@
'{name}' => $rec['name'],
'{quota}' => $rec['quota'],
'{ratio}' => $rec['ratio']);
-
+
$recipients = array();
//* send email to admin
if($global_config['admin_mail'] != '' && $mail_config['overquota_notify_admin'] == 'y') {
$recipients[] = $global_config['admin_mail'];
}
-
+
//* Send email to client
if($mail_config['overquota_notify_client'] == 'y') {
$client_group_id = $rec["sys_groupid"];
@@ -1011,35 +1010,35 @@
$recipients[] = $client['email'];
}
}
-
+
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'],
'{used}' => $rec['used'],
'{name}' => $rec['name'],
'{quota}' => $rec['quota'],
'{ratio}' => $rec['ratio']);
-
+
$recipients = array();
//* send email to admin
if($global_config['admin_mail'] != '' && $mail_config['overquota_notify_admin'] == 'y') {
$recipients[] = $global_config['admin_mail'];
}
-
+
//* Send email to client
if($mail_config['overquota_notify_client'] == 'y') {
$client_group_id = $rec["sys_groupid"];
@@ -1048,9 +1047,9 @@
$recipients[] = $client['email'];
}
}
-
+
send_notification_email('mail_quota_notification', $placeholders, $recipients);
- }
+ }
}
}
}
@@ -1081,7 +1080,7 @@
#######################################################################################################
function formatBytes($size, $precision = 2) {
$base=log($size)/log(1024);
- $suffixes=array('','k','M','G','T');
+ $suffixes=array('','k','M','G','T');
return round(pow(1024,$base-floor($base)),$precision).$suffixes[floor($base)];
}
@@ -1153,7 +1152,7 @@
} else {
if(is_file($web_backup_dir.'/'.$web_backup_file)) unlink($web_backup_dir.'/'.$web_backup_file);
}
-
+
//* Remove old backups
$backup_copies = intval($rec['backup_copies']);
@@ -1187,7 +1186,7 @@
//* Remove backupdir symlink and create as directory instead
$app->uses('system');
$app->system->web_folder_protection($web_path,false);
-
+
if(is_link($web_path.'/backup')) {
unlink($web_path.'/backup');
}
@@ -1196,7 +1195,7 @@
chown($web_path.'/backup', $rec['system_user']);
chgrp($web_path.'/backup', $rec['system_group']);
}
-
+
$app->system->web_folder_protection($web_path,true);
}
@@ -1232,33 +1231,72 @@
chown($db_backup_dir, 'root');
chgrp($db_backup_dir, 'root');
- //* Do the mysql database backup with mysqldump
+ //* Do the mysql database backup with mysqldump or mongodump
$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, $tmp_output, $retval);
- //* Compress the backup with gzip
- if($retval == 0) exec("gzip -c '".escapeshellcmd($db_backup_dir.'/'.$db_backup_file)."' > '".escapeshellcmd($db_backup_dir.'/'.$db_backup_file).".gz'", $tmp_output, $retval);
-
- if($retval == 0){
- chmod($db_backup_dir.'/'.$db_backup_file.'.gz', 0750);
- chown($db_backup_dir.'/'.$db_backup_file.'.gz', fileowner($db_backup_dir));
- chgrp($db_backup_dir.'/'.$db_backup_file.'.gz', filegroup($db_backup_dir));
+ if ($rec['type'] == 'mysql') {
+ $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, $tmp_output, $retval);
- //* Insert web backup record in database
- //$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);
- if($app->db->dbHost != $app->dbmaster->dbHost) $app->dbmaster->query($sql);
+ //* Compress the backup with gzip
+ if($retval == 0) exec("gzip -c '".escapeshellcmd($db_backup_dir.'/'.$db_backup_file)."' > '".escapeshellcmd($db_backup_dir.'/'.$db_backup_file).".gz'", $tmp_output, $retval);
- } else {
- if(is_file($db_backup_dir.'/'.$db_backup_file.'.gz')) unlink($db_backup_dir.'/'.$db_backup_file.'.gz');
+ if($retval == 0){
+ chmod($db_backup_dir.'/'.$db_backup_file.'.gz', 0750);
+ chown($db_backup_dir.'/'.$db_backup_file.'.gz', fileowner($db_backup_dir));
+ chgrp($db_backup_dir.'/'.$db_backup_file.'.gz', filegroup($db_backup_dir));
+
+ //* Insert web backup record in database
+ //$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);
+ if($app->db->dbHost != $app->dbmaster->dbHost) $app->dbmaster->query($sql);
+
+ } else {
+ if(is_file($db_backup_dir.'/'.$db_backup_file.'.gz')) unlink($db_backup_dir.'/'.$db_backup_file.'.gz');
+ }
+ //* Remove the uncompressed file
+ if(is_file($db_backup_dir.'/'.$db_backup_file)) unlink($db_backup_dir.'/'.$db_backup_file);
+ } else if ($rec['type'] == 'mongo') {
+ $db_backup_file = 'db_'.$db_name.'_'.date('Y-m-d_H-i');
+
+ try {
+ $connection = new MongoClient("mongodb://root:123456@127.0.0.1:27017/admin");
+ $db = $connection->selectDB($db_name);
+ // exclude not supported by mongodump, only get user collections
+ $collections = $db->getCollectionNames(false);
+
+ foreach ($collections as $collection) {
+ // mongodump -h 127.0.0.1 --port 27017 -u root -p 123456 --authenticationDatabase admin -d <db> -c <table> -o /tmp/test
+ $command = "mongodump -h 127.0.0.1 --port 27017 -u root -p 123456 --authenticationDatabase admin -d ".escapeshellcmd($db_name)." -c ".escapeshellcmd($collection)." -o ".escapeshellcmd($db_backup_dir.'/'.$db_backup_file);
+ exec($command);
+ }
+
+ if (is_dir(escapeshellcmd($db_backup_dir.'/'.$db_backup_file))) {
+ //* Compress the backup with gzip
+ exec("cd ".escapeshellcmd($db_backup_dir)." && tar -pczf ".escapeshellcmd($db_backup_dir.'/'.$db_backup_file).".tar.gz ".escapeshellcmd($db_backup_file));
+ chmod($db_backup_dir.'/'.$db_backup_file.'.tar.gz', 0750);
+ chown($db_backup_dir.'/'.$db_backup_file.'.tar.gz', fileowner($db_backup_dir));
+ chgrp($db_backup_dir.'/'.$db_backup_file.'.tar.gz', filegroup($db_backup_dir));
+
+ //* Insert web backup record in database
+ $sql = "INSERT INTO web_backup (server_id,parent_domain_id,backup_type,backup_mode,tstamp,filename) VALUES (".$conf['server_id'].",$web_id,'mongodb','rootgz',".time().",'".$app->db->quote($db_backup_file).".tar.gz')";
+ $app->db->query($sql);
+
+ if ($app->db->dbHost != $app->dbmaster->dbHost) {
+ $app->dbmaster->query($sql);
+ }
+
+ //* Remove the uncompressed file
+ exec("rm -rf ".escapeshellcmd($db_backup_dir.'/'.$db_backup_file));
+ }
+ } catch (MongoConnnectionException $e) {
+ // connecting to MongoDB failed - cannot create backup
+ }
}
- //* Remove the uncompressed file
- if(is_file($db_backup_dir.'/'.$db_backup_file)) unlink($db_backup_dir.'/'.$db_backup_file);
//* Remove old backups
$backup_copies = intval($rec['backup_copies']);
@@ -1266,13 +1304,13 @@
$dir_handle = dir($db_backup_dir);
$files = array();
while (false !== ($entry = $dir_handle->read())) {
- 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($entry != '.' && $entry != '..' && (preg_match('/^db_(.*?)_\d{4}-\d{2}-\d{2}_\d{2}-\d{2}\.sql.gz$/', $entry, $matches) || preg_match('/^db_(.*?)_\d{4}-\d{2}-\d{2}_\d{2}-\d{2}\.tar.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;
}
}
$dir_handle->close();
-
+
reset($files);
foreach($files as $db_name => $filelist) {
rsort($filelist);
--
Gitblit v1.9.1