paheko-fork/tools/make_installer.php
2024-01-19 16:39:49 +01:00

191 lines
4 KiB
PHP

<?php
$includes = [
'##KD2' => [
__DIR__ . '/../src/include/lib/KD2/Security.php',
__DIR__ . '/../src/include/lib/KD2/HTTP.php',
__DIR__ . '/../src/include/lib/KD2/FossilInstaller.php',
],
];
$template = <<<'EOF'
<?php
// Copier ce fichier dans un nouveau répertoire vide
// Et s'y rendre avec un navigateur web :-)
namespace KD2 {
##KD2
}
namespace {
const WEBSITE = 'https://fossil.kd2.org/paheko/';
const INSTALL_DIR = __DIR__ . '/.install';
echo '
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<style type="text/css">
body {
font-family: sans-serif;
}
h2, p {
margin: 0;
margin-bottom: 1rem;
}
div {
position: relative;
border: 1px solid #999;
max-width: 500px;
padding: 1em;
border-radius: .5em;
}
.spinner h2::after {
display: block;
content: " ";
margin: 1rem auto;
width: 50px;
height: 50px;
border: 5px solid #000;
border-radius: 50%;
border-top-color: #999;
animation: spin 1s ease-in-out infinite;
}
@keyframes spin { to { transform: rotate(360deg); } }
</style>';
function exception_error_handler($severity, $message, $file, $line) {
if (!(error_reporting() & $severity)) {
return;
}
throw new ErrorException($message, 0, $severity, $file, $line);
}
function mini_exception_handler($e) {
printf('
<div style="padding: 1rem;
background: #fee;
border: 2px solid darkred;"><h2>%s</h2>
<h3>in %s:%d</h3>
<pre>%s</pre>
</div>',
$e->getMessage(), $e->getFile(), $e->getLine(), (string) $e);
}
set_error_handler("exception_error_handler");
set_exception_handler('mini_exception_handler');
if (!version_compare(phpversion(), '7.4', '>=')) {
throw new \Exception('PHP 7.4 ou supérieur requis. PHP version ' . phpversion() . ' installée.');
}
if (!class_exists('SQLite3')) {
throw new \Exception('Le module de base de données SQLite3 n\'est pas disponible.');
}
$v = \SQLite3::version();
if (!version_compare($v['versionString'], '3.16', '>=')) {
throw new \Exception('SQLite3 version 3.16 ou supérieur requise. Version installée : ' . $v['versionString']);
}
$step = $_GET['step'] ?? null;
$error = null;
@mkdir(INSTALL_DIR);
$i = new KD2\FossilInstaller(WEBSITE, __DIR__, INSTALL_DIR, '!^paheko-(.*)\.tar\.gz$!');
if ($step == 'download') {
$latest = $i->latest();
if (!$latest) {
die('</head><h1>Aucune version à télécharger n\'a été trouvée.</h1>');
}
$i->download($latest);
$next = 'install';
}
elseif ($step == 'install') {
$latest = $i->latest();
if (!$latest) {
die('</head><h1>Aucune version à télécharger n\'a été trouvée.</h1>');
}
$i->install($latest);
$i->clean($latest);
if (class_exists('\OCP\AppFramework\Controller')) {
$next = 'nc' . time();
}
else {
$next = null;
}
}
else {
$next = 'download';
}
echo $next ? '<meta http-equiv="refresh" content="0;url=?step='.$next.'" />' : '';
echo '
</head>';
if ($step == 'download') {
echo '
<div class="spinner">
<h2>Décompression en cours…</h2>
</div>';
}
elseif ($step == 'install') {
echo '<div>
<h2>Installation réussie</h2>
<p>Configurez désormais votre sous-domaine pour pointer sur le sous-répertoire <strong>www</strong> de cette installation.</p>
<p><a href="' . WEBSITE . '">Consultez la documentation pour plus d\'infos</a></p>
</div>';
}
else {
echo '
<div class="spinner">
<h2>Téléchargement en cours…</h2>
</div>';
}
echo '
</body>
</html>
';
if ($step == 'install') {
$i->prune(0);
@rmdir(INSTALL_DIR);
@unlink(__FILE__);
}
}
?>
EOF;
foreach ($includes as $tag => $files) {
$source = [];
foreach ($files as $file) {
$content = file_get_contents($file);
$content = preg_replace('!^(?:<\?php|namespace |use ).*$!m', '', $content);
$content = preg_replace("!^!m", "\t$0", $content);
$content = preg_replace("!^\t$!m", '', $content);
$content = trim($content);
$source[] = $content;
}
$source = implode("\n\n", $source);
$template = str_replace($tag, $source, $template);
}
echo $template;