diff options
author | Jannik Schönartz | 2021-11-29 01:22:54 +0100 |
---|---|---|
committer | Jannik Schönartz | 2021-11-29 01:22:54 +0100 |
commit | a51f5cef0375973451807d2c4e0f17dc975fcd39 (patch) | |
tree | bb3acebddee09739011566465d6cceec3149c099 | |
parent | [statistics_reporting] Always send a minimal report (diff) | |
download | slx-admin-remote-edit-vm.tar.gz slx-admin-remote-edit-vm.tar.xz slx-admin-remote-edit-vm.zip |
[remoteaccess] Add support for remote edit (reservation and scp task trigger)remote-edit-vm
-rw-r--r-- | modules-available/remoteaccess/api.inc.php | 46 | ||||
-rw-r--r-- | modules-available/remoteaccess/install.inc.php | 28 |
2 files changed, 74 insertions, 0 deletions
diff --git a/modules-available/remoteaccess/api.inc.php b/modules-available/remoteaccess/api.inc.php index 859f5cfe..bebe0767 100644 --- a/modules-available/remoteaccess/api.inc.php +++ b/modules-available/remoteaccess/api.inc.php @@ -1,4 +1,50 @@ <?php +// Api call for reserving a client +if (Request::any('action') === 'reserve') { + $lectureid = Request::any('lectureid', '', 'string'); + $editid = Request::any('editid', '', 'string'); + $now = time(); + + // For now only considere pcs, that are already in the remote db and pc in idle state + //$client = Database::queryFirst("SELECT m.machineuuid, m.clientip, r.password, r.vncport FROM machine m INNER JOIN remoteaccess_machine r ON r.machineuuid = m.machineuuid WHERE m.currentsession IS NULL AND m.state = 'IDLE'"); + // Sometimes currentsession is not null while pc is in idle state ... bug? + $client = Database::queryFirst("SELECT m.machineuuid, m.clientip, r.password, r.vncport FROM machine m INNER JOIN remoteaccess_machine r ON r.machineuuid = m.machineuuid WHERE m.state = 'IDLE'"); + + // If there is a client reserve it + if ($client && $editid) { + Database::exec("UPDATE remoteaccess_machine SET timestamp=:now, lectureid=:lectureid, editid=:editid WHERE machineuuid=:machineuuid", ['now' => $now, 'lectureid' => $lectureid, 'editid' => $editid, 'machineuuid' => $client['machineuuid']]); + echo json_encode($client); + } else { + echo "Currently all machines are occupied, try again later!"; + } + + // Exit the call, so the rest doesn't get executed + exit(0); +} elseif (Request::any('action') === 'scp') { + // Start scp taskmanager task to download the qemu snapshot + $editid = Request::any('editid', '', 'string'); + $client = Database::queryFirst("SELECT m.machineuuid, m.clientip, r.editid, r.lectureid FROM machine m INNER JOIN remoteaccess_machine r ON r.machineuuid = m.machineuuid WHERE editid=:editid", ['editid' => $editid]); + + if (!$client) { + die("Invalid edit id"); + } + + // Check if client edit was allowed anyways. + // TODO does slx-admin even has the information if a user can edit a specific vm? + + // Start taskmanager task + $task = Taskmanager::submit('ScpSnapshot', array( + 'clientIp' => $client['clientip'], + 'editId' => $client['editid'], + 'lectureId' => $client['lectureid'], + )); + if (Taskmanager::isTask($task)) { + die(json_encode($task)); + } else { + die('Taskmanager could not start the task'); + } + exit(0); +} $ip = $_SERVER['REMOTE_ADDR']; if (substr($ip, 0, 7) === '::ffff:') $ip = substr($ip, 7); diff --git a/modules-available/remoteaccess/install.inc.php b/modules-available/remoteaccess/install.inc.php index 2e248282..1eeaf7e8 100644 --- a/modules-available/remoteaccess/install.inc.php +++ b/modules-available/remoteaccess/install.inc.php @@ -67,4 +67,32 @@ if (!tableHasColumn('remoteaccess_machine', 'vncport')) { $dbret[] = UPDATE_DONE; } + +// 2021-08-21: Add Columns for reserving clients +if (!tablehasColumn('remoteaccess_machine', 'lectureid')) { + $ret = Database::exec("ALTER TABLE remoteaccess_machine ADD COLUMN `lectureid` char(36)"); + if ($ret === false) { + finalResponse(UPDATE_FAILED, DATABASE::lastError()); + } + $dbret[] = UPDATE_DONE; +} + +// 2021-08-21: Timestamp to see when the client was reserved (timeout) +if (!tablehasColumn('remoteaccess_machine', 'timestamp')) { + $ret = Database::exec("ALTER TABLE remoteaccess_machine ADD COLUMN `timestamp` int unsigned"); + if ($ret === false) { + finalResponse(UPDATE_FAILED, DATABASE::lastError()); + } + $dbret[] = UPDATE_DONE; +} + +// 2021-11-27: Add column for an edit session id +if (!tablehasColumn('remoteaccess_machine', 'editid')) { + $ret = Database::exec("ALTER TABLE remoteaccess_machine ADD COLUMN `editid` char(36)"); + if ($ret === false) { + finalResponse(UPDATE_FAILED, DATABASE::lastError()); + } + $dbret[] = UPDATE_DONE; +} + responseFromArray($dbret); |