From dc516c24685518b41bcce0751caf286dc65e471f Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Wed, 17 Mar 2021 15:39:55 +0100 Subject: [locations/rebootcontrol] Change ENUM constants; display next event --- modules-available/rebootcontrol/hooks/cron.inc.php | 8 +++++--- modules-available/rebootcontrol/inc/scheduler.inc.php | 16 ++++++++++------ modules-available/rebootcontrol/install.inc.php | 15 +++++++++++---- 3 files changed, 26 insertions(+), 13 deletions(-) (limited to 'modules-available/rebootcontrol') diff --git a/modules-available/rebootcontrol/hooks/cron.inc.php b/modules-available/rebootcontrol/hooks/cron.inc.php index 56446c49..c1136c98 100644 --- a/modules-available/rebootcontrol/hooks/cron.inc.php +++ b/modules-available/rebootcontrol/hooks/cron.inc.php @@ -27,12 +27,14 @@ while ($row = $res->fetch(PDO::FETCH_ASSOC)) { $machines = Database::queryAll("SELECT machineuuid, clientip, macaddr, locationid FROM machine WHERE locationid = :locid", ['locid' => $row['locationid']]); - if ($row['action'] === 'sd') { + if ($row['action'] === Scheduler::SHUTDOWN) { RebootControl::execute($machines, RebootControl::SHUTDOWN, 0); - } elseif ($row['action'] === 'wol') { + } elseif ($row['action'] === Scheduler::WOL) { RebootControl::wakeMachines($machines); - } elseif ($row['action'] === 'rb') { + } elseif ($row['action'] === Scheduler::REBOOT) { RebootControl::execute($machines, RebootControl::REBOOT, 0); + } else { + EventLog::warning("Invalid action '{$row['action']}' in schedule for location " . $row['locationid']); } } diff --git a/modules-available/rebootcontrol/inc/scheduler.inc.php b/modules-available/rebootcontrol/inc/scheduler.inc.php index 613fbbee..45aedcc1 100644 --- a/modules-available/rebootcontrol/inc/scheduler.inc.php +++ b/modules-available/rebootcontrol/inc/scheduler.inc.php @@ -3,6 +3,10 @@ class Scheduler { + const SHUTDOWN = 'SHUTDOWN'; + const REBOOT = 'REBOOT'; + const WOL = 'WOL'; + public static function updateSchedule($locationid, $options, $openingTimes) { if (empty($openingTimes)) { @@ -57,11 +61,11 @@ class Scheduler foreach ($openingTimes as $row) { foreach ($row['days'] as $day) { if ($options['wol']) { - $events[] = ['action' => 'wol', + $events[] = ['action' => self::WOL, 'time' => self::calculateTimestamp($now, $day, $row['openingtime'])]; } if ($options['sd']) { - $events[] = ['action' => 'sd', + $events[] = ['action' => self::SHUTDOWN, 'time' => self::calculateTimestamp($now, $day, $row['closingtime'])]; } } @@ -75,9 +79,9 @@ class Scheduler $prev = PHP_INT_MAX; for ($i = count($events) - 1; $i >= 0; --$i) { $event =& $events[$i]; - if ($event['action'] === 'wol') { + if ($event['action'] === self::WOL) { $event['time'] -= $wolOffset; - } elseif ($event['action'] === 'sd') { + } elseif ($event['action'] === self::SHUTDOWN) { $event['time'] += $sdOffset; } else { error_log('BUG Unhandled event type ' . $event['action']); @@ -102,9 +106,9 @@ class Scheduler // If difference to next event is < 5 min, ignore. continue; } - if ($diff < 900 && $event['action'] === 'sd' && $events[$i + 1]['action'] === 'wol') { + if ($diff < 900 && $event['action'] === self::SHUTDOWN && $events[$i + 1]['action'] === self::WOL) { // If difference to next WOL is < 15 min and this is a shutdown, reboot instead. - $res['action'] = 'rb'; + $res['action'] = self::REBOOT; $res['time'] = $event['time']; } else { // Use first event. diff --git a/modules-available/rebootcontrol/install.inc.php b/modules-available/rebootcontrol/install.inc.php index f400129e..d45a2443 100644 --- a/modules-available/rebootcontrol/install.inc.php +++ b/modules-available/rebootcontrol/install.inc.php @@ -39,7 +39,7 @@ $output[] = tableCreate('reboot_subnet_x_subnet', " $output[] = tableCreate('reboot_scheduler', " `locationid` INT(11) NOT NULL, - `action` ENUM('wol', 'sd', 'rb'), + `action` ENUM('WOL', 'SHUTDOWN', 'REBOOT'), `nextexecution` INT(10) UNSIGNED NOT NULL DEFAULT 0, `options` BLOB, PRIMARY KEY (`locationid`)"); @@ -60,9 +60,16 @@ if (tableColumnKeyType('reboot_scheduler', 'action') === 'PRI') { $res = Database::exec("ALTER TABLE `reboot_scheduler` DROP PRIMARY KEY, ADD PRIMARY KEY (`locationid`)"); $output[] = $res !== false ? UPDATE_DONE : UPDATE_FAILED; } -if (strpos(tableColumnType('reboot_scheduler', 'action'), 'rb') === false) { - $res = Database::exec("ALTER TABLE `reboot_scheduler` MODIFY COLUMN `action` ENUM('wol', 'sd', 'rb')"); - $output[] = $res !== false ? UPDATE_DONE : UPDATE_FAILED; +if (strpos(tableColumnType('reboot_scheduler', 'action'), 'REBOOT') === false) { + // Fiddle with column to rename ENUM values + $res = Database::exec("ALTER TABLE `reboot_scheduler` MODIFY COLUMN `action` ENUM('sd', 'rb', 'WOL', 'SHUTDOWN', 'REBOOT')"); + handleUpdateResult($res); + $res = Database::exec("UPDATE reboot_scheduler SET action = + CASE WHEN action = 'sd' THEN 'SHUTDOWN' WHEN action = 'rb' THEN 'REBOOT' ELSE 'WOL' END"); + handleUpdateResult($res); + $res = Database::exec("ALTER TABLE `reboot_scheduler` MODIFY COLUMN `action` ENUM('WOL', 'SHUTDOWN', 'REBOOT')"); + handleUpdateResult($res); + $output[] = UPDATE_DONE; } -- cgit v1.2.3-55-g7522