From 6a4c343b03a8b79bcfb29cd7f9c1ca4ad4e43e3d Mon Sep 17 00:00:00 2001 From: Anonymous Contributor Date: Mon, 11 Sep 2023 06:04:30 +0200 Subject: [PATCH] Optimize IarMonitor --- app/cron/IarMonitor.php | 91 ++++++++++++++++++++++++++----------- app/opensim/RestConsole.php | 9 ++++ 2 files changed, 73 insertions(+), 27 deletions(-) diff --git a/app/cron/IarMonitor.php b/app/cron/IarMonitor.php index d6d6344..209cc80 100644 --- a/app/cron/IarMonitor.php +++ b/app/cron/IarMonitor.php @@ -9,6 +9,10 @@ use Mcp\Util\Util; class IarMonitor extends CronJob { + + private ?RestConsole $console; + private bool $consoleAvailable = true; + public function __construct(\Mcp\Mcp $app) { parent::__construct($app, Frequency::EACH_MINUTE); @@ -17,45 +21,57 @@ class IarMonitor extends CronJob public function run(): bool { $opensim = new OpenSim($this->app->db()); + + $dirPath = $this->app->getDataDir().DIRECTORY_SEPARATOR.'iars'; + if (!is_dir($dirPath)) { + mkdir($dirPath); + } - $statement = $this->app->db()->prepare("SELECT userID,iarfilename,filesize,state,created FROM mcp_iar_state WHERE state < ?"); + $statement = $this->app->db()->prepare("SELECT userID,iarfilename,filesize,state FROM mcp_iar_state WHERE state < ?"); $statement->execute([2]); - - while ($row = $statement->fetch()) { - if ($row['state'] == 0) { // 0 - Request to OS pending - $name = explode(' ', $opensim->getUserName($row['userID'])); - - $restCfg = $this->app->config('restconsole'); - $restConsole = new RestConsole($restCfg['host'], intval($restCfg['port'])); - if ($restConsole->startSession($restCfg['user'], $restCfg['password']) && $restConsole->sendCommand('save iar '.$name[0].' '.$name[1].' /* password '.$restCfg['os-iar-path'].$row['iarfilename'])) { - $statementUpdate = $this->app->db()->prepare('UPDATE mcp_iar_state SET state = ? WHERE userID = ?'); - $statementUpdate->execute([1, $row['userID']]); - } - } elseif ($row['state'] == 1) { // 1 - IAR Creation in progress - $fullFilePath = $this->app->getDataDir().DIRECTORY_SEPARATOR.'iars'.DIRECTORY_SEPARATOR.$row['iarfilename']; - if (file_exists($fullFilePath)) { - $filesize = filesize($fullFilePath); - - if ($filesize != $row['filesize']) { - $statementUpdate = $this->app->db()->prepare('UPDATE mcp_iar_state SET filesize = ? WHERE userID = ?'); - $statementUpdate->execute([$filesize, $row['userID']]); - } else { - $statementUpdate = $this->app->db()->prepare('UPDATE mcp_iar_state SET state = ?, created = ? WHERE userID = ?'); - $statementUpdate->execute([2, time(), $row['userID']]); - - Util::sendInworldIM("00000000-0000-0000-0000-000000000000", $row['userID'], "Inventory", $this->app->config('grid')['homeurl'], "Deine IAR ist fertig zum Download: https://".$this->app->config('domain').'/iars/'.$row['iarfilename']); + + if ($statement->rowCount() > 0) { + while ($row = $statement->fetch()) { + if ($row['state'] == 0) { // 0 - Request to OS pending + if ($this->console() === false) { + continue; + } + + $name = explode(' ', $opensim->getUserName($row['userID'])); + if ($this->console()->sendCommand('save iar '.$name[0].' '.$name[1].' /* password '.$this->app->config('iarfetcher')['os-iar-path'].$row['iarfilename'])) { + $statementUpdate = $this->app->db()->prepare('UPDATE mcp_iar_state SET state = ? WHERE userID = ?'); + $statementUpdate->execute([1, $row['userID']]); + } + } elseif ($row['state'] == 1) { // 1 - IAR Creation in progress + $fullFilePath = $dirPath.DIRECTORY_SEPARATOR.$row['iarfilename']; + if (file_exists($fullFilePath)) { + $filesize = filesize($fullFilePath); + + if ($filesize != $row['filesize']) { + $statementUpdate = $this->app->db()->prepare('UPDATE mcp_iar_state SET filesize = ? WHERE userID = ?'); + $statementUpdate->execute([$filesize, $row['userID']]); + } else { + $statementUpdate = $this->app->db()->prepare('UPDATE mcp_iar_state SET state = ?, created = ? WHERE userID = ?'); + $statementUpdate->execute([2, time(), $row['userID']]); + + Util::sendInworldIM("00000000-0000-0000-0000-000000000000", $row['userID'], "Inventory", $this->app->config('grid')['homeurl'], "Deine IAR ist fertig zum Download: https://".$this->app->config('domain').'/index.php?api=downloadIar&id='.substr($row['iarfilename'], 0, strlen($row['iarfilename']) - 4)); + } } } } - } + if ($this->consoleAvailable) { + $this->console->closeSession(); + } + } + // 2 - IAR creation finished; delete if expired $weekOld = time() - 604800; $statementExpired = $this->app->db()->prepare('SELECT userID,iarfilename FROM mcp_iar_state WHERE state = ? AND created < ?'); $statementExpired->execute([2, $weekOld]); $statementDeleteExpired = $this->app->db()->prepare('DELETE FROM mcp_iar_state WHERE state = ? AND userID = ?'); while ($row = $statementExpired->fetch()) { - $fullFilePath = $this->app->getDataDir().DIRECTORY_SEPARATOR.'iars'.DIRECTORY_SEPARATOR.$row['iarfilename']; + $fullFilePath = $dirPath.DIRECTORY_SEPARATOR.$row['iarfilename']; if (file_exists($fullFilePath) && unlink($fullFilePath)) { $statementDeleteExpired->execute([2, $row['userID']]); } @@ -63,4 +79,25 @@ class IarMonitor extends CronJob return true; } + + private function console(): RestConsole|bool + { + if (!$this->consoleAvailable) { + return false; + } + + if ($this->console == null) { + $restCfg = $this->app->config('iarfetcher'); + $console = new RestConsole($restCfg['host'], intval($restCfg['port'])); + if ($console->startSession($restCfg['user'], $restCfg['password'])) { + $this->console = $console; + } + else { + $this->consoleAvailable = false; + return false; + } + } + + return $this->console; + } } diff --git a/app/opensim/RestConsole.php b/app/opensim/RestConsole.php index 3c9ec40..1537cdb 100644 --- a/app/opensim/RestConsole.php +++ b/app/opensim/RestConsole.php @@ -31,6 +31,15 @@ class RestConsole return true; } + public function closeSession(): void + { + $response = $this->sendRequest('/CloseSession/', [ + 'ID' => $this->sessionId + ]); + + $this->detectError($response, '/CloseSession/'); + } + public function readResponses(): array { if ($this->sessionId == null) {