- It is now possible to exclude directories - on a per-vHost base - from website backups.
11 files modified
1 files added
New file |
| | |
| | | ALTER TABLE `web_domain` ADD `backup_excludes` MEDIUMTEXT NULL AFTER `backup_copies` ; |
| | |
| | | `custom_php_ini` mediumtext, |
| | | `backup_interval` VARCHAR( 255 ) NOT NULL DEFAULT 'none', |
| | | `backup_copies` INT NOT NULL DEFAULT '1', |
| | | `backup_excludes` mediumtext, |
| | | `active` enum('n','y') NOT NULL default 'y', |
| | | `traffic_quota_lock` enum('n','y') NOT NULL default 'n', |
| | | `fastcgi_php_version` varchar(255) DEFAULT NULL, |
| | |
| | | 'default' => '', |
| | | 'value' => array('1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9', '10' => '10') |
| | | ), |
| | | 'backup_excludes' => array ( |
| | | 'datatype' => 'VARCHAR', |
| | | 'validators' => array ( 0 => array ( 'type' => 'REGEX', |
| | | 'regex' => '@^(?!.*\.\.)[-a-zA-Z0-9_/.~,]*$@', |
| | | 'errmsg'=> 'backup_excludes_error_regex'), |
| | | ), |
| | | 'formtype' => 'TEXT', |
| | | 'default' => '', |
| | | 'value' => '', |
| | | 'width' => '30', |
| | | 'maxlength' => '255' |
| | | ), |
| | | //################################# |
| | | // ENDE Datatable fields |
| | | //################################# |
| | |
| | | 'default' => '', |
| | | 'value' => array('1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9', '10' => '10') |
| | | ), |
| | | 'backup_excludes' => array ( |
| | | 'datatype' => 'VARCHAR', |
| | | 'validators' => array ( 0 => array ( 'type' => 'REGEX', |
| | | 'regex' => '@^(?!.*\.\.)[-a-zA-Z0-9_/.~,]*$@', |
| | | 'errmsg'=> 'backup_excludes_error_regex'), |
| | | ), |
| | | 'formtype' => 'TEXT', |
| | | 'default' => '', |
| | | 'value' => '', |
| | | 'width' => '30', |
| | | 'maxlength' => '255' |
| | | ), |
| | | //################################# |
| | | // ENDE Datatable fields |
| | | //################################# |
| | |
| | | $wb['allowed_rewrite_rule_directives_txt'] = 'Erlaubte Direktiven:'; |
| | | $wb['configuration_error_txt'] = 'KONFIGURATIONSFEHLER'; |
| | | $wb['variables_txt'] = 'Variablen'; |
| | | $wb['added_by_txt'] = 'Hinzugefügt von'; |
| | | $wb['added_date_txt'] = 'Hinzugefügt am'; |
| | | $wb['backup_excludes_txt'] = 'Auszuschließende Verzeichnisse'; |
| | | $wb['backup_excludes_note_txt'] = '(Mehrere Verzeichnisse mit Kommas trennen)'; |
| | | $wb['backup_excludes_error_regex'] = 'Die auszuschließenden Verzeichnisse enthalten ungültige Zeichen.'; |
| | | ?> |
| | |
| | | $wb['invalid_rewrite_rules_txt'] = 'Unzulässige Rewrite Rules'; |
| | | $wb['allowed_rewrite_rule_directives_txt'] = 'Erlaubte Direktiven:'; |
| | | $wb['configuration_error_txt'] = 'KONFIGURATIONSFEHLER'; |
| | | $wb['variables_txt'] = 'Variablen'; |
| | | $wb['backup_excludes_txt'] = 'Auszuschließende Verzeichnisse'; |
| | | $wb['backup_excludes_note_txt'] = '(Mehrere Verzeichnisse mit Kommas trennen)'; |
| | | $wb['backup_excludes_error_regex'] = 'Die auszuschließenden Verzeichnisse enthalten ungültige Zeichen.'; |
| | | ?> |
| | |
| | | $wb['variables_txt'] = 'Variables'; |
| | | $wb['added_by_txt'] = 'Added by'; |
| | | $wb['added_date_txt'] = 'Added date'; |
| | | $wb['backup_excludes_txt'] = 'Excluded Directories'; |
| | | $wb['backup_excludes_note_txt'] = '(Separate multiple directories with commas)'; |
| | | $wb['backup_excludes_error_regex'] = 'The excluded directories contain invalid characters.'; |
| | | ?> |
| | |
| | | $wb['invalid_rewrite_rules_txt'] = 'Invalid Rewrite Rules'; |
| | | $wb['allowed_rewrite_rule_directives_txt'] = 'Allowed Directives:'; |
| | | $wb['configuration_error_txt'] = "CONFIGURATION ERROR"; |
| | | $wb['variables_txt'] = 'Variables'; |
| | | $wb['backup_excludes_txt'] = 'Auszuschließende Verzeichnisse'; |
| | | $wb['backup_excludes_note_txt'] = '(Mehrere Verzeichnisse mit Kommas trennen)'; |
| | | $wb['backup_excludes_error_regex'] = 'Die auszuschließenden Verzeichnisse enthalten ungültige Zeichen.'; |
| | | ?> |
| | |
| | | {tmpl_var name='backup_copies'} |
| | | </select> |
| | | </div> |
| | | <div class="ctrlHolder"> |
| | | <label for="backup_excludes">{tmpl_var name='backup_excludes_txt'}</label> |
| | | <input name="backup_excludes" id="backup_excludes" value="{tmpl_var name='backup_excludes'}" size="30" type="text" class="textInput" /> {tmpl_var name='backup_excludes_note_txt'} |
| | | </div> |
| | | </fieldset> |
| | | |
| | | {tmpl_var name='backup_records'} |
| | |
| | | </div> |
| | | <div class="ctrlHolder nginx"> |
| | | <label for="nginx_directives">{tmpl_var name='nginx_directives_txt'}</label> |
| | | <textarea name="nginx_directives" id="nginx_directives" rows='10' cols='50' style="width:400px;">{tmpl_var name='nginx_directives'}</textarea> <b>{tmpl_var name="available_nginx_directive_snippets_txt"}</b><br><br> {tmpl_var name="nginx_directive_snippets_txt"} |
| | | <textarea name="nginx_directives" id="nginx_directives" rows='10' cols='50' style="width:400px;">{tmpl_var name='nginx_directives'}</textarea> <b>{tmpl_var name="available_nginx_directive_snippets_txt"}</b><br><br> {tmpl_var name="nginx_directive_snippets_txt"}<br>----<br><b> {tmpl_var name='variables_txt'}:</b> <a href="javascript:void(0);" class="addPlaceholder">{DOCROOT}</a>, <a href="javascript:void(0);" class="addPlaceholder">{FASTCGIPASS}</a> |
| | | </div> |
| | | <div class="ctrlHolder proxy"> |
| | | <label for="proxy_directives">{tmpl_var name='proxy_directives_txt'}</label> |
| | |
| | | {tmpl_var name='backup_copies'} |
| | | </select> |
| | | </div> |
| | | <div class="ctrlHolder"> |
| | | <label for="backup_excludes">{tmpl_var name='backup_excludes_txt'}</label> |
| | | <input name="backup_excludes" id="backup_excludes" value="{tmpl_var name='backup_excludes'}" size="30" type="text" class="textInput" /> {tmpl_var name='backup_excludes_note_txt'} |
| | | </div> |
| | | </fieldset> |
| | | |
| | | {tmpl_var name='backup_records'} |
| | |
| | | chown($web_backup_dir, 'root'); |
| | | chgrp($web_backup_dir, 'root'); |
| | | }*/ |
| | | |
| | | $backup_excludes = ''; |
| | | $b_excludes = explode(',', trim($rec['backup_excludes'])); |
| | | if(is_array($b_excludes) && !empty($b_excludes)){ |
| | | foreach($b_excludes as $b_exclude){ |
| | | $b_exclude = trim($b_exclude); |
| | | if($b_exclude != ''){ |
| | | $backup_excludes .= ' --exclude='.escapeshellarg($b_exclude); |
| | | } |
| | | } |
| | | } |
| | | |
| | | 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'; |
| | | 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).' -@', $tmp_output, $retval); |
| | | if($retval == 0) 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).' -@', $tmp_output, $retval); |
| | | if($retval == 0) 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\*'.$backup_excludes.' --update --symlinks '.escapeshellarg($web_backup_dir.'/'.$web_backup_file).' -@', $tmp_output, $retval); |
| | | } 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).' .', $tmp_output, $retval); |
| | | exec('tar pczf '.escapeshellarg($web_backup_dir.'/'.$web_backup_file).' --exclude=backup\*'.$backup_excludes.' --directory '.escapeshellarg($web_path).' .', $tmp_output, $retval); |
| | | } |
| | | if($retval == 0 || $backup_mode != 'userzip'){ // tar can return 1 (due to harmless warings) and still create valid backups |
| | | if(is_file($web_backup_dir.'/'.$web_backup_file)){ |