From b90c97b1f096008b5fa9abf8c50a120a85c47a4e Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Thu, 30 Nov 2017 18:30:01 +0100 Subject: [roomplanner] Refactor to use runmode --- .../roomplanner/inc/pvsgenerator.inc.php | 35 +++++++++++++++++- modules-available/roomplanner/install.inc.php | 43 +++++++++++++++------- modules-available/roomplanner/page.inc.php | 36 +++++++++++++++--- 3 files changed, 93 insertions(+), 21 deletions(-) (limited to 'modules-available/roomplanner') diff --git a/modules-available/roomplanner/inc/pvsgenerator.inc.php b/modules-available/roomplanner/inc/pvsgenerator.inc.php index d61e826b..43285057 100644 --- a/modules-available/roomplanner/inc/pvsgenerator.inc.php +++ b/modules-available/roomplanner/inc/pvsgenerator.inc.php @@ -189,7 +189,7 @@ class PvsGenerator private static function boundingBox($grid, &$minX, &$minY, &$maxX, &$maxY) { - $minX = PHP_INT_MAX; /* PHP_INT_MIN is only avaiable since PHP 7 */ + $minX = PHP_INT_MAX; /* PHP_INT_MIN is only available since PHP 7 */ $maxX = ~PHP_INT_MAX; $minY = PHP_INT_MAX; $maxY = ~PHP_INT_MAX; @@ -202,4 +202,37 @@ class PvsGenerator } } + public static function runmodeConfigHook($machineUuid, $locationId, $data) + { + if (!empty($data)) { + $data = json_decode($data, true); + } + if (!is_array($data)) { + $data = array(); + } + ConfigHolder::add("SLX_PVS_CONFIG_URL", 'http://' . $_SERVER['SERVER_ADDR'] . $_SERVER['SCRIPT_NAME'] . '?do=roomplanner'); + + if (isset($data['dedicatedmgr']) && $data['dedicatedmgr']) { + ConfigHolder::add("SLX_ADDONS", false, 100000); + ConfigHolder::add("SLX_PVS_DEDICATED", 'yes'); + ConfigHolder::add("SLX_EXAM", false, 100000); + //ConfigHolder::add("SLX_SYSTEMD_TARGET", 'pvs-dedicated', 100000); + } else { + ConfigHolder::add("SLX_PVS_HYBRID", 'yes'); + } + } + + /** + * Get display name for manager of given locationId. + * @param $locationId + * @return bool|string + */ + public static function getManagerName($locationId) + { + $names = Location::getNameChain($locationId); + if ($names === false) + return false; + return implode(' / ', $names); + } + } diff --git a/modules-available/roomplanner/install.inc.php b/modules-available/roomplanner/install.inc.php index a6d98384..13365fe1 100644 --- a/modules-available/roomplanner/install.inc.php +++ b/modules-available/roomplanner/install.inc.php @@ -6,7 +6,6 @@ $res = array(); $res[] = tableCreate('location_roomplan', " `locationid` INT(11) NOT NULL, `managerip` varchar(45) CHARACTER SET ascii DEFAULT '', - `dedicatedmgr` tinyint(1) NOT NULL DEFAULT 0, `tutoruuid` char(36) CHARACTER SET ascii DEFAULT NULL, `roomplan` BLOB DEFAULT NULL, PRIMARY KEY (`locationid`), @@ -29,24 +28,40 @@ if (!tableHasColumn('location_roomplan', 'tutoruuid')) { } $res[] = UPDATE_DONE; } -if (!tableHasColumn('location_roomplan', 'dedicatedmgr')) { - $ret = Database::exec("ALTER TABLE `location_roomplan` ADD `dedicatedmgr` tinyint(1) NOT NULL DEFAULT 0 AFTER `managerip`") !== false; - if ($ret === false) { - finalResponse(UPDATE_FAILED, 'Adding dedicatedmgr to location_roomplan failed: ' . Database::lastError()); - } - $res[] = UPDATE_DONE; -} if (in_array(UPDATE_DONE, $res)) { Database::exec("ALTER TABLE `location_roomplan` - ADD CONSTRAINT `location_roomplan_ibfk_1` FOREIGN KEY (`locationid`) REFERENCES `location` (`locationid`) ON DELETE CASCADE"); + ADD CONSTRAINT `location_roomplan_ibfk_1` FOREIGN KEY (`locationid`) REFERENCES `location` (`locationid`) ON DELETE CASCADE"); Database::exec("ALTER TABLE `location_roomplan` - ADD CONSTRAINT `location_roomplan_ibfk_2` FOREIGN KEY (`tutoruuid`) REFERENCES `machine` (`machineuuid`) ON DELETE SET NULL ON UPDATE CASCADE"); + ADD CONSTRAINT `location_roomplan_ibfk_2` FOREIGN KEY (`tutoruuid`) REFERENCES `machine` (`machineuuid`) ON DELETE SET NULL ON UPDATE CASCADE"); } -if (in_array(UPDATE_DONE, $res)) { - finalResponse(UPDATE_DONE, 'Table created successfully'); +// 2017-11-30: Refactor to runmode +// managerip, dedicatedmgr, --> runmode +if (tableHasColumn('location_roomplan', 'dedicatedmgr')) { + if (!tableExists('runmode') || !tableExists('machine')) { + $res[] = UPDATE_RETRY; + } else { + $ret = Database::simpleQuery('SELECT lr.locationid, lr.managerip, lr.dedicatedmgr, m.machineuuid + FROM location_roomplan lr INNER JOIN machine m ON (m.clientip = lr.managerip)'); + if ($ret === false) { + $res[] = UPDATE_FAILED; + } else { + while ($row = $ret->fetch(PDO::FETCH_ASSOC)) { + $dedi = $row['dedicatedmgr'] != 0; + $data = json_encode(array('dedicatedmgr' => $dedi)); + Database::exec("INSERT IGNORE INTO runmode (machineuuid, module, modeid, modedata, isclient) + VALUES (:machineuuid, 'roomplanner', :locationid, :modedata, :isclient)", array( + 'machineuuid' => $row['machineuuid'], + 'locationid' => $row['locationid'], + 'modedata' => $data, + 'isclient' => ($dedi ? 0 : 1) + )); + } + Database::exec('ALTER TABLE location_roomplan DROP COLUMN dedicatedmgr'); + $res[] = UPDATE_DONE; + } + } } -finalResponse(UPDATE_NOOP, 'Everything already up to date'); - +responseFromArray($res); diff --git a/modules-available/roomplanner/page.inc.php b/modules-available/roomplanner/page.inc.php index 4e36d3ba..71499caf 100644 --- a/modules-available/roomplanner/page.inc.php +++ b/modules-available/roomplanner/page.inc.php @@ -58,7 +58,17 @@ class Page_Roomplanner extends Page if ($this->action === 'show') { /* do nothing */ Dashboard::disable(); - $config = Database::queryFirst('SELECT roomplan, managerip, dedicatedmgr, tutoruuid FROM location_roomplan WHERE locationid = :locationid', ['locationid' => $this->locationid]); + $config = Database::queryFirst('SELECT roomplan, managerip, tutoruuid FROM location_roomplan WHERE locationid = :locationid', ['locationid' => $this->locationid]); + $runmode = RunMode::getForMode(Page::getModule(), $this->locationid, true); + if (empty($runmode)) { + $config['dedicatedmgr'] = false; + } else { + $runmode = array_pop($runmode); + $config['managerip'] = $runmode['clientip']; + $config['manageruuid'] = $runmode['machineuuid']; + $data = json_decode($runmode['modedata'], true); + $config['dedicatedmgr'] = (isset($data['dedicatedmgr']) && $data['dedicatedmgr']); + } if ($config !== false) { $managerIp = $config['managerip']; $dediMgr = $config['dedicatedmgr'] ? 'checked' : ''; @@ -207,16 +217,30 @@ class Page_Roomplanner extends Page protected function saveRoomConfig($furniture, $tutorUuid) { $obj = json_encode(['furniture' => $furniture]); - Database::exec('INSERT INTO location_roomplan (locationid, roomplan, managerip, tutoruuid, dedicatedmgr)' - . ' VALUES (:locationid, :roomplan, :managerip, :tutoruuid, :dedicatedmgr)' + $managerIp = Request::post('managerip', '', 'string'); + Database::exec('INSERT INTO location_roomplan (locationid, roomplan, managerip, tutoruuid)' + . ' VALUES (:locationid, :roomplan, :managerip, :tutoruuid)' . ' ON DUPLICATE KEY UPDATE ' - . ' roomplan=VALUES(roomplan), managerip=VALUES(managerip), tutoruuid=VALUES(tutoruuid), dedicatedmgr=VALUES(dedicatedmgr)', [ + . ' roomplan=VALUES(roomplan), managerip=VALUES(managerip), tutoruuid=VALUES(tutoruuid)', [ 'locationid' => $this->locationid, 'roomplan' => $obj, - 'managerip' => Request::post('managerip', '', 'string'), - 'dedicatedmgr' => (Request::post('dedimgr') === 'on' ? 1 : 0), + 'managerip' => $managerIp, 'tutoruuid' => $tutorUuid ]); + // See if the client is known, set run-mode + if (empty($managerIp)) { + RunMode::deleteMode(Page::getModule(), $this->locationid); + } else { + RunMode::deleteMode(Page::getModule(), $this->locationid); + $pc = Statistics::getMachinesByIp($managerIp, Machine::NO_DATA, 'lastseen DESC'); + if (!empty($pc)) { + $dedicated = (Request::post('dedimgr') === 'on'); + $pc = array_shift($pc); + RunMode::setRunMode($pc->machineuuid, Page::getModule()->getIdentifier(), $this->locationid, json_encode([ + 'dedicatedmgr' => $dedicated + ]), !$dedicated); + } + } } protected function getFurniture($config) -- cgit v1.2.3-55-g7522