Skip to content

Commit e100328

Browse files
author
Marius Cramer
committed
Merge branch 'master' into 'master'
Master
2 parents e2b4f76 + caee7b0 commit e100328

File tree

2 files changed

+61
-35
lines changed

2 files changed

+61
-35
lines changed

server/lib/classes/cron.d/500-backup_mail.inc.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,13 +95,15 @@ public function onRunJob() {
9595
$domain_dir=explode('/',$rec['maildir']);
9696
$_temp=array_pop($domain_dir);unset($_temp);
9797
$domain_dir=implode('/',$domain_dir);
98-
99-
$source_dir=array_pop(explode('/',$rec['maildir']));
98+
99+
$parts=explode('/',$rec['maildir']);
100+
$source_dir=array_pop($parts);
101+
unset($parts);
100102

101103
//* create archives
102104
if($backup_mode == 'userzip') {
103105
$mail_backup_file.='.zip';
104-
exec('cd '.$rec['homedir'].' && zip -b /tmp -r '.$mail_backup_dir.'/'.$mail_backup_file.' '.$source_dir.' > /dev/nul');
106+
exec('cd '.$domain_dir.' && zip '.$mail_backup_dir.'/'.$mail_backup_file.' -b /tmp -r '.$source_dir.' > /dev/nul', $tmp_output, $retval);
105107
} else {
106108
/* Create a tar.gz backup */
107109
$mail_backup_file.='.tar.gz';

server/plugins-available/backup_plugin.inc.php

Lines changed: 56 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -170,44 +170,68 @@ public function backup_action($action_name, $data) {
170170
$app->uses('ini_parser,file,getconf');
171171

172172
$server_config = $app->getconf->get_server_config($conf['server_id'], 'server');
173-
$mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail');
174-
175-
$domain_rec = $app->db->queryOneRecord("SELECT * FROM mail_domain WHERE domain_id = ".intval($mail_backup['parent_domain_id']));
176-
177-
$backup_dir = $server_config['backup_dir'].'/mail'.$domain_rec['domain_id'];
178-
$mail_backup_file = $backup_dir.'/'.$mail_backup['filename'];
179-
180-
$sql = "SELECT * FROM mail_user WHERE server_id = '".$conf['server_id']."' AND mailuser_id = ".intval($mail_backup['mailuser_id']);
181-
$record = $app->db->queryOneRecord($sql);
182-
183-
//* strip mailbox from maildir
184-
$domain_dir=explode('/',$record['maildir']);
185-
$_temp=array_pop($domain_dir);unset($_temp);
186-
$domain_dir=implode('/',$domain_dir);
187-
if(file_exists($mail_backup_file) && $record['homedir'] != '' && $record['homedir'] != '/' && !stristr($mail_backup_file,'..') && !stristr($mail_backup_file,'etc') && $mail_config['homedir_path'] == $record['homedir'] && is_dir($domain_dir)) {
188-
if($mail_backup['backup_mode'] == 'userzip') {
189-
$command = 'sudo -u '.$mail_config['mailuser_name'].' unzip -qq -o '.escapeshellarg($mail_backup_file).' -d '.escapeshellarg($domain_dir).' 2> /dev/null';
190-
exec($command,$tmp_output, $retval);
191-
if($retval == 0){
192-
$app->log('Restored Mail backup '.$mail_backup_file,LOGLEVEL_DEBUG);
193-
} else {
194-
$app->log('Unable to restore Mail backup '.$mail_backup_file.' '.$tmp_output,LOGLEVEL_ERROR);
195-
}
173+
$backup_dir = $server_config['backup_dir'];
174+
175+
//* mount backup directory, if necessary
176+
$backup_dir_is_ready = true;
177+
$server_config['backup_dir_mount_cmd'] = trim($server_config['backup_dir_mount_cmd']);
178+
if($server_config['backup_dir_is_mount'] == 'y' && $server_config['backup_dir_mount_cmd'] != ''){
179+
if(!$app->system->is_mounted($backup_dir)){
180+
exec(escapeshellcmd($server_config['backup_dir_mount_cmd']));
181+
sleep(1);
182+
if(!$app->system->is_mounted($backup_dir)) $backup_dir_is_ready = false;
196183
}
197-
if($mail_backup['backup_mode'] == 'rootgz') {
198-
$command='tar xfz '.escapeshellarg($mail_backup_file).' --directory '.escapeshellarg($domain_dir);
199-
exec($command,$tmp_output, $retval);
200-
if($retval == 0){
201-
$app->log('Restored Mail backup '.$mail_backup_file,LOGLEVEL_DEBUG);
202-
} else {
203-
$app->log('Unable to restore Mail backup '.$mail_backup_file.' '.$tmp_output,LOGLEVEL_ERROR);
184+
}
185+
186+
if($backup_dir_is_ready){
187+
$mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail');
188+
$domain_rec = $app->db->queryOneRecord("SELECT * FROM mail_domain WHERE domain_id = ".intval($mail_backup['parent_domain_id']));
189+
190+
$backup_dir = $server_config['backup_dir'].'/mail'.$domain_rec['domain_id'];
191+
$mail_backup_file = $backup_dir.'/'.$mail_backup['filename'];
192+
193+
$sql = "SELECT * FROM mail_user WHERE server_id = '".$conf['server_id']."' AND mailuser_id = ".intval($mail_backup['mailuser_id']);
194+
$record = $app->db->queryOneRecord($sql);
195+
196+
//* strip mailbox from maildir
197+
$domain_dir=explode('/',$record['maildir']);
198+
$_temp=array_pop($domain_dir);unset($_temp);
199+
$domain_dir=implode('/',$domain_dir);
200+
201+
if(!is_dir($domain_dir)) {
202+
mkdir($domain_dir, 0700); //* never create the full path
203+
chown($domain_dir, $mail_config['mailuser_name']);
204+
chgrp($domain_dir, $mail_config['mailuser_group']);
205+
}
206+
207+
if(file_exists($mail_backup_file) && $record['homedir'] != '' && $record['homedir'] != '/' && !stristr($mail_backup_file,'..') && !stristr($mail_backup_file,'etc') && $mail_config['homedir_path'] == $record['homedir'] && is_dir($domain_dir)) {
208+
if($mail_backup['backup_mode'] == 'userzip') {
209+
copy($mail_backup_file, $domain_dir.'/'.$mail_backup['filename']);
210+
chgrp($domain_dir.'/'.$mail_backup['filename'], $mail_config['mailuser_group']);
211+
$command = 'sudo -u '.$mail_config['mailuser_name'].' unzip -qq -o '.escapeshellarg($domain_dir.'/'.$mail_backup['filename']).' -d '.escapeshellarg($domain_dir).' 2> /dev/null';
212+
exec($command,$tmp_output, $retval);
213+
unlink($domain_dir.'/'.$mail_backup['filename']);
214+
if($retval == 0){
215+
$app->log('Restored Mail backup '.$mail_backup_file,LOGLEVEL_DEBUG);
216+
} else {
217+
$app->log('Unable to restore Mail backup '.$mail_backup_file.' '.$tmp_output,LOGLEVEL_ERROR);
218+
}
219+
}
220+
if($mail_backup['backup_mode'] == 'rootgz') {
221+
$command='tar xfz '.escapeshellarg($mail_backup_file).' --directory '.escapeshellarg($domain_dir);
222+
exec($command,$tmp_output, $retval);
223+
if($retval == 0){
224+
$app->log('Restored Mail backup '.$mail_backup_file,LOGLEVEL_DEBUG);
225+
} else {
226+
$app->log('Unable to restore Mail backup '.$mail_backup_file.' '.$tmp_output,LOGLEVEL_ERROR);
227+
}
204228
}
205229
}
206230
} else {
207-
$app->log('Unable to restore Mail backup '.$mail_backup_file.' due to misconfiguration',LOGLEVEL_ERROR);
231+
$app->log('Backup directory not ready.', LOGLEVEL_DEBUG);
208232
}
209233
} else {
210-
$app->log('No backup with ID '.$backup_id.' found.',LOGLEVEL_DEBUG);
234+
$app->log('No backup with ID '.$backup_id.' found.', LOGLEVEL_DEBUG);
211235
}
212236

213237
return 'ok';

0 commit comments

Comments
 (0)