/** * Method to get update for one-click update * * @param string $module * @param string $new * @param string $old * @param int $id * @return void */ public function getUpdate($module = null, $new = null, $old = null, $id = null) { if (null === $module) { if (file_exists(CONTENT_ABS_PATH . '/assets/phire')) { $dir = new Dir(CONTENT_ABS_PATH . '/assets/phire'); $dir->emptyDir(true); } if (file_exists(CONTENT_ABS_PATH . '/assets/default')) { $dir = new Dir(CONTENT_ABS_PATH . '/assets/default'); $dir->emptyDir(true); } if (file_exists(CONTENT_ABS_PATH . '/assets/default-flat')) { $dir = new Dir(CONTENT_ABS_PATH . '/assets/default-flat'); $dir->emptyDir(true); } if (file_exists(CONTENT_ABS_PATH . '/assets/default-top')) { $dir = new Dir(CONTENT_ABS_PATH . '/assets/default-top'); $dir->emptyDir(true); } if (file_exists(CONTENT_ABS_PATH . '/assets/default-top-flat')) { $dir = new Dir(CONTENT_ABS_PATH . '/assets/default-top-flat'); $dir->emptyDir(true); } file_put_contents(CONTENT_ABS_PATH . '/updates/phirecms.zip', fopen('http://updates.phirecms.org/releases/phire/phirecms.zip', 'r')); $basePath = realpath(CONTENT_ABS_PATH . '/updates/'); $archive = new Archive($basePath . '/phirecms.zip'); $archive->extract($basePath); unlink(CONTENT_ABS_PATH . '/updates/phirecms.zip'); $json = json_decode(stream_get_contents(fopen('http://updates.phirecms.org/releases/phire/phire.json', 'r')), true); foreach ($json as $file) { if (!file_exists(__DIR__ . '/../' . $file) && !file_exists(dirname(__DIR__ . '/../' . $file))) { mkdir(dirname(__DIR__ . '/../' . $file), 0755, true); } copy(CONTENT_ABS_PATH . '/updates/phire-cms/' . $file, __DIR__ . '/../' . $file); } $dir = new Dir(CONTENT_ABS_PATH . '/updates/phire-cms/'); $dir->emptyDir(true); } else { if (file_exists(MODULES_ABS_PATH . '/' . $module . '-' . $old . '.zip')) { unlink(MODULES_ABS_PATH . '/' . $module . '-' . $old . '.zip'); } if (file_exists(MODULES_ABS_PATH . '/' . $module . '-' . $old)) { $dir = new Dir(MODULES_ABS_PATH . '/' . $module . '-' . $old); $dir->emptyDir(true); } if (file_exists(CONTENT_ABS_PATH . '/assets/' . $module)) { $dir = new Dir(CONTENT_ABS_PATH . '/assets/' . $module); $dir->emptyDir(true); } file_put_contents(MODULES_ABS_PATH . '/' . $module . '-' . $new . '.zip', fopen('http://updates.phirecms.org/releases/modules/' . $module . '-' . $new . '.zip', 'r')); $basePath = realpath(MODULES_ABS_PATH . '/'); $archive = new Archive($basePath . '/' . $module . '-' . $new . '.zip'); $archive->extract($basePath); $mod = Table\Modules::findById($id); $assets = unserialize($mod->assets); if (isset($assets['info']['version'])) { $assets['info']['version'] = $new; } else { if (isset($assets['info']['Version'])) { $assets['info']['Version'] = $new; } else { if (isset($assets['info']['VERSION'])) { $assets['info']['VERSION'] = $new; } } } $mod->file = $module . '-' . $new . '.zip'; $mod->folder = $module . '-' . $new; $mod->assets = serialize($assets); $mod->save(); } }
/** * Uninstall modules * * @param array $ids * @param \Pop\Service\Locator $services * @return void */ public function uninstall($ids, $services) { $modulesPath = MODULES_ABS_PATH; foreach ($ids as $id) { $module = Table\Modules::findById((int) $id); if (isset($module->id)) { $assets = unserialize($module->assets); if (isset($assets['tables']) && count($assets['tables']) > 0) { $db = $services['database']; if (DB_INTERFACE == 'mysql' || DB_TYPE == 'mysql') { $db->query('SET foreign_key_checks = 0;'); foreach ($assets['tables'] as $table) { $db->query('DROP TABLE ' . $table); } $db->query('SET foreign_key_checks = 1;'); } else { if (DB_INTERFACE == 'pgsql' || DB_TYPE == 'pgsql') { foreach ($assets['tables'] as $table) { $db->query('DROP TABLE ' . $table . ' CASCADE'); } } else { foreach ($assets['tables'] as $table) { $db->query('DROP TABLE ' . $table); } } } } // Run any uninstall functions $config = (include $modulesPath . '/' . $module->folder . '/config/module.php'); if (isset($config[$module->name]) && isset($config[$module->name]['uninstall']) && !empty($config[$module->name]['uninstall'])) { call_user_func_array($config[$module->name]['uninstall'], [$services]); } // Remove any assets if (file_exists(__DIR__ . '/../../..' . CONTENT_PATH . '/assets/' . strtolower($module->name))) { $dir = new Dir(__DIR__ . '/../../..' . CONTENT_PATH . '/assets/' . strtolower($module->name)); $dir->emptyDir(true); } if (strpos($modulesPath, 'vendor') === false) { // Remove the module folder and files if (file_exists($modulesPath . '/' . $module->folder)) { $dir = new Dir($modulesPath . '/' . $module->folder); $dir->emptyDir(true); } // Remove the module file if (file_exists($modulesPath . '/' . $module->file) && is_writable($modulesPath . '/' . $module->file)) { unlink($modulesPath . '/' . $module->file); } } $module->delete(); } } }
/** * Update action method * * @param int $id * @return void */ public function update($id) { $module = new Model\Module(); $module->getById($id); if (isset($module->id) && isset($this->sess->updates->modules[$module->name]) && version_compare($module->version, $this->sess->updates->modules[$module->name]) < 0) { if ($this->request->getQuery('update') == 2 && is_writable(MODULES_ABS_PATH) && is_writable(MODULES_ABS_PATH . '/' . $module->folder) && is_writable(MODULES_ABS_PATH . '/' . $module->folder . '.zip')) { clearstatcache(); $updaterClass = $module->prefix . 'Updater'; if (class_exists($updaterClass)) { $updater = new $updaterClass($module->name); $updater->runPost(); } $mod = \Phire\Table\Modules::findById($id); if (isset($mod->id)) { $mod->version = $this->sess->updates->modules[$module->name]; $mod->updated_on = date('Y-m-d H:i:s'); $mod->save(); } $this->redirect(BASE_PATH . APP_URI . '/modules/complete/' . $id); } else { if ($this->request->getQuery('update') == 1 && is_writable(MODULES_ABS_PATH) && is_writable(MODULES_ABS_PATH . '/' . $module->folder) && is_writable(MODULES_ABS_PATH . '/' . $module->folder . '.zip')) { $updater = new \Phire\Updater($module->name); $updater->getUpdate($module->name, $this->sess->updates->modules[$module->name], $module->version, $id); $this->redirect(BASE_PATH . APP_URI . '/modules/update/' . $id . '?update=2'); } else { $this->prepareView('phire/modules/update.phtml'); $this->view->title = 'Update ' . $module->name; $this->view->module_id = $module->id; $this->view->module_name = $module->name; $this->view->module_update_version = $this->sess->updates->modules[$module->name]; if (is_writable(MODULES_ABS_PATH) && is_writable(MODULES_ABS_PATH . '/' . $module->folder) && is_writable(MODULES_ABS_PATH . '/' . $module->folder . '.zip')) { $this->view->writable = true; } else { $this->view->writable = false; } $this->send(); } } } else { $this->redirect(BASE_PATH . APP_URI . '/modules'); } }
/** * Update action method * * @return void */ public function update() { $config = new Model\Config(); $updates = $config->getUpdates(); $moduleId = $this->getModuleId(); $module = Table\Modules::findById($moduleId); if (isset($module->id)) { if (isset($updates->modules[$module->folder]) && version_compare($updates->modules[$module->folder], $module->version) < 0) { $this->console->append(); $this->console->append($this->console->colorize('The \'' . $module->folder . '\' module is available for update.', Console::BOLD_YELLOW)); $this->console->append(); $this->console->append($this->console->colorize('Please back up all of your files and your database before proceeding.', Console::BOLD_RED)); $this->console->append(); $this->console->send(); $update = null; while (strtolower($update) != 'y' && strtolower($update) != 'n') { $update = $this->console->prompt($this->console->getIndent() . 'Update the \'' . $module->folder . '\' module? (Y/N) '); } if (strtolower($update) == 'y') { if (is_writable(__DIR__ . '/../../../') && is_writable(__DIR__ . '/../../../' . $module->folder) && is_writable(__DIR__ . '/../../../' . $module->folder . '.zip')) { $updater = new \Phire\Updater($module->folder); $updater->getUpdate($module->folder); clearstatcache(); $updaterClass = $module->prefix . 'Updater'; if (class_exists($updaterClass)) { $updater = new $updaterClass($module->folder); $updater->runPost(); } else { if (file_exists(__DIR__ . '/../../../' . $module->folder . '/src/Updater.php')) { include __DIR__ . '/../../../' . $module->folder . '/src/Updater.php'; if (class_exists($updaterClass)) { $updater = new $updaterClass($module->folder); $updater->runPost(); } } else { $module->updated_on = date('Y-m-d H:i:s'); $module->save(); } } $this->console->append(); $this->console->append($this->console->colorize('Update completed successfully!', Console::BOLD_CYAN)); $this->console->append($this->console->colorize('You have updated \'' . $module->folder . '\' to version ' . $updates->modules[$module->folder] . '.', Console::BOLD_CYAN)); $this->console->send(); } else { $this->console->append(); $this->console->append($this->console->colorize('The module folders are not writable. They must be writable to update the module.', Console::BOLD_RED)); $this->console->send(); } } } else { $this->console->append(); $this->console->append($this->console->colorize('The \'' . $module->folder . '\' module is up-to-date!', Console::BOLD_GREEN)); $this->console->send(); } } }