Exemplo n.º 1
0
 /**
  * Controller-Processing
  */
 public function process()
 {
     if (!parent::process()) {
         return false;
     }
     if ($this->canConnect) {
         $keyData = \fpcm\model\packages\package::explodeModuleFileName($this->key);
         $pkg = new \fpcm\model\packages\module('module', $keyData[0], $keyData[1]);
     }
     if (!isset($keyData[0]) || !isset($keyData[1])) {
         $this->returnCode = $this->step . '_0';
         $this->getResponse();
     }
     $this->returnData['current'] = $this->step;
     switch ($this->step) {
         case 1:
             $res = $pkg->download();
             $from = $pkg->getRemoteFile();
             if ($res === true) {
                 \fpcm\classes\logs::syslogWrite('Downloaded module package successfully from ' . $from);
                 $this->returnData['nextstep'] = 2;
             } else {
                 \fpcm\classes\logs::syslogWrite('Error while downloading module package from' . $from);
                 $this->returnData['nextstep'] = 5;
             }
             break;
         case 2:
             $res = $pkg->extract();
             $from = \fpcm\model\files\ops::removeBaseDir($pkg->getLocalFile());
             if ($res === true) {
                 \fpcm\classes\logs::syslogWrite('Extracted module package successfully from ' . $from);
                 $this->returnData['nextstep'] = 3;
             } else {
                 \fpcm\classes\logs::syslogWrite('Error while extracting module package from ' . $from);
                 $this->returnData['nextstep'] = 5;
             }
             break;
         case 3:
             $res = $pkg->copy();
             $dest = \fpcm\model\files\ops::removeBaseDir(\fpcm\classes\baseconfig::$baseDir) . $pkg->getCopyDestination() . $pkg->getKey();
             $from = \fpcm\model\files\ops::removeBaseDir($pkg->getExtractPath() . basename($pkg->getKey()));
             if ($res === true) {
                 \fpcm\classes\logs::syslogWrite('Moved module package content successfully from ' . $from . ' to ' . $dest);
                 $this->returnData['nextstep'] = 4;
             } else {
                 \fpcm\classes\logs::syslogWrite('Error while moving module package content from ' . $from . ' to ' . $dest);
                 \fpcm\classes\logs::syslogWrite(implode('<br>', $pkg->getCopyErrorPaths()));
                 $this->returnData['nextstep'] = 5;
             }
             break;
         case 4:
             $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)) {
                 $res = false;
                 trigger_error('Module class ' . $moduleClass . ' not found in "' . $moduleClassPath . '"!');
                 $this->returnData['nextstep'] = 5;
                 break;
             }
             if ($res) {
                 $modObj = new $moduleClass($keyData[0], '', $keyData[1]);
                 if (!is_a($modObj, '\\fpcm\\model\\abstracts\\module')) {
                     $res = false;
                     trigger_error('Module class ' . $moduleClass . ' must be an instance of "\\fpcm\\model\\abstracts\\module"!');
                     break;
                 }
                 $res = $modObj->runInstall();
             }
             $this->returnData['nextstep'] = 5;
             if ($res === true) {
                 \fpcm\classes\logs::syslogWrite('Run final module install steps successfully for ' . $pkg->getKey());
             } else {
                 \fpcm\classes\logs::syslogWrite('Error while running final module install steps for ' . $pkg->getKey());
             }
             break;
         case 5:
             if ($this->canConnect) {
                 $pkg->loadPackageFileListFromTemp();
                 \fpcm\classes\logs::pkglogWrite($pkg->getKey() . ' ' . $pkg->getVersion(), $pkg->getFiles());
                 $pkg->cleanup();
             }
             \fpcm\classes\baseconfig::enableAsyncCronjobs(true);
             $this->cache->cleanup();
             $res = true;
             break;
         default:
             $res = false;
             break;
     }
     $this->returnCode = $this->step . '_' . (int) $res;
     $this->getResponse();
 }
