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