浏览代码

System update (better installation)

markseu 9 年之前
父节点
当前提交
c035f0e782
共有 2 个文件被更改,包括 120 次插入56 次删除
  1. 2 2
      system/plugins/commandline.php
  2. 118 54
      system/plugins/update.php

+ 2 - 2
system/plugins/commandline.php

@@ -5,7 +5,7 @@
 // Command line plugin
 // Command line plugin
 class YellowCommandline
 class YellowCommandline
 {
 {
-	const Version = "0.6.13";
+	const Version = "0.6.14";
 	var $yellow;					//access to API
 	var $yellow;					//access to API
 	var $files;						//number of files
 	var $files;						//number of files
 	var $errors;					//number of errors
 	var $errors;					//number of errors
@@ -323,7 +323,7 @@ class YellowCommandline
 				++$updates;
 				++$updates;
 			}
 			}
 		}
 		}
-		if($statusCode != 200) echo "ERROR checking updates: $dataLatest[error]\n";
+		if($statusCode != 200) echo "ERROR checking updates: ".$this->yellow->page->get("pageError")."\n";
 		if($updates) echo "Yellow $command: $updates update".($updates==1 ? "":"s")." available\n";
 		if($updates) echo "Yellow $command: $updates update".($updates==1 ? "":"s")." available\n";
 		return $statusCode;
 		return $statusCode;
 	}
 	}

+ 118 - 54
system/plugins/update.php

@@ -5,7 +5,7 @@
 // Update plugin
 // Update plugin
 class YellowUpdate
 class YellowUpdate
 {
 {
-	const Version = "0.6.3";
+	const Version = "0.6.4";
 	var $yellow;					//access to API
 	var $yellow;					//access to API
 	
 	
 	// Handle initialisation
 	// Handle initialisation
@@ -16,6 +16,8 @@ class YellowUpdate
 		$this->yellow->config->setDefault("updateThemesUrl", "https://github.com/datenstrom/yellow-themes");
 		$this->yellow->config->setDefault("updateThemesUrl", "https://github.com/datenstrom/yellow-themes");
 		$this->yellow->config->setDefault("updateVersionFile", "version.ini");
 		$this->yellow->config->setDefault("updateVersionFile", "version.ini");
 		$this->yellow->config->setDefault("updateInformationFile", "update.ini");
 		$this->yellow->config->setDefault("updateInformationFile", "update.ini");
+		$this->yellow->config->setDefault("updateDocumentationFile", "README.md");
+		$this->yellow->config->setDefault("updateDownloadExtension", ".download");
 	}
 	}
 	
 	
 	// Handle request
 	// Handle request
@@ -38,7 +40,7 @@ class YellowUpdate
 		switch($command)
 		switch($command)
 		{
 		{
 			case "update":	$statusCode = $this->updateCommand($args); break;
 			case "update":	$statusCode = $this->updateCommand($args); break;
-			default:		$statusCode = $this->updateAutomaticCommand($args); break;
+			default:		$statusCode = $this->updateCommandPending($args); break;
 		}
 		}
 		return $statusCode;
 		return $statusCode;
 	}
 	}
@@ -49,41 +51,73 @@ class YellowUpdate
 		return "update [FEATURE]";
 		return "update [FEATURE]";
 	}
 	}
 	
 	
-	// Show software updates
+	// Update software
 	function updateCommand($args)
 	function updateCommand($args)
 	{
 	{
-		$statusCode = 0;
 		list($command, $feature) = $args;
 		list($command, $feature) = $args;
-		list($statusCode, $dataCurrent) = $this->getSoftwareVersion();
-		list($statusCode, $dataLatest) = $this->getSoftwareVersion(true);
-		foreach($dataCurrent as $key=>$value)
+		list($statusCode, $data) = $this->getSoftwareUpdate($feature);
+		if(!empty($data))
 		{
 		{
-			if(strnatcasecmp($dataCurrent[$key], $dataLatest[$key]) < 0)
+			foreach($data as $key=>$value)
 			{
 			{
-				if(empty($feature) || preg_match("/$feature/i", $key)) ++$updates;
+				list($version, $url) = explode(',', $value);
+				echo "$key $version\n";
 			}
 			}
-		}
-		if($statusCode != 200) echo "ERROR checking updates: $dataLatest[error]\n";
-		if($updates)
-		{
-			echo "Yellow $command: $updates update".($updates==1 ? "":"s")." available\n";
+			if($statusCode == 200) $statusCode = $this->download($data);
+			if($statusCode == 200) $statusCode = $this->update();
+			if($statusCode != 200) echo "ERROR updating files: ".$this->yellow->page->get("pageError")."\n";
+			echo "Yellow $command: Software ".($statusCode!=200 ? "not " : "")."updated\n";
 		} else {
 		} else {
+			if($statusCode != 200) echo "ERROR updating files: ".$this->yellow->page->get("pageError")."\n";
 			echo "Yellow $command: No updates available\n";
 			echo "Yellow $command: No updates available\n";
 		}
 		}
 		return $statusCode;
 		return $statusCode;
 	}
 	}
 	
 	
