summaryrefslogtreecommitdiff
path: root/cli
diff options
context:
space:
mode:
Diffstat (limited to 'cli')
-rw-r--r--cli/README.md8
-rwxr-xr-xcli/db-backup.php20
-rwxr-xr-xcli/db-restore.php65
3 files changed, 93 insertions, 0 deletions
diff --git a/cli/README.md b/cli/README.md
index 1ce70b5c1..366f456d5 100644
--- a/cli/README.md
+++ b/cli/README.md
@@ -121,6 +121,14 @@ cd /usr/share/FreshRSS
```sh
cd /usr/share/FreshRSS
+./cli/db-backup.php
+# Back-up all users respective database to `data/users/*/backup.sqlite`
+
+./cli/db-restore.php --delete-backup --force-overwrite
+# Restore all users respective database from `data/users/*/backup.sqlite`
+# --delete-backup: delete `data/users/*/backup.sqlite` after successful import
+# --force-overwrite: will clear the users respective database before import
+
./cli/db-optimize.php --user username
# Optimize database (reduces the size) for a given user (perform `OPTIMIZE TABLE` in MySQL, `VACUUM` in SQLite)
```
diff --git a/cli/db-backup.php b/cli/db-backup.php
new file mode 100755
index 000000000..290b5cc7b
--- /dev/null
+++ b/cli/db-backup.php
@@ -0,0 +1,20 @@
+#!/usr/bin/env php
+<?php
+declare(strict_types=1);
+require(__DIR__ . '/_cli.php');
+
+performRequirementCheck(FreshRSS_Context::systemConf()->db['type'] ?? '');
+$ok = true;
+
+foreach (listUsers() as $username) {
+ $username = cliInitUser($username);
+ $filename = DATA_PATH . '/users/' . $username . '/backup.sqlite';
+ @unlink($filename);
+
+ echo 'FreshRSS backup database to SQLite for user “', $username, "”…\n";
+
+ $databaseDAO = FreshRSS_Factory::createDatabaseDAO($username);
+ $ok &= $databaseDAO->dbCopy($filename, FreshRSS_DatabaseDAO::SQLITE_EXPORT);
+}
+
+done((bool)$ok);
diff --git a/cli/db-restore.php b/cli/db-restore.php
new file mode 100755
index 000000000..6ea6f4a7d
--- /dev/null
+++ b/cli/db-restore.php
@@ -0,0 +1,65 @@
+#!/usr/bin/env php
+<?php
+declare(strict_types=1);
+require(__DIR__ . '/_cli.php');
+
+performRequirementCheck(FreshRSS_Context::systemConf()->db['type'] ?? '');
+
+$cliOptions = new class extends CliOptionsParser {
+ public string $deleteBackup;
+ public string $forceOverwrite;
+
+ public function __construct() {
+ $this->addOption('deleteBackup', (new CliOption('delete-backup'))->withValueNone());
+ $this->addOption('forceOverwrite', (new CliOption('force-overwrite'))->withValueNone());
+ parent::__construct();
+ }
+};
+
+if (!empty($cliOptions->errors)) {
+ fail('FreshRSS error: ' . array_shift($cliOptions->errors) . "\n" . $cliOptions->usage);
+}
+
+FreshRSS_Context::initSystem(true);
+Minz_User::change(Minz_User::INTERNAL_USER);
+$ok = false;
+try {
+ $error = initDb();
+ if ($error != '') {
+ $_SESSION['bd_error'] = $error;
+ } else {
+ $ok = true;
+ }
+} catch (Exception $ex) {
+ $_SESSION['bd_error'] = $ex->getMessage();
+}
+if (!$ok) {
+ fail('FreshRSS database error: ' . (empty($_SESSION['bd_error']) ? 'Unknown error' : $_SESSION['bd_error']));
+}
+
+foreach (listUsers() as $username) {
+ $username = cliInitUser($username);
+ $filename = DATA_PATH . "/users/{$username}/backup.sqlite";
+ if (!file_exists($filename)) {
+ fwrite(STDERR, "FreshRSS SQLite backup not found for user “{$username}”!\n");
+ $ok = false;
+ continue;
+ }
+
+ echo 'FreshRSS restore database from SQLite for user “', $username, "”…\n";
+
+ $databaseDAO = FreshRSS_Factory::createDatabaseDAO($username);
+ $clearFirst = isset($cliOptions->forceOverwrite);
+ $ok &= $databaseDAO->dbCopy($filename, FreshRSS_DatabaseDAO::SQLITE_IMPORT, $clearFirst);
+ if ($ok) {
+ if (isset($cliOptions->deleteBackup)) {
+ unlink($filename);
+ }
+ } else {
+ fwrite(STDERR, "FreshRSS database already exists for user “{$username}”!\n");
+ fwrite(STDERR, "If you would like to clear the user database first, use the option --force-overwrite\n");
+ }
+ invalidateHttpCache($username);
+}
+
+done((bool)$ok);