From 16da53707f58789e682c411b417847aeb74ba681 Mon Sep 17 00:00:00 2001 From: Simon Leblanc <contact@leblanc-simon.eu> Date: Fri, 28 Nov 2014 05:12:21 +0100 Subject: [PATCH] First implementation of the installer --- app/inc/constants.php.template | 7 +- app/inc/init.php | 13 ++- install.mysql.auto.sql | 8 ++ install.php | 187 +++++++++++++++++++++++++++++++++ 4 files changed, 207 insertions(+), 8 deletions(-) create mode 100644 install.mysql.auto.sql create mode 100644 install.php diff --git a/app/inc/constants.php.template b/app/inc/constants.php.template index 82567d63..da740537 100644 --- a/app/inc/constants.php.template +++ b/app/inc/constants.php.template @@ -20,11 +20,8 @@ // FRAMADATE version const VERSION = 0.8; -// Server name -const STUDS_URL = '<www.mydomain.com>'; - // Application name -const NOMAPPLICATION = "<Application name>"; +const NOMAPPLICATION = '<Application name>'; // Database administrator email const ADRESSEMAILADMIN = '<email address>'; @@ -36,7 +33,7 @@ const ADRESSEMAILREPONSEAUTO = '<no-reply@mydomain.com>'; const BASE = '<database name>'; // Database user -const USERBASE = "<database user>"; +const USERBASE = '<database user>'; // Database password const USERPASSWD = '<database password>'; diff --git a/app/inc/init.php b/app/inc/init.php index 2a13d2b2..912d6e5c 100644 --- a/app/inc/init.php +++ b/app/inc/init.php @@ -23,9 +23,16 @@ if (ini_get('date.timezone') == '') { // Autoloading of dependencies with Composer require_once __DIR__ . '/../../vendor/autoload.php'; -include_once __DIR__ . '/constants.php'; -include_once __DIR__ . '/i18n.php'; +require_once __DIR__ . '/constants.php'; +require_once __DIR__ . '/i18n.php'; $connect = NewADOConnection(BASE_TYPE); -$connect->Connect(SERVEURBASE, USERBASE, USERPASSWD, BASE); + +if ('pdo' === BASE_TYPE) { + $database_host = 'mysql:host='.SERVEURBASE; +} else { + $database_host = SERVEURBASE; +} + +$connect->Connect($database_host, USERBASE, USERPASSWD, BASE); $err = 0; diff --git a/install.mysql.auto.sql b/install.mysql.auto.sql new file mode 100644 index 00000000..a42245e1 --- /dev/null +++ b/install.mysql.auto.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS `comments` (`id_comment` int(11) unsigned NOT NULL AUTO_INCREMENT, `id_sondage` char(16) NOT NULL, `comment` text NOT NULL, `usercomment` text, PRIMARY KEY (`id_comment`), KEY `id_sondage` (`id_sondage`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE IF NOT EXISTS `sondage` (`id_sondage` char(16) NOT NULL, `commentaires` text, `mail_admin` varchar(128) DEFAULT NULL, `nom_admin` varchar(64) DEFAULT NULL, `titre` text, `id_sondage_admin` char(24) DEFAULT NULL, `date_creation` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `date_fin` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `format` varchar(2) DEFAULT NULL, `mailsonde` tinyint(1) DEFAULT '0', `statut` int(11) NOT NULL DEFAULT '1' COMMENT '1 = actif ; 0 = inactif ; ', UNIQUE KEY `id_sondage` (`id_sondage`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE IF NOT EXISTS `sujet_studs` (`id_sondage` char(16) NOT NULL, `sujet` text, KEY `id_sondage` (`id_sondage`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE IF NOT EXISTS `user_studs` (`id_users` int(11) unsigned NOT NULL AUTO_INCREMENT, `nom` varchar(64) NOT NULL, `id_sondage` char(16) NOT NULL, `reponses` text NOT NULL, PRIMARY KEY (`id_users`), KEY `id_sondage` (`id_sondage`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ; + +INSERT INTO `sondage` (`id_sondage`, `commentaires`, `mail_admin`, `nom_admin`, `titre`, `id_sondage_admin`, `date_fin`, `format`) VALUES ('aqg259dth55iuhwm','Repas de Noel du service','Stephanie@retaillard.com','Stephanie', 'Repas de Noel','aqg259dth55iuhwmy9d8jlwk', FROM_UNIXTIME('1627100361'),'D+'); +INSERT INTO `sujet_studs` (`id_sondage`, `sujet`) VALUES ('aqg259dth55iuhwm','1225839600@12h,1225839600@19h,1226012400@12h,1226012400@19h,1226876400@12h,1226876400@19h,1227049200@12h,1227049200@19h,1227826800@12h,1227826800@19h'); +INSERT INTO `user_studs` (`nom`, `id_sondage`, `reponses`, `id_users`) VALUES ('marcel','aqg259dth55iuhwm','0110111101','933'), ('paul','aqg259dth55iuhwm','1011010111','935'), ('sophie','aqg259dth55iuhwm','1110110000','945'), ('barack','aqg259dth55iuhwm','0110000','948'), ('takashi','aqg259dth55iuhwm','0000110100','951'), ('albert','aqg259dth55iuhwm','1010110','975'), ('alfred','aqg259dth55iuhwm','0110010','1135'), ('marcs','aqg259dth55iuhwm','0100001010','1143'), ('laure','aqg259dth55iuhwm','0011000','1347'), ('benda','aqg259dth55iuhwm','1101101100','1667'), ('Albert','aqg259dth55iuhwm','1111110011','1668'); diff --git a/install.php b/install.php new file mode 100644 index 00000000..0e12bad6 --- /dev/null +++ b/install.php @@ -0,0 +1,187 @@ +<?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> + -- GitLab