From 29bcd8704d1abcfc20fc35b38acd18c08027a669 Mon Sep 17 00:00:00 2001 From: Thibault Dockx <thibault.dockx@fusiondirectory.org> Date: Tue, 18 Apr 2023 17:54:49 +0100 Subject: [PATCH] :ambulance: Fix(Snapshots) error reported by AT Fixes error reported by Automated Test. --- .../snapshot/class_SnapshotCreateDialog.inc | 6 +- .../snapshot/class_SnapshotHandler.inc | 65 +++++++++++-------- 2 files changed, 44 insertions(+), 27 deletions(-) diff --git a/include/management/snapshot/class_SnapshotCreateDialog.inc b/include/management/snapshot/class_SnapshotCreateDialog.inc index b8f7d50b8..7860e00e6 100644 --- a/include/management/snapshot/class_SnapshotCreateDialog.inc +++ b/include/management/snapshot/class_SnapshotCreateDialog.inc @@ -91,7 +91,11 @@ class SnapshotCreateDialog extends ManagementDialog public function getLdapRecordedDataSources () : array { global $config; - $recordedDataSources = $config->current['SNAPSHOTSOURCEDATA']; + + $recordedDataSources = []; + if (isset($config->current['SNAPSHOTSOURCEDATA']) && !empty($config->current['SNAPSHOTSOURCEDATA'])) { + $recordedDataSources = $config->current['SNAPSHOTSOURCEDATA']; + } return $recordedDataSources; } diff --git a/include/management/snapshot/class_SnapshotHandler.inc b/include/management/snapshot/class_SnapshotHandler.inc index 130552e4a..364932e08 100644 --- a/include/management/snapshot/class_SnapshotHandler.inc +++ b/include/management/snapshot/class_SnapshotHandler.inc @@ -290,37 +290,50 @@ class SnapshotHandler { global $config; - $snapMinRetention = $config->current['SNAPSHOTMINRETENTION']; - $snapRetentionDays = $config->current['SNAPSHOTRETENTIONDAYS']; + // In case the snap configuration has not set any numbers + if (isset($config->current['SNAPSHOTMINRETENTION']) && !empty($config->current['SNAPSHOTMINRETENTION'])) { + $snapMinRetention = $config->current['SNAPSHOTMINRETENTION']; + } else { + $snapMinRetention = 0; + } + + if (isset($config->current['SNAPSHOTRETENTIONDAYS']) && !empty($config->current['SNAPSHOTRETENTIONDAYS'])) { + $snapRetentionDays = $config->current['SNAPSHOTRETENTIONDAYS']; + } else { + $snapRetentionDays = -1; + } // 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']; + if ($snapRetentionDays !== 1) { + $todayMinusRetention = time() - ($snapRetentionDays * 24 * 60 * 60); + $snapDateToDelete = strtotime(date('Y-m-d H:i:s', $todayMinusRetention)); + + $dnSnapshotsList = $this->getSnapshots($dn, TRUE); + $snapToDelete = []; + $snapCount = 0; + + // Generate an arrays with snapshot to delete due to overdate. + 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]); + // 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]); + } } } } -- GitLab