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