|
@@ -1,13 +1,13 @@
|
|
|
<?php
|
|
|
-// Copyright (c) 2013-2015 Datenstrom, http://datenstrom.se
|
|
|
+// Copyright (c) 2013-2016 Datenstrom, http://datenstrom.se
|
|
|
// This file may be used and distributed under the terms of the public license.
|
|
|
|
|
|
// Command line plugin
|
|
|
class YellowCommandline
|
|
|
{
|
|
|
- const Version = "0.6.2";
|
|
|
+ const Version = "0.6.3";
|
|
|
var $yellow; //access to API
|
|
|
- var $content; //number of content pages
|
|
|
+ var $content; //number of content files
|
|
|
var $media; //number of media files
|
|
|
var $system; //number of system files
|
|
|
var $error; //number of build errors
|
|
@@ -79,12 +79,6 @@ class YellowCommandline
|
|
|
}
|
|
|
}
|
|
|
if($statusCode != 200) echo "ERROR checking updates at $url: $versionLatest[error]\n";
|
|
|
- if(!$this->yellow->config->isExisting("sitename"))
|
|
|
- {
|
|
|
- $fileNames = $this->yellow->toolbox->getDirectoryEntries(
|
|
|
- $this->yellow->config->get("configDir"), "/^.*\.ini$/", true, false);
|
|
|
- foreach($fileNames as $fileName) $statusCode = max($statusCode, $this->updateConfigFile($fileName));
|
|
|
- }
|
|
|
if($updates) echo "Yellow $command: $updates update".($updates==1 ? "":"s")." available at $url\n";
|
|
|
return $statusCode;
|
|
|
}
|
|
@@ -120,7 +114,7 @@ class YellowCommandline
|
|
|
return $statusCode;
|
|
|
}
|
|
|
|
|
|
- // Build static directories and files
|
|
|
+ // Build static files and directories
|
|
|
function buildStatic($path, $location)
|
|
|
{
|
|
|
$this->yellow->toolbox->timerStart($time);
|
|
@@ -130,106 +124,112 @@ class YellowCommandline
|
|
|
if(empty($location))
|
|
|
{
|
|
|
$statusCode = $this->cleanStatic($path, $location);
|
|
|
- foreach($this->getStaticLocations() as $location)
|
|
|
+ foreach($this->getContentLocations() as $location)
|
|
|
{
|
|
|
- $statusCode = max($statusCode, $this->buildStaticPage($path, $location, true));
|
|
|
+ $statusCode = max($statusCode, $this->buildStaticRequest($path, $location, "content", true));
|
|
|
}
|
|
|
foreach($this->locationsArgs as $location)
|
|
|
{
|
|
|
- $statusCode = max($statusCode, $this->buildStaticPage($path, $location, true));
|
|
|
+ $statusCode = max($statusCode, $this->buildStaticRequest($path, $location, "content", true));
|
|
|
}
|
|
|
foreach($this->locationsArgsPagination as $location)
|
|
|
{
|
|
|
if(substru($location, -1) != ':')
|
|
|
{
|
|
|
- $statusCode = max($statusCode, $this->buildStaticPage($path, $location, false, true));
|
|
|
+ $statusCode = max($statusCode, $this->buildStaticRequest($path, $location, "content", false, true));
|
|
|
}
|
|
|
for($pageNumber=2; $pageNumber<=999; ++$pageNumber)
|
|
|
{
|
|
|
- $statusCodeLocation = $this->buildStaticPage($path, $location.$pageNumber, false, true);
|
|
|
+ $statusCodeLocation = $this->buildStaticRequest($path, $location.$pageNumber, "content", false, true);
|
|
|
$statusCode = max($statusCode, $statusCodeLocation);
|
|
|
- if($statusCodeLocation == 0) break;
|
|
|
+ if($statusCodeLocation == 100) break;
|
|
|
}
|
|
|
}
|
|
|
- $statusCode = max($statusCode, $this->buildStaticPage($path, "/error", false, false, true));
|
|
|
- foreach($this->getStaticFilesMedia($path) as $fileNameSource=>$fileNameDest)
|
|
|
+ foreach($this->getMediaLocations() as $location)
|
|
|
{
|
|
|
- $statusCode = max($statusCode, $this->buildStaticFile($fileNameSource, $fileNameDest, true));
|
|
|
+ $statusCode = max($statusCode, $this->buildStaticRequest($path, $location, "media"));
|
|
|
}
|
|
|
- foreach($this->getStaticFilesSystem($path) as $fileNameSource=>$fileNameDest)
|
|
|
+ foreach($this->getSystemLocations() as $location)
|
|
|
{
|
|
|
- $statusCode = max($statusCode, $this->buildStaticFile($fileNameSource, $fileNameDest, false));
|
|
|
+ $statusCode = max($statusCode, $this->buildStaticRequest($path, $location, "system"));
|
|
|
}
|
|
|
+ $statusCode = max($statusCode, $this->buildStaticRequest($path, "/error", "system", false, false, true));
|
|
|
} else {
|
|
|
- $statusCode = $this->buildStaticPage($path, $location);
|
|
|
+ $statusCode = $this->buildStaticRequest($path, $location, "content");
|
|
|
}
|
|
|
$this->yellow->toolbox->timerStop($time);
|
|
|
if(defined("DEBUG") && DEBUG>=1) echo "YellowCommandline::buildStatic time:$time ms\n";
|
|
|
return $statusCode;
|
|
|
}
|
|
|
|
|
|
- // Build static page
|
|
|
- function buildStaticPage($path, $location, $analyse = false, $probe = false, $error = false)
|
|
|
- {
|
|
|
- ob_start();
|
|
|
- $_SERVER["SERVER_PROTOCOL"] = "HTTP/1.1";
|
|
|
- $_SERVER["SERVER_NAME"] = $this->yellow->config->get("serverName");
|
|
|
- $_SERVER["REQUEST_URI"] = $this->yellow->config->get("serverBase").$location;
|
|
|
- $_SERVER["SCRIPT_NAME"] = $this->yellow->config->get("serverBase")."/yellow.php";
|
|
|
- $_REQUEST = array();
|
|
|
- $statusCode = $this->yellow->request();
|
|
|
- if($statusCode<400 || $error)
|
|
|
+ // Build static request
|
|
|
+ function buildStaticRequest($path, $location, $type, $analyse = false, $probe = false, $error = false)
|
|
|
+ {
|
|
|
+ $this->yellow->page = new YellowPage($this->yellow);
|
|
|
+ if($type=="content" || $type=="system")
|
|
|
{
|
|
|
- $fileData = ob_get_contents();
|
|
|
- $modified = strtotime($this->yellow->page->getHeader("Last-Modified"));
|
|
|
- if($statusCode>=301 && $statusCode<=303)
|
|
|
+ ob_start();
|
|
|
+ $_SERVER["SERVER_PROTOCOL"] = "HTTP/1.1";
|
|
|
+ $_SERVER["SERVER_NAME"] = $this->yellow->config->get("serverName");
|
|
|
+ $_SERVER["REQUEST_URI"] = $this->yellow->config->get("serverBase").$location;
|
|
|
+ $_SERVER["SCRIPT_NAME"] = $this->yellow->config->get("serverBase")."/yellow.php";
|
|
|
+ $_REQUEST = array();
|
|
|
+ $statusCode = $this->yellow->request();
|
|
|
+ if($statusCode<400 || $error)
|
|
|
{
|
|
|
- $fileData = $this->getStaticRedirect($this->yellow->page->getHeader("Location"));
|
|
|
- $modified = time();
|
|
|
+ $fileData = ob_get_contents();
|
|
|
+ $modified = strtotime($this->yellow->page->getHeader("Last-Modified"));
|
|
|
+ if($modified == 0) $modified = filemtime($this->yellow->page->fileName);
|
|
|
+ if($statusCode>=301 && $statusCode<=303)
|
|
|
+ {
|
|
|
+ $fileData = $this->getStaticRedirect($this->yellow->page->getHeader("Location"));
|
|
|
+ $modified = time();
|
|
|
+ }
|
|
|
+ $fileName = $this->getStaticFile($path, $location, $statusCode);
|
|
|
+ if(!$this->yellow->toolbox->createFile($fileName, $fileData, true) ||
|
|
|
+ !$this->yellow->toolbox->modifyFile($fileName, $modified))
|
|
|
+ {
|
|
|
+ $statusCode = 500;
|
|
|
+ $this->yellow->page->statusCode = $statusCode;
|
|
|
+ $this->yellow->page->set("pageError", "Can't write file '$fileName'!");
|
|
|
+ }
|
|
|
}
|
|
|
+ ob_end_clean();
|
|
|
+ } else {
|
|
|
+ $statusCode = 200;
|
|
|
+ $fileNameSource = substru($location, 1);
|
|
|
$fileName = $this->getStaticFile($path, $location, $statusCode);
|
|
|
- if(!$this->yellow->toolbox->createFile($fileName, $fileData, true) ||
|
|
|
- !$this->yellow->toolbox->modifyFile($fileName, $modified))
|
|
|
+ if(!$this->yellow->toolbox->copyFile($fileNameSource, $fileName, true) ||
|
|
|
+ !$this->yellow->toolbox->modifyFile($fileName, filemtime($fileNameSource)))
|
|
|
{
|
|
|
$statusCode = 500;
|
|
|
$this->yellow->page->statusCode = $statusCode;
|
|
|
$this->yellow->page->set("pageError", "Can't write file '$fileName'!");
|
|
|
}
|
|
|
}
|
|
|
- ob_end_clean();
|
|
|
- if($statusCode==200 && $analyse) $this->analyseStaticPage($fileData);
|
|
|
+ if($statusCode==200 && $analyse) $this->analyseStaticRequest($fileData);
|
|
|
if($statusCode==404 && $error) $statusCode = 200;
|
|
|
- if($statusCode==404 && $probe) $statusCode = 0;
|
|
|
- if($statusCode != 0) ++$this->content;
|
|
|
- if($statusCode >= 400)
|
|
|
+ if($statusCode==404 && $probe) $statusCode = 100;
|
|
|
+ if($statusCode >= 200)
|
|
|
{
|
|
|
- ++$this->error;
|
|
|
- echo "ERROR building content location '$location', ".$this->yellow->page->getStatusCode(true)."\n";
|
|
|
+ switch($type)
|
|
|
+ {
|
|
|
+ case "content": ++$this->content; break;
|
|
|
+ case "media": ++$this->media; break;
|
|
|
+ case "system": ++$this->system; break;
|
|
|
+ }
|
|
|
}
|
|
|
- if(defined("DEBUG") && DEBUG>=3) echo $fileData;
|
|
|
- if(defined("DEBUG") && DEBUG>=1) echo "YellowCommandline::buildStaticPage status:$statusCode location:$location\n";
|
|
|
- return $statusCode;
|
|
|
- }
|
|
|
-
|
|
|
- // Build static file
|
|
|
- function buildStaticFile($fileNameSource, $fileNameDest, $fileTypeMedia)
|
|
|
- {
|
|
|
- $statusCode = $this->yellow->toolbox->copyFile($fileNameSource, $fileNameDest, true) &&
|
|
|
- $this->yellow->toolbox->modifyFile($fileNameDest, filemtime($fileNameSource)) ? 200 : 500;
|
|
|
- if($fileTypeMedia) { ++$this->media; } else { ++$this->system; }
|
|
|
if($statusCode >= 400)
|
|
|
{
|
|
|
++$this->error;
|
|
|
- $fileType = $fileTypeMedia ? "media file" : "system file";
|
|
|
- $fileError = $this->yellow->toolbox->getHttpStatusFormatted($statusCode);
|
|
|
- echo "ERROR building $fileType, $fileError: Can't write file '$fileNameDest'!\n";
|
|
|
+ echo "ERROR building location '$location', ".$this->yellow->page->getStatusCode(true)."\n";
|
|
|
}
|
|
|
- if(defined("DEBUG") && DEBUG>=1) echo "YellowCommandline::buildStaticFile status:$statusCode file:$fileNameDest\n";
|
|
|
+ if(defined("DEBUG") && DEBUG>=1) echo "YellowCommandline::buildStaticRequest status:$statusCode location:$location\n";
|
|
|
return $statusCode;
|
|
|
}
|
|
|
|
|
|
- // Analyse static page, detect locations with arguments
|
|
|
- function analyseStaticPage($text)
|
|
|
+ // Analyse static request, detect locations with arguments
|
|
|
+ function analyseStaticRequest($text)
|
|
|
{
|
|
|
$serverName = $this->yellow->config->get("serverName");
|
|
|
$serverBase = $this->yellow->config->get("serverBase");
|
|
@@ -252,14 +252,14 @@ class YellowCommandline
|
|
|
if(is_null($this->locationsArgs[$location]))
|
|
|
{
|
|
|
$this->locationsArgs[$location] = $location;
|
|
|
- if(defined("DEBUG") && DEBUG>=2) echo "YellowCommandline::analyseStaticPage detected location:$location\n";
|
|
|
+ if(defined("DEBUG") && DEBUG>=2) echo "YellowCommandline::analyseStaticRequest detected location:$location\n";
|
|
|
}
|
|
|
} else {
|
|
|
$location = rtrim($location, "0..9");
|
|
|
if(is_null($this->locationsArgsPagination[$location]))
|
|
|
{
|
|
|
$this->locationsArgsPagination[$location] = $location;
|
|
|
- if(defined("DEBUG") && DEBUG>=2) echo "YellowCommandline::analyseStaticPage detected location:$location\n";
|
|
|
+ if(defined("DEBUG") && DEBUG>=2) echo "YellowCommandline::analyseStaticRequest detected location:$location\n";
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -281,7 +281,7 @@ class YellowCommandline
|
|
|
return $statusCode;
|
|
|
}
|
|
|
|
|
|
- // Clean static directories and files
|
|
|
+ // Clean static files and directories
|
|
|
function cleanStatic($path, $location)
|
|
|
{
|
|
|
$statusCode = 200;
|
|
@@ -327,43 +327,6 @@ class YellowCommandline
|
|
|
return $statusCode;
|
|
|
}
|
|
|
|
|
|
- // Update configuration file if necessary
|
|
|
- function updateConfigFile($fileName)
|
|
|
- {
|
|
|
- $statusCode = 200;
|
|
|
- $fileData = @file($fileName);
|
|
|
- if($fileData)
|
|
|
- {
|
|
|
- foreach($fileData as $line)
|
|
|
- {
|
|
|
- if(preg_match("/^\/\/(.*)$/", $line, $matches))
|
|
|
- {
|
|
|
- if(!$found) $matches[1] .= " (updated)";
|
|
|
- $line = "#$matches[1]\n";
|
|
|
- $found = true;
|
|
|
- }
|
|
|
- if(preg_match("/^\s*(.*?)\s*=\s*(.*?)\s*$/", $line, $matches))
|
|
|
- {
|
|
|
- $line = ucfirst($matches[1]).": $matches[2]\n";
|
|
|
- }
|
|
|
- if(preg_match("/^([^,:]+),([^,]+),([^,]+),([^,]+),([^,\n]+)$/", $line, $matches))
|
|
|
- {
|
|
|
- $line = "$matches[1]: $matches[2],$matches[3],$matches[4],active,$matches[5]\n";
|
|
|
- }
|
|
|
- $fileDataNew .= $line;
|
|
|
- }
|
|
|
- }
|
|
|
- if($found)
|
|
|
- {
|
|
|
- if(!$this->yellow->toolbox->createFile($fileName, $fileDataNew))
|
|
|
- {
|
|
|
- $statusCode = 500;
|
|
|
- echo "ERROR updating configuration: Can't write file '$fileName'!\n";
|
|
|
- }
|
|
|
- }
|
|
|
- return $statusCode;
|
|
|
- }
|
|
|
-
|
|
|
// Forward plugin command
|
|
|
function pluginCommand($args)
|
|
|
{
|
|
@@ -409,8 +372,31 @@ class YellowCommandline
|
|
|
return $ok;
|
|
|
}
|
|
|
|
|
|
- // Return static locations from file system
|
|
|
- function getStaticLocations()
|
|
|
+ // Return static file
|
|
|
+ function getStaticFile($path, $location, $statusCode)
|
|
|
+ {
|
|
|
+ if($statusCode < 400)
|
|
|
+ {
|
|
|
+ $fileName = $path.$location;
|
|
|
+ if(!$this->yellow->lookup->isFileLocation($location)) $fileName .= $this->yellow->config->get("staticDefaultFile");
|
|
|
+ } else if($statusCode == 404) {
|
|
|
+ $fileName = $path."/".$this->yellow->config->get("staticErrorFile");
|
|
|
+ }
|
|
|
+ return $fileName;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Return static redirect
|
|
|
+ function getStaticRedirect($location)
|
|
|
+ {
|
|
|
+ $output = "<!DOCTYPE html><html>\n<head>\n";
|
|
|
+ $output .= "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />\n";
|
|
|
+ $output .= "<meta http-equiv=\"refresh\" content=\"0;url=".htmlspecialchars($location)."\" />\n";
|
|
|
+ $output .= "</head>\n</html>";
|
|
|
+ return $output;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Return content locations
|
|
|
+ function getContentLocations()
|
|
|
{
|
|
|
$locations = array();
|
|
|
$serverScheme = $this->yellow->config->get("serverScheme");
|
|
@@ -428,59 +414,37 @@ class YellowCommandline
|
|
|
return $locations;
|
|
|
}
|
|
|
|
|
|
- // Return static media files
|
|
|
- function getStaticFilesMedia($path)
|
|
|
+ // Return media locations
|
|
|
+ function getMediaLocations()
|
|
|
{
|
|
|
- $files = array();
|
|
|
+ $locations = array();
|
|
|
$fileNames = $this->yellow->toolbox->getDirectoryEntriesRecursive(
|
|
|
$this->yellow->config->get("mediaDir"), "/.*/", false, false);
|
|
|
- foreach($fileNames as $fileName) $files[$fileName] = "$path/$fileName";
|
|
|
- return $files;
|
|
|
+ foreach($fileNames as $fileName)
|
|
|
+ {
|
|
|
+ array_push($locations, "/".$fileName);
|
|
|
+ }
|
|
|
+ return $locations;
|
|
|
}
|
|
|
-
|
|
|
- // Return static system files
|
|
|
- function getStaticFilesSystem($path)
|
|
|
+
|
|
|
+ // Return system locations
|
|
|
+ function getSystemLocations()
|
|
|
{
|
|
|
- $files = array();
|
|
|
+ $locations = array();
|
|
|
$fileNames = $this->yellow->toolbox->getDirectoryEntries(
|
|
|
$this->yellow->config->get("pluginDir"), "/\.(css|js|jpg|png|txt|woff)/", false, false);
|
|
|
foreach($fileNames as $fileName)
|
|
|
{
|
|
|
- $files[$fileName] = $path.$this->yellow->config->get("pluginLocation").basename($fileName);
|
|
|
+ array_push($locations, $this->yellow->config->get("pluginLocation").basename($fileName));
|
|
|
}
|
|
|
$fileNames = $this->yellow->toolbox->getDirectoryEntries(
|
|
|
$this->yellow->config->get("themeDir"), "/\.(css|js|jpg|png|txt|woff)/", false, false);
|
|
|
foreach($fileNames as $fileName)
|
|
|
{
|
|
|
- $files[$fileName] = $path.$this->yellow->config->get("themeLocation").basename($fileName);
|
|
|
- }
|
|
|
- $fileNames = array();
|
|
|
- array_push($fileNames, $this->yellow->config->get("configDir").$this->yellow->config->get("robotsFile"));
|
|
|
- foreach($fileNames as $fileName) $files[$fileName] = "$path/".basename($fileName);
|
|
|
- return $files;
|
|
|
- }
|
|
|
-
|
|
|
- // Return static file
|
|
|
- function getStaticFile($path, $location, $statusCode)
|
|
|
- {
|
|
|
- if($statusCode < 400)
|
|
|
- {
|
|
|
- $fileName = $path.$location;
|
|
|
- if(!$this->yellow->lookup->isFileLocation($location)) $fileName .= $this->yellow->config->get("staticDefaultFile");
|
|
|
- } else if($statusCode == 404) {
|
|
|
- $fileName = $path."/".$this->yellow->config->get("staticErrorFile");
|
|
|
+ array_push($locations, $this->yellow->config->get("themeLocation").basename($fileName));
|
|
|
}
|
|
|
- return $fileName;
|
|
|
- }
|
|
|
-
|
|
|
- // Return static redirect
|
|
|
- function getStaticRedirect($location)
|
|
|
- {
|
|
|
- $output = "<!DOCTYPE html><html>\n<head>\n";
|
|
|
- $output .= "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />\n";
|
|
|
- $output .= "<meta http-equiv=\"refresh\" content=\"0;url=".htmlspecialchars($location)."\" />\n";
|
|
|
- $output .= "</head>\n</html>";
|
|
|
- return $output;
|
|
|
+ array_push($locations, "/".$this->yellow->config->get("robotsFile"));
|
|
|
+ return $locations;
|
|
|
}
|
|
|
|
|
|
// Return plugin version
|