/** * @see PackageInstallationPlugin::install() */ public function install() { parent::install(); $dir = $this->installation->getPackage()->getDir(); if (empty($dir)) { if ($this->installation->getPackage()->getParentPackageID() > 0) { // plugin // use parents package dir $dir = $this->installation->getPackage()->getParentPackage()->getDir(); } else { if ($this->installation->getPackage()->isStandalone() == 1 && $this->installation->getPackage()->getPackage() != 'com.woltlab.wcf' && $this->installation->getAction() == 'install') { // standalone package // prompt package dir $dir = $this->promptPackageDir(); } } // save package dir if (!empty($dir)) { $sql = "UPDATE\twcf" . WCF_N . "_package\n\t\t\t\t\tSET\tpackageDir = '" . escapeString($dir) . "'\n\t\t\t\t\tWHERE\tpackageID = " . $this->installation->getPackageID(); WCF::getDB()->sendQuery($sql); $this->installation->getPackage()->setDir($dir); } } // absolute path to package dir $packageDir = FileUtil::addTrailingSlash(FileUtil::getRealPath(WCF_DIR . $dir)); // extract files.tar to temp folder $tag = $this->installation->getXMLTag('files'); $sourceFile = $this->installation->getArchive()->extractTar($tag['cdata'], 'files_'); // create file handler $fileHandler = new FilesFileHandler($this->installation); // extract content of files.tar try { $fileInstaller = $this->installation->extractFiles($packageDir, $sourceFile, $fileHandler); } catch (SystemException $e) { if (!@file_exists(WCF_DIR . 'acp/templates/packageInstallationFileInstallationFailed.tpl')) { // workaround for wcf 1.0 to 1.1 update throw $e; } else { WCF::getTPL()->assign(array('exception' => $e)); WCF::getTPL()->display('packageInstallationFileInstallationFailed'); exit; } } // if this a standalone package, write config.inc.php for this package if ($this->installation->getPackage()->isStandalone() == 1 && $this->installation->getPackage()->getPackage() != 'com.woltlab.wcf' && $this->installation->getAction() == 'install') { // touch file $fileInstaller->touchFile(PackageInstallation::CONFIG_FILE); // create file Package::writeConfigFile($this->installation->getPackageID()); // log file $sql = "INSERT INTO\twcf" . WCF_N . "_package_installation_file_log\n\t\t\t\t\t\t(packageID, filename)\n\t\t\t\tVALUES\t\t(" . $this->installation->getPackageID() . ", 'config.inc.php')"; WCF::getDB()->sendQuery($sql); } // delete temporary sourceArchive @unlink($sourceFile); // update acp style file StyleUtil::updateStyleFile(); }
/** * Removes package information from database. */ protected function uninstallPackage() { $this->makeClear(); // delete package $sql = "DELETE FROM\twcf" . WCF_N . "_package\n\t\t\tWHERE\t\tpackageID = " . $this->packageID; WCF::getDB()->sendQuery($sql); // update queue entry $sql = "UPDATE\twcf" . WCF_N . "_package_installation_queue\n\t\t\tSET\tpackageID = 0\n\t\t\tWHERE\tqueueID = " . $this->queueID; WCF::getDB()->sendQuery($sql); // rebuild config.inc.php files if necessary // check if this package requires a standalone package (except com.woltlab.wcf) $configPackageIDs = array(); $sql = "SELECT\tCOUNT(*) AS count\n\t\t\tFROM\twcf" . WCF_N . "_package\n\t\t\tWHERE\tpackageID IN (\n\t\t\t\t\tSELECT\trequirement\n\t\t\t\t\tFROM\twcf" . WCF_N . "_package_requirement_map\n\t\t\t\t\tWHERE\tpackageID = " . $this->packageID . "\n\t\t\t\t)\n\t\t\t\tAND standalone = 1\n\t\t\t\tAND package <> 'com.woltlab.wcf'"; $row = WCF::getDB()->getFirstRow($sql); if ($row['count'] > 0) { // get all dependent standalone packages (except com.woltlab.wcf) $sql = "SELECT\tpackageID\n\t\t\t\tFROM\twcf" . WCF_N . "_package\n\t\t\t\tWHERE\tpackageID IN (\n\t\t\t\t\t\tSELECT\tpackageID\n\t\t\t\t\t\tFROM\twcf" . WCF_N . "_package_dependency\n\t\t\t\t\t\tWHERE\tdependency = " . $this->packageID . "\n\t\t\t\t\t)\n\t\t\t\t\tAND standalone = 1\n\t\t\t\t\tAND packageDir <> ''"; $result = WCF::getDB()->sendQuery($sql); while ($row = WCF::getDB()->fetchArray($result)) { $configPackageIDs[] = $row['packageID']; } } // delete requirements $sql = "DELETE FROM\twcf" . WCF_N . "_package_requirement\n\t\t\tWHERE\t\tpackageID = " . $this->packageID; WCF::getDB()->sendQuery($sql); $sql = "DELETE FROM\twcf" . WCF_N . "_package_requirement_map\n\t\t\tWHERE\t\tpackageID = " . $this->packageID; WCF::getDB()->sendQuery($sql); // delete excluded packages $sql = "DELETE FROM\twcf" . WCF_N . "_package_exclusion\n\t\t\tWHERE\t\tpackageID = " . $this->packageID; WCF::getDB()->sendQuery($sql); // reset package cache WCF::getCache()->clearResource('packages'); // rebuild package dependencies Package::rebuildParentPackageDependencies($this->packageID); // delete dependencies $sql = "DELETE FROM\twcf" . WCF_N . "_package_dependency\n\t\t\tWHERE\t\tpackageID = " . $this->packageID . "\n\t\t\t\t\tOR dependency = " . $this->packageID; WCF::getDB()->sendQuery($sql); // rebuild config.inc.php files if necessary foreach ($configPackageIDs as $configPackageID) { Package::writeConfigFile($configPackageID); } }
/** * Rebuilds config.inc.php files after package updates or plugin installations. */ protected function rebuildConfigFiles() { // rebuild config.inc.php files if necessary // check if this package requires a standalone package (except com.woltlab.wcf) $sql = "SELECT\tCOUNT(*) AS count\n\t\t\tFROM\twcf" . WCF_N . "_package\n\t\t\tWHERE\tpackageID IN (\n\t\t\t\t\tSELECT\trequirement\n\t\t\t\t\tFROM\twcf" . WCF_N . "_package_requirement_map\n\t\t\t\t\tWHERE\tpackageID = " . $this->packageID . "\n\t\t\t\t)\n\t\t\t\tAND standalone = 1\n\t\t\t\tAND package <> 'com.woltlab.wcf'"; $row = WCF::getDB()->getFirstRow($sql); if ($row['count'] > 0) { // get all dependent standalone packages (except com.woltlab.wcf) $sql = "SELECT\tpackageID\n\t\t\t\tFROM\twcf" . WCF_N . "_package\n\t\t\t\tWHERE\tpackageID IN (\n\t\t\t\t\t\tSELECT\tpackageID\n\t\t\t\t\t\tFROM\twcf" . WCF_N . "_package_dependency\n\t\t\t\t\t\tWHERE\tdependency = " . $this->packageID . "\n\t\t\t\t\t)\n\t\t\t\t\tAND standalone = 1\n\t\t\t\t\tAND packageDir <> ''"; $result = WCF::getDB()->sendQuery($sql); while ($row = WCF::getDB()->fetchArray($result)) { Package::writeConfigFile($row['packageID']); } } }