From d02193c14c33dd12edb14f000b1c4eb6b7c3f070 Mon Sep 17 00:00:00 2001
From: tbrehm <t.brehm@ispconfig.org>
Date: Mon, 23 Apr 2012 09:18:48 -0400
Subject: [PATCH] Implemented: FS#2187 - Add a config resync toll for websites, ftp users, shell users and mailboxes.

---
 /dev/null                                      |   31 -----
 interface/web/tools/lib/module.conf.php        |    2 
 interface/web/tools/lib/lang/en.lng            |    2 
 interface/web/tools/resync.php                 |  166 +++++++++++++++++++++++++++
 interface/web/tools/templates/resync.htm       |   67 +++++++++++
 interface/lib/classes/db_mysql.inc.php         |   35 +++--
 interface/web/tools/lib/lang/en_resync.lng     |   13 ++
 interface/web/tools/lib/menu.d/resync.menu.php |    4 
 8 files changed, 268 insertions(+), 52 deletions(-)

diff --git a/interface/lib/classes/db_mysql.inc.php b/interface/lib/classes/db_mysql.inc.php
index ae120c9..0319f47 100644
--- a/interface/lib/classes/db_mysql.inc.php
+++ b/interface/lib/classes/db_mysql.inc.php
@@ -1,6 +1,6 @@
 <?php
 /*
-Copyright (c) 2007, Till Brehm, projektfarm Gmbh
+Copyright (c) 2007-2012, Till Brehm, projektfarm Gmbh, ISPConfig UG
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without modification,
@@ -257,29 +257,34 @@
 	}
 	
 	//** Function to fill the datalog with a full differential record.
-	public function datalogSave($db_table, $action, $primary_field, $primary_id, $record_old, $record_new) {
+	public function datalogSave($db_table, $action, $primary_field, $primary_id, $record_old, $record_new, $force_update = false) {
 		global $app,$conf;
 
-		// Insert backticks only for incomplete table names.
+		//* Insert backticks only for incomplete table names.
 		if(stristr($db_table,'.')) {
 			$escape = '';
 		} else {
 			$escape = '`';
 		}
-
-		$tmp = $this->diffrec($record_old, $record_new);
-		$diffrec_full = $tmp['diff_rec'];
-		$diff_num = $tmp['diff_num'];
-		unset($tmp);
 		
-		// Insert the server_id, if the record has a server_id
+		if($force_update == true) {
+			//* We force a update even if no record has changed
+			$diffrec_full = array('new' => $record_new, 'old' => $record_old);
+			$diff_num = count($record_new);
+		} else {
+			//* get the difference record between old and new record
+			$tmp = $this->diffrec($record_old, $record_new);
+			$diffrec_full = $tmp['diff_rec'];
+			$diff_num = $tmp['diff_num'];
+			unset($tmp);
+		}
+		
+		//* Insert the server_id, if the record has a server_id
 		$server_id = (isset($record_old['server_id']) && $record_old['server_id'] > 0)?$record_old['server_id']:0;
 		if(isset($record_new['server_id'])) $server_id = $record_new['server_id'];
 		
 
 		if($diff_num > 0) {
-			//print_r($diff_num);
-			//print_r($diffrec_full);
 			$diffstr = $app->db->quote(serialize($diffrec_full));
 			$username = $app->db->quote($_SESSION['s']['user']['username']);
 			$dbidx = $primary_field.':'.$primary_id;
@@ -323,11 +328,7 @@
 	public function datalogUpdate($tablename, $update_data, $index_field, $index_value, $force_update = false) {
 		global $app;
 		
-		if($force_update == true) {
-			$old_rec = array();
-		} else {
-			$old_rec = $this->queryOneRecord("SELECT * FROM $tablename WHERE $index_field = '$index_value'");
-		}
+		$old_rec = $this->queryOneRecord("SELECT * FROM $tablename WHERE $index_field = '$index_value'");
 		
 		if(is_array($update_data)) {
 			$update_data_str = '';
@@ -340,7 +341,7 @@
 		
 		$this->query("UPDATE $tablename SET $update_data_str WHERE $index_field = '$index_value'");
 		$new_rec = $this->queryOneRecord("SELECT * FROM $tablename WHERE $index_field = '$index_value'");
-		$this->datalogSave($tablename, 'UPDATE', $index_field, $index_value, $old_rec, $new_rec);
+		$this->datalogSave($tablename, 'UPDATE', $index_field, $index_value, $old_rec, $new_rec, $force_update);
 		
 		return true;
 	}
diff --git a/interface/web/tools/dns_resync.php b/interface/web/tools/dns_resync.php
deleted file mode 100644
index c80735d..0000000
--- a/interface/web/tools/dns_resync.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-/*
-Copyright (c) 2008, Till Brehm, projektfarm Gmbh
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-      this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright notice,
-      this list of conditions and the following disclaimer in the documentation
-      and/or other materials provided with the distribution.
-    * Neither the name of ISPConfig nor the names of its contributors
-      may be used to endorse or promote products derived from this software without
-      specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
-INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-require_once('../../lib/config.inc.php');
-require_once('../../lib/app.inc.php');
-
-//* Check permissions for module
-$app->auth->check_module_permissions('admin');
-
-//* This is only allowed for administrators
-if(!$app->auth->is_admin()) die('only allowed for administrators.');
-
-$app->uses('tpl,validate_dns');
-
-$app->tpl->newTemplate('form.tpl.htm');
-$app->tpl->setInclude('content_tpl', 'templates/dns_resync.htm');
-$msg = '';
-$error = '';
-
-// Resyncing dns zones
-if(isset($_POST['resync']) && $_POST['resync'] == 1) {
-	$zones = $app->db->queryAllRecords("SELECT id,origin,serial FROM dns_soa WHERE active = 'Y'");
-	if(is_array($zones) && !empty($zones)) {
-		foreach($zones as $zone) {
-			$records = $app->db->queryAllRecords("SELECT id,serial FROM dns_rr WHERE zone = ".$zone['id']." AND active = 'Y'");
-			if(is_array($records)) {
-				foreach($records as $rec) {
-					$new_serial = $app->validate_dns->increase_serial($rec["serial"]);
-					$app->db->datalogUpdate('dns_rr', "serial = '".$new_serial."'", 'id', $rec['id']);
-					
-				}
-			}
-			$new_serial = $app->validate_dns->increase_serial($zone["serial"]);
-			$app->db->datalogUpdate('dns_soa', "serial = '".$new_serial."'", 'id', $zone['id']);
-			$msg .= "Resynced: ".$zone['origin'].'<br />';
-		}
-	} else {
-		$error .= "No zones found to sync.<br />";
-	}
-	
-}
-
-$app->tpl->setVar('msg',$msg);
-$app->tpl->setVar('error',$error);
-
-
-//* load language file
-/*
-$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_mailbox_import.lng';
-include($lng_file);
-$app->tpl->setVar($wb);
-*/
-
-$app->tpl_defaults();
-$app->tpl->pparse();
-
-
-?>
\ No newline at end of file
diff --git a/interface/web/tools/lib/lang/en.lng b/interface/web/tools/lib/lang/en.lng
index 1dee19d..0122dcd 100644
--- a/interface/web/tools/lib/lang/en.lng
+++ b/interface/web/tools/lib/lang/en.lng
@@ -4,6 +4,6 @@
 $wb['ISPConfig Tools'] = 'ISPConfig Tools';
 $wb['Password and Language'] = 'Password and Language';
 $wb['ispconfig_tools_note'] = 'This module allows you to change the password and language and to start a resync of the DNS records.';
