From 6635ff74f8266aa72f4243258561a5ae8d3915ac Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Mon, 29 Jun 2020 14:04:45 +0200 Subject: [remoteaccess] Fix/Improve WOL behavior Enable rebootcontrol module in ensureMachinesRunning(), so it works from the call in api.inc.php. Consider machines that we sent a WOL packet to during the last 90 seconds as online when counting number of idle machines, so slow booting machines won't cause us to wake too many machines. --- modules-available/remoteaccess/inc/remoteaccess.inc.php | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'modules-available/remoteaccess/inc/remoteaccess.inc.php') diff --git a/modules-available/remoteaccess/inc/remoteaccess.inc.php b/modules-available/remoteaccess/inc/remoteaccess.inc.php index fc719b37..37d33d45 100644 --- a/modules-available/remoteaccess/inc/remoteaccess.inc.php +++ b/modules-available/remoteaccess/inc/remoteaccess.inc.php @@ -19,11 +19,18 @@ class RemoteAccess public static function ensureMachinesRunning() { - $res = Database::simpleQuery("SELECT rg.groupid, rg.wolcount, GROUP_CONCAT(rxl.locationid) AS locs FROM remoteaccess_group rg - INNER JOIN remoteaccess_x_location rxl USING (groupid) - WHERE rg.active = 1 - GROUP BY groupid"); + if (!Module::isAvailable('rebootcontrol')) { + error_log("Not waking remote access machines: rebootcontrol missing"); + return; + } + + $res = Database::simpleQuery("SELECT rg.groupid, rg.groupname, rg.wolcount, GROUP_CONCAT(rxl.locationid) AS locs FROM remoteaccess_group rg + INNER JOIN remoteaccess_x_location rxl USING (groupid) + WHERE rg.active = 1 + GROUP BY groupid"); + // Consider machines we tried to wake in the past 90 seconds as online + $wolDeadline = time() - 90; while ($row = $res->fetch(PDO::FETCH_ASSOC)) { if ($row['wolcount'] <= 0) continue; @@ -33,7 +40,7 @@ class RemoteAccess continue; $active = Database::queryFirst("SELECT Count(*) AS cnt FROM machine m INNER JOIN remoteaccess_machine rm USING (machineuuid) - WHERE m.locationid IN ($locs) AND m.state = 'IDLE'"); + WHERE m.locationid IN ($locs) AND (m.state = 'IDLE' OR rm.woltime > $wolDeadline)"); $active = (isset($active['cnt']) ? $active['cnt'] : 0); $wantNum = $row['wolcount'] - $active; if ($wantNum <= 0) -- cgit v1.2.3-55-g7522