From d83fcfed014f35702a3d9b22b5c78c0292ca2b20 Mon Sep 17 00:00:00 2001
From: tbrehm <t.brehm@ispconfig.org>
Date: Sun, 06 Jul 2008 11:26:51 -0400
Subject: [PATCH] - Added database server module.

---
 interface/web/sites/lib/lang/en_database.lng           |    1 
 server/plugins-available/mysql_clientdb_plugin.inc.php |  181 ++++++++++++++++++++++++++++++
 install/install.php                                    |    8 +
 install/lib/installer_base.lib.php                     |   24 ++++
 server/mods-available/database_module.inc.php          |   90 +++++++++++++++
 install/update.php                                     |    4 
 interface/web/sites/database_edit.php                  |   14 ++
 install/tpl/mysql_clientdb.conf.master                 |    7 +
 8 files changed, 329 insertions(+), 0 deletions(-)

diff --git a/install/install.php b/install/install.php
index d953964..257b5b2 100644
--- a/install/install.php
+++ b/install/install.php
@@ -183,6 +183,10 @@
 	$inst->conf['apache']['vhost_port'] = $inst->free_query('ISPConfig Port', '8080');
 
 	$inst->install_ispconfig();
+	
+	//* Configure DBServer
+	swriteln('Configuring DBServer');
+	$inst->configure_dbserver();
 
 	//* Configure ISPConfig
 	swriteln('Installing Crontab');
@@ -306,6 +310,10 @@
 	}
 	
 	$inst->install_ispconfig();
+	
+	//* Configure DBServer
+	swriteln('Configuring DBServer');
+	$inst->configure_dbserver();
 		
 	//* Configure ISPConfig
 	swriteln('Installing Crontab');
diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php
index 3fc9787..925a2ba 100644
--- a/install/lib/installer_base.lib.php
+++ b/install/lib/installer_base.lib.php
@@ -755,6 +755,30 @@
 		exec('chmod 755 '.$install_dir.'/interface/bin/php-fcgi');
 	}
 	
+	public function configure_dbserver()
+	{
+		global $conf;
+		
+		//* If this server shall act as database server for client DB's, we configure this here
+		$install_dir = $this->conf['ispconfig_install_dir'];
+		
+		// Create a file with the database login details which 
+		// are used to create the client databases.
+		
+		if(!is_dir("$install_dir/server/lib")) {
+			$command = "mkdir $install_dir/server/lib";
+			caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
+		}
+		
+		$content = rf("tpl/mysql_clientdb.conf.master");
+		$content = str_replace('{username}',$conf['mysql']['admin_user'],$content);
+		$content = str_replace('{password}',$conf['mysql']['admin_password'], $content);
+		wf("$install_dir/server/lib/mysql_clientdb.conf",$content);
+		exec('chmod 600 '."$install_dir/server/lib/mysql_clientdb.conf");
+		exec('chown root:root '."$install_dir/server/lib/mysql_clientdb.conf");
+		
+	}
+	
 	public function install_crontab()
     {		
 		//* Root Crontab
diff --git a/install/tpl/mysql_clientdb.conf.master b/install/tpl/mysql_clientdb.conf.master
new file mode 100644
index 0000000..0d3de00
--- /dev/null
+++ b/install/tpl/mysql_clientdb.conf.master
@@ -0,0 +1,7 @@
+<?php
+
+$clientdb_host			= 'localhost';
+$clientdb_user			= '{username}';
+$clientdb_password		= '{password}';
+
+?>
\ No newline at end of file
diff --git a/install/update.php b/install/update.php
index 6bd4f18..d5e349c 100644
--- a/install/update.php
+++ b/install/update.php
@@ -196,6 +196,10 @@
 	//** Configure Apache
 	swriteln('Configuring Apache');
 	$inst->configure_apache();
+	
+	//* Configure DBServer
+	swriteln('Configuring DBServer');
+	$inst->configure_dbserver();
 }
 
 //** Configure ISPConfig
diff --git a/interface/web/sites/database_edit.php b/interface/web/sites/database_edit.php
index 4309bdc..3dbaff8 100644
--- a/interface/web/sites/database_edit.php
+++ b/interface/web/sites/database_edit.php
@@ -189,6 +189,20 @@
 		parent::onSubmit();
 	}
 	
