From d83fcfed014f35702a3d9b22b5c78c0292ca2b20 Mon Sep 17 00:00:00 2001 From: tbrehm Date: Sun, 6 Jul 2008 15:26:51 +0000 Subject: [PATCH] - Added database server module. --- install/install.php | 8 + install/lib/installer_base.lib.php | 24 +++ install/tpl/mysql_clientdb.conf.master | 7 + install/update.php | 4 + interface/web/sites/database_edit.php | 14 ++ interface/web/sites/lib/lang/en_database.lng | 1 + server/mods-available/database_module.inc.php | 90 +++++++++ .../mysql_clientdb_plugin.inc.php | 181 ++++++++++++++++++ 8 files changed, 329 insertions(+) create mode 100644 install/tpl/mysql_clientdb.conf.master create mode 100644 server/mods-available/database_module.inc.php create mode 100644 server/plugins-available/mysql_clientdb_plugin.inc.php diff --git a/install/install.php b/install/install.php index d953964acb..257b5b21d5 100644 --- a/install/install.php +++ b/install/install.php @@ -183,6 +183,10 @@ if($install_mode == 'Standard') { $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 @@ if($install_mode == 'Standard') { } $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 3fc97870a6..925a2ba848 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -755,6 +755,30 @@ class installer_base { 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 0000000000..0d3de00f00 --- /dev/null +++ b/install/tpl/mysql_clientdb.conf.master @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/install/update.php b/install/update.php index 6bd4f18403..d5e349c2e7 100644 --- a/install/update.php +++ b/install/update.php @@ -196,6 +196,10 @@ if($reconfigure_services_answer == 'yes') { //** 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 4309bdc3db..3dbaff8db7 100644 --- a/interface/web/sites/database_edit.php +++ b/interface/web/sites/database_edit.php @@ -189,6 +189,20 @@ class page_action extends tform_actions { 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"].'
'; + } + 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 1399a9ef64..fa9d1f835c 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_empty"] = 'Database user is empty.'; $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 0000000000..40ff6803f1 --- /dev/null +++ b/server/mods-available/database_module.inc.php @@ -0,0 +1,90 @@ +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 0000000000..bf535995f0 --- /dev/null +++ b/server/plugins-available/mysql_clientdb_plugin.inc.php @@ -0,0 +1,181 @@ +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 -- GitLab