X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCore%2FConsole%2FAutomaticInstallation.php;h=34a933e12ef51f686b60574f6b3df53b3fb18dfc;hb=90a38a00d8d642cb7473523539b64aa7c836a8c5;hp=c4e542e762738a674e3f3213f68d88b69c875273;hpb=74c5f1f684a8b8bd357329f0feb409fbc1aa6042;p=friendica.git diff --git a/src/Core/Console/AutomaticInstallation.php b/src/Core/Console/AutomaticInstallation.php index c4e542e762..34a933e12e 100644 --- a/src/Core/Console/AutomaticInstallation.php +++ b/src/Core/Console/AutomaticInstallation.php @@ -5,14 +5,11 @@ namespace Friendica\Core\Console; use Asika\SimpleConsole\Console; use Friendica\BaseObject; use Friendica\Core\Config; -use Friendica\Core\Install; +use Friendica\Core\Installer; use Friendica\Core\Theme; -use Friendica\Database\DBA; -use Friendica\Database\DBStructure; +use Friendica\Util\Config\ConfigFileLoader; use RuntimeException; -require_once 'include/dba.php'; - class AutomaticInstallation extends Console { protected function getHelp() @@ -23,7 +20,7 @@ Synopsis bin/console autoinstall [-h|--help|-?] [-v] [-a] [-f] Description - Installs Friendica with data based on the local.ini.php file or environment variables + Installs Friendica with data based on the local.config.php file or environment variables Notes Not checking .htaccess/URL-Rewrite during CLI installation. @@ -32,18 +29,20 @@ Options -h|--help|-? Show help information -v Show more debug information. -a All setup checks are required (except .htaccess) - -f|--file prepared config file (e.g. "config/local.ini.php" itself) which will override every other config option - except the environment variables) - -s|--savedb Save the DB credentials to the file (if environment variables is used) - -H|--dbhost The host of the mysql/mariadb database (env MYSQL_HOST) - -p|--dbport The port of the mysql/mariadb database (env MYSQL_PORT) - -d|--dbdata The name of the mysql/mariadb database (env MYSQL_DATABASE) - -U|--dbuser The username of the mysql/mariadb database login (env MYSQL_USER or MYSQL_USERNAME) - -P|--dbpass The password of the mysql/mariadb database login (env MYSQL_PASSWORD) - -u|--urlpath The URL path of Friendica - f.e. '/friendica' (env FRIENDICA_URL_PATH) - -b|--phppath The path of the PHP binary (env FRIENDICA_PHP_PATH) - -A|--admin The admin email address of Friendica (env FRIENDICA_ADMIN_MAIL) - -T|--tz The timezone of Friendica (env FRIENDICA_TZ) - -L|--lang The language of Friendica (env FRIENDICA_LANG) + -f|--file prepared config file (e.g. "config/local.config.php" itself) which will override every other config option - except the environment variables) + -s|--savedb Save the DB credentials to the file (if environment variables is used) + -H|--dbhost The host of the mysql/mariadb database (env MYSQL_HOST) + -p|--dbport The port of the mysql/mariadb database (env MYSQL_PORT) + -d|--dbdata The name of the mysql/mariadb database (env MYSQL_DATABASE) + -U|--dbuser The username of the mysql/mariadb database login (env MYSQL_USER or MYSQL_USERNAME) + -P|--dbpass The password of the mysql/mariadb database login (env MYSQL_PASSWORD) + -U|--urlpath The URL path of Friendica - f.e. '/friendica' (env FRIENDICA_URL_PATH) + -B|--phppath The path of the PHP binary (env FRIENDICA_PHP_PATH) + -b|--basepath The basepath of Friendica(env FRIENDICA_BASE_PATH) + -S|--sslpolicy The SSL policy of Friendica (env FRIENDICA_SSL_POLICY) + -n|--hostname The hostname of Friendica (env FRIENDICA_PHP_HOSTNAME) + -t|--tz The timezone of Friendica (env FRIENDICA_TZ) + -L|--lang The language of Friendica (env FRIENDICA_LANG) Environment variables MYSQL_HOST The host of the mysql/mariadb database (mandatory if mysql and environment is used) @@ -51,18 +50,21 @@ Environment variables MYSQL_USERNAME|MYSQL_USER The username of the mysql/mariadb database login (MYSQL_USERNAME is for mysql, MYSQL_USER for mariadb) MYSQL_PASSWORD The password of the mysql/mariadb database login MYSQL_DATABASE The name of the mysql/mariadb database - FRIENDICA_URL_PATH The URL path of Friendica (f.e. '/friendica') - FRIENDICA_PHP_PATH The path of the PHP binary + FRIENDICA_URL_PATH The URL path of Friendica (f.e. '/friendica') - leave empty for auto detection + FRIENDICA_PHP_PATH The path of the PHP binary - leave empty for auto detection + FRIENDICA_BASE_PATH The basepath of Friendica - leave empty for auto detection FRIENDICA_ADMIN_MAIL The admin email address of Friendica (this email will be used for admin access) + FRIENDICA_SSL_POLICY The SSL policy of Friendica (default is NO SSL) + FRIENDICA_HOSTNAME The hostname of Friendica - leave empty for auto detection FRIENDICA_TZ The timezone of Friendica FRIENDICA_LANG The langauge of Friendica Examples - bin/console autoinstall -f 'input.ini.php - Installs Friendica with the prepared 'input.ini.php' file + bin/console autoinstall -f 'input.config.php + Installs Friendica with the prepared 'input.config.php' file bin/console autoinstall --savedb - Installs Friendica with environment variables and saves them to the 'config/local.ini.php' file + Installs Friendica with environment variables and saves them to the 'config/local.config.php' file bin/console autoinstall -h localhost -p 3365 -U user -P passwort1234 -d friendica Installs Friendica with a local mysql database with credentials @@ -76,69 +78,100 @@ HELP; $a = BaseObject::getApp(); - $install = new Install(); + $installer = new Installer(); + + $configCache = $a->getConfigCache(); + $installer->setUpCache($configCache, dirname(__DIR__, 3), $_SERVER); + + $this->out(" Complete!\n\n"); + + // Check Environment + $this->out("Checking environment...\n"); + + $installer->resetChecks(); + + if (!$this->runBasicChecks($installer, $configCache)) { + $errorMessage = $this->extractErrors($installer->getChecks()); + throw new RuntimeException($errorMessage); + } + + $this->out(" Complete!\n\n"); // if a config file is set, $config_file = $this->getOption(['f', 'file']); if (!empty($config_file)) { - if ($config_file != 'config' . DIRECTORY_SEPARATOR . 'local.ini.php') { + if ($config_file != 'config' . DIRECTORY_SEPARATOR . 'local.config.php') { // Copy config file $this->out("Copying config file...\n"); - if (!copy($a->getBasePath() . DIRECTORY_SEPARATOR . $config_file, $a->getBasePath() . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'local.ini.php')) { - throw new RuntimeException("ERROR: Saving config file failed. Please copy '$config_file' to '" . $a->getBasePath() . "'" . DIRECTORY_SEPARATOR . "config" . DIRECTORY_SEPARATOR . "local.ini.php' manually.\n"); + if (!copy($a->getBasePath() . DIRECTORY_SEPARATOR . $config_file, $a->getBasePath() . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'local.config.php')) { + throw new RuntimeException("ERROR: Saving config file failed. Please copy '$config_file' to '" . $a->getBasePath() . "'" . DIRECTORY_SEPARATOR . "config" . DIRECTORY_SEPARATOR . "local.config.php' manually.\n"); } } - $db_host = $a->getConfigValue('database', 'hostname'); - $db_user = $a->getConfigValue('database', 'username'); - $db_pass = $a->getConfigValue('database', 'password'); - $db_data = $a->getConfigValue('database', 'database'); + //reload the config cache + $loader = new ConfigFileLoader($a->getBasePath(), $a->getMode()); + $loader->setupCache($configCache); + } else { // Creating config file $this->out("Creating config file...\n"); $save_db = $this->getOption(['s', 'savedb'], false); - $db_host = $this->getOption(['H', 'dbhost'], ($save_db) ? getenv('MYSQL_HOST') : ''); + //$db_host = $this->getOption(['H', 'dbhost'], ($save_db) ? (getenv('MYSQL_HOST') ? getenv('MYSQL_HOST') : Installer::DEFAULT_HOST) : ''); + $db_host = $this->getOption(['H', 'dbhost'], ($save_db) ? (getenv('MYSQL_HOST')) : Installer::DEFAULT_HOST); $db_port = $this->getOption(['p', 'dbport'], ($save_db) ? getenv('MYSQL_PORT') : null); - $db_data = $this->getOption(['d', 'dbdata'], ($save_db) ? getenv('MYSQL_DATABASE') : ''); - $db_user = $this->getOption(['U', 'dbuser'], ($save_db) ? getenv('MYSQL_USER') . getenv('MYSQL_USERNAME') : ''); - $db_pass = $this->getOption(['P', 'dbpass'], ($save_db) ? getenv('MYSQL_PASSWORD') : ''); - $url_path = $this->getOption(['u', 'urlpath'], (!empty('FRIENDICA_URL_PATH')) ? getenv('FRIENDICA_URL_PATH') : null); - $php_path = $this->getOption(['b', 'phppath'], (!empty('FRIENDICA_PHP_PATH')) ? getenv('FRIENDICA_PHP_PATH') : null); - $admin_mail = $this->getOption(['A', 'admin'], (!empty('FRIENDICA_ADMIN_MAIL')) ? getenv('FRIENDICA_ADMIN_MAIL') : ''); - $tz = $this->getOption(['T', 'tz'], (!empty('FRIENDICA_TZ')) ? getenv('FRIENDICA_TZ') : ''); - $lang = $this->getOption(['L', 'lang'], (!empty('FRIENDICA_LANG')) ? getenv('FRIENDICA_LANG') : ''); - - $install->createConfig( - $php_path, - $url_path, - ((!empty($db_port)) ? $db_host . ':' . $db_port : $db_host), - $db_user, - $db_pass, - $db_data, - $tz, - $lang, - $admin_mail, - $a->getBasePath() - ); - } - - $this->out(" Complete!\n\n"); - - // Check basic setup - $this->out("Checking basic setup...\n"); + $configCache->set('database', 'hostname', $db_host . (!empty($db_port) ? ':' . $db_port : '')); + $configCache->set('database', 'database', + $this->getOption(['d', 'dbdata'], + ($save_db) ? getenv('MYSQL_DATABASE') : '')); + $configCache->set('database', 'username', + $this->getOption(['U', 'dbuser'], + ($save_db) ? getenv('MYSQL_USER') . getenv('MYSQL_USERNAME') : '')); + $configCache->set('database', 'password', + $this->getOption(['P', 'dbpass'], + ($save_db) ? getenv('MYSQL_PASSWORD') : '')); + $php_path = $this->getOption(['b', 'phppath'], !empty('FRIENDICA_PHP_PATH') ? getenv('FRIENDICA_PHP_PATH') : null); + if (!empty($php_path)) { + $configCache->set('config', 'php_path', $php_path); + } else { + $configCache->set('config', 'php_path', $installer->getPHPPath()); + } - $checkResults = []; + $configCache->set('config', 'admin_email', + $this->getOption(['A', 'admin'], + !empty(getenv('FRIENDICA_ADMIN_MAIL')) ? getenv('FRIENDICA_ADMIN_MAIL') : '')); + $configCache->set('system', 'default_timezone', + $this->getOption(['T', 'tz'], + !empty(getenv('FRIENDICA_TZ')) ? getenv('FRIENDICA_TZ') : Installer::DEFAULT_TZ)); + $configCache->set('system', 'language', + $this->getOption(['L', 'lang'], + !empty(getenv('FRIENDICA_LANG')) ? getenv('FRIENDICA_LANG') : Installer::DEFAULT_LANG)); + + $configCache->set('system', 'urlpath', $this->getOption(['u', 'urlpath'], !empty(getenv('FRIENDICA_URL_PATH')) ? getenv('FRIENDICA_URL_PATH') : '')); + $basepath = $this->getOption(['b', 'basepath'], !empty(getenv('FRIENDICA_BASE_PATH')) ? getenv('FRIENDICA_BASE_PATH') : null); + if (!empty($basepath)) { + $configCache->set('system', 'basepath', $basepath); + } + $php_path = $this->getOption(['B', 'phppath'], !empty(getenv('FRIENDICA_PHP_PATH')) ? getenv('FRIENDICA_PHP_PATH') : null); + if (!empty($php_path)) { + $configCache->set('config', 'php_path', $php_path); + } + $ssl_policy = $this->getOption(['S', 'sslpolicy'], !empty(getenv('FRIENDICA_SSL_POLICY')) ? getenv('FRIENDICA_SSL_POLICY') : null); + if (!empty($ssl_policy)) { + $configCache->set('system', 'ssl_policy', $ssl_policy); + } + $configCache->set('config', 'hostname', $this->getOption(['n', 'hostname'], !empty(getenv('FRIENDICA_HOSTNAME')) ? getenv('FRIENDICA_HOSTNAME') : '')); - $this->runBasicChecks($install); + $configCache->set('system', 'url', $installer->determineBaseUrl($configCache)); - $checkResults['basic'] = $install->getChecks(); - $errorMessage = $this->extractErrors($checkResults['basic']); + if (empty($configCache->get('config', 'hostname'))) { + $this->out('The Friendica hostname has to be set during CLI installation.'); + return 1; + } - if ($errorMessage !== '') { - throw new RuntimeException($errorMessage); + $installer->createConfig($configCache); } $this->out(" Complete!\n\n"); @@ -146,11 +179,10 @@ HELP; // Check database connection $this->out("Checking database...\n"); - $checkResults['db'] = array(); - $checkResults['db'][] = $this->runDatabaseCheck($db_host, $db_user, $db_pass, $db_data); - $errorMessage = $this->extractErrors($checkResults['db']); + $installer->resetChecks(); - if ($errorMessage !== '') { + if (!$installer->checkDB($configCache, $a->getProfiler())) { + $errorMessage = $this->extractErrors($installer->getChecks()); throw new RuntimeException($errorMessage); } @@ -159,10 +191,11 @@ HELP; // Install database $this->out("Inserting data into database...\n"); - $checkResults['data'] = DBStructure::update(false, true, true); + $installer->resetChecks(); - if ($checkResults['data'] !== '') { - throw new RuntimeException("ERROR: DB Database creation error. Is the DB empty?\n"); + if (!$installer->installDatabase($a->getBasePath())) { + $errorMessage = $this->extractErrors($installer->getChecks()); + throw new RuntimeException($errorMessage); } $this->out(" Complete!\n\n"); @@ -173,7 +206,7 @@ HELP; Theme::install(Config::get('system', 'theme')); $this->out(" Complete\n\n"); } else { - $this->out(" Theme setting is empty. Please check the file 'config/local.ini.php'\n\n"); + $this->out(" Theme setting is empty. Please check the file 'config/local.config.php'\n\n"); } $this->out("\nInstallation is finished\n"); @@ -182,52 +215,42 @@ HELP; } /** - * @param Install $install the Installer instance - */ - private function runBasicChecks(Install $install) - { - $install->resetChecks(); - $install->checkFunctions(); - $install->checkImagick(); - $install->checkLocalIni(); - $install->checkSmarty3(); - $install->checkKeys(); - - if (!empty(Config::get('config', 'php_path'))) { - if (!$install->checkPHP(Config::get('config', 'php_path'), true)) { - throw new RuntimeException(" ERROR: The php_path is not valid in the config.\n"); - } - } else { - throw new RuntimeException(" ERROR: The php_path is not set in the config.\n"); - } - - $this->out(" NOTICE: Not checking .htaccess/URL-Rewrite during CLI installation.\n"); - } - - /** - * @param $db_host - * @param $db_user - * @param $db_pass - * @param $db_data + * @param Installer $installer The Installer instance + * @param Config\Cache\IConfigCache $configCache The config cache * - * @return array + * @return bool true if checks were successfully, otherwise false + * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ - private function runDatabaseCheck($db_host, $db_user, $db_pass, $db_data) + private function runBasicChecks(Installer $installer, Config\Cache\IConfigCache $configCache) { - $result = array( - 'title' => 'MySQL Connection', - 'required' => true, - 'status' => true, - 'help' => '', - ); + $checked = true; + + $installer->resetChecks(); + if (!$installer->checkFunctions()) { + $checked = false; + } + if (!$installer->checkImagick()) { + $checked = false; + } + if (!$installer->checkLocalIni()) { + $checked = false; + } + if (!$installer->checkSmarty3()) { + $checked = false; + } + if (!$installer->checkKeys()) { + $checked = false; + } + $php_path = $configCache->get('config', 'php_path'); - if (!DBA::connect($db_host, $db_user, $db_pass, $db_data)) { - $result['status'] = false; - $result['help'] = 'Failed, please check your MySQL settings and credentials.'; + if (!$installer->checkPHP($php_path, true)) { + $checked = false; } - return $result; + $this->out(" NOTICE: Not checking .htaccess/URL-Rewrite during CLI installation.\n"); + + return $checked; } /**