Update mode

This commit is contained in:
Sergio Brighenti 2018-11-13 13:43:06 +01:00
parent d6a9fcf600
commit 945790bedd
2 changed files with 120 additions and 84 deletions

View file

@ -48,27 +48,8 @@ $container['view'] = function ($container) use (&$config) {
return $view;
};
$app = new App($container);
$app->get('/', function (Request $request, Response $response) {
return $this->view->render($response, 'install.twig');
});
$app->post('/', function (Request $request, Response $response) use (&$config) {
$config['base_url'] = $request->getParam('base_url');
$config['storage_dir'] = $request->getParam('storage_dir');
$config['displayErrorDetails'] = false;
$config['db']['connection'] = $request->getParam('connection');
$config['db']['dsn'] = $request->getParam('dsn');
$config['db']['username'] = $request->getParam('db_user');
$config['db']['password'] = $request->getParam('db_password');
file_put_contents(__DIR__ . '/../config.php', '<?php' . PHP_EOL . 'return ' . var_export($config, true) . ';');
DB::setDsn($config['db']['connection'] . ':' . __DIR__ . '/../' . $config['db']['dsn'], $config['db']['username'], $config['db']['password']);
function migrate($config)
{
$firstMigrate = false;
if (!file_exists(__DIR__ . '/../' . $config['db']['dsn']) && DB::driver() === 'sqlite') {
touch(__DIR__ . '/../' . $config['db']['dsn']);
@ -105,7 +86,7 @@ $app->post('/', function (Request $request, Response $response) use (&$config) {
if (basename($file) === $migration->name && $migration->migrated) {
$continue = true;
break;
} elseif (basename($file) === $migration->name && !$migration->migrated) {
} else if (basename($file) === $migration->name && !$migration->migrated) {
$exists = true;
break;
}
@ -127,9 +108,51 @@ $app->post('/', function (Request $request, Response $response) use (&$config) {
throw $exception;
}
}
}
function cleanDir($path)
{
$directoryIterator = new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS);
$iteratorIterator = new RecursiveIteratorIterator($directoryIterator, RecursiveIteratorIterator::CHILD_FIRST);
foreach ($iteratorIterator as $file) {
if ($file->getFilename() !== '.gitkeep') {
$file->isDir() ? rmdir($file) : unlink($file);
}
}
}
$app = new App($container);
$app->get('/', function (Request $request, Response $response) {
$installed = file_exists(__DIR__ . '/../config.php');
return $this->view->render($response, 'install.twig', ['installed' => $installed]);
});
$app->post('/', function (Request $request, Response $response) use (&$config) {
if (!file_exists(__DIR__ . '/../config.php')) {
$config['base_url'] = $request->getParam('base_url');
$config['storage_dir'] = $request->getParam('storage_dir');
$config['displayErrorDetails'] = false;
$config['db']['connection'] = $request->getParam('connection');
$config['db']['dsn'] = $request->getParam('dsn');
$config['db']['username'] = $request->getParam('db_user');
$config['db']['password'] = $request->getParam('db_password');
file_put_contents(__DIR__ . '/../config.php', '<?php' . PHP_EOL . 'return ' . var_export($config, true) . ';');
}
DB::setDsn($config['db']['connection'] . ':' . __DIR__ . '/../' . $config['db']['dsn'], $config['db']['username'], $config['db']['password']);
migrate($config);
DB::query("INSERT INTO `users` (`email`, `username`, `password`, `is_admin`, `user_code`) VALUES (?, 'admin', ?, 1, ?)", [$request->getParam('email'), password_hash($request->getParam('password'), PASSWORD_DEFAULT), substr(md5(microtime()), rand(0, 26), 5)]);
cleanDir(__DIR__ . '/../resources/cache');
cleanDir(__DIR__ . '/../resources/sessions');
return $response->withRedirect('../?afterInstall=true');
});

View file

@ -47,80 +47,93 @@
<div class="card-header">Install XBackBone</div>
<div class="card-body">
<form method="post" action="">
{% if not installed %}
<div class="form-group row">
<label for="base_url" class="col-sm-3 col-form-label">Base URL</label>
<div class="col-sm-9">
<input type="text" class="form-control" id="base_url" name="base_url"
value="{{ config.base_url }}" autocomplete="off" required>
</div>
</div>
<hr>
<div class="form-group row">
<label for="connection" class="col-sm-3 col-form-label">SQL Engine</label>
<div class="col-sm-9">
<select name="connection" id="connection" required class="form-control">
<option value="sqlite" selected>SQLite</option>
<option value="mysql">MySQL</option>
</select>
</div>
</div>
<div class="form-group row">
<label for="base_url" class="col-sm-3 col-form-label">Base URL</label>
<div class="col-sm-9">
<input type="text" class="form-control" id="base_url" name="base_url"
value="{{ config.base_url }}" autocomplete="off" required>
<div class="form-group row">
<label for="dsn" class="col-sm-3 col-form-label">Database Source Name (DSN)</label>
<div class="col-sm-9">
<input type="text" class="form-control" id="dsn" name="dsn"
value="{{ config.db.dsn }}"
autocomplete="off" required>
</div>
</div>
</div>
<hr>
<div class="form-group row">
<label for="connection" class="col-sm-3 col-form-label">SQL Engine</label>
<div class="col-sm-9">
<select name="connection" id="connection" required class="form-control">
<option value="sqlite" selected>SQLite</option>
<option value="mysql">MySQL</option>
</select>
</div>
</div>
<div class="form-group row">
<label for="dsn" class="col-sm-3 col-form-label">Database Source Name (DSN)</label>
<div class="col-sm-9">
<input type="text" class="form-control" id="dsn" name="dsn" value="{{ config.db.dsn }}"
autocomplete="off" required>
<div class="form-group row">
<label for="db_user" class="col-sm-3 col-form-label">Database Username</label>
<div class="col-sm-9">
<input type="text" class="form-control" id="db_user" name="db_user"
autocomplete="off"
disabled>
</div>
</div>
</div>
<div class="form-group row">
<label for="db_user" class="col-sm-3 col-form-label">Database Username</label>
<div class="col-sm-9">
<input type="text" class="form-control" id="db_user" name="db_user" autocomplete="off" disabled>
<div class="form-group row">
<label for="db_password" class="col-sm-3 col-form-label">Database Password</label>
<div class="col-sm-9">
<input type="password" class="form-control" id="db_password" name="db_password"
autocomplete="off" disabled>
</div>
</div>
<hr>
<div class="form-group row">
<label for="storage_dir" class="col-sm-3 col-form-label">Storage Directory</label>
<div class="col-sm-9">
<input type="text" class="form-control" id="storage_dir" name="storage_dir"
value="{{ config.storage_dir }}" autocomplete="off" required>
<small>Must be a writable directory</small>
</div>
</div>
<hr>
<div class="form-group row">
<label for="email" class="col-sm-3 col-form-label">Admin email</label>
<div class="col-sm-9">
<input type="email" class="form-control" id="email" placeholder="email@example.com"
name="email" autocomplete="off" required>
</div>
</div>
</div>
<div class="form-group row">
<label for="db_password" class="col-sm-3 col-form-label">Database Password</label>
<div class="col-sm-9">
<input type="password" class="form-control" id="db_password" name="db_password"
autocomplete="off" disabled>
<div class="form-group row">
<label for="password" class="col-sm-3 col-form-label">Admin password</label>
<div class="col-sm-9">
<input type="password" class="form-control" id="password" placeholder="Password"
name="password" autocomplete="off" required>
</div>
</div>
</div>
<hr>
<div class="form-group row">
<label for="storage_dir" class="col-sm-3 col-form-label">Storage Directory</label>
<div class="col-sm-9">
<input type="text" class="form-control" id="storage_dir" name="storage_dir"
value="{{ config.storage_dir }}" autocomplete="off" required>
<small>Must be a writable directory</small>
</div>
</div>
<hr>
<div class="form-group row">
<label for="email" class="col-sm-3 col-form-label">Admin email</label>
<div class="col-sm-9">
<input type="email" class="form-control" id="email" placeholder="email@example.com"
name="email" autocomplete="off" required>
</div>
</div>
<div class="form-group row">
<label for="password" class="col-sm-3 col-form-label">Admin password</label>
<div class="col-sm-9">
<input type="password" class="form-control" id="password" placeholder="Password"
name="password" autocomplete="off" required>
<div class="form-group row justify-content-md-end">
<div class="col-sm-9">
<button type="submit" class="btn btn-outline-success">
<i class="fas fa-save fa-fw"></i> Configure & Install
</button>
</div>
</div>
</div>
<div class="form-group row justify-content-md-end">
<div class="col-sm-9">
<button type="submit" class="btn btn-outline-success">
<i class="fas fa-save fa-fw"></i> Configure & Install
</button>
{% else %}
<div class="form-group row">
<div class="col-sm-12 d-flex justify-content-center">
<button type="submit" class="btn btn-lg btn-outline-primary">
<i class="fas fa-sync fa-fw"></i> Update database
</button>
</div>
</div>
</div>
{% endif %}
</form>
</div>
</div>