Initial commit
This commit is contained in:
298
setup/update.php
Normal file
298
setup/update.php
Normal file
@@ -0,0 +1,298 @@
|
||||
<?php
|
||||
|
||||
/*************************************************************************************/
|
||||
/* */
|
||||
/* Thelia */
|
||||
/* */
|
||||
/* Copyright (c) OpenStudio */
|
||||
/* email : info@thelia.net */
|
||||
/* web : http://www.thelia.net */
|
||||
/* */
|
||||
/* This program is free software; you can redistribute it and/or modify */
|
||||
/* it under the terms of the GNU General Public License as published by */
|
||||
/* the Free Software Foundation; either version 3 of the License */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, */
|
||||
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
|
||||
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
|
||||
/* GNU General Public License for more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License */
|
||||
/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
/* */
|
||||
/*************************************************************************************/
|
||||
|
||||
$bootstrapToggle = false;
|
||||
$bootstraped = false;
|
||||
|
||||
// Autoload bootstrap
|
||||
|
||||
foreach ($argv as $arg) {
|
||||
if ($arg === '-b') {
|
||||
$bootstrapToggle = true;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($bootstrapToggle) {
|
||||
require __DIR__ . DIRECTORY_SEPARATOR . $arg;
|
||||
|
||||
$bootstraped = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$bootstraped) {
|
||||
if (isset($bootstrapFile)) {
|
||||
require $bootstrapFile;
|
||||
} elseif (is_file($file = __DIR__ . '/../core/vendor/autoload.php')) {
|
||||
require $file;
|
||||
} elseif (is_file($file = __DIR__ . '/../../bootstrap.php')) {
|
||||
// Here we are on a thelia/thelia-project
|
||||
require $file;
|
||||
} else {
|
||||
cliOutput('No autoload file found. Please use the -b argument to include yours', 'error');
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
if (php_sapi_name() != 'cli') {
|
||||
cliOutput('this script can only be launched with cli sapi', 'error');
|
||||
exit(1);
|
||||
}
|
||||
|
||||
use Symfony\Component\Filesystem\Filesystem;
|
||||
use Symfony\Component\Finder\Finder;
|
||||
use Thelia\Install\Exception\UpdateException;
|
||||
|
||||
/***************************************************
|
||||
* Load Update class
|
||||
***************************************************/
|
||||
|
||||
try {
|
||||
$update = new \Thelia\Install\Update(false);
|
||||
} catch (UpdateException $ex) {
|
||||
cliOutput($ex->getMessage(), 'error');
|
||||
exit(2);
|
||||
}
|
||||
|
||||
/***************************************************
|
||||
* Check if update is needed
|
||||
***************************************************/
|
||||
|
||||
if ($update->isLatestVersion()) {
|
||||
cliOutput("You already have the latest version of Thelia : " . $update->getCurrentVersion(), 'success');
|
||||
exit(3);
|
||||
}
|
||||
|
||||
$current = $update->getCurrentVersion();
|
||||
$files = $update->getLatestVersion();
|
||||
$web = $update->getWebVersion();
|
||||
|
||||
while (1) {
|
||||
if ($web !== null && $files != $web) {
|
||||
cliOutput(sprintf(
|
||||
"Thelia server is reporting the current stable release version is %s ",
|
||||
$web
|
||||
), 'warning');
|
||||
}
|
||||
|
||||
cliOutput(sprintf(
|
||||
"You are going to update Thelia from version %s to version %s.",
|
||||
$current,
|
||||
$files
|
||||
), 'info');
|
||||
|
||||
if ($web !== null && $files < $web) {
|
||||
cliOutput(sprintf(
|
||||
"Your files belongs to version %s, which is not the latest stable release.",
|
||||
$files
|
||||
), 'warning');
|
||||
cliOutput(sprintf(
|
||||
"It is recommended to upgrade your files first then run this script again." . PHP_EOL
|
||||
. "The latest version is available at http://thelia.net/#download ."
|
||||
), 'warning');
|
||||
cliOutput("Continue update process anyway ? (Y/n)");
|
||||
} else {
|
||||
cliOutput("Continue update process ? (Y/n)");
|
||||
}
|
||||
|
||||
$rep = readStdin(true);
|
||||
if ($rep == 'y') {
|
||||
break;
|
||||
} elseif ($rep == 'n') {
|
||||
cliOutput("Update aborted", 'warning');
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
$backup = false;
|
||||
while (1) {
|
||||
cliOutput(sprintf("Would you like to backup the current database before proceeding ? (Y/n)"));
|
||||
|
||||
$rep = readStdin(true);
|
||||
if ($rep == 'y') {
|
||||
$backup = true;
|
||||
break;
|
||||
} elseif ($rep == 'n') {
|
||||
$backup = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/***************************************************
|
||||
* Update
|
||||
***************************************************/
|
||||
|
||||
$updateError = null;
|
||||
|
||||
try {
|
||||
// backup db
|
||||
if (true === $backup) {
|
||||
try {
|
||||
$update->backupDb();
|
||||
cliOutput(sprintf('Your database has been backed up. The sql file : %s', $update->getBackupFile()), 'info');
|
||||
} catch (\Exception $e) {
|
||||
cliOutput('Sorry, your database can\'t be backed up. Reason : ' . $e->getMessage(), 'error');
|
||||
exit(4);
|
||||
}
|
||||
}
|
||||
// update
|
||||
$update->process($backup);
|
||||
} catch (UpdateException $ex) {
|
||||
$updateError = $ex;
|
||||
}
|
||||
|
||||
|
||||
|
||||
foreach ($update->getMessages() as $message) {
|
||||
cliOutput($message[0], $message[1]);
|
||||
}
|
||||
|
||||
if (null === $updateError) {
|
||||
cliOutput(sprintf('Thelia as been successfully updated to version %s', $update->getCurrentVersion()), 'success');
|
||||
if ($update->hasPostInstructions()) {
|
||||
cliOutput('===================================');
|
||||
cliOutput($update->getPostInstructions());
|
||||
cliOutput('===================================');
|
||||
}
|
||||
|
||||
} else {
|
||||
cliOutput(sprintf('Sorry, an unexpected error has occured : %s', $updateError->getMessage()), 'error');
|
||||
print $updateError->getTraceAsString() . PHP_EOL;
|
||||
print "Trace: " . PHP_EOL;
|
||||
foreach ($update->getLogs() as $log) {
|
||||
cliOutput(sprintf('[%s] %s' . PHP_EOL, $log[0], $log[1]), 'error');
|
||||
}
|
||||
|
||||
if (true === $backup) {
|
||||
while (1) {
|
||||
cliOutput("Would you like to restore the backup database ? (Y/n)");
|
||||
|
||||
$rep = readStdin(true);
|
||||
if ($rep == 'y') {
|
||||
cliOutput("Database restore started. Wait, it could take a while...");
|
||||
|
||||
if (false === $update->restoreDb()) {
|
||||
cliOutput(sprintf(
|
||||
'Sorry, your database can\'t be restore. Try to do it manually : %s',
|
||||
$update->getBackupFile()
|
||||
), 'error');
|
||||
exit(5);
|
||||
} else {
|
||||
cliOutput("Database successfully restore.");
|
||||
exit(5);
|
||||
}
|
||||
break;
|
||||
} elseif ($rep == 'n') {
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/***************************************************
|
||||
* Try to delete cache
|
||||
***************************************************/
|
||||
|
||||
$finder = new Finder();
|
||||
$fs = new Filesystem();
|
||||
$hasDeleteError = false;
|
||||
|
||||
$finder->files()->in(THELIA_CACHE_DIR);
|
||||
|
||||
cliOutput(sprintf("Try to delete cache in : %s", THELIA_CACHE_DIR), 'info');
|
||||
|
||||
foreach ($finder as $file) {
|
||||
try {
|
||||
$fs->remove($file);
|
||||
} catch (\Symfony\Component\Filesystem\Exception\IOException $ex) {
|
||||
$hasDeleteError = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (true === $hasDeleteError) {
|
||||
cliOutput("The cache has not been cleared properly. Try to run the command manually : " .
|
||||
"(sudo) php Thelia cache:clear (--env=prod).");
|
||||
}
|
||||
|
||||
cliOutput("Update process finished.", 'info');
|
||||
exit(0);
|
||||
|
||||
|
||||
/***************************************************
|
||||
* Utils
|
||||
***************************************************/
|
||||
|
||||
function readStdin($normalize = false)
|
||||
{
|
||||
$fr = fopen("php://stdin", "r");
|
||||
$input = fgets($fr, 128);
|
||||
$input = rtrim($input);
|
||||
fclose($fr);
|
||||
|
||||
if ($normalize) {
|
||||
$input = strtolower(trim($input));
|
||||
}
|
||||
|
||||
return $input;
|
||||
}
|
||||
|
||||
function joinPaths()
|
||||
{
|
||||
$args = func_get_args();
|
||||
$paths = [];
|
||||
|
||||
foreach ($args as $arg) {
|
||||
$paths[] = trim($arg, '/\\');
|
||||
}
|
||||
|
||||
$path = join(DIRECTORY_SEPARATOR, $paths);
|
||||
if (substr($args[0], 0, 1) === '/') {
|
||||
$path = DIRECTORY_SEPARATOR . $path;
|
||||
}
|
||||
|
||||
return $path;
|
||||
}
|
||||
|
||||
function cliOutput($message, $type = null)
|
||||
{
|
||||
switch ($type) {
|
||||
case 'success':
|
||||
$color = "\033[0;32m";
|
||||
break;
|
||||
case 'info':
|
||||
$color = "\033[0;34m";
|
||||
break;
|
||||
case 'error':
|
||||
$color = "\033[0;31m";
|
||||
break;
|
||||
case 'warning':
|
||||
$color = "\033[1;33m";
|
||||
break;
|
||||
default:
|
||||
$color = "\033[0m";
|
||||
}
|
||||
|
||||
echo PHP_EOL . $color . $message . "\033[0m" . PHP_EOL;
|
||||
}
|
||||
Reference in New Issue
Block a user