diff --git a/install/install.php b/install/install.php index d953964acbd421ba8d85fa1d75ac9240f890ce87..257b5b21d5e46cca157f837f63a1b6707c27b2ea 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 3fc97870a6024bf11e2b51be0883269e3aa29478..925a2ba8486393bce73efc1354466166334dbed9 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 0000000000000000000000000000000000000000..0d3de00f003862a274aa76cb4c98bc062428c62a --- /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 6bd4f18403bc47f7f2b073be389f7279ef68791a..d5e349c2e706ef4ddc124bd648083aa764d54f2d 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 4309bdc3db255c9cd74f5e591e649fb91ab04816..3dbaff8db75332643483ffc412e4de49efb552f3 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 1399a9ef643931038a0f8e161c8354fccdcbe92d..fa9d1f835c63887b1b638a0f760f7926d91f7818 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 0000000000000000000000000000000000000000..40ff6803f16eb23ec9c230d680b1fb4f24bddefa --- /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 0000000000000000000000000000000000000000..bf535995f0b7e2aca8bcd495e29f7721489c7fb4 --- /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