Exemplo n.º 2
0
 /**
  * Führt Upload von Module-Package via HTML-Form + PHP sowie Installation aus Modulmanager durch
  * @return boolean
  */
 public function processModuleUpload()
 {
     $tempNames = $this->uploader['tmp_name'];
     $fileNames = $this->uploader['name'];
     $fileTypes = $this->uploader['type'];
     foreach ($tempNames as $key => $value) {
         if (!is_uploaded_file($value) || !isset($fileNames[$key]) || !isset($fileTypes[$key])) {
             continue;
         }
         $ext = pathinfo($fileNames[$key], PATHINFO_EXTENSION);
         $ext = $ext ? strtolower($ext) : '';
         if ($ext != 'zip') {
             return false;
         }
         $fileName = \fpcm\classes\baseconfig::$tempDir . $fileNames[$key];
         if (!move_uploaded_file($value, $fileName)) {
             return false;
         }
         $data = \fpcm\model\packages\package::explodeModuleFileName(basename($fileNames[$key], '.zip'));
         $package = new \fpcm\model\packages\module('module', $data[0], $data[1]);
         $res = $package->extract();
         $extractPath = $package->getExtractPath();
         $modulelisteConfigFile = realpath($extractPath . $data[0] . '/config/modulelist.yml');
         if (!file_exists($modulelisteConfigFile)) {
             return $res;
         }
         include_once \fpcm\classes\loader::libGetFilePath('spyc', 'Spyc.php');
         $modulelisteConfig = \Spyc::YAMLLoad($modulelisteConfigFile);
         if ($res !== true) {
             return $res;
         }
         $package->setCopyDestination($modulelisteConfig['vendor'] . '/');
         $res = $package->copy();
         if ($res !== true) {
             return $res;
         }
         $package->cleanup();
         $moduleClass = \fpcm\model\abstracts\module::getModuleClassName($modulelisteConfig['vendor'] . '/' . $modulelisteConfig['key']);
         if (class_exists($moduleClass)) {
             $modObj = new $moduleClass($modulelisteConfig['vendor'] . $modulelisteConfig['key'], '', $data[1]);
             $res = $modObj->isInstalled() ? $modObj->runUpdate() : $modObj->runInstall();
             if ($res !== true) {
                 return $res;
             }
         }
     }
     return true;
 }
Exemplo n.º 3
0
 /**
  * Module deinstallieren, nur wenn deaktiviert
  * @param array $keys
  * @return boolean
  */
 public function uninstallModules(array $keys)
 {
     $this->cache->cleanup();
     $keys = array_intersect($keys, $this->getDisabledInstalledModules());
     if (!count($keys)) {
         return false;
     }
     $res = true;
     foreach ($keys as $key) {
         $moduleClass = \fpcm\model\abstracts\module::getModuleClassName($key);
         if (!class_exists($moduleClass)) {
             continue;
         }
         $modObj = new $moduleClass($key, '', '');
         if (!is_a($modObj, '\\fpcm\\model\\abstracts\\module')) {
             continue;
         }
         $res = $res && $modObj->runUninstall();
     }
     $res = $res && $this->dbcon->delete($this->table, "(modkey = '" . implode("' OR modkey = '", $keys) . "') AND status = 0");
     $lastKey = false;
     foreach ($keys as $key) {
         $res = $res && \fpcm\model\files\ops::deleteRecursive(\fpcm\classes\baseconfig::$moduleDir . $key);
         $lastKey = $key;
     }
     if (!$lastKey) {
         return $res;
     }
     $folders = glob(\fpcm\classes\baseconfig::$moduleDir . dirname($lastKey) . '/*', GLOB_ONLYDIR);
     if (!count($folders)) {
         $res = $res && \fpcm\model\files\ops::deleteRecursive(\fpcm\classes\baseconfig::$moduleDir . dirname($lastKey));
     }
     return $res;
 }
Exemplo n.º 4
0
 /**
  * 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;
 }