-	// Update software automatically
-	function updateAutomaticCommand($args)
+	// Update pending software
+	function updateCommandPending($args)
 	{
 	{
 		$statusCode = $this->update();
 		$statusCode = $this->update();
 		if($statusCode != 0)
 		if($statusCode != 0)
 		{
 		{
-			if($statusCode == 500) echo "ERROR updating files: ".$this->yellow->page->getStatusCode(true)."\n";
+			if($statusCode != 200) echo "ERROR updating files: ".$this->yellow->page->get("pageError")."\n";
 			echo "Yellow has ".($statusCode!=200 ? "not " : "")."been updated: Please run command again\n";
 			echo "Yellow has ".($statusCode!=200 ? "not " : "")."been updated: Please run command again\n";
 		}
 		}
 		return $statusCode;
 		return $statusCode;
 	}
 	}
+	
+	// Download available updates
+	function download($data)
+	{
+		$statusCode = 0;
+		$path = $this->yellow->config->get("pluginDir");
+		$extension = $this->yellow->config->get("updateDownloadExtension");
+		foreach($data as $key=>$value)
+		{
+			$fileName = strtoloweru("$path$key.zip");
+			list($version, $url) = explode(',', $value);
+			list($statusCode, $fileData) = $this->getSoftwareFile($url);
+			if(empty($fileData) || !$this->yellow->toolbox->createFile($fileName.$extension, $fileData))
+			{
+				$statusCode = 500;
+				$this->yellow->page->error($statusCode, "Can't download file '$fileName'!");
+				break;
+			}
+		}
+		if($statusCode == 200)
+		{
+			foreach($data as $key=>$value)
+			{
+				$fileName = strtoloweru("$path$key.zip");
+				if(!$this->yellow->toolbox->renameFile($fileName.$extension, $fileName))
+				{
+					$statusCode = 500;
+					$this->yellow->page->error($statusCode, "Can't create file '$fileName'!");
+				}
+			}
+		}
+		return $statusCode;
+	}
 
 
 	// Update downloaded software
 	// Update downloaded software
 	function update()
 	function update()
@@ -126,7 +160,11 @@ class YellowUpdate
 			for($i=0; $i<$zip->numFiles; ++$i)
 			for($i=0; $i<$zip->numFiles; ++$i)
 			{
 			{
 				$fileName = $zip->getNameIndex($i);
 				$fileName = $zip->getNameIndex($i);
-				if(empty($pathBase) && substru($fileName, -1, 1)=="/") $pathBase = $fileName;
+				if(empty($pathBase))
+				{
+					preg_match("#^(.*\/).*?$#", $fileName, $matches);
+					$pathBase = $matches[1];
+				}
 				if($fileName == $pathBase.$fileNameInformation)
 				if($fileName == $pathBase.$fileNameInformation)
 				{
 				{
 					$fileData = $zip->getFromIndex($i);
 					$fileData = $zip->getFromIndex($i);
@@ -141,10 +179,10 @@ class YellowUpdate
 				if(!empty($software) && !empty($matches[1]) && !empty($matches[2]))
 				if(!empty($software) && !empty($matches[1]) && !empty($matches[2]))
 				{
 				{
 					list($fileName, $flags) = explode(',', $matches[2], 2);
 					list($fileName, $flags) = explode(',', $matches[2], 2);
-					$rawData = $zip->getFromName($pathBase.$fileName);
+					$fileData = $zip->getFromName($pathBase.$fileName);
 					$metaData = $zip->statName($pathBase.$fileName);
 					$metaData = $zip->statName($pathBase.$fileName);
 					$modified = $metaData ? $metaData["mtime"] : 0;
 					$modified = $metaData ? $metaData["mtime"] : 0;
-					$statusCode = $this->updateSoftwareFile($matches[1], $rawData, $modified, $flags, $software);
+					$statusCode = $this->updateSoftwareFile($matches[1], $fileData, $modified, $flags, $software);
 					if($statusCode != 200) break;
 					if($statusCode != 200) break;
 				}
 				}
 			}
 			}
@@ -159,20 +197,20 @@ class YellowUpdate
 	}
 	}
 	
 	
 	// Update software file
 	// Update software file
