cleanupParams($params); $installFileMode = $command === 'install-file'; /** @var $ftpObj Mage_Connect_Ftp */ $ftpObj=null; $ftp = empty($options['ftp']) ? false : $options['ftp']; /** @var $packager Mage_Connect_Packager */ $packager = $this->getPackager(); /** @var $cache Mage_Connect_Singleconfig */ /** @var $config Mage_Connect_Config */ if ($ftp) { list($cache, $config, $ftpObj) = $packager->getRemoteConf($ftp); } else { $cache = $this->getSconfig(); $config = $this->config(); } try { $forceMode = isset($options['force']); $upgradeAllMode = $command == 'upgrade-all'; $upgradeMode = $command == 'upgrade' || $command == 'upgrade-all'; $noFilesInstall = isset($options['nofiles']); $withDepsMode = !isset($options['nodeps']); $ignoreModifiedMode = true || !isset($options['ignorelocalmodification']); $clearInstallMode = $command == 'install' && !$forceMode; $installAll = isset($options['install_all']); $channelAuth = isset($options['auth'])?$options['auth']:array(); $rest = $this->rest(); if (empty($config->magento_root)) { $config->magento_root=dirname(dirname($_SERVER['SCRIPT_FILENAME'])); } chdir($config->magento_root); $dirCache = DIRECTORY_SEPARATOR . $config->downloader_path . DIRECTORY_SEPARATOR . Mage_Connect_Config::DEFAULT_CACHE_PATH; $dirTmp = DIRECTORY_SEPARATOR . Mage_Connect_Package_Reader::PATH_TO_TEMPORARY_DIRECTORY; $dirMedia = DIRECTORY_SEPARATOR . 'media'; $isWritable = true; if ($ftp) { $cwd=$ftpObj->getcwd(); $ftpObj->mkdirRecursive($cwd . $dirCache,0777); $ftpObj->chdir($cwd); $ftpObj->mkdirRecursive($cwd . $dirTmp,0777); $ftpObj->chdir($cwd); $ftpObj->mkdirRecursive($cwd . $dirMedia,0777); $ftpObj->chdir($cwd); $err = "Please check for sufficient ftp write file permissions."; } else { @mkdir($config->magento_root . $dirCache,0777,true); @mkdir($config->magento_root . $dirTmp,0777,true); @mkdir($config->magento_root . $dirMedia,0777,true); $isWritable = is_writable($config->magento_root) && is_writable($config->magento_root . DIRECTORY_SEPARATOR . $config->downloader_path) && is_writable($config->magento_root . $dirCache) && is_writable($config->magento_root . $dirTmp) && is_writable($config->magento_root . $dirMedia); $err = "Please check for sufficient write file permissions."; } $isWritable = $isWritable && is_writable($config->magento_root . $dirMedia) && is_writable($config->magento_root . $dirCache) && is_writable($config->magento_root . $dirTmp); if (!$isWritable) { $this->doError($command, $err); throw new Exception( 'Your Magento folder does not have sufficient write permissions, which downloader requires.' ); } if (!empty($channelAuth)) { $rest->getLoader()->setCredentials($channelAuth['username'], $channelAuth['password']); } if ($installFileMode) { if (count($params) < 1) { throw new Exception("Argument should be: filename"); } $filename = $params[0]; if (!@file_exists($filename)) { throw new Exception("File '{$filename}' not found"); } if (!@is_readable($filename)) { throw new Exception("File '{$filename}' is not readable"); } $package = new Mage_Connect_Package($filename); $package->setConfig($config); $package->validate(); $errors = $package->getErrors(); if (count($errors)) { throw new Exception("Package file is invalid\n" . implode("\n", $errors)); } $pChan = $package->getChannel(); $pName = $package->getName(); $pVer = $package->getVersion(); if (!($cache->isChannelName($pChan) || $cache->isChannelAlias($pChan))) { throw new Exception("The '{$pChan}' channel is not installed. Please use the MAGE shell " . "script to install the '{$pChan}' channel."); } $conflicts = $cache->hasConflicts($pChan, $pName, $pVer); if (false !== $conflicts) { $conflicts = implode(", ",$conflicts); if ($forceMode) { $this->doError($command, "Package {$pChan}/{$pName} {$pVer} conflicts with: " . $conflicts); } else { throw new Exception("Package {$pChan}/{$pName} {$pVer} conflicts with: " . $conflicts); } } $conflicts = $package->checkPhpDependencies(); if (true !== $conflicts) { $conflicts = implode(",",$conflicts); $err = "Package {$pChan}/{$pName} {$pVer} depends on PHP extensions: " . $conflicts; if ($forceMode) { $this->doError($command, $err); } else { throw new Exception($err); } } $conflicts = $package->checkPhpVersion(); if (true !== $conflicts) { $err = "Package {$pChan}/{$pName} {$pVer}: " . $conflicts; if ($forceMode) { $this->doError($command, $err); } else { throw new Exception($err); } } if (!$noFilesInstall) { if ($ftp) { $packager->processInstallPackageFtp($package, $filename, $config, $ftpObj); } else { $packager->processInstallPackage($package, $filename, $config); } } $cache->addPackage($package); $installedDeps = array(); $installedDepsAssoc = array(); $installedDepsAssoc[] = array('channel'=>$pChan, 'name'=>$pName, 'version'=>$pVer); $installedDeps[] = array($pChan, $pName, $pVer); $title = isset($options['title']) ? $options['title'] : "Package installed: "; $out = array($command => array('data'=>$installedDeps, 'assoc'=>$installedDepsAssoc, 'title'=>$title)); if ($ftp) { $packager->writeToRemoteCache($cache, $ftpObj); @unlink($config->getFilename()); } $this->ui()->output($out); return $out[$command]['data']; } if (!$upgradeAllMode) { if (count($params) < 2) { throw new Exception("Argument should be: channelName packageName"); } $channel = $params[0]; $package = $params[1]; $argVersionMax = isset($params[2]) ? $params[2]: false; $argVersionMin = isset($params[3]) ? $params[3]: false; $cache->checkChannel($channel, $config, $rest); $channelName = $cache->chanName($channel); $this->ui()->output("Checking dependencies of packages"); $packagesToInstall = $packager->getDependenciesList($channelName, $package, $cache, $config, $argVersionMax, $argVersionMin, $withDepsMode, false, $rest ); /* * process 'failed' results */ if (count($packagesToInstall['failed'])) { $showError=!count($packagesToInstall['result']); foreach ($packagesToInstall['failed'] as $failed) { $msg="Package {$failed['channel']}/{$failed['name']} failed: " . $failed['reason']; if ($showError) { $this->doError($command, $msg); } else { $this->ui()->output($msg); } } } $packagesToInstall = $packagesToInstall['result']; } else { if (empty($params[0])) { $channels = $cache->getChannelNames(); } else { $channel = $params[0]; if (!$cache->isChannel($channel)) { throw new Exception("'{$channel}' is not existant channel name / valid uri"); } $channels = $cache->chanName($channel); } $packagesToInstall = array(); $neededToUpgrade = $packager->getUpgradesList($channels, $cache, $config, $rest); foreach ($neededToUpgrade as $chan=>$packages) { foreach ($packages as $name=>$data) { $versionTo = $data['to']; $tmp = $packager->getDependenciesList($chan, $name, $cache, $config, $versionTo, $versionTo, $withDepsMode, false, $rest ); if (count($tmp['result'])) { $packagesToInstall = array_merge($packagesToInstall, $tmp['result']); } } } } /** * Make installation */ $installedDeps = array(); $installedDepsAssoc = array(); foreach ($packagesToInstall as $package) { try { $pName = $package['name']; $pChan = $package['channel']; $pVer = $package['downloaded_version']; $pInstallState = $package['install_state']; $rest->setChannel($cache->chanUrl($pChan)); /** * Skip existing packages */ if ($upgradeMode && $cache->hasPackage($pChan, $pName, $pVer, $pVer) || ('already_installed' == $pInstallState && !$forceMode) ) { $this->ui()->output("Already installed: {$pChan}/{$pName} {$pVer}, skipping"); continue; } if ('incompartible' == $pInstallState) { $this->ui()->output( "Package incompartible with installed Magento: {$pChan}/{$pName} {$pVer}, skipping" ); continue; } $conflicts = $cache->hasConflicts($pChan, $pName, $pVer); if (false !== $conflicts) { $conflicts = implode(", ",$conflicts); if ($forceMode) { $this->doError($command, "Package {$pChan}/{$pName} {$pVer} conflicts with: " . $conflicts); } else { throw new Exception("Package {$pChan}/{$pName} {$pVer} conflicts with: " . $conflicts); } } /** * Modifications */ if (($upgradeMode || ($pInstallState == 'upgrade')) && !$ignoreModifiedMode) { if ($ftp) { $modifications = $packager->getRemoteModifiedFiles($pChan, $pName, $cache, $config, $ftp); } else { $modifications = $packager->getLocalModifiedFiles($pChan, $pName, $cache, $config); } if (count($modifications) > 0) { $this->ui()->output('Changed locally: '); foreach ($modifications as $row) { if (!$ftp) { $this->ui()->output($config->magento_root . DS . $row); } else { $this->ui()->output($row); } } } } if ($ftp) { $cwd=$ftpObj->getcwd(); $dir=$cwd . DIRECTORY_SEPARATOR .$config->downloader_path . DIRECTORY_SEPARATOR . Mage_Connect_Config::DEFAULT_CACHE_PATH . DIRECTORY_SEPARATOR . trim( $pChan, "\\/"); $ftpObj->mkdirRecursive($dir,0777); $ftpObj->chdir($cwd); } else { $dir = $config->getChannelCacheDir($pChan); @mkdir($dir, 0777, true); } $dir = $config->getChannelCacheDir($pChan); $packageFileName = $pName . "-" . $pVer . ".tgz"; $file = $dir . DIRECTORY_SEPARATOR . $packageFileName; if (!@file_exists($file)) { $this->ui()->output("Starting to download $packageFileName ..."); $rest->downloadPackageFileOfRelease($pName, $pVer, $file); $this->ui()->output(sprintf("...done: %s bytes", number_format(filesize($file)))); } /** * Remove old version package before install new */ if ($cache->hasPackage($pChan, $pName)) { if ($ftp) { $packager->processUninstallPackageFtp($pChan, $pName, $cache, $ftpObj); } else { $packager->processUninstallPackage($pChan, $pName, $cache, $config); } $cache->deletePackage($pChan, $pName); } $package = new Mage_Connect_Package($file); if ($clearInstallMode && $pInstallState != 'upgrade' && !$installAll) { $contents = $package->getContents(); $this->backup()->setFileTypes(array('csv', 'html')); $typesToBackup = $this->backup()->getFileTypes(); $this->validator()->validateContents($contents, $config, $typesToBackup); $errors = $this->validator()->getErrors(); if (count($errors)) { throw new Exception("Package '{$pName}' is invalid\n" . implode("\n", $errors)); } $targetPath = rtrim($config->magento_root, "\\/"); foreach ($contents as $filePath) { $this->backup()->addFile($filePath, $targetPath); } if ($this->backup()->getFilesCount() > 0) { $this->ui()->output('
'); $this->ui()->output('Backup of following files will be created :'); $this->ui()->output('
'); $this->backup()->run(); $this->ui()->output(implode('
', $this->backup()->getAllFiles())); $this->ui()->output('
'); $this->ui()->output( $this->backup()->getFilesCount() . ' files was overwritten by installed extension.' ); $this->ui()->output('
'); $this->backup()->unsetAllFiles(); } } $conflicts = $package->checkPhpDependencies(); if (true !== $conflicts) { $conflicts = implode(",",$conflicts); $err = "Package {$pChan}/{$pName} {$pVer} depends on PHP extensions: " . $conflicts; if ($forceMode) { $this->doError($command, $err); } else { throw new Exception($err); } } $conflicts = $package->checkPhpVersion(); if (true !== $conflicts) { $err = "Package {$pChan}/{$pName} {$pVer}: " . $conflicts; if ($forceMode) { $this->doError($command, $err); } else { throw new Exception($err); } } if (!$noFilesInstall) { $this->ui()->output("Installing package {$pChan}/{$pName} {$pVer}"); if ($ftp) { $packager->processInstallPackageFtp($package, $file, $config, $ftpObj); } else { $packager->processInstallPackage($package, $file, $config); } $this->ui()->output("Package {$pChan}/{$pName} {$pVer} installed successfully"); } $cache->addPackage($package); $installedDepsAssoc[] = array('channel'=>$pChan, 'name'=>$pName, 'version'=>$pVer); $installedDeps[] = array($pChan, $pName, $pVer); } catch(Exception $e) { $this->doError($command, $e->getMessage()); } } $title = isset($options['title']) ? $options['title'] : "Package installed: "; $out = array($command => array('data'=>$installedDeps, 'assoc'=>$installedDepsAssoc, 'title'=>$title)); if ($ftp) { $packager->writeToRemoteCache($cache, $ftpObj); @unlink($config->getFilename()); } $this->ui()->output($out); return $out[$command]['data']; } catch (Exception $e) { if ($ftp) { $packager->writeToRemoteCache($cache, $ftpObj); @unlink($config->getFilename()); } return $this->doError($command, $e->getMessage()); } } /** * Upgrade action callback * * @param string $command * @param array $options * @param array $params * @return array|null */ public function doUpgrade($command, $options, $params) { $options['title'] = "Package upgraded: "; return $this->doInstall($command, $options, $params); } /** * Updgrade action callback * * @param string $command * @param array $options * @param array $params * @return array|null */ public function doUpgradeAll($command, $options, $params) { $options['title'] = "Package upgraded: "; return $this->doInstall($command, $options, $params); } /** * Uninstall package callback * * @param string $command * @param array $options * @param array $params * @return array|null */ public function doUninstall($command, $options, $params) { $this->cleanupParams($params); try { if (count($params) != 2) { throw new Exception("Argument count should be = 2"); } $channel = $params[0]; $package = $params[1]; /** @var $packager Mage_Connect_Packager */ $packager = $this->getPackager(); $withDepsMode = !isset($options['nodeps'])? false : (boolean)$options['nodeps']; $forceMode = isset($options['force']); $ftp = empty($options['ftp']) ? false : $options['ftp']; /** @var $cache Mage_Connect_Singleconfig */ /** @var $config Mage_Connect_Config */ /** @var $ftpObj Mage_Connect_Ftp */ if ($ftp) { list($cache, $config, $ftpObj) = $packager->getRemoteConf($ftp); } else { $cache = $this->getSconfig(); $config = $this->config(); } $channel = $cache->chanName($channel); if (!$cache->hasPackage($channel, $package)) { throw new Exception("Package is not installed"); } $deletedPackages = array(); $list = $packager->getUninstallList($channel, $package, $cache, $config, $withDepsMode); foreach ($list['list'] as $packageData) { try { $reqd = $cache->requiredByOtherPackages( $packageData['channel'], $packageData['name'], $list['list'] ); if (count($reqd)) { $errMessage = "{$packageData['channel']}/{$packageData['name']} " . "{$packageData['version']} is required by: "; $t = array(); foreach ($reqd as $r) { $t[] = $r['channel'] . "/" . $r['name'] . " " . $r['version']; } $errMessage .= implode(", ", $t); if ($forceMode) { $this->ui()->output("Warning: " . $errMessage); } else { throw new Exception($errMessage); } } } catch(Exception $e) { if ($forceMode) { $this->doError($command, $e->getMessage()); } else { throw new Exception($e->getMessage()); } } } foreach ($list['list'] as $packageData) { try { list($chan, $pack) = array($packageData['channel'], $packageData['name']); $packageName = $packageData['channel'] . "/" . $packageData['name']; $this->ui()->output("Starting to uninstall $packageName "); if ($ftp) { $packager->processUninstallPackageFtp($chan, $pack, $cache, $ftpObj); } else { $packager->processUninstallPackage($chan, $pack, $cache, $config); } $cache->deletePackage($chan, $pack); $deletedPackages[] = array($chan, $pack); $this->ui()->output("Package {$packageName} uninstalled"); } catch(Exception $e) { if ($forceMode) { $this->doError($command, $e->getMessage()); } else { throw new Exception($e->getMessage()); } } } if ($ftp) { $packager->writeToRemoteCache($cache, $ftpObj); @unlink($config->getFilename()); } $out = array($command=>array('data'=>$deletedPackages, 'title'=>'Package deleted: ')); $this->ui()->output($out); return $out[$command]['data']; } catch (Exception $e) { return $this->doError($command, $e->getMessage()); } } }