/** * Returns if the package exists. * * @param string $packageId Package ID * * @return bool */ public static function exists($packageId) { $package = explode('/', $packageId); if (isset($package[1])) { return rex_plugin::exists($package[0], $package[1]); } return rex_addon::exists($package[0]); }
protected function checkPreConditions() { if (!rex_addon::exists($this->addonkey)) { throw new rex_api_exception(sprintf('AddOn "%s" does not exist!', $this->addonkey)); } $this->addon = rex_addon::get($this->addonkey); if (!rex_string::versionCompare($this->file['version'], $this->addon->getVersion(), '>')) { throw new rex_api_exception(sprintf('Existing version of AddOn "%s" (%s) is newer than %s', $this->addonkey, $this->addon->getVersion(), $this->file['version'])); } }
public static function getMyPackages() { if (is_array(self::$myPackages)) { return self::$myPackages; } self::$myPackages = self::getPackages('?only_my=1'); foreach (self::$myPackages as $key => $addon) { if (!rex_addon::exists($key)) { unset(self::$myPackages[$key]); } } return self::$myPackages; }
protected function checkPreConditions() { if (rex_addon::exists($this->addonkey)) { throw new rex_api_exception(sprintf('AddOn "%s" already exist!', $this->addonkey)); } }
public function execute() { if (!rex::getUser()->isAdmin()) { throw new rex_api_exception('You do not have the permission!'); } $installAddon = rex_addon::get('install'); $versions = self::getVersions(); $versionId = rex_request('version_id', 'int'); if (!isset($versions[$versionId])) { return null; } $version = $versions[$versionId]; if (!rex_string::versionCompare($version['version'], rex::getVersion(), '>')) { throw new rex_api_exception(sprintf('Existing version of Core (%s) is newer than %s', rex::getVersion(), $version['version'])); } try { $archivefile = rex_install_webservice::getArchive($version['path']); } catch (rex_functional_exception $e) { throw new rex_api_exception($e->getMessage()); } $message = ''; $temppath = rex_path::coreCache('.new.core/'); try { if ($version['checksum'] != md5_file($archivefile)) { throw new rex_functional_exception($installAddon->i18n('warning_zip_wrong_checksum')); } if (!rex_install_archive::extract($archivefile, $temppath)) { throw new rex_functional_exception($installAddon->i18n('warning_core_zip_not_extracted')); } if (!is_dir($temppath . 'core')) { throw new rex_functional_exception($installAddon->i18n('warning_zip_wrong_format')); } $coreAddons = []; /** @var rex_addon[] $updateAddons */ $updateAddons = []; if (is_dir($temppath . 'addons')) { foreach (rex_finder::factory($temppath . 'addons')->dirsOnly() as $dir) { $addonkey = $dir->getBasename(); $addonPath = $dir->getRealPath() . '/'; if (!file_exists($addonPath . rex_package::FILE_PACKAGE)) { continue; } $config = rex_file::getConfig($addonPath . rex_package::FILE_PACKAGE); if (!isset($config['version']) || rex_addon::exists($addonkey) && rex_string::versionCompare($config['version'], rex_addon::get($addonkey)->getVersion(), '<')) { continue; } $coreAddons[$addonkey] = $addonkey; if (rex_addon::exists($addonkey)) { $updateAddons[$addonkey] = rex_addon::get($addonkey); $updateAddonsConfig[$addonkey] = $config; } } } //$config = rex_file::getConfig($temppath . 'core/default.config.yml'); //foreach ($config['system_addons'] as $addonkey) { // if (is_dir($temppath . 'addons/' . $addonkey) && rex_addon::exists($addonkey)) { // $updateAddons[$addonkey] = rex_addon::get($addonkey); // } //} $this->checkRequirements($temppath, $version['version'], $updateAddonsConfig); if (file_exists($temppath . 'core/update.php')) { include $temppath . 'core/update.php'; } foreach ($updateAddons as $addonkey => $addon) { if ($addon->isInstalled() && file_exists($file = $temppath . 'addons/' . $addonkey . '/' . rex_package::FILE_UPDATE)) { try { $addon->includeFile($file); if ($msg = $addon->getProperty('updatemsg', '')) { throw new rex_functional_exception($msg); } if (!$addon->getProperty('update', true)) { throw new rex_functional_exception(rex_i18n::msg('package_no_reason')); } } catch (rex_functional_exception $e) { throw new rex_functional_exception($addonkey . ': ' . $e->getMessage(), $e); } catch (rex_sql_exception $e) { throw new rex_functional_exception($addonkey . ': SQL error: ' . $e->getMessage(), $e); } } } // create backup $installConfig = rex_file::getCache($installAddon->getDataPath('config.json')); if (isset($installConfig['backups']) && $installConfig['backups']) { rex_dir::create($installAddon->getDataPath()); $archive = $installAddon->getDataPath(strtolower(preg_replace('/[^a-z0-9-_.]/i', '_', rex::getVersion())) . '.zip'); rex_install_archive::copyDirToArchive(rex_path::core(), $archive); foreach ($updateAddons as $addonkey => $addon) { rex_install_archive::copyDirToArchive($addon->getPath(), $archive, 'addons/' . $addonkey); } } // copy plugins to new addon dirs foreach ($updateAddons as $addonkey => $addon) { foreach ($addon->getRegisteredPlugins() as $plugin) { $pluginPath = $temppath . 'addons/' . $addonkey . '/plugins/' . $plugin->getName(); if (!is_dir($pluginPath)) { rex_dir::copy($plugin->getPath(), $pluginPath); } elseif ($plugin->isInstalled() && is_dir($pluginPath . '/assets')) { rex_dir::copy($pluginPath . '/assets', $plugin->getAssetsPath()); } } } // move temp dirs to permanent destination rex_dir::delete(rex_path::core()); rename($temppath . 'core', rex_path::core()); if (is_dir(rex_path::core('assets'))) { rex_dir::copy(rex_path::core('assets'), rex_path::coreAssets()); } foreach ($coreAddons as $addonkey) { if (isset($updateAddons[$addonkey])) { rex_dir::delete(rex_path::addon($addonkey)); } rename($temppath . 'addons/' . $addonkey, rex_path::addon($addonkey)); if (is_dir(rex_path::addon($addonkey, 'assets'))) { rex_dir::copy(rex_path::addon($addonkey, 'assets'), rex_path::addonAssets($addonkey)); } } } catch (rex_functional_exception $e) { $message = $e->getMessage(); } catch (rex_sql_exception $e) { $message = 'SQL error: ' . $e->getMessage(); } rex_file::delete($archivefile); rex_dir::delete($temppath); if ($message) { $message = $installAddon->i18n('warning_core_not_updated') . '<br />' . $message; $success = false; } else { $message = $installAddon->i18n('info_core_updated'); $success = true; rex_delete_cache(); rex_install_webservice::deleteCache('core'); } $result = new rex_api_result($success, $message); if ($success) { $result->setRequiresReboot(true); } return $result; }
/** * Synchronizes the packages with the file system. */ public static function synchronizeWithFileSystem() { $config = rex::getConfig('package-config'); $addons = self::readPackageFolder(rex_path::src('addons')); $registeredAddons = array_keys(rex_addon::getRegisteredAddons()); foreach (array_diff($registeredAddons, $addons) as $addonName) { $manager = rex_addon_manager::factory(rex_addon::get($addonName)); $manager->_delete(true); unset($config[$addonName]); } foreach ($addons as $addonName) { if (!rex_addon::exists($addonName)) { $config[$addonName]['install'] = false; $config[$addonName]['status'] = false; $registeredPlugins = []; } else { $addon = rex_addon::get($addonName); $config[$addonName]['install'] = $addon->isInstalled(); $config[$addonName]['status'] = $addon->isAvailable(); $registeredPlugins = array_keys($addon->getRegisteredPlugins()); } $plugins = self::readPackageFolder(rex_path::addon($addonName, 'plugins')); foreach (array_diff($registeredPlugins, $plugins) as $pluginName) { $manager = rex_plugin_manager::factory(rex_plugin::get($addonName, $pluginName)); $manager->_delete(true); unset($config[$addonName]['plugins'][$pluginName]); } foreach ($plugins as $pluginName) { $plugin = rex_plugin::get($addonName, $pluginName); $config[$addonName]['plugins'][$pluginName]['install'] = $plugin->isInstalled(); $config[$addonName]['plugins'][$pluginName]['status'] = $plugin->getProperty('status'); } if (isset($config[$addonName]['plugins']) && is_array($config[$addonName]['plugins'])) { ksort($config[$addonName]['plugins']); } } ksort($config); rex::setConfig('package-config', $config); rex_addon::initialize(); }
</div> '; $content = ' <table class="table table-striped table-hover" id="rex-js-table-install-packages-addons"> <thead> <tr> <th class="rex-table-icon"><a href="' . rex_url::currentBackendPage(['func' => 'reload']) . '" title="' . $this->i18n('reload') . '"><i class="rex-icon rex-icon-refresh"></i></a></th> <th>' . $this->i18n('key') . '</th> <th>' . $this->i18n('name') . ' / ' . $this->i18n('author') . '</th> <th>' . $this->i18n('shortdescription') . '</th> <th class="rex-table-action">' . $this->i18n('header_function') . '</th> </tr> </thead> <tbody>'; foreach ($addons as $key => $addon) { if (rex_addon::exists($key)) { $content .= ' <tr> <td class="rex-table-icon"><i class="rex-icon rex-icon-package"></i></td> <td data-title="' . $this->i18n('key') . '">' . $key . '</td> <td data-title="' . $this->i18n('name') . '"><b>' . $addon['name'] . '</b><br /><span class="text-muted">' . $addon['author'] . '</span></td> <td data-title="' . $this->i18n('shortdescription') . '">' . nl2br($addon['shortdescription']) . '</td> <td class="rex-table-action"><span class="text-nowrap"><i class="rex-icon rex-icon-package-exists"></i> ' . $this->i18n('addon_already_exists') . '</span></td> </tr>'; } else { $url = rex_url::currentBackendPage(['addonkey' => $key]); $content .= ' <tr> <td class="rex-table-icon"><a href="' . $url . '"><i class="rex-icon rex-icon-package"></i></a></td> <td data-title="' . $this->i18n('key') . '"><a href="' . $url . '">' . $key . '</a></td> <td data-title="' . $this->i18n('name') . '"><b>' . $addon['name'] . '</b><br /><span class="text-muted">' . $addon['author'] . '</span></td>
/** * Returns if the plugin exists. * * @param string $addon Name of the addon * @param string $plugin Name of the plugin * * @return bool */ public static function exists($addon, $plugin = null) { return rex_addon::exists($addon) && rex_addon::get($addon)->pluginExists($plugin); }