From 43ff675b5e3a442df3207b20f0a08b83480fd299 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Wed, 5 May 2021 13:37:19 +0200 Subject: [PATCH] installation von extensions auf mehreren servern ermoeglicht --- .../system/extensions/CLI_Manager.php | 5 +-- .../controllers/system/extensions/Manager.php | 8 +++-- application/libraries/ExtensionsLib.php | 32 ++++++++++++------- .../models/system/Extensions_model.php | 2 +- .../views/system/extensions/manager.php | 7 +++- system/dbupdate_3.3.php | 32 +++++++++++++++++-- 6 files changed, 66 insertions(+), 20 deletions(-) diff --git a/application/controllers/system/extensions/CLI_Manager.php b/application/controllers/system/extensions/CLI_Manager.php index ed8a5f7a5..110fad9e8 100644 --- a/application/controllers/system/extensions/CLI_Manager.php +++ b/application/controllers/system/extensions/CLI_Manager.php @@ -28,9 +28,10 @@ class CLI_Manager extends CLI_Controller * die Commandline ohne Upload durchzufuehren. * @param $extensioName string Name der Extension * @param $filename Url Encoded Pfad zum tgz File der Extension + * @param $perform_sql boolean ob die SQL Befehle ausgeführt werden */ - public function uploadExtension($extensionName = null, $filename = null) + public function uploadExtension($extensionName = null, $filename = null, $perform_sql = true) { - $this->extensionslib->installExtension($extensionName, urldecode($filename)); + $this->extensionslib->installExtension($extensionName, urldecode($filename), $perform_sql); } } diff --git a/application/controllers/system/extensions/Manager.php b/application/controllers/system/extensions/Manager.php index aa4e76e9c..429c967ae 100644 --- a/application/controllers/system/extensions/Manager.php +++ b/application/controllers/system/extensions/Manager.php @@ -87,9 +87,13 @@ class Manager extends Auth_Controller * die Commandline ohne Upload durchzufuehren. * @param $extensioName string Name der Extension * @param $filename Url Encoded Pfad zum tgz File der Extension + * @param $perform_sql boolean ob die SQL Befehle ausgeführt werden */ - public function uploadExtension($extensionName = null, $filename = null) + public function uploadExtension($extensionName = null, $filename = null, $perform_sql = true) { - $this->extensionslib->installExtension($extensionName, urldecode($filename)); + $perform_sql = $this->input->post('databasechange'); + $perform_sql = isset($perform_sql) ? false : true; + + $this->extensionslib->installExtension($extensionName, urldecode($filename), $perform_sql); } } diff --git a/application/libraries/ExtensionsLib.php b/application/libraries/ExtensionsLib.php index cec40a753..6598ec2e8 100644 --- a/application/libraries/ExtensionsLib.php +++ b/application/libraries/ExtensionsLib.php @@ -64,7 +64,7 @@ class ExtensionsLib * @param $extensionName string Name of Extension (optional) * @param $filename Path to tgz Extension File (optional) */ - public function installExtension($extensionName = null, $filename = null) + public function installExtension($extensionName = null, $filename = null, $perform_sql = true) { $extensionDB = null; // contains data from DB about an extension $extensionJson = null; // contains the extension.json data @@ -114,7 +114,7 @@ class ExtensionsLib $this->_installExtension($extensionJson); // records extension data in DB - if (!$this->_errorOccurred) // if no error occurred + if (!$this->_errorOccurred && $perform_sql === true) // if no error occurred { // Loads and executes neede SQL scripts $this->_loadSQLs( @@ -173,6 +173,9 @@ class ExtensionsLib $result = $this->_ci->ExtensionsModel->load($extensionId); if (hasData($result)) // if something was found { + $extensionServer = $result->retval[0]->server_kurzbz; + if ($extensionServer !== SERVER_NAME) + return false; $extensionName = $result->retval[0]->name; // extension name $this->_delSoftLinks($extensionName); // not to be checked, could fail if the extension is disabled // remove the extension from the extensions installation directory @@ -180,10 +183,9 @@ class ExtensionsLib // Select all the version of this extension $this->_ci->ExtensionsModel->addSelect('extension_id'); - $result = $this->_ci->ExtensionsModel->loadWhere(array('name' => $extensionName)); + $result = $this->_ci->ExtensionsModel->loadWhere(array('name' => $extensionName, 'server_kurzbz' => SERVER_NAME)); if (hasData($result)) // if something was found { - $extsArray = array(); foreach ($result->retval as $key => $extension) // loops on them { // Remove them all @@ -328,7 +330,7 @@ class ExtensionsLib // Loads the last version of the previous installation of this extension $this->_ci->ExtensionsModel->addOrder('version', 'DESC'); $this->_ci->ExtensionsModel->addLimit(1); - $result = $this->_ci->ExtensionsModel->loadWhere(array('name' => $extensionName)); + $result = $this->_ci->ExtensionsModel->loadWhere(array('name' => $extensionName, 'server_kurzbz' => SERVER_NAME)); if (isError($result)) { $this->_errorOccurred = true; @@ -550,7 +552,8 @@ class ExtensionsLib 'license' => isset($extensionJson->license) ? $extensionJson->license : null, 'url' => isset($extensionJson->url) ? $extensionJson->url : null, 'core_version' => $extensionJson->core_version, - 'dependencies' => isset($extensionJson->dependencies) ? $extensionJson->dependencies : null + 'dependencies' => isset($extensionJson->dependencies) ? $extensionJson->dependencies : null, + 'server_kurzbz' => SERVER_NAME, ) ); if (isSuccess($result)) @@ -738,11 +741,18 @@ class ExtensionsLib mkdir($extensionPath.$targetDirectory); } - // Create the symlink - $_addSoftLinks = symlink( - $extensionPath.$targetDirectory, - $rootPath.$targetDirectory.'/'.ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$extensionName - ); + if (!file_exists($rootPath.$targetDirectory.'/'.ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$extensionName)) + { + // Create the symlink + $_addSoftLinks = symlink( + $extensionPath.$targetDirectory, + $rootPath.$targetDirectory.'/'.ExtensionsLib::EXTENSIONS_DIR_NAME.'/'.$extensionName + ); + }else + { + $_addSoftLinks = true; + } + if (!$_addSoftLinks) { log_message('error', 'Failed to create Symlink to '.$extensionPath.$targetDirectory); diff --git a/application/models/system/Extensions_model.php b/application/models/system/Extensions_model.php index 8898ebd50..1beef4d8b 100644 --- a/application/models/system/Extensions_model.php +++ b/application/models/system/Extensions_model.php @@ -31,7 +31,7 @@ class Extensions_model extends DB_Model */ public function getInstalledExtensions() { - $query = 'SELECT extension_id, e1.name, e1.version, description, license, url, core_version, dependencies, enabled + $query = 'SELECT extension_id, e1.name, e1.version, description, license, url, core_version, dependencies, enabled, e1.server_kurzbz FROM system.tbl_extensions e1 INNER JOIN ( SELECT name, MAX(version) AS version diff --git a/application/views/system/extensions/manager.php b/application/views/system/extensions/manager.php index 6c48bc80a..01111f295 100644 --- a/application/views/system/extensions/manager.php +++ b/application/views/system/extensions/manager.php @@ -108,6 +108,7 @@ URL Minimum required Core version Dependes on (extensions) + Server Enabled   @@ -124,6 +125,7 @@ %s %s %s + %s @@ -143,6 +145,7 @@ $extension->url, $extension->core_version, count($extension->dependencies) == 0 ? 'None' : json_encode($extension->dependencies), + $extension->server_kurzbz, $extension->extension_id, $extension->enabled === true ? 'checked' : '', $extension->extension_id @@ -160,7 +163,9 @@ - +
+ + diff --git a/system/dbupdate_3.3.php b/system/dbupdate_3.3.php index e658d7a97..0bcff4928 100644 --- a/system/dbupdate_3.3.php +++ b/system/dbupdate_3.3.php @@ -956,13 +956,39 @@ if ($result = @$db->db_query("SELECT conname FROM pg_constraint WHERE conname = // UNIQUE INDEX uidx_extensions_name_version if ($result = $db->db_query("SELECT 0 FROM pg_class WHERE relname = 'uidx_extensions_name_version'")) { - if ($db->db_num_rows($result) == 0) + if ($db->db_num_rows($result) == 1) { - $qry = 'CREATE UNIQUE INDEX uidx_extensions_name_version ON system.tbl_extensions USING btree (name, version);'; + $qry = 'DROP INDEX system.uidx_extensions_name_version'; if (!$db->db_query($qry)) echo 'uidx_extensions_name_version '.$db->db_last_error().'
'; else - echo '
Created unique uidx_extensions_name_version'; + echo '
Dropped unique uidx_extensions_name_version'; + } +} + +// stud_selfservice boolean fuer public.tbl_vorlage +if(!@$db->db_query("SELECT server_kurzbz FROM system.tbl_extensions LIMIT 1")) +{ + $qry = "ALTER TABLE system.tbl_extensions ADD COLUMN server_kurzbz varchar(64); + ALTER TABLE system.tbl_extensions ADD CONSTRAINT fk_extensios_server_kurzbz FOREIGN KEY (server_kurzbz) REFERENCES system.tbl_server(server_kurzbz) ON UPDATE CASCADE ON DELETE RESTRICT;"; + + if(!$db->db_query($qry)) + echo 'App: '.$db->db_last_error().'
'; + else + echo '
Neue Spalte server_kurzbz in system.tbl_extensions hinzugefügt'; +} + + +// UNIQUE INDEX uidx_extensions_name_version_server +if ($result = $db->db_query("SELECT 0 FROM pg_class WHERE relname = 'uidx_extensions_name_version_server'")) +{ + if ($db->db_num_rows($result) == 0) + { + $qry = 'CREATE UNIQUE INDEX uidx_extensions_name_version_server ON system.tbl_extensions USING btree (name, version, server_kurzbz);'; + if (!$db->db_query($qry)) + echo 'uidx_extensions_name_version_server '.$db->db_last_error().'
'; + else + echo '
Created unique uidx_extensions_name_version_server'; } }