125 lines
No EOL
4 KiB
PHP
125 lines
No EOL
4 KiB
PHP
<?php
|
|
|
|
namespace OCA\GroupfolderFilesystemSnapshots\Manager;
|
|
|
|
use OCP\IL10N;
|
|
|
|
use OCA\GroupfolderFilesystemSnapshots\Manager\PathManager;
|
|
use OCA\GroupfolderFilesystemSnapshots\Service\SettingsService;
|
|
use OCA\GroupfolderFilesystemSnapshots\Entity\Snapshot;
|
|
|
|
class SnapshotManager {
|
|
private string $snapshotNamingScheme = "";
|
|
|
|
public function __construct(
|
|
protected readonly IL10N $l10n,
|
|
private readonly PathManager $pathManager,
|
|
private readonly SettingsService $settingsService,
|
|
){
|
|
$this->snapshotNamingScheme = $this->settingsService->getAppValue("snapshot_naming_scheme");
|
|
}
|
|
|
|
private function validSnapshotId(string $snapshotId) {
|
|
return (preg_match("/^[a-zA-Z0-9-_]+$/", $snapshotId) == 1);
|
|
}
|
|
|
|
function snapshotExists(string $snapshotId): bool {
|
|
if($this->validSnapshotId($snapshotId)) {
|
|
$path = $this->pathManager->getSnapshotPath($snapshotId);
|
|
return (file_exists($path) && is_dir($path));
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
private function createSnapshotEntity(string $id): Snapshot {
|
|
if ($this->snapshotNamingScheme === "zfs-auto-snapshot" && str_starts_with($id, "zfs-auto-snap")) {
|
|
if (str_starts_with($id, "zfs-auto-snap_hourly-")) {
|
|
$name = $this->l10n->t("Automated hourly backup");
|
|
$datetimestring = str_replace("zfs-auto-snap_hourly-", "", $id);
|
|
} elseif (str_starts_with($id, "zfs-auto-snap_daily-")) {
|
|
$name = $this->l10n->t("Automated daily backup");
|
|
$datetimestring = str_replace("zfs-auto-snap_daily-", "", $id);
|
|
} elseif (str_starts_with($id, "zfs-auto-snap_weekly-")) {
|
|
$name = $this->l10n->t("Automated weekly backup");
|
|
$datetimestring = str_replace("zfs-auto-snap_weekly-", "", $id);
|
|
} elseif (str_starts_with($id, "zfs-auto-snap_monthly-")) {
|
|
$name = $this->l10n->t("Automated monthly backup");
|
|
$datetimestring = str_replace("zfs-auto-snap_monthly-", "", $id);
|
|
}
|
|
|
|
if(isset($datetimestring)) {
|
|
$datetimearray = explode("-", $datetimestring);
|
|
$timestring = array_pop($datetimearray);
|
|
|
|
$year = (int)$datetimearray[0];
|
|
$month = (int)$datetimearray[1];
|
|
$day = (int)$datetimearray[2];
|
|
$hour = (int)substr($timestring, 0, 2);
|
|
$minute = (int)substr($timestring, 2, 2);
|
|
|
|
$createdTimestamp = (new \DateTimeImmutable())
|
|
->setDate($year, $month, $day)
|
|
->setTime($hour, $minute);
|
|
}
|
|
|
|
return new Snapshot(
|
|
id: $id,
|
|
name: $name ?: $id,
|
|
createdTimestamp: $createdTimestamp,
|
|
);
|
|
} else {
|
|
return new Snapshot(
|
|
id: $id,
|
|
name: $id,
|
|
);
|
|
}
|
|
}
|
|
|
|
function get(string $snapshotId) {
|
|
if(self::snapshotExists($snapshotId)) {
|
|
return $this->createSnapshotEntity($snapshotId);
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function getAll(): array {
|
|
$snapshots = [];
|
|
|
|
$iterator = new \FilesystemIterator($this->pathManager->getFilesystemSnapshotsPath());
|
|
|
|
foreach ($iterator as $fileinfo) {
|
|
if(!$fileinfo->isDir()) continue;
|
|
$snapshots[] = $this->createSnapshotEntity($fileinfo->getFilename());
|
|
}
|
|
|
|
return $snapshots;
|
|
}
|
|
|
|
function getAllGenerator(){
|
|
$iterator = new \FilesystemIterator($this->pathManager->getFilesystemSnapshotsPath());
|
|
|
|
foreach ($iterator as $fileinfo) {
|
|
if(!$fileinfo->isDir()) continue;
|
|
yield $this->createSnapshotEntity($fileinfo->getFilename());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @var $subPathFilter Only return snapshots that have this subfolder in the specified groupfolder
|
|
*/
|
|
function getFilteredGenerator(int $groupfolderId, string $subDirectoryFilter) {
|
|
$iterator = new \FilesystemIterator($this->pathManager->getFilesystemSnapshotsPath());
|
|
|
|
$groupfolderSubdirectoryPath = $this->pathManager->getGroupFolderDirectory($groupfolderId, $subDirectoryFilter);
|
|
|
|
foreach ($iterator as $fileinfo) {
|
|
if(!$fileinfo->isDir()) continue;
|
|
$snapshotId = $fileinfo->getFilename();
|
|
$filterFullPath = $this->pathManager->convertToSnapshotPath($groupfolderSubdirectoryPath, $snapshotId);
|
|
if(!(is_dir($filterFullPath))) continue;
|
|
yield $this->createSnapshotEntity($snapshotId);
|
|
}
|
|
}
|
|
} |