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); } } }