4
0

_cli.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <?php
  2. declare(strict_types=1);
  3. if (php_sapi_name() !== 'cli') {
  4. die('FreshRSS error: This PHP script may only be invoked from command line!');
  5. }
  6. const EXIT_CODE_ALREADY_EXISTS = 3;
  7. require dirname(__DIR__) . '/constants.php';
  8. require LIB_PATH . '/lib_rss.php'; //Includes class autoloader
  9. require LIB_PATH . '/lib_install.php';
  10. require_once __DIR__ . '/CliOption.php';
  11. require_once __DIR__ . '/CliOptionsParser.php';
  12. Minz_Session::init('FreshRSS', true);
  13. FreshRSS_Context::initSystem();
  14. Minz_ExtensionManager::init();
  15. Minz_Translate::init(Minz_Translate::DEFAULT_LANGUAGE);
  16. FreshRSS_Context::$isCli = true;
  17. function fail(string $message, int $exitCode = 1): never {
  18. fwrite(STDERR, $message . "\n");
  19. die($exitCode);
  20. }
  21. function cliInitUser(string $username): string {
  22. if (!FreshRSS_user_Controller::checkUsername($username)) {
  23. fail('FreshRSS error: invalid username: ' . $username . "\n");
  24. }
  25. if (!FreshRSS_user_Controller::userExists($username)) {
  26. fail('FreshRSS error: user not found: ' . $username . "\n");
  27. }
  28. FreshRSS_Context::initUser($username);
  29. if (!FreshRSS_Context::hasUserConf()) {
  30. fail('FreshRSS error: invalid configuration for user: ' . $username . "\n");
  31. }
  32. $ext_list = FreshRSS_Context::userConf()->extensions_enabled;
  33. Minz_ExtensionManager::enableByList($ext_list, 'user');
  34. return $username;
  35. }
  36. function accessRights(): void {
  37. echo 'ℹ️ Remember to re-apply the appropriate access rights, such as:',
  38. "\t", 'sudo cli/access-permissions.sh', "\n";
  39. }
  40. function done(bool $ok = true): never {
  41. if (!$ok) {
  42. fwrite(STDERR, (isset($_SERVER['argv']) && is_array($_SERVER['argv']) && !empty($_SERVER['argv'][0]) && is_string($_SERVER['argv'][0]) ?
  43. basename($_SERVER['argv'][0]) : 'Process') . ' failed!' . "\n");
  44. }
  45. exit($ok ? 0 : 1);
  46. }
  47. function requirementStatus(string $key, string $status): string {
  48. if ($key === 'php') {
  49. return _t('install.check.' . $key . '.' . ($status === 'ok' ? 'ok' : 'nok'), PHP_VERSION, FRESHRSS_MIN_PHP_VERSION);
  50. }
  51. return _t('install.check.' . $key . '.' . ($status === 'ok' ? 'ok' : 'nok'));
  52. }
  53. function performRequirementCheck(string $databaseType): void {
  54. if (!in_array($databaseType, ['mysql', 'pgsql', 'sqlite'], true)) {
  55. fail('Invalid database type!');
  56. }
  57. $requirements = checkRequirements($databaseType);
  58. $message = '';
  59. if (in_array('warn', array_values($requirements), true)) {
  60. $message .= 'FreshRSS failed recommendations:' . "\n";
  61. foreach ($requirements as $requirement => $check) {
  62. if ($check === 'warn') {
  63. $message .= '⚠ ' . $requirement . ': ' . requirementStatus($requirement, $check) . "\n";
  64. }
  65. }
  66. $message .= "\n";
  67. }
  68. if ($requirements['all'] !== 'ok') {
  69. $message .= 'FreshRSS failed requirements:' . "\n";
  70. foreach ($requirements as $requirement => $check) {
  71. if ($check === 'ko' && !in_array($requirement, ['all'], true)) {
  72. $message .= '❌ ' . $requirement . ': ' . requirementStatus($requirement, $check) . "\n";
  73. }
  74. }
  75. fail($message);
  76. }
  77. $message = trim($message);
  78. if ($message !== '') {
  79. fwrite(STDERR, $message . "\n");
  80. }
  81. }