move install into his own folder and split code into class
(cherry picked from commit 1a5846a156
)
This commit is contained in:
parent
b459eeb61e
commit
059f4c2fc7
187
install.php
187
install.php
@ -1,187 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
$configuration_file = __DIR__.'/app/inc/constants.php';
|
|
||||||
|
|
||||||
if (file_exists($configuration_file) === true) {
|
|
||||||
header('Location: index.php');
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($_POST['install']) === true) {
|
|
||||||
ini_set('max_execution_time', 0);
|
|
||||||
ob_start();
|
|
||||||
|
|
||||||
// Composer exist ?
|
|
||||||
$locations = array(
|
|
||||||
__DIR__.'/composer.phar',
|
|
||||||
//'/usr/bin/composer',
|
|
||||||
'/usr/bin/composer.phar',
|
|
||||||
//'/usr/local/bin/composer',
|
|
||||||
'/usr/local/bin/composer.phar',
|
|
||||||
);
|
|
||||||
$composer = null;
|
|
||||||
foreach ($locations as $location) {
|
|
||||||
if (file_exists($location) === true) {
|
|
||||||
$composer = $location;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If composer not found, download it !
|
|
||||||
if (null === $composer) {
|
|
||||||
if (!file_put_contents(__DIR__.'/composer.phar', file_get_contents('https://getcomposer.org/composer.phar'))) {
|
|
||||||
die('Installation impossible : impossible to find composer !');
|
|
||||||
}
|
|
||||||
$composer = __DIR__.'/composer.phar';
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
echo "Utilisation de ".$composer.'<br />';
|
|
||||||
ob_flush();
|
|
||||||
flush();
|
|
||||||
|
|
||||||
require_once 'phar://'.$composer.'/src/bootstrap.php';
|
|
||||||
ob_flush();
|
|
||||||
flush();
|
|
||||||
|
|
||||||
$composer_home = getenv('COMPOSER_HOME');
|
|
||||||
$personal_home = getenv('HOME');
|
|
||||||
if (empty($composer_home) === true && empty($personal_home) === true) {
|
|
||||||
putenv('COMPOSER_HOME='.sys_get_temp_dir());
|
|
||||||
}
|
|
||||||
|
|
||||||
$application = new \Composer\Console\Application();
|
|
||||||
$application->setAutoExit(false);
|
|
||||||
$command = $application->find('install');
|
|
||||||
$input = new \Symfony\Component\Console\Input\ArrayInput(array(
|
|
||||||
'command' => 'install',
|
|
||||||
'-d' => __DIR__,
|
|
||||||
'-vvv',
|
|
||||||
'--optimize-autoloader',
|
|
||||||
));
|
|
||||||
$fhandle = fopen('php://output', 'wb');
|
|
||||||
$output = new \Symfony\Component\Console\Output\StreamOutput($fhandle);
|
|
||||||
|
|
||||||
$application->run($input, $output);
|
|
||||||
fclose($fhandle);
|
|
||||||
ob_flush();
|
|
||||||
flush();
|
|
||||||
|
|
||||||
// Save configuration
|
|
||||||
$configuration = file_get_contents($configuration_file.'.template');
|
|
||||||
if (false === $configuration) {
|
|
||||||
throw new \Exception('Impossible to read template configuration');
|
|
||||||
}
|
|
||||||
|
|
||||||
$configuration = str_replace(
|
|
||||||
array(
|
|
||||||
'\'<Application name>\'',
|
|
||||||
'\'<email address>\'',
|
|
||||||
'\'<no-reply@mydomain.com>\'',
|
|
||||||
'\'<database name>\'',
|
|
||||||
'\'<database user>\'',
|
|
||||||
'\'<database password>\'',
|
|
||||||
'\'<database server>\'',
|
|
||||||
'\'<database type>\'',
|
|
||||||
),
|
|
||||||
array(
|
|
||||||
var_export($_POST['title'], true),
|
|
||||||
var_export($_POST['email'], true),
|
|
||||||
var_export($_POST['no-reply-email'], true),
|
|
||||||
var_export($_POST['db-name'], true),
|
|
||||||
var_export($_POST['db-user'], true),
|
|
||||||
var_export($_POST['db-pass'], true),
|
|
||||||
var_export($_POST['db-host'], true),
|
|
||||||
var_export($_POST['db-type'], true),
|
|
||||||
),
|
|
||||||
$configuration
|
|
||||||
);
|
|
||||||
|
|
||||||
if (file_put_contents($configuration_file, $configuration) === false) {
|
|
||||||
throw new \Exception('Impossible to save configuration');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Inject database
|
|
||||||
require_once __DIR__.'/app/inc/init.php';
|
|
||||||
|
|
||||||
$sqls = explode("\n", file_get_contents(__DIR__.'/install.mysql.auto.sql'));
|
|
||||||
foreach ($sqls as $sql) {
|
|
||||||
$sql = trim($sql);
|
|
||||||
if (empty($sql) === true) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$query = $connect->Prepare($sql);
|
|
||||||
$cleaning = $connect->Execute($query);
|
|
||||||
}
|
|
||||||
|
|
||||||
ob_flush();
|
|
||||||
flush();
|
|
||||||
ob_end_clean();
|
|
||||||
} catch (Exception $e) {
|
|
||||||
echo '<br /><b>'.$e->getMessage().'</b><br />';
|
|
||||||
echo "<pre>".$e->getTraceAsString()."</pre>";
|
|
||||||
die('installation failed');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
?><!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<title>OpenSondage Installation</title>
|
|
||||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="container">
|
|
||||||
<h1>OpenSondage Installation</h1>
|
|
||||||
<form action="" method="post" role="form">
|
|
||||||
<fieldset>
|
|
||||||
<legend>General</legend>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="title">Title</label>
|
|
||||||
<input type="text" class="form-control" id="title" name="title" placeholder="Application name" required>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="email">Administrator email</label>
|
|
||||||
<input type="email" class="form-control" id="email" name="email" placeholder="Email of the administrator" required>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="no-reply-email">No-reply email</label>
|
|
||||||
<input type="email" class="form-control" id="no-reply-email" name="no-reply-email" placeholder="Email for automatic responses" required>
|
|
||||||
</div>
|
|
||||||
</fieldset>
|
|
||||||
<fieldset>
|
|
||||||
<legend>Database</legend>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="db-type">Type</label>
|
|
||||||
<select name="db-type" id="db-type" required>
|
|
||||||
<option value="pdo">PDO - MySQL</option>
|
|
||||||
<option value="mysql">MySQL</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="db-host">Host</label>
|
|
||||||
<input type="text" class="form-control" id="db-host" name="db-host" value="localhost" required>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="db-name">Database name</label>
|
|
||||||
<input type="text" class="form-control" id="db-name" name="db-name" value="opensondage" required>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="db-user">Username</label>
|
|
||||||
<input type="text" class="form-control" id="db-user" name="db-user" value="root" required>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="db-pass">Password</label>
|
|
||||||
<input type="password" class="form-control" id="db-pass" name="db-pass" value="">
|
|
||||||
</div>
|
|
||||||
</fieldset>
|
|
||||||
|
|
||||||
<input type="submit" class="btn btn-default" name="install" value="Install">
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|
90
install/InstallComposer.php
Normal file
90
install/InstallComposer.php
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class InstallComposer
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $composer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function check()
|
||||||
|
{
|
||||||
|
return file_exists(dirname(__DIR__).'/vendor/autoload.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function install()
|
||||||
|
{
|
||||||
|
require_once 'phar://'.$this->getComposer().'/src/bootstrap.php';
|
||||||
|
|
||||||
|
$this->initEnv();
|
||||||
|
|
||||||
|
$application = new \Composer\Console\Application();
|
||||||
|
$application->setAutoExit(false);
|
||||||
|
|
||||||
|
$input = new \Symfony\Component\Console\Input\ArrayInput(array(
|
||||||
|
'command' => 'install',
|
||||||
|
'-d' => __DIR__.'/..',
|
||||||
|
'-vvv',
|
||||||
|
'--optimize-autoloader',
|
||||||
|
));
|
||||||
|
$output = new \Symfony\Component\Console\Output\NullOutput();
|
||||||
|
|
||||||
|
$application->run($input, $output);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private function getComposer()
|
||||||
|
{
|
||||||
|
if (null === $this->composer) {
|
||||||
|
$this->initComposer();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->composer;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function initComposer()
|
||||||
|
{
|
||||||
|
// Composer exist ?
|
||||||
|
$locations = array(
|
||||||
|
__DIR__.'/../composer.phar',
|
||||||
|
'/usr/bin/composer.phar',
|
||||||
|
'/usr/local/bin/composer.phar',
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->composer = null;
|
||||||
|
foreach ($locations as $location) {
|
||||||
|
if (file_exists($location) === true) {
|
||||||
|
$this->composer = $location;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If composer not found, download it !
|
||||||
|
if (null === $this->composer) {
|
||||||
|
if (!file_put_contents(
|
||||||
|
__DIR__.'/../composer.phar',
|
||||||
|
file_get_contents('https://getcomposer.org/composer.phar')
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
throw new \Exception('Impossible to download composer');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->composer = __DIR__.'/../composer.phar';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function initEnv()
|
||||||
|
{
|
||||||
|
$composer_home = getenv('COMPOSER_HOME');
|
||||||
|
$personal_home = getenv('HOME');
|
||||||
|
if (empty($composer_home) === true && empty($personal_home) === true) {
|
||||||
|
putenv('COMPOSER_HOME='.sys_get_temp_dir());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
73
install/InstallConfiguration.php
Normal file
73
install/InstallConfiguration.php
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class InstallConfiguration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
private $datas;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
private $checks = array(
|
||||||
|
'title' => 'Application name',
|
||||||
|
'email' => 'email address',
|
||||||
|
'no-reply-email' => 'no-reply@mydomain.com',
|
||||||
|
'db-name' => 'database name',
|
||||||
|
'db-user' => 'database user',
|
||||||
|
'db-pass' => 'database password',
|
||||||
|
'db-host' => 'database server',
|
||||||
|
'db-type' => 'database type',
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $datas
|
||||||
|
*/
|
||||||
|
public function __construct(array $datas)
|
||||||
|
{
|
||||||
|
$this->datas = $datas;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function checkValues()
|
||||||
|
{
|
||||||
|
foreach (array_keys($this->checks) as $key) {
|
||||||
|
if (isset($this->datas[$key]) === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function copy($template, $destination)
|
||||||
|
{
|
||||||
|
$configuration = file_get_contents($template);
|
||||||
|
if (false === $configuration) {
|
||||||
|
throw new \Exception('Impossible to read template configuration');
|
||||||
|
}
|
||||||
|
|
||||||
|
$configuration = $this->convertConfigurationFile($configuration);
|
||||||
|
|
||||||
|
if (file_put_contents($destination, $configuration) === false) {
|
||||||
|
throw new \Exception('Impossible to save configuration');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function convertConfigurationFile($content)
|
||||||
|
{
|
||||||
|
foreach ($this->checks as $replace => $search) {
|
||||||
|
$content = str_replace(
|
||||||
|
'\'<'.$search.'>\'',
|
||||||
|
var_export($this->datas[$replace], true),
|
||||||
|
$content
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $content;
|
||||||
|
}
|
||||||
|
}
|
24
install/InstallSql.php
Normal file
24
install/InstallSql.php
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class InstallSql
|
||||||
|
{
|
||||||
|
public function inject()
|
||||||
|
{
|
||||||
|
require_once __DIR__.'/../app/inc/init.php';
|
||||||
|
|
||||||
|
if ($connect->ErrorMsg() !== '') {
|
||||||
|
throw new \Exception('Bad database configuration : '.$connect->ErrorMsg());
|
||||||
|
}
|
||||||
|
|
||||||
|
$sqls = explode("\n", file_get_contents(__DIR__.'/install.mysql.auto.sql'));
|
||||||
|
foreach ($sqls as $sql) {
|
||||||
|
$sql = trim($sql);
|
||||||
|
if (empty($sql) === true) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$query = $connect->Prepare($sql);
|
||||||
|
$cleaning = $connect->Execute($query);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
33
install/error.html
Normal file
33
install/error.html
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<title>OpenSondage Installation</title>
|
||||||
|
<link rel="stylesheet" href="../css/bootstrap.min.css">
|
||||||
|
<link rel="stylesheet" href="../css/style.css">
|
||||||
|
<link rel="stylesheet" href="../css/frama.css">
|
||||||
|
<link rel="stylesheet" href="install.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container ombre">
|
||||||
|
<header role="banner">
|
||||||
|
<h1>
|
||||||
|
<img src="../images/logo-framadate.png" width="360" height="50" alt="OpenSondage" />
|
||||||
|
</h1>
|
||||||
|
<h2>Make your polls</h2>
|
||||||
|
<hr class="trait" role="presentation">
|
||||||
|
</header>
|
||||||
|
<main role="main">
|
||||||
|
<h3>OpenSondage Installation</h3>
|
||||||
|
<div class="alert alert-danger" role="alert">
|
||||||
|
<?php echo htmlspecialchars($e->getMessage(), ENT_COMPAT | ENT_HTML401, 'UTF-8') ?>
|
||||||
|
</div>
|
||||||
|
<div class="alert alert-info" role="alert">
|
||||||
|
<pre>
|
||||||
|
<?php echo htmlspecialchars($e->getTraceAsString(), ENT_COMPAT | ENT_HTML401, 'UTF-8') ?>
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
11
install/install.css
Normal file
11
install/install.css
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
header {
|
||||||
|
padding-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
main {
|
||||||
|
padding-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
fieldset {
|
||||||
|
margin: 1.5em 0;
|
||||||
|
}
|
72
install/install.html
Normal file
72
install/install.html
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<title>OpenSondage Installation</title>
|
||||||
|
<link rel="stylesheet" href="../css/bootstrap.min.css">
|
||||||
|
<link rel="stylesheet" href="../css/style.css">
|
||||||
|
<link rel="stylesheet" href="../css/frama.css">
|
||||||
|
<link rel="stylesheet" href="install.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container ombre">
|
||||||
|
<header role="banner">
|
||||||
|
<h1>
|
||||||
|
<img src="../images/logo-framadate.png" width="360" height="50" alt="OpenSondage" />
|
||||||
|
</h1>
|
||||||
|
<h2>Make your polls</h2>
|
||||||
|
<hr class="trait" role="presentation">
|
||||||
|
</header>
|
||||||
|
<main role="main">
|
||||||
|
<h3>OpenSondage Installation</h3>
|
||||||
|
<form action="" method="post" role="form">
|
||||||
|
<fieldset>
|
||||||
|
<legend>General</legend>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="title">Title</label>
|
||||||
|
<input type="text" class="form-control" id="title" name="title" placeholder="Application name" required>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="email">Administrator email</label>
|
||||||
|
<input type="email" class="form-control" id="email" name="email" placeholder="Email of the administrator" required>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="no-reply-email">No-reply email</label>
|
||||||
|
<input type="email" class="form-control" id="no-reply-email" name="no-reply-email" placeholder="Email for automatic responses" required>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
<fieldset>
|
||||||
|
<legend>Database</legend>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="db-type">Type</label>
|
||||||
|
<select name="db-type" id="db-type" required>
|
||||||
|
<option value="pdo">PDO - MySQL (recommanded)</option>
|
||||||
|
<option value="mysql">MySQL</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="db-host">Host</label>
|
||||||
|
<input type="text" class="form-control" id="db-host" name="db-host" value="localhost" required>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="db-name">Database name</label>
|
||||||
|
<input type="text" class="form-control" id="db-name" name="db-name" value="opensondage" required>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="db-user">Username</label>
|
||||||
|
<input type="text" class="form-control" id="db-user" name="db-user" value="root" required>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="db-pass">Password</label>
|
||||||
|
<input type="password" class="form-control" id="db-pass" name="db-pass" value="">
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
|
||||||
|
<input type="submit" class="btn btn-success" name="install" value="Install">
|
||||||
|
</form>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
43
install/install.php
Normal file
43
install/install.php
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
require_once __DIR__.'/InstallComposer.php';
|
||||||
|
require_once __DIR__.'/InstallConfiguration.php';
|
||||||
|
require_once __DIR__.'/InstallSql.php';
|
||||||
|
|
||||||
|
$configuration_file = __DIR__.'/../app/inc/constants.php';
|
||||||
|
|
||||||
|
if (file_exists($configuration_file) === true) {
|
||||||
|
header('Location: ../index.php');
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($_POST['install']) === true) {
|
||||||
|
try {
|
||||||
|
// Composer installation
|
||||||
|
$composer = new InstallComposer();
|
||||||
|
if ($composer->check() === false) {
|
||||||
|
ini_set('max_execution_time', 0);
|
||||||
|
$composer->install();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save configuration
|
||||||
|
$configuration = new InstallConfiguration($_POST);
|
||||||
|
if ($configuration->checkValues() === false) {
|
||||||
|
throw new \Exception('Bad value for configuration');
|
||||||
|
}
|
||||||
|
|
||||||
|
$configuration->copy($configuration_file.'.template', $configuration_file);
|
||||||
|
|
||||||
|
// Inject database
|
||||||
|
$sql = new InstallSql();
|
||||||
|
$sql->inject();
|
||||||
|
|
||||||
|
header('Location: ../index.php');
|
||||||
|
die();
|
||||||
|
} catch (Exception $e) {
|
||||||
|
require_once __DIR__.'/error.html';
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
require_once __DIR__.'/install.html';
|
Loading…
Reference in New Issue
Block a user