From a752dec91b0e236c0ecf10f3f3d67e69cdc5a08e Mon Sep 17 00:00:00 2001 From: Thomas Steur Date: Fri, 13 Sep 2013 14:05:01 +1200 Subject: current state of installing plugin from marketplace --- plugins/CorePluginsAdmin/PluginInstaller.php | 111 +++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 plugins/CorePluginsAdmin/PluginInstaller.php (limited to 'plugins/CorePluginsAdmin/PluginInstaller.php') diff --git a/plugins/CorePluginsAdmin/PluginInstaller.php b/plugins/CorePluginsAdmin/PluginInstaller.php new file mode 100644 index 0000000000..c6c54b89c1 --- /dev/null +++ b/plugins/CorePluginsAdmin/PluginInstaller.php @@ -0,0 +1,111 @@ +pluginName = $pluginName; + } + + public function installOrUpdatePluginFromMarketplace() + { + $tmpPluginZip = PIWIK_USER_PATH . self::PATH_TO_DOWNLOAD . $this->pluginName . '.zip'; + $tmpPluginFolder = PIWIK_USER_PATH . self::PATH_TO_DOWNLOAD . $this->pluginName; + + $this->makeSureFoldersAreWritable(); + $this->downloadPluginFromMarketplace($tmpPluginZip); + $this->extractPluginFiles($tmpPluginZip, $tmpPluginFolder); + $this->copyPluginToDestination($tmpPluginFolder); + + $this->removeFileIfExists($tmpPluginZip); + $this->removeFolderIfExists($tmpPluginFolder); + } + + private function makeSureFoldersAreWritable() + { + Piwik::dieIfDirectoriesNotWritable(array(self::PATH_TO_DOWNLOAD, self::PATH_TO_EXTRACT)); + } + + private function downloadPluginFromMarketplace($pluginZipTargetFile) + { + $this->removeFileIfExists($pluginZipTargetFile); + + $marketplace = new MarketplaceApiClient(); + $success = $marketplace->download($this->pluginName, $pluginZipTargetFile); + + if (!$success) { + throw new \Exception('Failed to download plugin'); + } + } + + /** + * @param $pluginZipFile + * @param $pathExtracted + * @throws \Exception + */ + private function extractPluginFiles($pluginZipFile, $pathExtracted) + { + $archive = Unzip::factory('PclZip', $pluginZipFile); + + $this->removeFolderIfExists($pathExtracted); + + if (0 == ($pluginFiles = $archive->extract($pathExtracted))) { + throw new \Exception(Piwik_TranslateException('Plugin_ExceptionArchiveIncompatible', $archive->errorInfo())); + } + + if (0 == count($pluginFiles)) { + throw new \Exception(Piwik_TranslateException('Plugin Zip File Is Empty')); + } + } + + private function copyPluginToDestination($tmpPluginFolder) + { + $pluginTargetPath = PIWIK_USER_PATH . self::PATH_TO_EXTRACT . $this->pluginName; + + $this->removeFolderIfExists($pluginTargetPath); + Piwik::copyRecursive($tmpPluginFolder, $pluginTargetPath); + } + + /** + * @param $pathExtracted + */ + private function removeFolderIfExists($pathExtracted) + { + if (file_exists($pathExtracted)) { + Piwik::unlinkRecursive($pathExtracted, true); + } + } + + /** + * @param $targetTmpFile + */ + private function removeFileIfExists($targetTmpFile) + { + if (file_exists($targetTmpFile)) { + unlink($targetTmpFile); + } + } + +} -- cgit v1.2.3