712 lines
28 KiB
PHP
712 lines
28 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
// =============================================================================
|
|
// Glastree Installer - Wizard Setup
|
|
// =============================================================================
|
|
|
|
session_start();
|
|
|
|
require_once __DIR__ . '/functions.php';
|
|
|
|
// If already installed (and not in the middle of install), block
|
|
if (isEnvFileExists() && empty($_SESSION['install_in_progress'])) {
|
|
redirect('/login');
|
|
}
|
|
|
|
$step = max(1, min(6, (int) ($_GET['step'] ?? 1)));
|
|
$errors = [];
|
|
$success = '';
|
|
|
|
// ─── Step 1: Welcome + Mode Selection ──────────────────────────────────────
|
|
|
|
if ($step === 1) {
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
$mode = $_POST['mode'] ?? '';
|
|
if (!in_array($mode, ['fresh', 'backup'], true)) {
|
|
$errors[] = 'Seleziona una modalita di installazione.';
|
|
} else {
|
|
$_SESSION['install_mode'] = $mode;
|
|
$_SESSION['install_in_progress'] = true;
|
|
redirect('setup.php?step=2');
|
|
}
|
|
}
|
|
|
|
renderHeader('Benvenuto', '1');
|
|
?>
|
|
<h2>Benvenuto nell'installazione di Glastree</h2>
|
|
<p>Questo wizard ti guidera nella configurazione dell'applicazione su questo server.</p>
|
|
|
|
<?php renderErrors($errors); ?>
|
|
|
|
<form method="POST">
|
|
<div class="option-group">
|
|
<label class="option-card <?= ($_SESSION['install_mode'] ?? '') === 'fresh' ? 'selected' : '' ?>">
|
|
<input type="radio" name="mode" value="fresh" class="option-radio"
|
|
<?= ($_SESSION['install_mode'] ?? '') === 'fresh' ? 'checked' : '' ?>>
|
|
<div class="option-content">
|
|
<div class="option-icon"><i class="icon-rocket"></i></div>
|
|
<h3>Fresh Install</h3>
|
|
<p>Crea un database nuovo, esegue migration e seed, e configura l'applicazione da zero.</p>
|
|
<ul>
|
|
<li>Database nuovo</li>
|
|
<li>Migration + dati di base</li>
|
|
<li>Crea amministratore</li>
|
|
</ul>
|
|
</div>
|
|
</label>
|
|
<label class="option-card <?= ($_SESSION['install_mode'] ?? '') === 'backup' ? 'selected' : '' ?>">
|
|
<input type="radio" name="mode" value="backup" class="option-radio"
|
|
<?= ($_SESSION['install_mode'] ?? '') === 'backup' ? 'checked' : '' ?>>
|
|
<div class="option-content">
|
|
<div class="option-icon"><i class="icon-upload"></i></div>
|
|
<h3>Restore da Backup</h3>
|
|
<p>Carica un file ZIP di backup per ripristinare un'installazione esistente su questo server.</p>
|
|
<ul>
|
|
<li>Upload file ZIP</li>
|
|
<li>Importa database</li>
|
|
<li>Ripristina documenti</li>
|
|
</ul>
|
|
</div>
|
|
</label>
|
|
</div>
|
|
<div class="form-actions">
|
|
<button type="submit" class="btn btn-primary">Avanti →</button>
|
|
</div>
|
|
</form>
|
|
<?php
|
|
renderFooter();
|
|
}
|
|
|
|
// ─── Step 2: Requirements Check ─────────────────────────────────────────────
|
|
|
|
if ($step === 2) {
|
|
$checks = checkRequirements();
|
|
$allMet = allRequirementsMet($checks);
|
|
$nonCriticalFailed = false;
|
|
|
|
foreach ($checks as $check) {
|
|
if (!$check['passed'] && empty($check['critical'])) {
|
|
$nonCriticalFailed = true;
|
|
}
|
|
}
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST' && $allMet) {
|
|
redirect('setup.php?step=3');
|
|
}
|
|
|
|
renderHeader('Verifica Requisiti', '2');
|
|
?>
|
|
<h2>Verifica Requisiti di Sistema</h2>
|
|
<p>Il sistema controlla che il server soddisfi i requisiti minimi per eseguire Glastree.</p>
|
|
|
|
<?php renderErrors($errors); ?>
|
|
|
|
<div class="requirements-list">
|
|
<?php foreach ($checks as $check): ?>
|
|
<div class="requirement-item <?= $check['passed'] ? 'passed' : 'failed' ?>">
|
|
<span class="req-icon">
|
|
<?php if ($check['passed']): ?>
|
|
<i class="icon-ok"></i>
|
|
<?php else: ?>
|
|
<i class="icon-error"></i>
|
|
<?php endif; ?>
|
|
</span>
|
|
<span class="req-name"><?= e($check['name']) ?></span>
|
|
<span class="req-status"><?= $check['passed'] ? 'OK' : 'ERRORE' ?></span>
|
|
<?php if (!$check['passed']): ?>
|
|
<span class="req-msg"><?= e($check['message']) ?></span>
|
|
<?php endif; ?>
|
|
</div>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
|
|
<?php if (!$allMet): ?>
|
|
<div class="alert alert-danger">
|
|
<i class="icon-error"></i>
|
|
Requisiti critici non soddisfatti. Risolvi gli errori sopra e ricarica la pagina.
|
|
</div>
|
|
<?php elseif ($nonCriticalFailed): ?>
|
|
<div class="alert alert-warning">
|
|
<i class="icon-warning"></i>
|
|
Alcuni requisiti non critici non sono soddisfatti. Puoi proseguire, ma alcune funzionalita potrebbero essere limitate.
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
<form method="POST">
|
|
<div class="form-actions">
|
|
<a href="setup.php?step=1" class="btn btn-secondary">← Indietro</a>
|
|
<?php if ($allMet): ?>
|
|
<button type="submit" class="btn btn-primary">Avanti →</button>
|
|
<?php endif; ?>
|
|
</div>
|
|
</form>
|
|
<?php
|
|
renderFooter();
|
|
}
|
|
|
|
// ─── Step 3: Database Configuration ─────────────────────────────────────────
|
|
|
|
if ($step === 3) {
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
$action = $_POST['action'] ?? '';
|
|
$dbHost = $_POST['db_host'] ?? '127.0.0.1';
|
|
$dbPort = (int) ($_POST['db_port'] ?? 3306);
|
|
|
|
if ($action === 'test_root') {
|
|
// Test root credentials
|
|
$rootUser = $_POST['root_user'] ?? 'root';
|
|
$rootPass = $_POST['root_pass'] ?? '';
|
|
$result = testRootConnection($dbHost, $dbPort, $rootUser, $rootPass);
|
|
if ($result['success']) {
|
|
$_SESSION['root_user'] = $rootUser;
|
|
$_SESSION['root_pass'] = $rootPass;
|
|
$success = 'Connessione root riuscita. Ora puoi creare il database.';
|
|
} else {
|
|
$errors[] = $result['message'];
|
|
}
|
|
} elseif ($action === 'create_db') {
|
|
// Create database + user
|
|
$rootUser = $_SESSION['root_user'] ?? 'root';
|
|
$rootPass = $_SESSION['root_pass'] ?? '';
|
|
$dbName = $_POST['db_name'] ?? 'glastree';
|
|
$dbUser = $_POST['db_user'] ?? 'glastree';
|
|
$dbPass = $_POST['db_pass'] ?? '';
|
|
$appUrl = $_POST['app_url'] ?? getBaseUrl();
|
|
|
|
if (strlen($dbPass) < 6) {
|
|
$errors[] = 'La password del database deve essere almeno 6 caratteri.';
|
|
} else {
|
|
$result = createDatabaseAndUser($rootUser, $rootPass, $dbHost, $dbPort, $dbName, $dbUser, $dbPass);
|
|
if ($result['success']) {
|
|
$_SESSION['db_host'] = $dbHost;
|
|
$_SESSION['db_port'] = $dbPort;
|
|
$_SESSION['db_name'] = $dbName;
|
|
$_SESSION['db_user'] = $dbUser;
|
|
$_SESSION['db_pass'] = $dbPass;
|
|
$_SESSION['app_url'] = $appUrl;
|
|
|
|
// Write .env
|
|
$envWritten = writeEnvFile([
|
|
'app_url' => $appUrl,
|
|
'db_host' => $dbHost,
|
|
'db_port' => (string) $dbPort,
|
|
'db_database' => $dbName,
|
|
'db_username' => $dbUser,
|
|
'db_password' => $dbPass,
|
|
]);
|
|
|
|
if ($envWritten) {
|
|
redirect('setup.php?step=4');
|
|
} else {
|
|
$errors[] = 'Impossibile scrivere il file .env.';
|
|
}
|
|
} else {
|
|
$errors[] = $result['message'];
|
|
}
|
|
}
|
|
} elseif ($action === 'test_existing') {
|
|
// Test existing database connection
|
|
$dbName = $_POST['db_name'] ?? '';
|
|
$dbUser = $_POST['db_user'] ?? '';
|
|
$dbPass = $_POST['db_pass'] ?? '';
|
|
$appUrl = $_POST['app_url'] ?? getBaseUrl();
|
|
|
|
if (empty($dbName) || empty($dbUser)) {
|
|
$errors[] = 'Compila tutti i campi obbligatori.';
|
|
} else {
|
|
$result = testDatabaseConnection($dbHost, $dbPort, $dbName, $dbUser, $dbPass);
|
|
if ($result['success']) {
|
|
$_SESSION['db_host'] = $dbHost;
|
|
$_SESSION['db_port'] = $dbPort;
|
|
$_SESSION['db_name'] = $dbName;
|
|
$_SESSION['db_user'] = $dbUser;
|
|
$_SESSION['db_pass'] = $dbPass;
|
|
$_SESSION['app_url'] = $appUrl;
|
|
|
|
$envWritten = writeEnvFile([
|
|
'app_url' => $appUrl,
|
|
'db_host' => $dbHost,
|
|
'db_port' => (string) $dbPort,
|
|
'db_database' => $dbName,
|
|
'db_username' => $dbUser,
|
|
'db_password' => $dbPass,
|
|
]);
|
|
|
|
if ($envWritten) {
|
|
redirect('setup.php?step=4');
|
|
} else {
|
|
$errors[] = 'Impossibile scrivere il file .env.';
|
|
}
|
|
} else {
|
|
$errors[] = $result['message'];
|
|
}
|
|
}
|
|
} else {
|
|
$errors[] = 'Azione non valida.';
|
|
}
|
|
}
|
|
|
|
renderHeader('Configurazione Database', '3');
|
|
?>
|
|
<h2>Configurazione Database</h2>
|
|
<p>Configura la connessione al database MySQL.</p>
|
|
|
|
<?php renderErrors($errors); ?>
|
|
<?php if ($success): ?>
|
|
<div class="alert alert-success"><i class="icon-ok"></i> <?= e($success) ?></div>
|
|
<?php endif; ?>
|
|
|
|
<form method="POST" id="db-form">
|
|
<div class="form-group">
|
|
<label for="db_host">Host MySQL</label>
|
|
<input type="text" name="db_host" id="db_host" class="form-control" value="<?= old('db_host', '127.0.0.1') ?>" placeholder="127.0.0.1">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="db_port">Porta</label>
|
|
<input type="number" name="db_port" id="db_port" class="form-control" value="<?= old('db_port', '3306') ?>" placeholder="3306">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="app_url">URL Applicazione</label>
|
|
<input type="text" name="app_url" id="app_url" class="form-control" value="<?= old('app_url', getBaseUrl()) ?>" placeholder="https://glastree.esempio.it">
|
|
<small class="form-text text-muted">L'indirizzo pubblico con cui si accedera a Glastree</small>
|
|
</div>
|
|
|
|
<hr>
|
|
<h4>Modalita A: Crea Nuovo Database</h4>
|
|
|
|
<div class="form-group">
|
|
<label for="root_user">Utente Root MySQL</label>
|
|
<input type="text" name="root_user" id="root_user" class="form-control" value="<?= old('root_user', 'root') ?>">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="root_pass">Password Root</label>
|
|
<input type="password" name="root_pass" id="root_pass" class="form-control" value="">
|
|
</div>
|
|
<button type="submit" name="action" value="test_root" class="btn btn-secondary">
|
|
<i class="icon-ok"></i> Test Connessione Root
|
|
</button>
|
|
|
|
<div class="mt-3 p-3 bg-light border rounded">
|
|
<h5>Nuovo Database da Creare</h5>
|
|
<div class="form-group">
|
|
<label for="db_name">Nome Database</label>
|
|
<input type="text" name="db_name" class="form-control" value="<?= old('db_name', 'glastree') ?>" placeholder="glastree">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="db_user">Utente Database</label>
|
|
<input type="text" name="db_user" class="form-control" value="<?= old('db_user', 'glastree') ?>" placeholder="glastree">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="db_pass">Password Utente</label>
|
|
<input type="password" name="db_pass" class="form-control" value="">
|
|
</div>
|
|
<button type="submit" name="action" value="create_db" class="btn btn-primary">
|
|
<i class="icon-rocket"></i> Crea Database e Continua
|
|
</button>
|
|
</div>
|
|
|
|
<hr>
|
|
<h4>Modalita B: Usa Database Esistente</h4>
|
|
|
|
<div class="form-group">
|
|
<label for="db_name_ex">Nome Database</label>
|
|
<input type="text" name="db_name" class="form-control" value="<?= old('db_name', 'glastree') ?>" placeholder="glastree">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="db_user_ex">Utente</label>
|
|
<input type="text" name="db_user" class="form-control" value="<?= old('db_user', 'glastree') ?>" placeholder="glastree">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="db_pass_ex">Password</label>
|
|
<input type="password" name="db_pass" class="form-control" value="">
|
|
</div>
|
|
<button type="submit" name="action" value="test_existing" class="btn btn-primary">
|
|
<i class="icon-ok"></i> Test e Continua
|
|
</button>
|
|
</form>
|
|
|
|
<div class="form-actions mt-3">
|
|
<a href="setup.php?step=2" class="btn btn-secondary">← Indietro</a>
|
|
</div>
|
|
<?php
|
|
renderFooter();
|
|
}
|
|
|
|
// ─── Step 4: Install (Fresh: migrate+seed / Backup: upload+restore) ────────
|
|
|
|
if ($step === 4) {
|
|
$mode = $_SESSION['install_mode'] ?? 'fresh';
|
|
$installDone = $_SESSION['install_done'] ?? false;
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
if ($mode === 'fresh') {
|
|
// Run Artisan commands
|
|
try {
|
|
$kernel = bootstrapLaravel();
|
|
|
|
$commands = [
|
|
'key:generate' => ['--force' => true],
|
|
'migrate' => ['--force' => true],
|
|
'db:seed' => ['--force' => true],
|
|
'storage:link' => [],
|
|
];
|
|
|
|
$results = runArtisanCommands($kernel, $commands);
|
|
$allOk = true;
|
|
$log = [];
|
|
foreach ($results as $r) {
|
|
$log[] = ($r['success'] ? 'OK' : 'ERRORE') . ': ' . $r['command'];
|
|
if (!$r['success']) $allOk = false;
|
|
}
|
|
|
|
if ($allOk) {
|
|
$_SESSION['install_done'] = true;
|
|
$success = 'Installazione completata con successo!';
|
|
$log[] = 'Ora puoi creare l\'amministratore.';
|
|
} else {
|
|
$errors[] = 'Alcuni comandi sono falliti. Verifica i log.';
|
|
foreach ($log as $l) $errors[] = $l;
|
|
}
|
|
} catch (\Exception $e) {
|
|
$errors[] = 'Errore: ' . $e->getMessage();
|
|
}
|
|
} elseif ($mode === 'backup') {
|
|
// Handle backup upload
|
|
if (!empty($_FILES['backup_file']) && $_FILES['backup_file']['error'] === UPLOAD_ERR_OK) {
|
|
$uploadedFile = $_FILES['backup_file']['tmp_name'];
|
|
$originalName = $_FILES['backup_file']['name'];
|
|
|
|
$result = restoreFromBackup(
|
|
$uploadedFile,
|
|
$_SESSION['db_user'] ?? '',
|
|
$_SESSION['db_pass'] ?? '',
|
|
$_SESSION['db_name'] ?? ''
|
|
);
|
|
|
|
if ($result['success']) {
|
|
$_SESSION['install_done'] = true;
|
|
$success = 'Backup ripristinato con successo!';
|
|
$log = $result['log'] ?? [];
|
|
} else {
|
|
$errors[] = $result['message'];
|
|
if (!empty($result['log'])) {
|
|
foreach ($result['log'] as $l) $errors[] = $l;
|
|
}
|
|
}
|
|
} elseif (!empty($_POST['backup_path'])) {
|
|
// Backup file already on server
|
|
$serverPath = $_POST['backup_path'];
|
|
|
|
if (!file_exists($serverPath)) {
|
|
$errors[] = 'File non trovato: ' . $serverPath;
|
|
} else {
|
|
$result = restoreFromBackup(
|
|
$serverPath,
|
|
$_SESSION['db_user'] ?? '',
|
|
$_SESSION['db_pass'] ?? '',
|
|
$_SESSION['db_name'] ?? ''
|
|
);
|
|
|
|
if ($result['success']) {
|
|
$_SESSION['install_done'] = true;
|
|
$success = 'Backup ripristinato con successo!';
|
|
} else {
|
|
$errors[] = $result['message'];
|
|
}
|
|
}
|
|
} else {
|
|
$errors[] = 'Seleziona un file di backup o fornisci il percorso.';
|
|
}
|
|
}
|
|
}
|
|
|
|
renderHeader($mode === 'fresh' ? 'Installazione' : 'Ripristino Backup', '4');
|
|
?>
|
|
<h2><?= $mode === 'fresh' ? 'Installazione Database' : 'Ripristino Backup' ?></h2>
|
|
|
|
<?php renderErrors($errors); ?>
|
|
<?php if ($success): ?>
|
|
<div class="alert alert-success"><i class="icon-ok"></i> <?= e($success) ?></div>
|
|
<?php if (!empty($log)): ?>
|
|
<div class="log-list">
|
|
<?php foreach ($log as $l): ?>
|
|
<div class="log-item"><?= e($l) ?></div>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
<?php endif; ?>
|
|
<?php endif; ?>
|
|
|
|
<?php if ($installDone): ?>
|
|
<div class="alert alert-info">
|
|
<i class="icon-ok"></i> Installazione completata. Procedi al passo successivo.
|
|
</div>
|
|
<div class="form-actions">
|
|
<a href="setup.php?step=5" class="btn btn-primary">Avanti →</a>
|
|
</div>
|
|
<?php else: ?>
|
|
|
|
<?php if ($mode === 'fresh'): ?>
|
|
<form method="POST">
|
|
<p>Clicca "Installa" per eseguire migration, seed e generare la chiave dell'applicazione.</p>
|
|
<div class="form-actions">
|
|
<a href="setup.php?step=3" class="btn btn-secondary">← Indietro</a>
|
|
<button type="submit" class="btn btn-primary"><i class="icon-rocket"></i> Installa</button>
|
|
</div>
|
|
</form>
|
|
<?php else: ?>
|
|
<form method="POST" enctype="multipart/form-data">
|
|
<div class="form-group">
|
|
<label for="backup_file">Carica file ZIP di backup</label>
|
|
<input type="file" name="backup_file" id="backup_file" class="form-control" accept=".zip">
|
|
</div>
|
|
<hr>
|
|
<p class="text-muted">oppure specifica il percorso sul server:</p>
|
|
<div class="form-group">
|
|
<label for="backup_path">Percorso server del file ZIP</label>
|
|
<input type="text" name="backup_path" id="backup_path" class="form-control" placeholder="/tmp/backup.zip">
|
|
</div>
|
|
<div class="form-actions">
|
|
<a href="setup.php?step=3" class="btn btn-secondary">← Indietro</a>
|
|
<button type="submit" class="btn btn-primary"><i class="icon-upload"></i> Ripristina Backup</button>
|
|
</div>
|
|
</form>
|
|
<?php endif; ?>
|
|
<?php endif; ?>
|
|
<?php
|
|
renderFooter();
|
|
}
|
|
|
|
// ─── Step 5: Admin User Creation ────────────────────────────────────────────
|
|
|
|
if ($step === 5) {
|
|
$mode = $_SESSION['install_mode'] ?? 'fresh';
|
|
$adminCreated = false;
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
if ($mode === 'fresh') {
|
|
$name = trim($_POST['name'] ?? '');
|
|
$email = trim($_POST['email'] ?? '');
|
|
$password = $_POST['password'] ?? '';
|
|
$passwordConfirm = $_POST['password_confirm'] ?? '';
|
|
|
|
if (empty($name)) $errors[] = 'Il nome e obbligatorio.';
|
|
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) $errors[] = 'Email non valida.';
|
|
if (strlen($password) < 8) $errors[] = 'La password deve essere almeno 8 caratteri.';
|
|
if ($password !== $passwordConfirm) $errors[] = 'Le password non coincidono.';
|
|
|
|
if (empty($errors)) {
|
|
$result = createSuperAdmin($name, $email, $password);
|
|
if ($result['success']) {
|
|
$adminCreated = true;
|
|
$_SESSION['admin_created'] = true;
|
|
} else {
|
|
$errors[] = $result['message'];
|
|
}
|
|
}
|
|
} else {
|
|
// Backup mode: skip or create additional admin
|
|
if (!empty($_POST['name']) && !empty($_POST['email']) && !empty($_POST['password'])) {
|
|
$result = createSuperAdmin($_POST['name'], $_POST['email'], $_POST['password']);
|
|
if ($result['success']) {
|
|
$adminCreated = true;
|
|
} else {
|
|
$errors[] = $result['message'];
|
|
}
|
|
} else {
|
|
$_SESSION['admin_created'] = true;
|
|
$adminCreated = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Check existing users (backup mode)
|
|
$existingUsers = [];
|
|
if ($mode === 'backup' && file_exists(dirname(__DIR__) . '/.env')) {
|
|
try {
|
|
$existingUsers = getExistingUsers();
|
|
} catch (\Exception $e) {
|
|
// Ignore
|
|
}
|
|
}
|
|
|
|
renderHeader('Amministratore', '5');
|
|
?>
|
|
<h2><?= $mode === 'fresh' ? 'Crea Amministratore' : 'Verifica Utenti' ?></h2>
|
|
|
|
<?php renderErrors($errors); ?>
|
|
<?php if ($success): ?>
|
|
<div class="alert alert-success"><?= e($success) ?></div>
|
|
<?php endif; ?>
|
|
|
|
<?php if ($adminCreated || !empty($_SESSION['admin_created'])): ?>
|
|
<div class="alert alert-success">
|
|
<i class="icon-ok"></i>
|
|
<?php if ($mode === 'fresh'): ?>
|
|
Amministratore creato con successo!
|
|
<?php else: ?>
|
|
Utenti configurati.
|
|
<?php endif; ?>
|
|
</div>
|
|
<div class="form-actions">
|
|
<a href="setup.php?step=6" class="btn btn-primary">Avanti →</a>
|
|
</div>
|
|
<?php else: ?>
|
|
|
|
<?php if (!empty($existingUsers)): ?>
|
|
<div class="alert alert-info">
|
|
<strong>Utenti trovati nel database ripristinato:</strong>
|
|
<ul>
|
|
<?php foreach ($existingUsers as $u): ?>
|
|
<li><?= e($u['name']) ?> <<?= e($u['email']) ?>>
|
|
<?= $u['is_admin'] ? '<span class="badge badge-admin">Superadmin</span>' : '' ?>
|
|
</li>
|
|
<?php endforeach; ?>
|
|
</ul>
|
|
<p>Puoi proseguire senza creare nuovi utenti.</p>
|
|
</div>
|
|
<form method="POST" class="mt-3">
|
|
<button type="submit" class="btn btn-secondary">Salta (usa utenti esistenti)</button>
|
|
</form>
|
|
<hr>
|
|
<p class="text-muted">oppure crea un nuovo amministratore:</p>
|
|
<?php endif; ?>
|
|
|
|
<form method="POST">
|
|
<div class="form-group">
|
|
<label for="name">Nome Amministratore</label>
|
|
<input type="text" name="name" id="name" class="form-control" value="<?= old('name', 'Amministratore') ?>" required>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="email">Email</label>
|
|
<input type="email" name="email" id="email" class="form-control" value="<?= old('email', 'admin@glastree.local') ?>" required>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="password">Password (min. 8 caratteri)</label>
|
|
<input type="password" name="password" id="password" class="form-control" required minlength="8">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="password_confirm">Conferma Password</label>
|
|
<input type="password" name="password_confirm" id="password_confirm" class="form-control" required minlength="8">
|
|
</div>
|
|
<div class="form-actions">
|
|
<a href="setup.php?step=4" class="btn btn-secondary">← Indietro</a>
|
|
<button type="submit" class="btn btn-primary"><i class="icon-ok"></i> Crea Amministratore</button>
|
|
</div>
|
|
</form>
|
|
<?php endif; ?>
|
|
<?php
|
|
renderFooter();
|
|
}
|
|
|
|
// ─── Step 6: Finalize ───────────────────────────────────────────────────────
|
|
|
|
if ($step === 6) {
|
|
$finalized = false;
|
|
$results = [];
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
try {
|
|
if (!file_exists(dirname(__DIR__) . '/.env')) {
|
|
$errors[] = 'File .env non trovato. Qualcosa e andato storto.';
|
|
} else {
|
|
$kernel = bootstrapLaravel();
|
|
$commands = [
|
|
'config:cache' => [],
|
|
'route:cache' => [],
|
|
'view:cache' => [],
|
|
];
|
|
|
|
$results = runArtisanCommands($kernel, $commands);
|
|
$allOk = true;
|
|
foreach ($results as $r) {
|
|
if (!$r['success']) $allOk = false;
|
|
}
|
|
|
|
if ($allOk) {
|
|
// Self-destruct
|
|
selfDestruct();
|
|
$finalized = true;
|
|
} else {
|
|
$errors[] = 'Alcune operazioni sono fallite.';
|
|
}
|
|
}
|
|
} catch (\Exception $e) {
|
|
$errors[] = 'Errore: ' . $e->getMessage();
|
|
}
|
|
}
|
|
|
|
if (!$finalized && empty($errors)) {
|
|
// Initial display
|
|
renderHeader('Finalizzazione', '6');
|
|
?>
|
|
<h2>Finalizzazione</h2>
|
|
<p>Completa l'installazione generando la cache e rimuovendo i file di setup.</p>
|
|
|
|
<?php renderErrors($errors); ?>
|
|
|
|
<form method="POST">
|
|
<div class="form-actions">
|
|
<a href="setup.php?step=5" class="btn btn-secondary">← Indietro</a>
|
|
<button type="submit" class="btn btn-primary"><i class="icon-ok"></i> Completa Installazione</button>
|
|
</div>
|
|
</form>
|
|
<?php
|
|
renderFooter();
|
|
} else {
|
|
// Show results
|
|
renderHeader('Installazione Completata', '6');
|
|
?>
|
|
<h2>Installazione Completata!</h2>
|
|
|
|
<?php renderErrors($errors); ?>
|
|
|
|
<?php if (!empty($results)): ?>
|
|
<div class="results-list">
|
|
<?php foreach ($results as $r): ?>
|
|
<div class="result-item <?= $r['success'] ? 'success' : 'error' ?>">
|
|
<span class="result-icon"><?= $r['success'] ? '<i class="icon-ok"></i>' : '<i class="icon-error"></i>' ?></span>
|
|
<span class="result-name"><?= e($r['command']) ?></span>
|
|
</div>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
<?php endif; ?>
|
|
|
|
<?php if ($finalized): ?>
|
|
<div class="alert alert-success">
|
|
<i class="icon-ok"></i>
|
|
<strong>Glastree e stato installato con successo!</strong>
|
|
<p class="mb-0 mt-2">La cartella <code>installer/</code> e stata eliminata per sicurezza.</p>
|
|
</div>
|
|
|
|
<div class="final-box">
|
|
<h3>Prossimi passi:</h3>
|
|
<ol>
|
|
<li><strong>Configura SSL</strong> con Let's Encrypt per connessioni sicure</li>
|
|
<li>Accedi con le credenziali amministratore</li>
|
|
<li>Vai su <strong>Impostazioni</strong> per configurare:
|
|
<ul>
|
|
<li>Nome applicazione e logo</li>
|
|
<li>Email (SMTP e IMAP)</li>
|
|
<li>Repository remoti (Google Drive, Nextcloud)</li>
|
|
</ul>
|
|
</li>
|
|
<li>Vai su <strong>Admin</strong> per creare altri utenti</li>
|
|
<li>Configura il cron per backup automatico:
|
|
<code class="d-block mt-2 p-2 bg-light">* * * * * cd <?= e(dirname(__DIR__)) ?> && php artisan schedule:run >> /dev/null 2>&1</code>
|
|
</li>
|
|
</ol>
|
|
</div>
|
|
|
|
<div class="form-actions">
|
|
<a href="<?= e(getBaseUrl()) ?>/login" class="btn btn-primary btn-lg">
|
|
<i class="icon-ok"></i> Vai al Login →
|
|
</a>
|
|
</div>
|
|
<?php endif; ?>
|
|
<?php
|
|
renderFooter();
|
|
}
|
|
}
|