Installer and Updater

This commit is contained in:
Dan Cryer 2014-12-04 15:01:19 +00:00
parent bfca6bc27a
commit 6e469b01ec
3 changed files with 88 additions and 44 deletions

View file

@ -15,6 +15,7 @@ use PDO;
use b8\Config;
use b8\Database;
use b8\Store\Factory;
use PHPCI\Helper\Lang;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
@ -39,16 +40,16 @@ class InstallCommand extends Command
$this
->setName('phpci:install')
->addOption('url', null, InputOption::VALUE_OPTIONAL, 'PHPCI Installation URL')
->addOption('db-host', null, InputOption::VALUE_OPTIONAL, 'Database hostname')
->addOption('db-name', null, InputOption::VALUE_OPTIONAL, 'Database name')
->addOption('db-user', null, InputOption::VALUE_OPTIONAL, 'Database username')
->addOption('db-pass', null, InputOption::VALUE_OPTIONAL, 'Database password')
->addOption('admin-name', null, InputOption::VALUE_OPTIONAL, 'Admin username')
->addOption('admin-pass', null, InputOption::VALUE_OPTIONAL, 'Admin password')
->addOption('admin-mail', null, InputOption::VALUE_OPTIONAL, 'Admin e-mail')
->addOption('config-path', null, InputOption::VALUE_OPTIONAL, 'Config file path', $defaultPath)
->setDescription('Install PHPCI.');
->addOption('url', null, InputOption::VALUE_OPTIONAL, Lang::get('installation_url'))
->addOption('db-host', null, InputOption::VALUE_OPTIONAL, Lang::get('db_host'))
->addOption('db-name', null, InputOption::VALUE_OPTIONAL, Lang::get('db_name'))
->addOption('db-user', null, InputOption::VALUE_OPTIONAL, Lang::get('db_user'))
->addOption('db-pass', null, InputOption::VALUE_OPTIONAL, Lang::get('db_pass'))
->addOption('admin-name', null, InputOption::VALUE_OPTIONAL, Lang::get('admin_name'))
->addOption('admin-pass', null, InputOption::VALUE_OPTIONAL, Lang::get('admin_pass'))
->addOption('admin-mail', null, InputOption::VALUE_OPTIONAL, Lang::get('admin_email'))
->addOption('config-path', null, InputOption::VALUE_OPTIONAL, Lang::get('config_path'), $defaultPath)
->setDescription(Lang::get('install_phpci'));
}
/**
@ -62,13 +63,13 @@ class InstallCommand extends Command
$output->writeln('');
$output->writeln('<info>******************</info>');
$output->writeln('<info> Welcome to PHPCI</info>');
$output->writeln('<info> '.Lang::get('welcome_to_phpci').'</info>');
$output->writeln('<info>******************</info>');
$output->writeln('');
$this->checkRequirements($output);
$output->writeln('Please answer the following questions:');
$output->writeln(Lang::get('please_answer'));
$output->writeln('-------------------------------------');
$output->writeln('');
@ -111,9 +112,9 @@ class InstallCommand extends Command
$errors = false;
// Check PHP version:
if (!(version_compare(PHP_VERSION, '5.3.3') >= 0)) {
if (!(version_compare(PHP_VERSION, '5.3.8') >= 0)) {
$output->writeln('');
$output->writeln('<error>PHPCI requires at least PHP 5.3.3 to function.</error>');
$output->writeln('<error>'.Lang::get('phpci_php_req').'</error>');
$errors = true;
}
@ -123,7 +124,7 @@ class InstallCommand extends Command
foreach ($requiredExtensions as $extension) {
if (!extension_loaded($extension)) {
$output->writeln('');
$output->writeln('<error>'.$extension.' extension must be installed.</error>');
$output->writeln('<error>'.Lang::get('extension_required', $extension).'</error>');
$errors = true;
}
}
@ -134,22 +135,22 @@ class InstallCommand extends Command
foreach ($requiredFunctions as $function) {
if (!function_exists($function)) {
$output->writeln('');
$output->writeln('<error>PHPCI needs to be able to call the '.$function.'() function. Is it disabled in php.ini?</error>');
$output->writeln('<error>'.Lang::get('function_required', $function).'</error>');
$errors = true;
}
}
if (!function_exists('password_hash')) {
$output->writeln('');
$output->writeln('<error>PHPCI requires the password_hash() function available in PHP 5.4, or the password_compat library by ircmaxell.</error>');
$output->writeln('<error>'.Lang::get('function_required', $function).'</error>');
$errors = true;
}
if ($errors) {
throw new Exception('PHPCI cannot be installed, as not all requirements are met. Please review the errors above before continuing.');
throw new Exception(Lang::get('requirements_not_met'));
}
$output->writeln(' <info>OK</info>');
$output->writeln(' <info>'.Lang::get('ok').'</info>');
$output->writeln('');
}
@ -170,9 +171,9 @@ class InstallCommand extends Command
$dialog = $this->getHelperSet()->get('dialog');
// Function to validate mail address.
$mailValidator =function ($answer) {
$mailValidator = function ($answer) {
if (!filter_var($answer, FILTER_VALIDATE_EMAIL)) {
throw new Exception('Must be a valid email address.');
throw new Exception(Lang::get('must_be_valid_email'));
}
return $answer;
@ -181,13 +182,13 @@ class InstallCommand extends Command
if ($adminEmail = $input->getOption('admin-mail')) {
$adminEmail = $mailValidator($adminEmail);
} else {
$adminEmail = $dialog->askAndValidate($output, 'Your email address: ', $mailValidator, false);
$adminEmail = $dialog->askAndValidate($output, Lang::get('enter_email'), $mailValidator, false);
}
if (!$adminName = $input->getOption('admin-name')) {
$adminName = $dialog->ask($output, 'Enter your name: ');
$adminName = $dialog->ask($output, Lang::get('enter_name'));
}
if (!$adminPass = $input->getOption('admin-pass')) {
$adminPass = $dialog->askHiddenResponse($output, 'Enter your desired admin password: ');
$adminPass = $dialog->askHiddenResponse($output, Lang::get('enter_password'));
}
$admin['mail'] = $adminEmail;
@ -216,7 +217,7 @@ class InstallCommand extends Command
// FUnction do validate URL.
$urlValidator = function ($answer) {
if (!filter_var($answer, FILTER_VALIDATE_URL)) {
throw new Exception('Must be a valid URL');
throw new Exception(Lang::get('must_be_valid_url'));
}
return rtrim($answer, '/');
@ -225,7 +226,7 @@ class InstallCommand extends Command
if ($url = $input->getOption('url')) {
$url = $urlValidator($url);
} else {
$url = $dialog->askAndValidate($output, 'Your PHPCI URL ("http://phpci.local" for example): ', $urlValidator, false);
$url = $dialog->askAndValidate($output, Lang::get('enter_phpci_url'), $urlValidator, false);
}
$phpci['url'] = $url;
@ -250,19 +251,19 @@ class InstallCommand extends Command
$dialog = $this->getHelperSet()->get('dialog');
if (!$dbHost = $input->getOption('db-host')) {
$dbHost = $dialog->ask($output, 'Please enter your MySQL host [localhost]: ', 'localhost');
$dbHost = $dialog->ask($output, Lang::get('enter_db_host'), 'localhost');
}
if (!$dbName = $input->getOption('db-name')) {
$dbName = $dialog->ask($output, 'Please enter your database name [phpci]: ', 'phpci');
$dbName = $dialog->ask($output, Lang::get('enter_db_name'), 'phpci');
}
if (!$dbUser = $input->getOption('db-user')) {
$dbUser = $dialog->ask($output, 'Please enter your database username [phpci]: ', 'phpci');
$dbUser = $dialog->ask($output, Lang::get('enter_db_user'), 'phpci');
}
if (!$dbPass = $input->getOption('db-pass')) {
$dbPass = $dialog->askHiddenResponse($output, 'Please enter your database password: ');
$dbPass = $dialog->askHiddenResponse($output, Lang::get('enter_db_pass'));
}
$db['servers']['read'] = $dbHost;
@ -298,7 +299,7 @@ class InstallCommand extends Command
return true;
} catch (Exception $ex) {
$output->writeln('<error>PHPCI could not connect to MySQL with the details provided. Please try again.</error>');
$output->writeln('<error>'.Lang::get('could_not_connect').'</error>');
$output->writeln('<error>' . $ex->getMessage() . '</error>');
}
@ -319,11 +320,11 @@ class InstallCommand extends Command
protected function setupDatabase(OutputInterface $output)
{
$output->write('Setting up your database... ');
$output->write(Lang::get('setting_up_db'));
shell_exec(PHPCI_DIR . 'vendor/bin/phinx migrate -c "' . PHPCI_DIR . 'phinx.php"');
$output->writeln('<info>OK</info>');
$output->writeln('<info>'.Lang::get('ok').'</info>');
}
/**
@ -341,9 +342,9 @@ class InstallCommand extends Command
$userService = new UserService($userStore);
$userService->createUser($admin['name'], $admin['mail'], $admin['pass'], 1);
$output->writeln('<info>User account created!</info>');
$output->writeln('<info>'.Lang::get('user_created').'</info>');
} catch (\Exception $ex) {
$output->writeln('<error>PHPCI failed to create your admin account.</error>');
$output->writeln('<error>'.Lang::get('failed_to_create').'</error>');
$output->writeln('<error>' . $ex->getMessage() . '</error>');
die;
}
@ -367,8 +368,8 @@ class InstallCommand extends Command
$content = file_get_contents($this->configFilePath);
if (!empty($content)) {
$output->writeln('<error>The PHPCI config file exists and is not empty.</error>');
$output->writeln('<error>If you were trying to update PHPCI, please use phpci:update instead.</error>');
$output->writeln('<error>'.Lang::get('config_exists').'</error>');
$output->writeln('<error>'.Lang::get('update_instead').'</error>');
die;
}
}

View file

@ -10,6 +10,7 @@
namespace PHPCI\Command;
use Monolog\Logger;
use PHPCI\Helper\Lang;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputDefinition;
@ -40,7 +41,7 @@ class UpdateCommand extends Command
{
$this
->setName('phpci:update')
->setDescription('Update the database to reflect modified models.');
->setDescription(Lang::get('update_phpci'));
}
/**
@ -50,25 +51,25 @@ class UpdateCommand extends Command
{
$this->verifyInstalled($output);
$output->write('Updating PHPCI database: ');
$output->write(Lang::get('updating_phpci'));
shell_exec(PHPCI_DIR . 'vendor/bin/phinx migrate -c "' . PHPCI_DIR . 'phinx.php"');
$output->writeln('<info>Done!</info>');
$output->writeln('<info>'.Lang::get('ok').'</info>');
}
protected function verifyInstalled(OutputInterface $output)
{
if (!file_exists(PHPCI_DIR . 'PHPCI/config.yml')) {
$output->writeln('<error>PHPCI does not appear to be installed.</error>');
$output->writeln('<error>Please install PHPCI via phpci:install instead.</error>');
$output->writeln('<error>'.Lang::get('not_installed').'</error>');
$output->writeln('<error>'.Lang::get('install_instead').'</error>');
die;
}
$content = file_get_contents(PHPCI_DIR . 'PHPCI/config.yml');
if (empty($content)) {
$output->writeln('<error>PHPCI does not appear to be installed.</error>');
$output->writeln('<error>Please install PHPCI via phpci:install instead.</error>');
$output->writeln('<error>'.Lang::get('not_installed').'</error>');
$output->writeln('<error>'.Lang::get('install_instead').'</error>');
die;
}
}

View file

@ -273,4 +273,46 @@ PHPCI',
'remove' => 'Remove &raquo;',
'search_packagist_for_more' => 'Search Packagist for more packages',
'search' => 'Search &raquo;',
// Installer
'installation_url' => 'PHPCI Installation URL',
'db_host' => 'Database Host',
'db_name' => 'Database Name',
'db_user' => 'Database Username',
'db_pass' => 'Database Password',
'admin_name' => 'Admin Name',
'admin_pass' => 'Admin Password',
'admin_email' => 'Admin Email Address',
'config_path' => 'Config File Path',
'install_phpci' => 'Install PHPCI',
'welcome_to_phpci' => 'Welcome to PHPCI',
'please_answer' => 'Please answer the following questions:',
'phpci_php_req' => 'PHPCI requires at least PHP 5.3.8 to function.',
'extension_required' => 'Extension required: %s',
'function_required' => 'PHPCI needs to be able to call the %s() function. Is it disabled in php.ini?',
'requirements_not_met' => 'PHPCI cannot be installed, as not all requirements are met.
Please review the errors above before continuing.',
'must_be_valid_email' => 'Must be a valid email address.',
'must_be_valid_url' => 'Must be a valid URL.',
'enter_name' => 'Admin Name:',
'enter_email' => 'Admin Email:',
'enter_password' => 'Admin Password:',
'enter_phpci_url' => 'Your PHPCI URL ("http://phpci.local" for example): ',
'enter_db_host' => 'Please enter your MySQL host [localhost]: ',
'enter_db_name' => 'Please enter your MySQL name [phpci]: ',
'enter_db_user' => 'Please enter your MySQL username [phpci]: ',
'enter_db_pass' => 'Please enter your MySQL password: ',
'could_not_connect' => 'PHPCI could not connect to MySQL with the details provided. Please try again.',
'setting_up_db' => 'Setting up your database... ',
'user_created' => 'User account created!',
'failed_to_create' => 'PHPCI failed to create your admin account.',
'config_exists' => 'The PHPCI config file exists and is not empty.',
'update_instead' => 'If you were trying to update PHPCI, please use phpci:update instead.',
// Update
'update_phpci' => 'Update the database to reflect modified models.',
'updating_phpci' => 'Updating PHPCI database: ',
'not_installed' => 'PHPCI does not appear to be installed.',
'install_instead' => 'Please install PHPCI via phpci:install instead.',
);