blue-twilight/public/update.php

255 lines
7.0 KiB
PHP

<?php
namespace BtwInstaller;
class BlueTwilightUpdater
{
private $baseDirectory;
private $composerSignature;
public function __construct()
{
$this->baseDirectory = dirname(__DIR__);
chdir($this->baseDirectory);
putenv('HOME=' . $this->baseDirectory);
// Display errors so installer never gets a WSOD!
ini_set('display_errors', true);
}
public function run()
{
if (strtoupper($_SERVER['REQUEST_METHOD']) == 'POST')
{
// Handle post
$this->runUpdate();
exit();
}
?>
<html>
<head>
<title>Blue Twilight Update</title>
</head>
<body>
<h1>Blue Twilight Update</h1>
<p>This update routine ensures your Blue Twilight Composer packages are up-to-date.</p>
<p>To get started, simply click the button below.</p>
<p style="font-weight: bold; color: #ff0000;">This can take a few minutes so please be patient, and only click the button once!</p>
<form method="post">
<button type="submit">Update Composer and dependencies for me</button>
</form>
<hr/>
<h2>Got Composer?</h2>
<p>If you already have Composer installed, however, you may want to use that instead. Just run the below commands on your server, changing the path to Composer as appropriate:</p>
<p><em>Please note: &quot;composer.phar&quot; may actually be &quot;composer&quot; on your system.</em></p>
<pre>
cd <?php echo $this->baseDirectory; ?>
php artisan clear-compiled
php artisan cache:clear
php artisan config:clear
php artisan view:clear
/path/to/composer.phar install
</pre>
</body>
</html>
<?php
}
private function runUpdate()
{
?>
<h1>Updating Blue Twilight Composer packages</h1>
<ul>
<?php
$steps = [
['Removing compiled cache', 'removeCompiledCached'],
['Fetching Composer signature', 'fetchComposerSignature'],
['Installing Composer', 'installComposer'],
['Updating dependencies using Composer', 'runComposer']
];
$successful = true;
foreach ($steps as $step)
{
echo sprintf("<li>%s...</li>%s", $step[0], PHP_EOL);
$result = call_user_func([$this, $step[1]]);
if (!$result)
{
$successful = false;
break;
}
}
if ($successful)
{
header('Location: admin');
exit();
}
?>
</ul>
<?php
}
private function fetchComposerSignature()
{
if (!boolval(ini_get('allow_url_fopen')))
{
$this->echoError('allow_url_fopen is disabled so we cannot use Composer');
echo '<br/>';
$this->echoError('You will need to install the vendor libraries manually - <a href="https://github.com/pandy06269/blue-twilight/wiki/Install-Vendor-libraries-manually" target="_blank">see this page for more details</a>');
return false;
}
$signatureUrl = 'https://composer.github.io/installer.sig';
$this->composerSignature = trim(file_get_contents($signatureUrl));
if (strlen($this->composerSignature) == 0)
{
$this->echoError(sprintf("Failed downloading the Composer signature from %s", $signatureUrl));
return false;
}
else
{
$this->echoOK($this->composerSignature);
}
return true;
}
private function removeCompiledCached()
{
ob_start();
system('php artisan clear-compiled', $rc);
$result = ob_get_clean();
echo nl2br($result);
if ($rc != 0)
{
$this->echoError('clear-compiled command failed');
return false;
}
ob_start();
system('php artisan cache:clear', $rc);
$result = ob_get_clean();
echo nl2br($result);
if ($rc != 0)
{
$this->echoError('cache:clear command failed');
return false;
}
ob_start();
system('php artisan config:clear', $rc);
$result = ob_get_clean();
echo nl2br($result);
if ($rc != 0)
{
$this->echoError('config:clear command failed');
return false;
}
ob_start();
system('php artisan view:clear', $rc);
$result = ob_get_clean();
echo nl2br($result);
if ($rc != 0)
{
$this->echoError('view:clear command failed');
return false;
}
$this->echoOK();
return true;
}
private function echoError($message)
{
echo sprintf("<span style=\"color: #ff0000;\">%s.</span>%s", $message, PHP_EOL);
}
private function echoOK($message = '')
{
echo "<span style=\"color: #008800;\">OK";
if (strlen($message) > 0)
{
echo sprintf('... %s', $message);
}
echo '</span>' . PHP_EOL;
}
private function installComposer()
{
$rc = -1;
ob_start();
system('php -r "copy(\'https://getcomposer.org/installer\', \'composer-setup.php\');"', $rc);
$result = ob_get_clean();
echo nl2br($result);
if ($rc != 0)
{
$this->echoError('Failed to fetch Composer');
return false;
}
ob_start();
system(sprintf('php -r "if (hash_file(\'SHA384\', \'composer-setup.php\') === \'%s\') { echo \'Installer verified\'; } else { echo \'Installer corrupt\'; unlink(\'composer-setup.php\'); } echo PHP_EOL;"', $this->composerSignature), $rc);
$result = ob_get_clean();
echo nl2br($result);
if ($rc != 0)
{
$this->echoError('Composer verification failed');
return false;
}
ob_start();
system('php composer-setup.php', $rc);
$result = ob_get_clean();
echo nl2br($result);
if ($rc != 0)
{
$this->echoError('Failed to install Composer');
return false;
}
ob_start();
system('php -r "unlink(\'composer-setup.php\');"', $rc);
$result = ob_get_clean();
echo nl2br($result);
if ($rc != 0)
{
$this->echoError('Failed to remove Composer setup file');
return false;
}
$this->echoOK();
return true;
}
private function runComposer()
{
ob_start();
system('php composer.phar install', $rc);
$result = ob_get_clean();
echo nl2br($result);
if ($rc != 0)
{
$this->echoError('Updating Composer packages failed');
return false;
}
$this->echoOK();
return true;
}
}
$installer = new BlueTwilightUpdater();
$installer->run();