-$wb['Dns Tools'] = 'Dns Tools';
+$wb['Sync Tools'] = 'Sync Tools';
 $wb['Resync'] = 'Resync';
 ?>
\ No newline at end of file
diff --git a/interface/web/tools/lib/lang/en_resync.lng b/interface/web/tools/lib/lang/en_resync.lng
new file mode 100644
index 0000000..ae87bbd
--- /dev/null
+++ b/interface/web/tools/lib/lang/en_resync.lng
@@ -0,0 +1,13 @@
+<?php
+$wb['head_txt'] = 'Resync Tool';
+$wb['legend_txt'] = 'Resync';
+$wb['resync_sites_txt'] = 'Resync Websites';
+$wb['resync_ftp_txt'] = 'Resync FTP users';
+$wb['resync_shell_txt'] = 'Resync shell users';
+$wb['resync_cron_txt'] = 'Resync cronjobs';
+$wb['resync_db_txt'] = 'Resync database config';
+$wb['resync_mailbox_txt'] = 'Resync Mailboxes';
+$wb['resync_dns_txt'] = 'Resync DNS records';
+$wb['btn_start_txt'] = 'Start';
+$wb['btn_cancel_txt'] = 'Cancel';
+?>
\ No newline at end of file
diff --git a/interface/web/tools/lib/menu.d/dns_resync.menu.php b/interface/web/tools/lib/menu.d/resync.menu.php
similarity index 69%
rename from interface/web/tools/lib/menu.d/dns_resync.menu.php
rename to interface/web/tools/lib/menu.d/resync.menu.php
index f6b6ae0..3ef45fb 100644
--- a/interface/web/tools/lib/menu.d/dns_resync.menu.php
+++ b/interface/web/tools/lib/menu.d/resync.menu.php
@@ -9,10 +9,10 @@
 
 $items[] = array( 'title' 	=> 'Resync',
 				  'target' 	=> 'content',
-				  'link'	=> 'tools/dns_resync.php');
+				  'link'	=> 'tools/resync.php');
 
 
-$module['nav'][] = array(	'title'	=> 'DNS Tools',
+$module['nav'][] = array(	'title'	=> 'Sync Tools',
 							'open' 	=> 1,
 							'items'	=> $items);
 
diff --git a/interface/web/tools/lib/module.conf.php b/interface/web/tools/lib/module.conf.php
index a88aab0..3190d70 100644
--- a/interface/web/tools/lib/module.conf.php
+++ b/interface/web/tools/lib/module.conf.php
@@ -29,7 +29,7 @@
 	if ($dh = opendir($menu_dir)) {
 		//** Go through all files in the menu dir
 		while (($file = readdir($dh)) !== false) {
-			if($file != '.' && $file != '..' && substr($file,-9,9) == '.menu.php') {
+			if($file != '.' && $file != '..' && substr($file,-9,9) == '.menu.php' && $file != 'dns_resync.menu.php') {
 				include_once($menu_dir.'/'.$file);
 			}
 		}
diff --git a/interface/web/tools/resync.php b/interface/web/tools/resync.php
new file mode 100644
index 0000000..86ba27d
--- /dev/null
+++ b/interface/web/tools/resync.php
@@ -0,0 +1,166 @@
+<?php
+/*
+Copyright (c) 2012, Till Brehm, projektfarm Gmbh, ISPConfig UG
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once('../../lib/config.inc.php');
+require_once('../../lib/app.inc.php');
+
+//* Check permissions for module
+$app->auth->check_module_permissions('admin');
+
+//* This is only allowed for administrators
+if(!$app->auth->is_admin()) die('only allowed for administrators.');
+
+$app->uses('tpl,validate_dns');
+
+$app->tpl->newTemplate('form.tpl.htm');
+$app->tpl->setInclude('content_tpl', 'templates/resync.htm');
+$msg = '';
+$error = '';
+
+//* load language file
+$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_resync.lng';
+include($lng_file);
+$app->tpl->setVar($wb);
+
+//* Resyncing websites
+if(isset($_POST['resync_sites']) && $_POST['resync_sites'] == 1) {
+	$db_table = 'web_domain';
+	$index_field = 'domain_id';
+	$sql = "SELECT * FROM ".$db_table." WHERE active = 'y'";
+	$records = $app->db->queryAllRecords($sql);
+	if(is_array($records)) {
+		foreach($records as $rec) {
+			$app->db->datalogUpdate($db_table, $rec, $index_field, $rec[$index_field], true);
+			$msg .= "Resynced Website: ".$rec['domain'].'<br />';
+		}
+	}
+}
+
+//* Resyncing ftp
+if(isset($_POST['resync_ftp']) && $_POST['resync_ftp'] == 1) {
+	$db_table = 'ftp_user';
+	$index_field = 'ftp_user_id';
+	$sql = "SELECT * FROM ".$db_table." WHERE active = 'y'";
+	$records = $app->db->queryAllRecords($sql);
+	if(is_array($records)) {
+		foreach($records as $rec) {
+			$app->db->datalogUpdate($db_table, $rec, $index_field, $rec[$index_field], true);
+			$msg .= "Resynced FTP user: ".$rec['username'].'<br />';
+		}
+	}
+}
+
+//* Resyncing shell
+if(isset($_POST['resync_shell']) && $_POST['resync_shell'] == 1) {
+	$db_table = 'shell_user';
+	$index_field = 'shell_user_id';
+	$sql = "SELECT * FROM ".$db_table." WHERE active = 'y'";
+	$records = $app->db->queryAllRecords($sql);
+	if(is_array($records)) {
+		foreach($records as $rec) {
+			$app->db->datalogUpdate($db_table, $rec, $index_field, $rec[$index_field], true);
+			$msg .= "Resynced Shell user: ".$rec['username'].'<br />';
+		}
+	}
+}
+
+//* Resyncing Cronjobs
+if(isset($_POST['resync_cron']) && $_POST['resync_cron'] == 1) {
+	$db_table = 'cron';
+	$index_field = 'id';
+	$sql = "SELECT * FROM ".$db_table." WHERE active = 'y'";
+	$records = $app->db->queryAllRecords($sql);
+	if(is_array($records)) {
+		foreach($records as $rec) {
+			$app->db->datalogUpdate($db_table, $rec, $index_field, $rec[$index_field], true);
+			$msg .= "Resynced Cron: ".$rec['id'].'<br />';
+		}
+	}
+}
+
+//* Resyncing Databases
+if(isset($_POST['resync_db']) && $_POST['resync_db'] == 1) {
+	$db_table = 'web_database';
+	$index_field = 'database_id';
+	$sql = "SELECT * FROM ".$db_table." WHERE active = 'y'";
+	$records = $app->db->queryAllRecords($sql);
+	if(is_array($records)) {
+		foreach($records as $rec) {
+			$app->db->datalogUpdate($db_table, $rec, $index_field, $rec[$index_field], true);
+			$msg .= "Resynced Database: ".$rec['database_name'].'<br />';
+		}
+	}
+}
+
+//* Resyncing Mailboxes
+if(isset($_POST['resync_mailbox']) && $_POST['resync_mailbox'] == 1) {
+	$db_table = 'mail_user';
+	$index_field = 'mailuser_id';
+	$sql = "SELECT * FROM ".$db_table." WHERE active = 'y'";
+	$records = $app->db->queryAllRecords($sql);
+	if(is_array($records)) {
+		foreach($records as $rec) {
+			$app->db->datalogUpdate($db_table, $rec, $index_field, $rec[$index_field], true);
+			$msg .= "Resynced Mailbox: ".$rec['email'].'<br />';
+		}
+	}
+}
+
+
+//* Resyncing dns zones
+if(isset($_POST['resync_dns']) && $_POST['resync_dns'] == 1) {
+	$zones = $app->db->queryAllRecords("SELECT id,origin,serial FROM dns_soa WHERE active = 'Y'");
+	if(is_array($zones) && !empty($zones)) {
+		foreach($zones as $zone) {
+			$records = $app->db->queryAllRecords("SELECT id,serial FROM dns_rr WHERE zone = ".$zone['id']." AND active = 'Y'");
+			if(is_array($records)) {
+				foreach($records as $rec) {
+					$new_serial = $app->validate_dns->increase_serial($rec["serial"]);
+					$app->db->datalogUpdate('dns_rr', "serial = '".$new_serial."'", 'id', $rec['id']);
+					
+				}
+			}
+			$new_serial = $app->validate_dns->increase_serial($zone["serial"]);
+			$app->db->datalogUpdate('dns_soa', "serial = '".$new_serial."'", 'id', $zone['id']);
+			$msg .= "Resynced DNS zone: ".$zone['origin'].'<br />';
+		}
+	} else {
+		$error .= "No zones found to sync.<br />";
+	}
+	
+}
+
+$app->tpl->setVar('msg',$msg);
+$app->tpl->setVar('error',$error);
+
+$app->tpl_defaults();
+$app->tpl->pparse();
+
+
+?>
\ No newline at end of file
diff --git a/interface/web/tools/templates/dns_resync.htm b/interface/web/tools/templates/dns_resync.htm
deleted file mode 100644
index 372206a..0000000
--- a/interface/web/tools/templates/dns_resync.htm
+++ /dev/null
@@ -1,31 +0,0 @@
-<h2>DNS Resync</h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_language_import">
-  
-  <div class="pnl_formsarea">
-    <fieldset class="inlineLabels"><legend>DNS Resync</legend>
-	  <div class="ctrlHolder">
-				<p class="label">Resync DNS Records</p>
-					<div class="multiField">
-						<input id="resync" type="checkbox" value="1" name="resync" checked/>
-					</div>
-	  </div>
-    </fieldset>
-	
-	<tmpl_if name="msg">
-	<div id="OKMsg"><p><tmpl_var name="msg"></p></div>
-  </tmpl_if>
-  <tmpl_if name="error">
-	<div id="errorMsg"><h3>ERROR</h3><ol><tmpl_var name="error"></ol></div>
-  </tmpl_if>
-	
-    <input type="hidden" name="id" value="{tmpl_var name='id'}">
-
-    <div class="buttonHolder buttons">
-      <button class="positive iconstxt icoPositive" type="button" value="Import" onClick="submitForm('pageForm','tools/dns_resync.php');"><span>Start</span></button>
-      <button class="negative iconstxt icoNegative" type="button" value="Cancel" onClick="loadContent('tools/index.php');"><span>Cancel</span></button>
-    </div>
-  </div>
-  
-</div>
diff --git a/interface/web/tools/templates/resync.htm b/interface/web/tools/templates/resync.htm
new file mode 100644
index 0000000..196fb7e
--- /dev/null
+++ b/interface/web/tools/templates/resync.htm
@@ -0,0 +1,67 @@
+<h2>{tmpl_var name="head_txt"}</h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_language_import">
+  
+  <div class="pnl_formsarea">
+    <fieldset class="inlineLabels"><legend>{tmpl_var name="legend_txt"}</legend>
+	  <div class="ctrlHolder">
+		<p class="label">{tmpl_var name="resync_sites_txt"}</p>
+		<div class="multiField">
+			<input id="resync_sites" type="checkbox" value="1" name="resync_sites" />
+		</div>
+	  </div>
+	  <div class="ctrlHolder">
+		<p class="label">{tmpl_var name="resync_ftp_txt"}</p>
+		<div class="multiField">
+			<input id="resync_ftp" type="checkbox" value="1" name="resync_ftp" />
+		</div>
+	  </div>
+	  <div class="ctrlHolder">
+		<p class="label">{tmpl_var name="resync_shell_txt"}</p>
+		<div class="multiField">
+			<input id="resync_shell" type="checkbox" value="1" name="resync_shell" />
+		</div>
+	  </div>
+	  <div class="ctrlHolder">
+		<p class="label">{tmpl_var name="resync_cron_txt"}</p>
+		<div class="multiField">
+			<input id="resync_cron" type="checkbox" value="1" name="resync_cron" />
+		</div>
+	  </div>
+	  <div class="ctrlHolder">
+		<p class="label">{tmpl_var name="resync_db_txt"}</p>
+		<div class="multiField">
+			<input id="resync_db" type="checkbox" value="1" name="resync_db" />
+		</div>
+	  </div>
+	  <div class="ctrlHolder">
+		<p class="label">{tmpl_var name="resync_mailbox_txt"}</p>
+		<div class="multiField">
+			<input id="resync_mailbox" type="checkbox" value="1" name="resync_mailbox" />
+		</div>
+	  </div>
+	  <div class="ctrlHolder">
+		<p class="label">{tmpl_var name="resync_dns_txt"}</p>
+		<div class="multiField">
+			<input id="resync_dns" type="checkbox" value="1" name="resync_dns" />
+		</div>
+	  </div>
+    </fieldset>
+	
+	<tmpl_if name="msg">
+	<div id="OKMsg"><p><tmpl_var name="msg"></p></div>
+  </tmpl_if>
+  <tmpl_if name="error">
+	<div id="errorMsg"><h3>ERROR</h3><ol><tmpl_var name="error"></ol></div>
+  </tmpl_if>
+	
+    <input type="hidden" name="id" value="{tmpl_var name='id'}">
+
+    <div class="buttonHolder buttons">
+      <button class="positive iconstxt icoPositive" type="button" value="Import" onClick="submitForm('pageForm','tools/resync.php');"><span>{tmpl_var name="btn_start_txt"}</span></button>
+      <button class="negative iconstxt icoNegative" type="button" value="Cancel" onClick="loadContent('tools/index.php');"><span>{tmpl_var name="btn_cancel_txt"}</span></button>
+    </div>
+  </div>
+  
+</div>

--
Gitblit v1.9.1