-	function updateSoftwareFile($fileName, $rawData, $modified, $flags, $software)
+	function updateSoftwareFile($fileName, $fileData, $modified, $flags, $software)
 	{
 	{
 		$statusCode = 200;
 		$statusCode = 200;
 		$fileName = $this->yellow->toolbox->normaliseTokens($fileName);
 		$fileName = $this->yellow->toolbox->normaliseTokens($fileName);
 		if($this->yellow->lookup->isValidFile($fileName) && !empty($flags))
 		if($this->yellow->lookup->isValidFile($fileName) && !empty($flags))
 		{
 		{
 			$create = $update = $delete = false;
 			$create = $update = $delete = false;
-			if(preg_match("/create/i", $flags) && !is_file($fileName) && !empty($rawData)) $create = true;
-			if(preg_match("/update/i", $flags) && is_file($fileName) && !empty($rawData)) $update = true;
+			if(preg_match("/create/i", $flags) && !is_file($fileName) && !empty($fileData)) $create = true;
+			if(preg_match("/update/i", $flags) && is_file($fileName) && !empty($fileData)) $update = true;
 			if(preg_match("/delete/i", $flags) && is_file($fileName)) $delete = true;
 			if(preg_match("/delete/i", $flags) && is_file($fileName)) $delete = true;
 			if(preg_match("/optional/i", $flags) && $this->isSoftware($software)) $create = $update = $delete = false;
 			if(preg_match("/optional/i", $flags) && $this->isSoftware($software)) $create = $update = $delete = false;
 			if($create)
 			if($create)
 			{
 			{
-				if(!$this->yellow->toolbox->createFile($fileName, $rawData, true) ||
+				if(!$this->yellow->toolbox->createFile($fileName, $fileData, true) ||
 				   !$this->yellow->toolbox->modifyFile($fileName, $modified))
 				   !$this->yellow->toolbox->modifyFile($fileName, $modified))
 				{
 				{
 					$statusCode = 500;
 					$statusCode = 500;
@@ -182,7 +220,7 @@ class YellowUpdate
 			if($update)
 			if($update)
 			{
 			{
 				if(!$this->yellow->toolbox->deleteFile($fileName, $this->yellow->config->get("trashDir")) ||
 				if(!$this->yellow->toolbox->deleteFile($fileName, $this->yellow->config->get("trashDir")) ||
-				   !$this->yellow->toolbox->createFile($fileName, $rawData) ||
+				   !$this->yellow->toolbox->createFile($fileName, $fileData) ||
 				   !$this->yellow->toolbox->modifyFile($fileName, $modified))
 				   !$this->yellow->toolbox->modifyFile($fileName, $modified))
 				{
 				{
 					$statusCode = 500;
 					$statusCode = 500;
@@ -329,17 +367,49 @@ class YellowUpdate
 		$data["installationMode"] = "0";
 		$data["installationMode"] = "0";
 		return $data;
 		return $data;
 	}
 	}
-	
+
+	// Return software update
+	function getSoftwareUpdate($feature)
+	{
+		$data = array();
+		list($statusCode, $dataCurrent) = $this->getSoftwareVersion();
+		list($statusCode, $dataLatest) = $this->getSoftwareVersion(true, true);
+		foreach($dataCurrent as $key=>$value)
+		{
+			list($version, $url) = explode(',', $dataLatest[$key]);
+			if(empty($feature))
+			{
+				if(strnatcasecmp($dataCurrent[$key], $version) < 0) $data[$key] = $dataLatest[$key];
+			} else {
+				if(preg_match("/$feature/i", $key) && $version) $data[$key] = $dataLatest[$key];
+			}
+		}
+		return array($statusCode, $data);
+	}
+
 	// Return software version
 	// Return software version
-	function getSoftwareVersion($latest = false)
+	function getSoftwareVersion($latest = false, $rawFormat = false)
 	{
 	{
 		$data = array();
 		$data = array();
 		if($latest)
 		if($latest)
 		{
 		{
-			list($statusCodePlugins, $dataPlugins) = $this->getSoftwareVersionFromUrl($this->yellow->config->get("updatePluginsUrl"));
-			list($statusCodeThemes, $dataThemes) = $this->getSoftwareVersionFromUrl($this->yellow->config->get("updateThemesUrl"));
+			$urlPlugins = $this->yellow->config->get("updatePluginsUrl")."/raw/master/".$this->yellow->config->get("updateVersionFile");
+			$urlThemes = $this->yellow->config->get("updateThemesUrl")."/raw/master/".$this->yellow->config->get("updateVersionFile");
+			list($statusCodePlugins, $fileDataPlugins) = $this->getSoftwareFile($urlPlugins, $rawFormat);
+			list($statusCodeThemes, $fileDataThemes) = $this->getSoftwareFile($urlThemes, $rawFormat);
 			$statusCode = max($statusCodePlugins, $statusCodeThemes);
 			$statusCode = max($statusCodePlugins, $statusCodeThemes);
-			$data = array_merge($dataPlugins, $dataThemes);
+			if($statusCode == 200)
+			{
+				foreach($this->yellow->toolbox->getTextLines($fileDataPlugins."\n".$fileDataThemes) as $line)
+				{
+					preg_match("/^\s*(.*?)\s*:\s*(.*?)\s*$/", $line, $matches);
+					if(!empty($matches[1]) && !empty($matches[2]))
+					{
+						list($version, $url) = explode(',', $matches[2]);
+						$data[$matches[1]] = $rawFormat ? $matches[2] : $version;
+					}
+				}
+			}
 		} else {
 		} else {
 			$statusCode = 200;
 			$statusCode = 200;
 			foreach($this->yellow->plugins->getData() as $key=>$value) $data[$key] = $value;
 			foreach($this->yellow->plugins->getData() as $key=>$value) $data[$key] = $value;
@@ -348,19 +418,19 @@ class YellowUpdate
 		return array($statusCode, $data);
 		return array($statusCode, $data);
 	}
 	}
 	
 	
-	// Return software version from URL
-	function getSoftwareVersionFromUrl($url)
+	// Return software file
+	function getSoftwareFile($url)
 	{
 	{
-		$data = array();
-		$urlVersion = $url;
-		if(preg_match("#^https://github.com/(.+)$#", $url, $matches))
-		{
-			$urlVersion = "https://raw.githubusercontent.com/".$matches[1]."/master/".$this->yellow->config->get("updateVersionFile");
-		}
+		$fileData = "";
 		if(extension_loaded("curl"))
 		if(extension_loaded("curl"))
 		{
 		{
+			$urlRequest = $url;
+			if(preg_match("#^https://github.com/(.+)/raw/(.+)$#", $url, $matches))
+			{
+				$urlRequest = "https://raw.githubusercontent.com/".$matches[1]."/".$matches[2];
+			}
 			$curlHandle = curl_init();
 			$curlHandle = curl_init();
-			curl_setopt($curlHandle, CURLOPT_URL, $urlVersion);
+			curl_setopt($curlHandle, CURLOPT_URL, $urlRequest);
 			curl_setopt($curlHandle, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; YellowCore/".YellowCore::Version).")";
 			curl_setopt($curlHandle, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; YellowCore/".YellowCore::Version).")";
 			curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1);
 			curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1);
 			curl_setopt($curlHandle, CURLOPT_CONNECTTIMEOUT, 30);
 			curl_setopt($curlHandle, CURLOPT_CONNECTTIMEOUT, 30);
@@ -369,25 +439,19 @@ class YellowUpdate
 			curl_close($curlHandle);
 			curl_close($curlHandle);
 			if($statusCode == 200)
 			if($statusCode == 200)
 			{
 			{
-				if(defined("DEBUG") && DEBUG>=2) echo "YellowUpdate::getSoftwareVersionFromUrl location:$url\n";
-				foreach($this->yellow->toolbox->getTextLines($rawData) as $line)
-				{
-					preg_match("/^\s*(.*?)\s*:\s*(.*?)\s*$/", $line, $matches);
-					if(!empty($matches[1]) && !empty($matches[2]))
-					{
-						list($version, $url) = explode(',', $matches[2]);
-						$data[$matches[1]] = $version;
-						if(defined("DEBUG") && DEBUG>=3) echo "YellowUpdate::getSoftwareVersionFromUrl $matches[1]:$version\n";
-					}
-				}
+				$fileData = $rawData;
+			} else if($statusCode == 0) {
+				$statusCode = 444;
+				$this->yellow->page->error($statusCode, "No response from server!");
+			} else {
+				$this->yellow->page->error($statusCode, "Can't download file '$url'!");
 			}
 			}
-			if($statusCode == 0) $statusCode = 444;
-			$data["error"] = "$url - ".$this->yellow->toolbox->getHttpStatusFormatted($statusCode);
+			if(defined("DEBUG") && DEBUG>=3) echo "YellowUpdate::getSoftwareFile status:$statusCode url:$url<br/>\n";
 		} else {
 		} else {
 			$statusCode = 500;
 			$statusCode = 500;
-			$data["error"] = "Plugin 'update' requires cURL library!";
+			$this->yellow->page->error($statusCode, "Plugin 'update' requires cURL library!");
 		}
 		}
-		return array($statusCode, $data);
+		return array($statusCode, $fileData);
 	}
 	}
 	
 	
 	// Check if software exists
 	// Check if software exists