From fe5f535946b2270558579f7b09c40199462172b0 Mon Sep 17 00:00:00 2001 From: Falko Timme <ft@falkotimme.com> Date: Wed, 20 Nov 2013 20:45:35 -0500 Subject: [PATCH] - It is now possible to exclude directories - on a per-vHost base - from website backups. --- interface/web/sites/templates/web_vhost_subdomain_advanced.htm | 2 install/sql/ispconfig3.sql | 1 interface/web/sites/form/web_vhost_subdomain.tform.php | 12 ++++++ interface/web/sites/templates/web_vhost_subdomain_backup.htm | 4 ++ install/sql/incremental/upd_0061.sql | 1 interface/web/sites/lib/lang/de_web_domain.lng | 5 ++ interface/web/sites/templates/web_domain_backup.htm | 4 ++ interface/web/sites/lib/lang/en_web_vhost_subdomain.lng | 4 ++ interface/web/sites/lib/lang/en_web_domain.lng | 3 + interface/web/sites/lib/lang/de_web_vhost_subdomain.lng | 4 ++ interface/web/sites/form/web_domain.tform.php | 12 ++++++ server/cron_daily.php | 16 +++++++- 12 files changed, 65 insertions(+), 3 deletions(-) diff --git a/install/sql/incremental/upd_0061.sql b/install/sql/incremental/upd_0061.sql new file mode 100644 index 0000000..781b221 --- /dev/null +++ b/install/sql/incremental/upd_0061.sql @@ -0,0 +1 @@ +ALTER TABLE `web_domain` ADD `backup_excludes` MEDIUMTEXT NULL AFTER `backup_copies` ; \ No newline at end of file diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index 09a8607..0556ff6 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -1796,6 +1796,7 @@ `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, diff --git a/interface/web/sites/form/web_domain.tform.php b/interface/web/sites/form/web_domain.tform.php index 59ecba4..ed590c9 100644 --- a/interface/web/sites/form/web_domain.tform.php +++ b/interface/web/sites/form/web_domain.tform.php @@ -520,6 +520,18 @@ '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 //################################# diff --git a/interface/web/sites/form/web_vhost_subdomain.tform.php b/interface/web/sites/form/web_vhost_subdomain.tform.php index 5e507d1..328fc27 100644 --- a/interface/web/sites/form/web_vhost_subdomain.tform.php +++ b/interface/web/sites/form/web_vhost_subdomain.tform.php @@ -510,6 +510,18 @@ '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 //################################# diff --git a/interface/web/sites/lib/lang/de_web_domain.lng b/interface/web/sites/lib/lang/de_web_domain.lng index 899a34d..4a6dc0c 100644 --- a/interface/web/sites/lib/lang/de_web_domain.lng +++ b/interface/web/sites/lib/lang/de_web_domain.lng @@ -121,4 +121,9 @@ $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.'; ?> \ No newline at end of file diff --git a/interface/web/sites/lib/lang/de_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/de_web_vhost_subdomain.lng index 827cc80..f454aa4 100644 --- a/interface/web/sites/lib/lang/de_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/de_web_vhost_subdomain.lng @@ -119,4 +119,8 @@ $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.'; ?> \ No newline at end of file diff --git a/interface/web/sites/lib/lang/en_web_domain.lng b/interface/web/sites/lib/lang/en_web_domain.lng index b35236c..415bebd 100644 --- a/interface/web/sites/lib/lang/en_web_domain.lng +++ b/interface/web/sites/lib/lang/en_web_domain.lng @@ -123,4 +123,7 @@ $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.'; ?> \ No newline at end of file diff --git a/interface/web/sites/lib/lang/en_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/en_web_vhost_subdomain.lng index ae88738..96e16f4 100644 --- a/interface/web/sites/lib/lang/en_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/en_web_vhost_subdomain.lng @@ -120,4 +120,8 @@ $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.'; ?> \ No newline at end of file diff --git a/interface/web/sites/templates/web_domain_backup.htm b/interface/web/sites/templates/web_domain_backup.htm index cfe4337..e5829e5 100644 --- a/interface/web/sites/templates/web_domain_backup.htm +++ b/interface/web/sites/templates/web_domain_backup.htm @@ -26,6 +26,10 @@ {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'} diff --git a/interface/web/sites/templates/web_vhost_subdomain_advanced.htm b/interface/web/sites/templates/web_vhost_subdomain_advanced.htm index cffd3fa..52fb5c7 100644 --- a/interface/web/sites/templates/web_vhost_subdomain_advanced.htm +++ b/interface/web/sites/templates/web_vhost_subdomain_advanced.htm @@ -75,7 +75,7 @@ </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> diff --git a/interface/web/sites/templates/web_vhost_subdomain_backup.htm b/interface/web/sites/templates/web_vhost_subdomain_backup.htm index 6c55e50..d76afdf 100644 --- a/interface/web/sites/templates/web_vhost_subdomain_backup.htm +++ b/interface/web/sites/templates/web_vhost_subdomain_backup.htm @@ -17,6 +17,10 @@ {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'} diff --git a/server/cron_daily.php b/server/cron_daily.php index 60f3c21..cb90582 100644 --- a/server/cron_daily.php +++ b/server/cron_daily.php @@ -1127,15 +1127,27 @@ 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)){ -- Gitblit v1.9.1