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" />&nbsp;{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>&nbsp;<b>{tmpl_var name="available_nginx_directive_snippets_txt"}</b><br><br>&nbsp;{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>&nbsp;<b>{tmpl_var name="available_nginx_directive_snippets_txt"}</b><br><br>&nbsp;{tmpl_var name="nginx_directive_snippets_txt"}<br>----<br><b>&nbsp;{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" />&nbsp;{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