Finished implementing of new update mechanism

This commit is contained in:
kolaente 2017-10-06 00:12:03 +02:00
parent e8e1ff2451
commit a485c1763c
3 changed files with 72 additions and 24 deletions

View File

@ -11,8 +11,7 @@ $update->thingsToNotUpdate = [
'config/', 'config/',
'content/', 'content/',
'vendor/', 'vendor/',
'templates_c', 'templates_c'
'docker-dev'
]; ];
//Update-Checker //Update-Checker
@ -124,10 +123,10 @@ if (isset($_GET['update']))
if($update->cleanup()) if($update->cleanup())
{ {
// Update new Version in Config file // Update new Version in Config file
$conf = \Symfony\Component\Yaml\Yaml::parse(file_get_contents('../config.yml')); $conf = \Symfony\Component\Yaml\Yaml::parse(file_get_contents('../config/config.yml'));
$conf['Versioning']['version'] = $update->getCurrentVersion(); $conf['Versioning']['version'] = $update->getCurrentVersion();
$configfile = \Symfony\Component\Yaml\Yaml::dump($CONFIG); $configfile = \Symfony\Component\Yaml\Yaml::dump($conf);
if (file_put_contents('../config/config.yml', $configfile)) if (file_put_contents('../config/config.yml', $configfile))
{ {
// Disable Construction mode // Disable Construction mode

View File

@ -13,6 +13,8 @@ class updater
private $updateServer; private $updateServer;
private $updateDir; private $updateDir;
private $newUpdateFiles;
/** /**
* Every file/folder, including subdirectories which should not be updated or deleted after the update. * Every file/folder, including subdirectories which should not be updated or deleted after the update.
* @var string * @var string
@ -136,7 +138,7 @@ class updater
public function getChangelog($changelogUrl) public function getChangelog($changelogUrl)
{ {
if($this->remote_file_exists($changelogUrl)) if ($this->remote_file_exists($changelogUrl))
{ {
return file_get_contents($changelogUrl); return file_get_contents($changelogUrl);
} }
@ -156,7 +158,7 @@ class updater
*/ */
public function updateFolderIsWritable($updateFolder = '') public function updateFolderIsWritable($updateFolder = '')
{ {
if($updateFolder == '') $updateFolder = $this->updateDir; if ($updateFolder == '') $updateFolder = $this->updateDir;
if (is_dir($updateFolder)) if (is_dir($updateFolder))
{ {
if (is_writable($updateFolder)) if (is_writable($updateFolder))
@ -182,7 +184,7 @@ class updater
} }
} }
if($updateFolder == $this->updateDir && !is_dir($this->updateDir)) if ($updateFolder == $this->updateDir && !is_dir($this->updateDir))
{ {
throw new \Exception('Update folder is not a folder!'); throw new \Exception('Update folder is not a folder!');
} }
@ -263,7 +265,19 @@ class updater
// Upzip the downloaded update // Upzip the downloaded update
$zippy = Zippy::load(); $zippy = Zippy::load();
$update = $zippy->open('.update.tmp.zip'); $update = $zippy->open('.update.tmp.zip');
if(!$update->extract($this->updateDir))
foreach ($update as $file)
{
$name = $this->updateDir . '/' . $file->getLocation();
if ($file->isDir())
{
$name = substr($name, 0, strlen($name) - 1);
}
$this->newUpdateFiles[] = $name;
}
if (!$update->extract($this->updateDir))
{ {
throw new \Exception('Could not extract the update!'); throw new \Exception('Could not extract the update!');
} }
@ -274,10 +288,10 @@ class updater
*/ */
public function migrate() public function migrate()
{ {
if(file_exists($this->updateDir.'migrations.php')) if (file_exists($this->updateDir . 'migrations.php'))
{ {
require_once $this->updateDir . 'migrations.php'; require_once $this->updateDir . 'migrations.php';
unlink($this->updateDir.'migrations.php'); unlink($this->updateDir . 'migrations.php');
} }
} }
@ -293,18 +307,28 @@ class updater
*/ */
public function cleanup() public function cleanup()
{ {
// cleanup downloaded zips
$success = unlink('.update.tmp.zip');
$success = unlink('.update-backup.zip');
// Delete all Files which don't exist anymore in the update. Ommit everything in $filesToNotUpdate // Delete all Files which don't exist anymore in the update. Ommit everything in $filesToNotUpdate
$diff = array_diff($this->getDirContents($this->updateDir), $update); $diff = array_diff($this->getDirContents($this->updateDir), $this->newUpdateFiles);
foreach ($diff as $file) foreach ($diff as $file)
{ {
$success = unlink($file); if (is_dir($file))
{
$success = $this->rrmdir($file);
} else
{
// Empty files wont show up in the zip, which is why we check this here.
if(filesize($file) != 0)
{
$success = unlink($file);
}
}
} }
// cleanup downloaded zips
$success = unlink('.update.tmp.zip');
$success = unlink('.update-backup.zip');
return $success; return $success;
} }
@ -351,7 +375,7 @@ class updater
{ {
$p = $this->str_replace_first($dir, '', $path); $p = $this->str_replace_first($dir, '', $path);
$p = $this->str_replace_first('/', '', $p); $p = $this->str_replace_first('/', '', $p);
if($this->stringMatchesInArray($p, $this->thingsToNotUpdate)) if ($this->stringMatchesInArray($p, $this->thingsToNotUpdate))
{ {
unset($results[$in]); unset($results[$in]);
} }
@ -374,7 +398,7 @@ class updater
$path = $dir . DIRECTORY_SEPARATOR . $value; $path = $dir . DIRECTORY_SEPARATOR . $value;
// Don't show the directory if it's hidden // Don't show the directory if it's hidden
if(substr( $value, 0, 1 ) !== "." ) if (substr($value, 0, 1) !== ".")
{ {
if (!is_dir($path)) if (!is_dir($path))
{ {
@ -399,14 +423,14 @@ class updater
{ {
foreach ($array as $item) foreach ($array as $item)
{ {
$itm = '/'.preg_quote($item, '/').'/'; $itm = '/' . preg_quote($item, '/') . '/';
if(preg_match($itm, $string)) if (preg_match($itm, $string))
{ {
return true; return true;
} }
//if it matches without a slash at the end //if it matches without a slash at the end
if(substr($item, 0, (strlen($item) - 1)) === $string) if (substr($item, 0, (strlen($item) - 1)) === $string)
{ {
return true; return true;
} }
@ -423,8 +447,33 @@ class updater
*/ */
private function str_replace_first($search, $replace, $subject) private function str_replace_first($search, $replace, $subject)
{ {
$search = '/'.preg_quote($search, '/').'/'; $search = '/' . preg_quote($search, '/') . '/';
return preg_replace($search, $replace, $subject, 1); return preg_replace($search, $replace, $subject, 1);
} }
/**
* Deletes a non-empty folder
* @param $dir
* @return bool
*/
private function rrmdir($dir)
{
if (is_dir($dir))
{
$objects = scandir($dir);
foreach ($objects as $object)
{
if ($object != "." && $object != "..")
{
if (filetype($dir . "/" . $object) == "dir") $this->rrmdir($dir . "/" . $object); else unlink($dir . "/" . $object);
}
}
reset($objects);
return rmdir($dir);
} else
{
return false;
}
}
} }

View File

@ -2,6 +2,6 @@ User-Agent: *
Disallow: /admin/ Disallow: /admin/
Disallow: /apps/ Disallow: /apps/
Disallow: /cache/ Disallow: /cache/
Disallow: /Files/ Disallow: /vendor/
Disallow: /inc/ Disallow: /inc/
Disallow: /templates_c/ Disallow: /templates_c/