diff options
Diffstat (limited to 'cli/do-install.php')
| -rwxr-xr-x | cli/do-install.php | 182 |
1 files changed, 101 insertions, 81 deletions
diff --git a/cli/do-install.php b/cli/do-install.php index 2d73c2e98..77acc58ed 100755 --- a/cli/do-install.php +++ b/cli/do-install.php @@ -7,74 +7,91 @@ if (file_exists(DATA_PATH . '/applied_migrations.txt')) { fail('FreshRSS seems to be already installed!' . "\n" . 'Please use `./cli/reconfigure.php` instead.', EXIT_CODE_ALREADY_EXISTS); } -$parameters = [ - 'long' => [ - 'environment' => ':', - 'base-url' => ':', - 'language' => ':', - 'title' => ':', - 'default-user' => ':', - 'allow-anonymous' => '', - 'allow-anonymous-refresh' => '', - 'auth-type' => ':', - 'api-enabled' => '', - 'allow-robots' => '', - 'disable-update' => '', - 'db-type' => ':', - 'db-host' => ':', - 'db-user' => ':', - 'db-password' => ':', - 'db-base' => ':', - 'db-prefix' => '::', - ], - 'short' => [], - 'deprecated' => [ - 'base-url' => 'base_url', - 'default-user' => 'default_user', - 'allow-anonymous' => 'allow_anonymous', - 'allow-anonymous-refresh' => 'allow_anonymous_refresh', - 'auth-type' => 'auth_type', - 'api-enabled' => 'api_enabled', - 'allow-robots' => 'allow_robots', - 'disable-update' => 'disable_update', - ], -]; - -$configParams = [ - 'environment' => 'environment', - 'base-url' => 'base_url', - 'language' => 'language', - 'title' => 'title', - 'default-user' => 'default_user', - 'allow-anonymous' => 'allow_anonymous', - 'allow-anonymous-refresh' => 'allow_anonymous_refresh', - 'auth-type' => 'auth_type', - 'api-enabled' => 'api_enabled', - 'allow-robots' => 'allow_robots', - 'disable-update' => 'disable_update', -]; - -$dBconfigParams = [ - 'db-type' => 'type', - 'db-host' => 'host', - 'db-user' => 'user', - 'db-password' => 'password', - 'db-base' => 'base', - 'db-prefix' => 'prefix', -]; - -$options = parseCliParams($parameters); +$cliOptions = new class extends CliOptionsParser { + public string $defaultUser; + public string $environment; + public string $baseUrl; + public string $language; + public string $title; + public bool $allowAnonymous; + public bool $allowAnonymousRefresh; + public string $authType; + public bool $apiEnabled; + public bool $allowRobots; + public bool $disableUpdate; + public string $dbType; + public string $dbHost; + public string $dbUser; + public string $dbPassword; + public string $dbBase; + public string $dbPrefix; + + public function __construct() { + $this->addRequiredOption('defaultUser', (new CliOption('default-user'))->deprecatedAs('default_user')); + $this->addOption('environment', (new CliOption('environment'))); + $this->addOption('baseUrl', (new CliOption('base-url'))->deprecatedAs('base_url')); + $this->addOption('language', (new CliOption('language'))); + $this->addOption('title', (new CliOption('title'))); + $this->addOption( + 'allowAnonymous', + (new CliOption('allow-anonymous'))->withValueOptional('true')->deprecatedAs('allow_anonymous')->typeOfBool() + ); + $this->addOption( + 'allowAnonymousRefresh', + (new CliOption('allow-anonymous-refresh'))->withValueOptional('true')->deprecatedAs('allow_anonymous_refresh')->typeOfBool() + ); + $this->addOption('authType', (new CliOption('auth-type'))->deprecatedAs('auth_type')); + $this->addOption( + 'apiEnabled', + (new CliOption('api-enabled'))->withValueOptional('true')->deprecatedAs('api_enabled')->typeOfBool() + ); + $this->addOption( + 'allowRobots', + (new CliOption('allow-robots'))->withValueOptional('true')->deprecatedAs('allow_robots')->typeOfBool() + ); + $this->addOption( + 'disableUpdate', + (new CliOption('disable-update'))->withValueOptional('true')->deprecatedAs('disable_update')->typeOfBool() + ); + $this->addOption('dbType', (new CliOption('db-type'))); + $this->addOption('dbHost', (new CliOption('db-host'))); + $this->addOption('dbUser', (new CliOption('db-user'))); + $this->addOption('dbPassword', (new CliOption('db-password'))); + $this->addOption('dbBase', (new CliOption('db-base'))); + $this->addOption('dbPrefix', (new CliOption('db-prefix'))->withValueOptional()); + parent::__construct(); + } +}; -if (!empty($options['invalid']) || empty($options['valid']['default-user']) || !is_string($options['valid']['default-user'])) { - fail('Usage: ' . basename(__FILE__) . " --default-user admin ( --auth-type form" . - " --environment production --base-url https://rss.example.net --allow-robots" . - " --language en --title FreshRSS --allow-anonymous --allow-anonymous-refresh --api-enabled" . - " --db-type mysql --db-host localhost:3306 --db-user freshrss --db-password dbPassword123" . - " --db-base freshrss --db-prefix freshrss_ --disable-update )"); +if (!empty($cliOptions->errors)) { + fail('FreshRSS error: ' . array_shift($cliOptions->errors) . "\n" . $cliOptions->usage); } fwrite(STDERR, 'FreshRSS install…' . "\n"); +$values = [ + 'default_user' => $cliOptions->defaultUser ?? null, + 'environment' => $cliOptions->environment ?? null, + 'base_url' => $cliOptions->baseUrl ?? null, + 'language' => $cliOptions->language ?? null, + 'title' => $cliOptions->title ?? null, + 'allow_anonymous' => $cliOptions->allowAnonymous ?? null, + 'allow_anonymous_refresh' => $cliOptions->allowAnonymousRefresh ?? null, + 'auth_type' => $cliOptions->authType ?? null, + 'api_enabled' => $cliOptions->apiEnabled ?? null, + 'allow_robots' => $cliOptions->allowRobots ?? null, + 'disable_update' => $cliOptions->disableUpdate ?? null, +]; + +$dbValues = [ + 'type' => $cliOptions->dbType ?? null, + 'host' => $cliOptions->dbHost ?? null, + 'user' => $cliOptions->dbUser ?? null, + 'password' => $cliOptions->dbPassword ?? null, + 'base' => $cliOptions->dbBase ?? null, + 'prefix' => $cliOptions->dbPrefix ?? null, +]; + $config = array( 'salt' => generateSalt(), 'db' => FreshRSS_Context::systemConf()->db, @@ -88,10 +105,26 @@ if (file_exists($customConfigPath)) { } } -foreach ($configParams as $param => $configParam) { - if (isset($options['valid'][$param])) { - $isFlag = $parameters['long'][$param] === ''; - $config[$configParam] = $isFlag ? true : $options['valid'][$param]; +foreach ($values as $name => $value) { + if ($value !== null) { + switch ($name) { + case 'default_user': + if (!FreshRSS_user_Controller::checkUsername($value)) { + fail('FreshRSS invalid default username! default_user must be ASCII alphanumeric'); + } + break; + case 'environment': + if (!in_array($value, ['development', 'production', 'silent'], true)) { + fail('FreshRSS invalid environment! environment must be one of { development, production, silent }'); + } + break; + case 'auth_type': + if (!in_array($value, ['form', 'http_auth', 'none'], true)) { + fail('FreshRSS invalid authentication method! auth_type must be one of { form, http_auth, none }'); + } + break; + } + $config[$name] = $value; } } @@ -99,23 +132,10 @@ if ((!empty($config['base_url'])) && is_string($config['base_url']) && Minz_Requ $config['pubsubhubbub_enabled'] = true; } -foreach ($dBconfigParams as $dBparam => $configDbParam) { - if (isset($options['valid'][$dBparam])) { - $config['db'][$configDbParam] = $options['valid'][$dBparam]; - } -} +$config['db'] = array_merge($config['db'], array_filter($dbValues)); performRequirementCheck($config['db']['type']); -if (!FreshRSS_user_Controller::checkUsername($options['valid']['default-user'])) { - fail('FreshRSS error: invalid default username “' . $options['valid']['default-user'] - . '”! Must be matching ' . FreshRSS_user_Controller::USERNAME_PATTERN); -} - -if (isset($options['valid']['auth-type']) && !in_array($options['valid']['auth-type'], ['form', 'http_auth', 'none'], true)) { - fail('FreshRSS invalid authentication method (auth-type must be one of { form, http_auth, none })'); -} - if (file_put_contents(join_path(DATA_PATH, 'config.php'), "<?php\n return " . var_export($config, true) . ";\n") === false) { fail('FreshRSS could not write configuration file!: ' . join_path(DATA_PATH, 'config.php')); |
