From 7be80e61e939de72b4e228b7406f11c0028c3a86 Mon Sep 17 00:00:00 2001 From: Thibault Dockx <thibault.dockx@fusiondirectory.org> Date: Thu, 13 Apr 2023 19:54:30 +0100 Subject: [PATCH] :sparkles: Feat(Snapshot) - automatic removal of snaps. Automatic removal of snapshots for users is now operational. --- .../snapshot/class_SnapshotHandler.inc | 43 +++++++++++++++++++ plugins/personal/generic/class_user.inc | 2 +- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/include/management/snapshot/class_SnapshotHandler.inc b/include/management/snapshot/class_SnapshotHandler.inc index 371671ca9..aa6119552 100644 --- a/include/management/snapshot/class_SnapshotHandler.inc +++ b/include/management/snapshot/class_SnapshotHandler.inc @@ -284,6 +284,48 @@ class SnapshotHandler logging::log('snapshot', 'create', $new_dn, array_keys($target), $ldap->get_error()); } + // function verifing the configuration retention for snapshots. + // Remove snapshots from the user if retention rules approves. + public function verifySnapshotRetention (string $dn) : void + { + global $config; + + $snapMinRetention = $config->current['SNAPSHOTMINRETENTION']; + $snapRetentionDays = $config->current['SNAPSHOTRETENTIONDAYS']; + + // calculate the epoch date on which snaps can be delete. + $todayMinusRetention = time() - ($snapRetentionDays * 24 * 60 * 60); + $snapDateToDelete = strtotime(date('Y-m-d H:i:s', $todayMinusRetention)); + + $dnSnapshotsList = $this->getSnapshots($dn, TRUE); + $snapToDelete = []; + $snapCount = 0; + + if (isset($dnSnapshotsList) && !empty($dnSnapshotsList)) { + foreach ($dnSnapshotsList as $snap) { + $snapCount += 1; + // let's keep seconds instead of nanosecs + $snapEpoch = preg_split('/-/', $snap['gosaSnapshotTimestamp'][0]); + if ($snapEpoch[0] < $snapDateToDelete) { + $snapToDelete[] = $snap['dn']; + } + } + } + + // The not empty is not mandatory but is more ressource friendly + if (!empty($snapToDelete) && ($snapCount > $snapMinRetention)) { + $snapToKeep = $snapCount - $snapMinRetention; + // Sort snapToDelete by old first DN timestamp is the only thing different. + sort($snapToDelete); + for ($i = 0; $i < $snapToKeep; $i++) { + // not empty required because array keeps on being iterated even if NULL object. + if (!empty($snapToDelete[$i])) { + $this->removeSnapshot($snapToDelete[$i]); + } + } + } + } + /*! * \brief Remove a snapshot * @@ -291,6 +333,7 @@ class SnapshotHandler */ function removeSnapshot ($dn) { + error_log($dn); global $config; $ldap = $config->get_ldap_link(); $ldap->cd($config->current['BASE']); diff --git a/plugins/personal/generic/class_user.inc b/plugins/personal/generic/class_user.inc index 63bce7877..08f4f2053 100644 --- a/plugins/personal/generic/class_user.inc +++ b/plugins/personal/generic/class_user.inc @@ -400,9 +400,9 @@ class user extends simplePlugin { $snapshotHandler = new SnapshotHandler(); $snapshotHandler->createSnapshot($this->dn, 'automatic snapshot', 'USER', 'FD'); + $snapshotHandler->verifySnapshotRetention($this->dn); } - function adapt_from_template (array $attrs, array $skip = []) { if ($this->uid != '') { -- GitLab