From 992797f73c92b413a7fecff02c27c61b7db55b43 Mon Sep 17 00:00:00 2001 From: Marius Cramer <m.cramer@pixcept.de> Date: Mon, 14 Oct 2013 09:54:49 -0400 Subject: [PATCH] Copied files from svn 3.0.5 stable branch (git migration) --- server/cron_daily.php | 275 ++++++++++++++++++++++++------------------------------ 1 files changed, 122 insertions(+), 153 deletions(-) diff --git a/server/cron_daily.php b/server/cron_daily.php index 029c4f3..3342cee 100644 --- a/server/cron_daily.php +++ b/server/cron_daily.php @@ -55,7 +55,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'); @@ -93,15 +93,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) { @@ -109,15 +109,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; @@ -147,17 +147,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"; @@ -167,7 +167,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']) { @@ -179,7 +179,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']); @@ -189,7 +189,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"; @@ -199,7 +199,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 @@ -208,7 +208,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']); @@ -219,7 +219,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']; @@ -239,7 +239,7 @@ //echo $sql; } } - + unset($mailbox_traffic); if($last_line) file_put_contents($state_file, $last_line); } @@ -279,7 +279,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'])); @@ -331,7 +331,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'])); @@ -453,7 +453,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'])); @@ -462,7 +462,7 @@ $log_folder .= '/' . $subdomain_host; unset($tmp); } - + $logfile = $rec['document_root'].'/' . $log_folder . '/'.$yesterday.'-access.log'; $total_bytes = 0; @@ -647,10 +647,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')) { @@ -660,7 +660,7 @@ } else { $lines = file($conf['rootpath'].'/conf/mail/' . $template . '_en.txt'); } - + //* get mail headers, subject and body $mailHeaders = ''; $mailBody = ''; @@ -681,12 +681,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); } @@ -695,7 +695,7 @@ unset($mailHeaders); unset($mailBody); unset($lines); - + return true; } @@ -707,7 +707,7 @@ if ($app->dbmaster == $app->db) { $global_config = $app->getconf->get_global_config('mail'); - + $current_month = date('Y-m'); //* Check website traffic quota @@ -740,19 +740,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'], + $placeholders = array('{domain}' => $rec['domain'], '{admin_mail}' => ($global_config['admin_mail'] != ''? $global_config['admin_mail'] : 'root')); $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"]; @@ -761,10 +761,11 @@ $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 +792,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 +800,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 +822,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 +845,7 @@ } else { $rec['soft'] .= ' KB'; } - + if($rec['hard'] > 1024) { $rec['hard'] = round($rec['hard'] / 1024,2).' MB'; } elseif($rec['hard'] == 0){ @@ -852,12 +853,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 +869,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 +885,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'] != ''? $global_config['admin_mail'] : 'root'), '{used}' => $rec['used'], @@ -905,12 +906,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 +940,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 +954,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 +982,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 +997,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 +1012,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'] != ''? $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']; } - + //* Send email to client if($mail_config['overquota_notify_client'] == 'y') { $client_group_id = $rec["sys_groupid"]; @@ -1048,9 +1049,9 @@ $recipients[] = $client['email']; } } - + send_notification_email('mail_quota_notification', $placeholders, $recipients); - } + } } } } @@ -1076,17 +1077,12 @@ } -####################################################################################################### -// Create website backups -####################################################################################################### -function formatBytes($size, $precision = 2) { - $base=log($size)/log(1024); - $suffixes=array('','k','M','G','T'); - return round(pow(1024,$base-floor($base)),$precision).$suffixes[floor($base)]; -} - -$server_config = $app->getconf->get_server_config($conf['server_id'], 'server'); -$backup_dir = $server_config['backup_dir']; +####################################################################################################### +// Create website backups +####################################################################################################### + +$server_config = $app->getconf->get_server_config($conf['server_id'], 'server'); +$backup_dir = $server_config['backup_dir']; $backup_mode = $server_config['backup_mode']; if($backup_mode == '') $backup_mode = 'userzip'; @@ -1139,7 +1135,7 @@ $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).' .', $tmp_output, $retval); } - if($retval == 0){ + if($retval == 0 || $backup_mode != 'userzip'){ // tar can return 1 (due to harmless warings) and still create valid backups chown($web_backup_dir.'/'.$web_backup_file, 'root'); chgrp($web_backup_dir.'/'.$web_backup_file, 'root'); chmod($web_backup_dir.'/'.$web_backup_file, 0750); @@ -1153,7 +1149,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 +1183,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,9 +1192,8 @@ chown($web_path.'/backup', $rec['system_user']); chgrp($web_path.'/backup', $rec['system_group']); } - + $app->system->web_folder_protection($web_path,true); - } /* If backup_interval is set to none and we have a @@ -1232,73 +1227,34 @@ chown($db_backup_dir, 'root'); chgrp($db_backup_dir, 'root'); - //* Do the mysql database backup with mysqldump or mongodump + //* 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."'"; + $command = "mysqldump -h ".escapeshellarg($clientdb_host)." -u ".escapeshellarg($clientdb_user)." -p".escapeshellarg($clientdb_password)." -c --add-drop-table --create-options --quick --result-file='".$db_backup_dir.'/'.$db_backup_file."' '".$db_name."'"; + exec($command, $tmp_output, $retval); - 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."'"; - $command = "mysqldump -h ".escapeshellarg($clientdb_host)." -u ".escapeshellarg($clientdb_user)." -p".escapeshellarg($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)); - //* 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); + //* 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); - 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 - } + } 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); //* Remove old backups $backup_copies = intval($rec['backup_copies']); @@ -1306,13 +1262,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) || preg_match('/^db_(.*?)_\d{4}-\d{2}-\d{2}_\d{2}-\d{2}\.tar.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) && 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); @@ -1339,6 +1295,19 @@ unset($clientdb_password); } + + // remove non-existing backups from database + $backups = $app->db->queryAllRecords("SELECT * FROM web_backup WHERE server_id = ".$conf['server_id']); + if(is_array($backups) && !empty($backups)){ + foreach($backups as $backup){ + $backup_file = $backup_dir.'/web'.$backup['parent_domain_id'].'/'.$backup['filename']; + if(!is_file($backup_file)){ + $sql = "DELETE FROM web_backup WHERE server_id = ".$conf['server_id']." AND parent_domain_id = ".$backup['parent_domain_id']." AND filename = '".$backup['filename']."'"; + $app->db->query($sql); + if($app->db->dbHost != $app->dbmaster->dbHost) $app->dbmaster->query($sql); + } + } + } } -- Gitblit v1.9.1