summaryrefslogtreecommitdiffstats
path: root/library/Director/Objects/IcingaScheduledDowntimeRange.php
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 12:43:12 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 12:43:12 +0000
commitcd989f9c3aff968e19a3aeabc4eb9085787a6673 (patch)
treefbff2135e7013f196b891bbde54618eb050e4aaf /library/Director/Objects/IcingaScheduledDowntimeRange.php
parentInitial commit. (diff)
downloadicingaweb2-module-director-cd989f9c3aff968e19a3aeabc4eb9085787a6673.tar.xz
icingaweb2-module-director-cd989f9c3aff968e19a3aeabc4eb9085787a6673.zip
Adding upstream version 1.10.2.upstream/1.10.2upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'library/Director/Objects/IcingaScheduledDowntimeRange.php')
-rw-r--r--library/Director/Objects/IcingaScheduledDowntimeRange.php88
1 files changed, 88 insertions, 0 deletions
diff --git a/library/Director/Objects/IcingaScheduledDowntimeRange.php b/library/Director/Objects/IcingaScheduledDowntimeRange.php
new file mode 100644
index 0000000..6280990
--- /dev/null
+++ b/library/Director/Objects/IcingaScheduledDowntimeRange.php
@@ -0,0 +1,88 @@
+<?php
+
+namespace Icinga\Module\Director\Objects;
+
+use Icinga\Module\Director\Data\Db\DbObject;
+
+class IcingaScheduledDowntimeRange extends DbObject
+{
+ protected $keyName = ['scheduled_downtime_id', 'range_key', 'range_type'];
+
+ protected $table = 'icinga_scheduled_downtime_range';
+
+ protected $defaultProperties = [
+ 'scheduled_downtime_id' => null,
+ 'range_key' => null,
+ 'range_value' => null,
+ 'range_type' => 'include',
+ 'merge_behaviour' => 'set',
+ ];
+
+ public function isActive($now = null)
+ {
+ if ($now === null) {
+ $now = time();
+ }
+
+ if (false === ($weekDay = $this->getWeekDay($this->get('range_key')))) {
+ // TODO, dates are not yet supported
+ return false;
+ }
+
+ if ((int) date('w', $now) !== $weekDay) {
+ return false;
+ }
+
+ $timeRanges = preg_split('/\s*,\s*/', $this->get('range_value'), -1, PREG_SPLIT_NO_EMPTY);
+ foreach ($timeRanges as $timeRange) {
+ if ($this->timeRangeIsActive($timeRange, $now)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ protected function timeRangeIsActive($rangeString, $now)
+ {
+ $hBegin = $mBegin = $hEnd = $mEnd = null;
+ if (sscanf($rangeString, '%2d:%2d-%2d:%2d', $hBegin, $mBegin, $hEnd, $mEnd) === 4) {
+ if ($this->timeFromHourMin($hBegin, $mBegin, $now) <= $now
+ && $this->timeFromHourMin($hEnd, $mEnd, $now) >= $now
+ ) {
+ return true;
+ }
+ } else {
+ // TODO: throw exception?
+ }
+
+ return false;
+ }
+
+ protected function timeFromHourMin($hour, $min, $now)
+ {
+ return strtotime(sprintf('%s %02d:%02d:00', date('Y-m-d', $now), $hour, $min));
+ }
+
+ protected function getWeekDay($day)
+ {
+ switch ($day) {
+ case 'sunday':
+ return 0;
+ case 'monday':
+ return 1;
+ case 'tuesday':
+ return 2;
+ case 'wednesday':
+ return 3;
+ case 'thursday':
+ return 4;
+ case 'friday':
+ return 5;
+ case 'saturday':
+ return 6;
+ }
+
+ return false;
+ }
+}