aboutsummaryrefslogtreecommitdiffstats
path: root/core/BackgroundJobs/BackgroundCleanupUpdaterBackupsJob.php
diff options
context:
space:
mode:
Diffstat (limited to 'core/BackgroundJobs/BackgroundCleanupUpdaterBackupsJob.php')
-rw-r--r--core/BackgroundJobs/BackgroundCleanupUpdaterBackupsJob.php84
1 files changed, 84 insertions, 0 deletions
diff --git a/core/BackgroundJobs/BackgroundCleanupUpdaterBackupsJob.php b/core/BackgroundJobs/BackgroundCleanupUpdaterBackupsJob.php
new file mode 100644
index 00000000000..d1ecc08ca4b
--- /dev/null
+++ b/core/BackgroundJobs/BackgroundCleanupUpdaterBackupsJob.php
@@ -0,0 +1,84 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OC\Core\BackgroundJobs;
+
+use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\BackgroundJob\QueuedJob;
+use OCP\Files;
+use OCP\IConfig;
+use Psr\Log\LoggerInterface;
+
+class BackgroundCleanupUpdaterBackupsJob extends QueuedJob {
+ public function __construct(
+ protected IConfig $config,
+ protected LoggerInterface $log,
+ ITimeFactory $time,
+ ) {
+ parent::__construct($time);
+ }
+
+ /**
+ * This job cleans up all backups except the latest 3 from the updaters backup directory
+ *
+ * @param array $argument
+ */
+ public function run($argument): void {
+ $this->log->info('Running background job to clean-up outdated updater backups');
+
+ $updateDir = $this->config->getSystemValue('updatedirectory', null) ?? $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data');
+ $instanceId = $this->config->getSystemValue('instanceid', null);
+
+ if (!is_string($instanceId) || empty($instanceId)) {
+ $this->log->error('Skipping updater backup clean-up - instanceId is missing!');
+ return;
+ }
+
+ $updaterFolderPath = $updateDir . '/updater-' . $instanceId;
+ $backupFolderPath = $updaterFolderPath . '/backups';
+ if (file_exists($backupFolderPath)) {
+ $this->log->debug("Updater backup folder detected: $backupFolderPath");
+
+ $dirList = [];
+ $dirs = new \DirectoryIterator($backupFolderPath);
+ foreach ($dirs as $dir) {
+ // skip files and dot dirs
+ if ($dir->isFile() || $dir->isDot()) {
+ continue;
+ }
+
+ $mtime = $dir->getMTime();
+ $realPath = $dir->getRealPath();
+
+ if ($realPath === false) {
+ $pathName = $dir->getPathname();
+ $this->log->warning("Skipping updater backup folder: $pathName (not found)");
+ continue;
+ }
+
+ $dirList[$mtime] = $realPath;
+ }
+
+ ksort($dirList);
+ // drop the newest 3 directories
+ $dirList = array_slice($dirList, 0, -3);
+ $this->log->debug('Updater backup folders that will be deleted: ' . json_encode($dirList));
+
+ foreach ($dirList as $dir) {
+ $this->log->info("Removing $dir ...");
+ $result = Files::rmdirr($dir);
+ if (!$result) {
+ $this->log->error('Could not remove updater backup folder $dir');
+ }
+ }
+ $this->log->info('Background job to clean-up updater backups has finished');
+ } else {
+ $this->log->warning("Skipping updater backup clean-up - could not find updater backup folder $backupFolderPath");
+ }
+ }
+}