+	function onUpdate() {
+		global $app, $conf;
+		
+		//* Prevent that the database name is changed
+		$old_record = $app->tform->getDataRecord($this->id);
+		if($old_record["database_name"] != $this->dataRecord["database_name"]) {
+			$app->tform->errorMessage .= $app->tform->wordbook["database_name_change_txt"].'<br />';
+		}
+		unset($old_record);
+		
+		parent::onUpdate();
+		
+	}
+	
 	function onAfterInsert() {
 		global $app, $conf;
 		
diff --git a/interface/web/sites/lib/lang/en_database.lng b/interface/web/sites/lib/lang/en_database.lng
index 1399a9e..fa9d1f8 100644
--- a/interface/web/sites/lib/lang/en_database.lng
+++ b/interface/web/sites/lib/lang/en_database.lng
@@ -16,4 +16,5 @@
 $wb["database_user_error_unique"] = 'There is already a database user with this name on the server. To get a unique name, e.g. prepend your domain name to the username.';
 $wb["database_user_error_regex"] = 'Invalid database user name. The username may contain these characters: a-z, A-Z, 0-9 and the underscore. Length: 2 - 64 characters.';
 $wb["limit_database_txt"] = 'The max. number of databases is reached.';
+$wb["database_name_change_txt"] = 'The database name can not be changed';
 ?>
\ No newline at end of file
diff --git a/server/mods-available/database_module.inc.php b/server/mods-available/database_module.inc.php
new file mode 100644
index 0000000..40ff680
--- /dev/null
+++ b/server/mods-available/database_module.inc.php
@@ -0,0 +1,90 @@
+<?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.
+*/
+
+class database_module {
+	
+	var $module_name = 'database_module';
+	var $class_name = 'database_module';
+	var $actions_available = array(	'database_insert',
+									'database_update',
+									'database_delete'
+									);
+	
+	/*
+	 	This function is called when the module is loaded
+	*/
+	
+	function onLoad() {
+		global $app;
+		
+		/*
+		Annonce the actions that where provided by this module, so plugins 
+		can register on them.
+		*/
+		
+		$app->plugins->announceEvents($this->module_name,$this->actions_available);
+		
+		/*
+		As we want to get notified of any changes on several database tables,
+		we register for them.
+		
+		The following function registers the function "functionname"
+ 		to be executed when a record for the table "dbtable" is 
+ 		processed in the sys_datalog. "classname" is the name of the
+ 		class that contains the function functionname.
+		*/
+		
+		$app->modules->registerTableHook('web_database','server_module','process');
+		
+		// Register service
+		//$app->services->registerService('httpd','web_module','restartHttpd');
+		
+	}
+	
+	/*
+	 This function is called when a change in one of the registered tables is detected.
+	 The function then raises the events for the plugins.
+	*/
+
+	function process($tablename,$action,$data) {
+		global $app;
+		
+		switch ($tablename) {
+			case 'web_database':
+				if($action == 'i') $app->plugins->raiseEvent('database_insert',$data);
+				if($action == 'u') $app->plugins->raiseEvent('database_update',$data);
+				if($action == 'd') $app->plugins->raiseEvent('database_delete',$data);
+			break;
+		} // end switch
+	} // end function
+
+} // end class
+
+?>
\ No newline at end of file
diff --git a/server/plugins-available/mysql_clientdb_plugin.inc.php b/server/plugins-available/mysql_clientdb_plugin.inc.php
new file mode 100644
index 0000000..bf53599
--- /dev/null
+++ b/server/plugins-available/mysql_clientdb_plugin.inc.php
@@ -0,0 +1,181 @@
+<?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.
+*/
+
+class mysql_clientdb {
+	
+	var $plugin_name = 'mysql_clientdb';
+	var $class_name  = 'mysql_clientdb';
+	
+		
+	/*
+	 	This function is called when the plugin is loaded
+	*/
+	
+	function onLoad() {
+		global $app;
+		
+		/*
+		Register for the events
+		*/
+		
+		//* Mailboxes
+		$app->plugins->registerEvent('database_insert',$this->plugin_name,'db_insert');
+		$app->plugins->registerEvent('database_update',$this->plugin_name,'db_update');
+		$app->plugins->registerEvent('database_delete',$this->plugin_name,'db_delete');
+		
+		
+	}
+	
+	
+	function db_insert($event_name,$data) {
+		global $app, $conf;
+		
+		if($data["new"]["type"] == 'mysql') {
+			if(!include_once(ISPC_LIB_PATH.'/mysql_clientdb.conf')) {
+				$app->log('Unable to open'.ISPC_LIB_PATH.'/mysql_clientdb.conf',LOGLEVEL_ERROR);
+			}
+		
+			//* Connect to the database
+			$link = mysql_connect($clientdb_host, $clientdb_user, $clientdb_password);
+			if (!$link) {
+				$app->log('Unable to connect to the database'.mysql_error($link),LOGLEVEL_ERROR);
+			}
+		
+			//* Create the new database
+			if (mysql_create_db($data["new"]["database_name"]),$link) {
+				$app->log('Created MySQL database: '.$data["new"]["database_name"],LOGLEVEL_DEBUG);
+			} else {
+				$app->log('Unable to connect to the database'.mysql_error($link),LOGLEVEL_ERROR);
+			}
+			
+			// Create the database user
+			if($data["new"]["remote_access"] == 'y') {
+			 	$db_host = '%';
+			} else {
+				$db_host = 'localhost';
+			}
+			
+			mysql_query("GRANT ALL ON ".addslashes($data["new"]["database_name"])." TO '".addslashes($data["new"]["database_user"])."'@'$db_host' IDENTIFIED BY '".addslashes($data["new"]["database_password"])."';",$link);
+			
+			mysql_query("FLUSH PRIVILEGES;",$link);
+			mysql_close($link);
+		}
+	}
+	
+	function db_update($event_name,$data) {
+		global $app, $conf;
+		
+		if($data["new"]["type"] == 'mysql') {
+			if(!include_once(ISPC_LIB_PATH.'/mysql_clientdb.conf')) {
+				$app->log('Unable to open'.ISPC_LIB_PATH.'/mysql_clientdb.conf',LOGLEVEL_ERROR);
+			}
+		
+			//* Connect to the database
+			$link = mysql_connect($clientdb_host, $clientdb_user, $clientdb_password);
+			if (!$link) {
+				$app->log('Unable to connect to the database'.mysql_error($link),LOGLEVEL_ERROR);
+			}
+			
+			//* Rename User
+			if($data["new"]["database_user"] != $data["old"]["database_user"]) {
+				mysql_query("RENAME USER '".addslashes($data["old"]["database_user"])."' TO '".addslashes($data["new"]["database_user"])."'",$link);
+				$app->log('Renaming mysql user: '.$data["old"]["database_user"].' to '.$data["new"]["database_user"],LOGLEVEL_DEBUG);
+			}
+			
+			//* Remote access option has changed.
+			if($data["new"]["remote_access"] != $data["old"]["remote_access"]) {
+				if($data["new"]["remote_access"] == 'y') {
+					mysql_query("UPDATE mysql.user SET Host = '%' WHERE User = '".addslashes($data["new"]["database_user"])."' and Host = 'localhost';",$link);
+				} else {
+					mysql_query("UPDATE mysql.user SET Host = 'localhost' WHERE User = '".addslashes($data["new"]["database_user"])."' and Host = '%';",$link);
+				}
+				$app->log('Changing mysql remote access priveliges for database: '.$data["new"]["database_name"],LOGLEVEL_DEBUG);
+			}
+			
+			//* Get the db host setting for the access priveliges
+			if($data["new"]["remote_access"] == 'y') {
+			 	$db_host = '%';
+			} else {
+				$db_host = 'localhost';
+			}
+			
+			/*
+			//* Rename database
+			if($data["new"]["database_name"] != $data["old"]["database_name"]) {
+				mysql_query("",$link);
+			}
+			*/
+			
+			//* Change password
+			if($data["new"]["database_password"] != $data["old"]["database_password"]) {
+				mysql_query("SET PASSWORD FOR '".addslashes($data["new"]["database_user"])."'@'$db_host' = PASSWORD('".addslashes($data["new"]["database_password"])."');",$link);
+				$app->log('Changing mysql user password for: '.$data["new"]["database_user"],LOGLEVEL_DEBUG);
+			}
+			
+			mysql_query("FLUSH PRIVILEGES;",$link);
+			mysql_close($link);
+		}
+		
+	}
+	
+	function db_delete($event_name,$data) {
+		global $app, $conf;
+		
+		if($data["new"]["type"] == 'mysql') {
+			if(!include_once(ISPC_LIB_PATH.'/mysql_clientdb.conf')) {
+				$app->log('Unable to open'.ISPC_LIB_PATH.'/mysql_clientdb.conf',LOGLEVEL_ERROR);
+			}
+		
+			//* Connect to the database
+			$link = mysql_connect($clientdb_host, $clientdb_user, $clientdb_password);
+			if (!$link) {
+				$app->log('Unable to connect to the database'.mysql_error($link),LOGLEVEL_ERROR);
+			}
+			
+			mysql_query("DROP USER '".addslashes($data["old"]["database_user"])."';",$link);
+			$app->log('Dropping mysql user: '.$data["old"]["database_user"],LOGLEVEL_DEBUG);
+			
+			mysql_drop_db($data["old"]["database_name"],$link);
+			$app->log('Dropping mysql database: '.$data["old"]["database_name"],LOGLEVEL_DEBUG);
+			
+			
+			mysql_query("FLUSH PRIVILEGES;",$link);
+			mysql_close($link);
+		}
+		
+		
+	}
+	
+	
+	
+
+} // end class
+
+?>
\ No newline at end of file

--
Gitblit v1.9.1