/** * @return bool */ public function installPackage() { /* add required core data */ $this->install->xpdo->loadClass('transport.xPDOTransport', XPDO_CORE_PATH, true, true); $packageDirectory = MODX_CORE_PATH . 'packages/'; $packageState = $this->install->settings->get('unpacked') == 1 ? xPDOTransport::STATE_UNPACKED : xPDOTransport::STATE_PACKED; $package = xPDOTransport::retrieve($this->install->xpdo, $packageDirectory . 'core.transport.zip', $packageDirectory, $packageState); if (!is_object($package) || !$package instanceof xPDOTransport) { $this->addResult(modInstallRunner::RESULT_FAILURE, '<p class="notok">' . $this->install->lexicon('package_execute_err_retrieve', array('path' => $this->install->settings->get('core_path'))) . '</p>'); return false; } if (!defined('MODX_BASE_PATH')) { define('MODX_BASE_PATH', $this->install->settings->get('context_web_path')); } if (!defined('MODX_ASSETS_PATH')) { $assetsDefault = $this->install->settings->get('context_assets_path', $this->install->settings->get('context_web_path') . 'assets/'); define('MODX_ASSETS_PATH', $assetsDefault); } if (!defined('MODX_MANAGER_PATH')) { define('MODX_MANAGER_PATH', $this->install->settings->get('context_mgr_path')); } if (!defined('MODX_CONNECTORS_PATH')) { define('MODX_CONNECTORS_PATH', $this->install->settings->get('context_connectors_path')); } if (!defined('MODX_BASE_URL')) { define('MODX_BASE_URL', $this->install->settings->get('context_web_url')); } if (!defined('MODX_ASSETS_URL')) { $assetsDefault = $this->install->settings->get('context_assets_url', $this->install->settings->get('context_web_url') . 'assets/'); define('MODX_ASSETS_URL', $assetsDefault); } if (!defined('MODX_MANAGER_URL')) { define('MODX_MANAGER_URL', $this->install->settings->get('context_mgr_url')); } if (!defined('MODX_CONNECTORS_URL')) { define('MODX_CONNECTORS_URL', $this->install->settings->get('context_connectors_url')); } return $package->install(array(xPDOTransport::RESOLVE_FILES => $this->install->settings->get('inplace') == 0 ? 1 : 0, xPDOTransport::INSTALL_FILES => $this->install->settings->get('inplace') == 0 ? 1 : 0, xPDOTransport::PREEXISTING_MODE => xPDOTransport::REMOVE_PREEXISTING)); }
/** * Installs a transport package. * * @param string The package signature. * @param array $attributes An array of installation attributes. * @return array An array of error messages collected during the process. */ public function installPackage($pkg, array $attributes = array()) { $errors = array(); /* instantiate the modX class */ if (@(require_once MODX_CORE_PATH . 'model/modx/modx.class.php')) { $modx = new modX(MODX_CORE_PATH . 'config/'); if (!is_object($modx) || !$modx instanceof modX) { $errors[] = '<p>' . $this->lexicon('modx_err_instantiate') . '</p>'; } else { /* try to initialize the mgr context */ $modx->initialize('mgr'); if (!$modx->_initialized) { $errors[] = '<p>' . $this->lexicon('modx_err_instantiate_mgr') . '</p>'; } else { $loaded = $modx->loadClass('transport.xPDOTransport', XPDO_CORE_PATH, true, true); if (!$loaded) { $errors[] = '<p>' . $this->lexicon('transport_class_err_load') . '</p>'; } $packageDirectory = MODX_CORE_PATH . 'packages/'; $packageState = isset($attributes[xPDOTransport::PACKAGE_STATE]) ? $attributes[xPDOTransport::PACKAGE_STATE] : xPDOTransport::STATE_PACKED; $package = xPDOTransport::retrieve($modx, $packageDirectory . $pkg . '.transport.zip', $packageDirectory, $packageState); if ($package) { if (!$package->install($attributes)) { $errors[] = '<p>' . $this->lexicon('package_err_install', array('package' => $pkg)) . '</p>'; } else { $modx->log(xPDO::LOG_LEVEL_INFO, $this->lexicon('package_installed', array('package' => $pkg))); } } else { $errors[] = '<p>' . $this->lexicon('package_err_nf', array('package' => $pkg)) . '</p>'; } } } } else { $errors[] = '<p>' . $this->lexicon('modx_class_err_nf') . '</p>'; } return $errors; }
/** * Gets the package's transport mechanism. * * @access public * @param integer $state The state of the package. * @return mixed The package. */ public function getTransport($state = -1) { if (!is_object($this->package) || !($this->package instanceof xPDOTransport)) { if ($this->xpdo->loadClass('transport.xPDOTransport', XPDO_CORE_PATH, true, true)) { $workspace = $this->getOne('Workspace'); if ($workspace) { $packageDir = $workspace->get('path') . 'packages/'; $sourceFile = $this->get('source'); if ($sourceFile) { $transferred= file_exists($packageDir . $sourceFile); if (!$transferred) { /* if no transport zip, attempt to get it */ if (!$transferred= $this->transferPackage($sourceFile, $packageDir)) { $this->xpdo->log(xPDO::LOG_LEVEL_ERROR,$this->xpdo->lexicon('package_err_transfer',array( 'sourceFile' => $sourceFile, 'packageDir' => $packageDir, ))); } else { $sourceFile= basename($sourceFile); } } if ($transferred) { if ($state < 0) { /* if directory is missing but zip exists, and DB state value is incorrect, fix here */ $targetDir = basename($sourceFile, '.transport.zip'); $state = is_dir($packageDir.$targetDir) ? $this->get('state') : xPDOTransport::STATE_PACKED; } /* retrieve the package */ $this->package = xPDOTransport :: retrieve($this->xpdo, $packageDir . $sourceFile, $packageDir, $state); if ($this->package) { /* set to unpacked state */ if ($state == xPDOTransport::STATE_PACKED) { $this->set('state', xPDOTransport::STATE_UNPACKED); } $this->set('source', $sourceFile); $this->set('attributes', $this->package->attributes); $this->save(); } } } else { $this->xpdo->log(xPDO::LOG_LEVEL_ERROR,$this->xpdo->lexicon('package_err_source_nf')); } } } } return $this->package; }
/** * Uninstalls vehicle artifacts from the transport host. */ public function uninstall(&$transport, $options) { $uninstalled = false; $vOptions = $this->get($transport, $options); if (isset($vOptions['object']) && isset($vOptions['object']['source']) && isset($vOptions['object']['target']) && isset($vOptions['object']['name'])) { if ($transport->xpdo->getDebug() === true) { $transport->xpdo->log(xPDO::LOG_LEVEL_DEBUG, "Installing Vehicle: " . print_r($vOptions, true)); } $state = isset($vOptions['state']) ? $vOptions['state'] : xPDOTransport::STATE_UNPACKED; $pkgSource = $transport->path . $vOptions['object']['source'] . $vOptions['object']['name']; $pkgTarget = eval($vOptions['object']['target']); $object = xPDOTransport::retrieve($transport->xpdo, $pkgSource, $pkgTarget, $state); if ($this->validate($transport, $object, $vOptions)) { $uninstalled = $object->uninstall($vOptions); if (!$uninstalled) { $transport->xpdo->log(xPDO::LOG_LEVEL_ERROR, 'Could not uninstall vehicle: ' . print_r($vOptions, true)); } elseif (!$this->resolve($transport, $object, $vOptions)) { $transport->xpdo->log(xPDO::LOG_LEVEL_ERROR, 'Could not resolve vehicle: ' . print_r($vOptions, true)); } } else { $transport->xpdo->log(xPDO::LOG_LEVEL_ERROR, 'Could not validate vehicle: ' . print_r($vOptions, true)); } } else { $transport->xpdo->log(xPDO::LOG_LEVEL_ERROR, 'Could not load vehicle: ' . print_r($vOptions, true)); } return $uninstalled; }