$group]); } 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"); while ($row = $res->fetch(PDO::FETCH_ASSOC)) { if ($row['wolcount'] <= 0) continue; // This can't really be anything but a CSV list, but better be safe $locs = preg_replace('/[^0-9,]/', '', $row['locs']); if (empty($locs)) 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'"); $wantNum = $row['wolcount'] - (isset($active['cnt']) ? $active['cnt'] : 0); if ($wantNum <= 0) continue; self::tryWakeMachines($locs, $wantNum); } } private static function tryWakeMachines($locs, $num) { $res = Database::simpleQuery("SELECT m.machineuuid, m.macaddr, m.clientip FROM machine m LEFT JOIN remoteaccess_machine rm USING (machineuuid) WHERE m.locationid IN ($locs) AND m.state IN ('OFFLINE', 'STANDBY') ORDER BY rm.woltime ASC"); $NOW = time(); while ($num > 0) { $list = []; for ($i = 0; $i < $num && $row = $res->fetch(PDO::FETCH_ASSOC); ++$i) { $list[] = $row; Database::exec("INSERT INTO remoteaccess_machine (machineuuid, password, woltime) VALUES (:uuid, NULL, :now) ON DUPLICATE KEY UPDATE woltime = VALUES(woltime)", ['uuid' => $row['machineuuid'], 'now' => $NOW]); } if (empty($list)) break; // No more clients in this location error_log('Trying to wake ' . count($list) . " in $locs"); RebootControl::wakeMachines($list, $fails); $num -= count($list) - count($fails); if (!empty($fails)) { error_log(count($fails) . ' failed'); $failIds = ArrayUtil::flattenByKey($fails, 'machineuuid'); // Reduce time so they won't be marked as wol_in_progress Database::exec('UPDATE remoteaccess_machine SET woltime = :faketime WHERE machineuuid IN (:fails)', ['faketime' => $NOW - 95, 'fails' => $failIds]); } } if ($num > 0) { error_log("Could not wake $num clients..."); } } }