/** * Gibt Liste mit Modulen zurück, die von Modul-Server angeboten werden * @param bool $init * @return array */ public function getModulesRemote($init = true) { if (!\fpcm\classes\baseconfig::canConnect()) { return array(); } $moduleUpdater = new \fpcm\model\updater\modules(); $moduleUpdater->getModulelist(); $remoteModues = $moduleUpdater->getRemoteData(); if (!is_array($remoteModues)) { return array(); } $modules = array(); foreach ($remoteModues as $key => $value) { if (version_compare($this->config->system_version, $value['minsysverion'], '<') || version_compare($this->config->system_version, $value['maxsysverion'], '>')) { continue; } $value['description'] = isset($value['description']) ? $value['description'] : ''; $value['author'] = isset($value['author']) ? $value['author'] : ''; $value['link'] = isset($value['link']) ? $value['link'] : ''; $value['systemMinVersion'] = isset($value['minsysverion']) ? $value['minsysverion'] : ''; $mlConfig = $this->getConfigByModuleKey($key, 'modulelist'); $moduleItem = new \fpcm\model\modules\listitem($key, $value['name'], isset($mlConfig['version']) ? $mlConfig['version'] : '-', $value['version'], $value['description'], $value['author'], $value['link'], $value['systemMinVersion'], $init); if (isset($value['dependencies'])) { $moduleItem->setDependencies($value['dependencies']); } $modules[$key] = $moduleItem; } return $modules; }
/** * Controller-Processing */ public function process() { if (!parent::process()) { return false; } $this->cache->cleanup(); $updater = new \fpcm\model\updater\modules(); $updater->checkUpdates(true); }
/** * Liefert Modul-Update-HTML zurück * @since FPCM 3.1.0 */ private function getModuleUpdateStatus() { $moduleUpdates = new \fpcm\model\updater\modules(); $checkRes = $moduleUpdates->checkUpdates(); if ($checkRes === true) { $iconClass = 'fa-cloud-download'; $statusClass = 'fpcm-dashboard-updates-outdated'; $statusText = $this->language->translate('UPDATE_MODULECHECK_NEW'); } elseif ($checkRes === \fpcm\model\updater\system::SYSTEMUPDATER_FURLOPEN_ERROR) { $iconClass = 'fa-exclamation-triangle'; $statusClass = 'fpcm-dashboard-updates-checkerror'; $statusText = $this->language->translate('UPDATE_MODULECHECK_FAILED'); } else { $iconClass = 'fa-check'; $statusClass = 'fpcm-dashboard-updates-current'; $statusText = $this->language->translate('UPDATE_MODULECHECK_CURRENT'); } $this->renderTable($iconClass, $statusClass, $statusText); }
/** * Paket Manager Aktionen * @return boolean */ public function processPkg() { $updaterSys = new \fpcm\model\updater\system(); $updaterMod = new \fpcm\model\updater\modules(); $moduleList = new \fpcm\model\modules\modulelist(); switch ($this->funcParams[0]) { case self::FPCMCLI_PARAM_UPDATE: $this->output('Check for system and module updates...'); $successSys = $updaterSys->checkUpdates(); $successMod = $updaterMod->checkUpdates(); if ($successSys > 1 || $successMod > 1) { $this->output('Unable to update package informations. Check PHP log for further information.' . PHP_EOL . 'Error Code: SYS-' . $successSys . ' | MOD-' . $successMod, true); } $this->output('Check successfull!'); $this->output('Current system version: ' . $updaterSys->getRemoteData('version')); $this->output('Module updates available: ' . ($successMod ? 'yes' : 'no')); break; case self::FPCMCLI_PARAM_INSTALL: case self::FPCMCLI_PARAM_UPGRADE: if ($this->funcParams[1] !== self::FPCMCLI_PARAM_TYPE_MODULE && $this->funcParams[0] === self::FPCMCLI_PARAM_INSTALL) { $this->output('Invalid params', true); } if ($this->funcParams[1] === self::FPCMCLI_PARAM_TYPE_SYSTEM) { $this->output('Start system update...'); $successSys = $updaterSys->checkUpdates(); $remoteData = $updaterSys->getRemoteData(); $fileInfo = pathinfo($remoteData['filepath'], PATHINFO_FILENAME); $pkg = new \fpcm\model\packages\update('update', $fileInfo); } elseif ($this->funcParams[1] === self::FPCMCLI_PARAM_TYPE_MODULE) { $list = $moduleList->getModulesRemote(); $keyData = \fpcm\model\packages\package::explodeModuleFileName($this->funcParams[2]); if (!array_key_exists($keyData[0], $list)) { $this->output('The requested module was not found in package list storage. Check your module key or update package information storage.', true); } /* @var $module \fpcm\model\modules\listitem */ $module = $list[$keyData[0]]; $pkg = new \fpcm\model\packages\module('module', $module->getKey(), $module->getVersionRemote()); } $this->output('Download package from ' . $pkg->getRemoteFile() . '...'); $success = $pkg->download(); if ($success !== true) { $this->output('Download failed. ERROR CODE: ' . $success, true); } $this->output('Unpacking package file ' . \fpcm\model\files\ops::removeBaseDir($pkg->getLocalFile(), true) . '...'); $success = $pkg->extract(); if ($success !== true) { $this->output('Unpacking failed. ERROR CODE: ' . $success, true); } $this->output('Copy package content...'); $success = $pkg->copy(); if ($success !== true) { $this->output('Copy process failed. ERROR CODE: ' . $success, true); } if ($this->funcParams[1] === self::FPCMCLI_PARAM_TYPE_SYSTEM) { $this->output('Run final update steps...'); $this->runFinalizer(); } elseif ($this->funcParams[1] === self::FPCMCLI_PARAM_TYPE_MODULE) { $this->output('Perform database changes...'); $moduleClass = \fpcm\model\abstracts\module::getModuleClassName($keyData[0]); $res = class_exists($moduleClass); $moduleClassPath = \fpcm\classes\baseconfig::$moduleDir . $keyData[0] . '/' . str_replace(array('\\', '/'), '', $keyData[0]) . '.php'; if (!file_exists($moduleClassPath)) { $this->output('Module class ' . $moduleClass . ' not found in "' . $moduleClassPath . '"!', true); } $modObj = new $moduleClass($pkg->getKey(), '', $module->getVersionRemote()); if (!is_a($modObj, '\\fpcm\\model\\abstracts\\module')) { $this->output('Module class ' . $moduleClass . ' must be an instance of "\\fpcm\\model\\abstracts\\module"!', true); } if ($this->funcParams[0] === self::FPCMCLI_PARAM_INSTALL) { if ($module->isInstalled()) { $this->output('The selected module is already installed. Exiting...', true); } $res = $modObj->runInstall(); } elseif ($this->funcParams[0] === self::FPCMCLI_PARAM_UPGRADE) { if (!$module->isInstalled()) { $this->output('The selected module is not installed. Exiting...', true); } $res = $modObj->runUpdate(); } } $this->output('Update package manager log...'); $pkg->loadPackageFileListFromTemp(); \fpcm\classes\logs::pkglogWrite($pkg->getKey() . ' ' . $pkg->getVersion(), $pkg->getFiles()); $this->output('Perform cleanup...'); $success = $pkg->cleanup(); if ($this->funcParams[1] === self::FPCMCLI_PARAM_TYPE_SYSTEM) { $this->output('System update successfull. New version: ' . $this->config->system_version); } if ($this->funcParams[1] === self::FPCMCLI_PARAM_TYPE_MODULE) { $this->output('Module installed successfull!'); } break; case self::FPCMCLI_PARAM_UPGRADE_DB: if ($this->funcParams[1] === self::FPCMCLI_PARAM_TYPE_MODULE) { $this->output('Invalid params', true); } if ($this->funcParams[1] === self::FPCMCLI_PARAM_TYPE_SYSTEM) { $this->output('Update database and filesystem...'); $this->runFinalizer(); $this->output('Update successfull. New version: ' . $this->config->system_version); } break; case self::FPCMCLI_PARAM_REMOVE: if ($this->funcParams[1] !== self::FPCMCLI_PARAM_TYPE_MODULE) { $this->output('Invalid params', true); } $list = $moduleList->getModulesRemote(); $keyData = \fpcm\model\packages\package::explodeModuleFileName($this->funcParams[2]); if (!array_key_exists($keyData[0], $list)) { $this->output('The requested module was not found in package list storage. Check your module key or update package information storage.', true); } /* @var $module \fpcm\model\modules\listitem */ $module = $list[$keyData[0]]; if (!$module->isInstalled()) { $this->output('The selected module is not installed. Exiting...', true); } $module->runUninstall(); if (!$moduleList->uninstallModules(array($keyData[0]))) { $this->output('Unable to remove module ' . $keyData[0], true); } $this->output('Module ' . $keyData[0] . ' was removed successfully.'); break; case self::FPCMCLI_PARAM_LIST: if ($this->funcParams[1] !== self::FPCMCLI_PARAM_TYPE_MODULE) { $this->output('Invalid params', true); } $list = $moduleList->getModulesRemote(false); $out = array('', 'Available modules from package server for current FanPress CM version:', ''); /* @var $value \fpcm\model\modules\listitem */ foreach ($list as $value) { $line = array(' == ' . $value->getName() . ' > ' . $value->getKey() . ', ' . $value->getVersionRemote(), ' ' . $value->getAuthor() . ' > ' . $value->getLink(), ' ' . $value->getDescription(), ''); $out[] = implode(PHP_EOL, $line); } $this->output($out); break; case self::FPCMCLI_PARAM_INFO: if ($this->funcParams[1] !== self::FPCMCLI_PARAM_TYPE_MODULE) { $this->output('Invalid params', true); } $list = $moduleList->getModulesRemote(); $keyData = \fpcm\model\packages\package::explodeModuleFileName($this->funcParams[2]); if (!array_key_exists($keyData[0], $list)) { $this->output('The requested module was not found in package list storage. Check your module key or update package information storage.', true); } /* @var $module \fpcm\model\modules\listitem */ $module = $list[$keyData[0]]; $this->output(array('== ' . $module->getName(), ' ' . $module->getKey(), ' > ' . $module->getDescription(), ' Version: ' . $module->getVersionRemote(), ' Author: ' . $module->getAuthor(), ' Link: ' . $module->getLink(), ' Installed: ' . ($module->isInstalled() ? 'yes' : 'no'), ' Installed version: ' . $module->getVersion(), ' Status: ' . ($module->getStatus() ? 'enabled' : 'disabled'), ' Dependencies:', ' ' . implode(PHP_EOL, $module->getDependencies()))); break; default: break; } return true; }
/** * Request-Handler * @return boolean */ public function request() { if (!$this->session->exists() && !$this->permissions->check($this->checkPermission)) { return false; } if (is_null($this->getRequestVar('action')) || is_null($this->getRequestVar('keys'))) { return true; } $this->cache->cleanup(); $this->action = $this->getRequestVar('action'); $this->keys = $this->getRequestVar('keys', array(1, 4, 7)); if (!is_array($this->keys)) { $this->keys = json_decode($this->keys, true); } if (!is_array($this->keys)) { return true; } $this->keys = array_map('trim', $this->keys); $this->keys = array_map('base64_decode', $this->keys); switch ($this->action) { case 'disable': if (!$this->permissions->check(array('modules' => 'enable'))) { return true; } $res = $this->modulelist->disableModules($this->keys); break; case 'enable': if (!$this->permissions->check(array('modules' => 'enable'))) { return true; } $res = $this->modulelist->enableModules($this->keys); break; case 'uninstall': if (!$this->permissions->check(array('modules' => 'uninstall'))) { return true; } $res = $this->modulelist->uninstallModules($this->keys); break; case 'install': if (!$this->permissions->check(array('modules' => 'install'))) { return true; } $this->keys = array_diff($this->keys, $this->modulelist->getInstalledModules()); $tempFile = new \fpcm\model\files\tempfile('installkeys', json_encode($this->keys)); if (!$tempFile->save()) { trigger_error('Unable to save module keys to temp file'); return true; } break; case 'update': if (!$this->permissions->check(array('modules' => 'install'))) { return true; } $updater = new \fpcm\model\updater\modules(); $updater->getModulelist(); $remotes = $updater->getRemoteData(); $this->keys = array_intersect($this->keys, $this->modulelist->getInstalledModules()); $versionKeys = array(); foreach ($this->keys as $key) { $versionKeys[] = $key . '_version' . $remotes[$key]['version']; } $tempFile = new \fpcm\model\files\tempfile('installkeys', json_encode($versionKeys)); if (!$tempFile->save()) { trigger_error('Unable to save module keys to temp file'); return true; } break; } if (!isset($res)) { return true; } if ($res) { $this->view->addNoticeMessage('MODULES_SUCCESS_' . strtoupper($this->action)); } else { $this->view->addErrorMessage('MODULES_FAILED_' . strtoupper($this->action)); } return true; }