db-restore.php 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #!/usr/bin/env php
  2. <?php
  3. declare(strict_types=1);
  4. require(__DIR__ . '/_cli.php');
  5. performRequirementCheck(FreshRSS_Context::systemConf()->db['type'] ?? '');
  6. $cliOptions = new class extends CliOptionsParser {
  7. public string $deleteBackup;
  8. public string $forceOverwrite;
  9. public function __construct() {
  10. $this->addOption('deleteBackup', (new CliOption('delete-backup'))->withValueNone());
  11. $this->addOption('forceOverwrite', (new CliOption('force-overwrite'))->withValueNone());
  12. parent::__construct();
  13. }
  14. };
  15. if (!empty($cliOptions->errors)) {
  16. fail('FreshRSS error: ' . array_shift($cliOptions->errors) . "\n" . $cliOptions->usage);
  17. }
  18. FreshRSS_Context::initSystem(true);
  19. Minz_User::change(Minz_User::INTERNAL_USER);
  20. $ok = false;
  21. try {
  22. $error = initDb();
  23. if ($error != '') {
  24. $_SESSION['bd_error'] = $error;
  25. } else {
  26. $ok = true;
  27. }
  28. } catch (Exception $ex) {
  29. $_SESSION['bd_error'] = $ex->getMessage();
  30. }
  31. if (!$ok) {
  32. fail('FreshRSS database error: ' . (is_string($_SESSION['bd_error'] ?? null) ? $_SESSION['bd_error'] : 'Unknown error'));
  33. }
  34. foreach (listUsers() as $username) {
  35. $username = cliInitUser($username);
  36. $filename = DATA_PATH . "/users/{$username}/backup.sqlite";
  37. if (!file_exists($filename)) {
  38. fwrite(STDERR, "FreshRSS SQLite backup not found for user “{$username}”!\n");
  39. $ok = false;
  40. continue;
  41. }
  42. echo 'FreshRSS restore database from SQLite for user “', $username, "”…\n";
  43. $databaseDAO = FreshRSS_Factory::createDatabaseDAO($username);
  44. $clearFirst = isset($cliOptions->forceOverwrite);
  45. $ok &= $databaseDAO->dbCopy($filename, FreshRSS_DatabaseDAO::SQLITE_IMPORT, $clearFirst);
  46. if ($ok) {
  47. if (isset($cliOptions->deleteBackup)) {
  48. unlink($filename);
  49. }
  50. } else {
  51. fwrite(STDERR, "FreshRSS database already exists for user “{$username}”!\n");
  52. fwrite(STDERR, "If you would like to clear the user database first, use the option --force-overwrite\n");
  53. }
  54. invalidateHttpCache($username);
  55. }
  56. done((bool)$ok);