diff options
Diffstat (limited to 'modules-available/dnbd3/page.inc.php')
-rw-r--r-- | modules-available/dnbd3/page.inc.php | 140 |
1 files changed, 79 insertions, 61 deletions
diff --git a/modules-available/dnbd3/page.inc.php b/modules-available/dnbd3/page.inc.php index 87169a03..6b0df8e4 100644 --- a/modules-available/dnbd3/page.inc.php +++ b/modules-available/dnbd3/page.inc.php @@ -25,7 +25,7 @@ class Page_Dnbd3 extends Page } elseif ($action === 'savelocations') { $this->saveServerLocations(); } elseif ($action === 'toggle-usage') { - $this->toggleUsage(); + $this->saveGenericSettings(); } if (Request::isPost()) { Util::redirect('?do=dnbd3'); @@ -34,7 +34,7 @@ class Page_Dnbd3 extends Page private function editServer() { - $server = $this->getServerById(); + $server = $this->getServerFromQuery(); if (!isset($server['machineuuid'])) { Message::addError('not-automatic-server', $server['ip']); return; @@ -45,12 +45,15 @@ class Page_Dnbd3 extends Page $overrideIp = false; $sip = Request::post('fixedip', null, 'string'); if (empty($sip)) { + // Reset IP override $overrideIp = null; - } elseif ($server['fixedip'] !== $overrideIp) { + } elseif ($server['fixedip'] !== $sip) { + // IP override is set and different from current value if (Dnbd3Util::matchAddress($sip) === false) { Message::addError('invalid-ip', $sip); return; } + // Dupcheck $res = Database::queryFirst('SELECT serverid FROM dnbd3_server s LEFT JOIN machine m USING (machineuuid) WHERE s.fixedip = :ip OR m.clientip = :ip', ['ip' => $sip]); @@ -66,23 +69,31 @@ class Page_Dnbd3 extends Page 'fixedip' => $overrideIp, )); } + $advancedSettings = []; + foreach (Request::post('extra', [], 'array') as $name => $value) { + $value = preg_replace('/[^0-9KMGTmhdBbtruefals]/', '', $value); + if ($value === '') + continue; + $advancedSettings[$name] = $value; + } RunMode::setRunMode($server['machineuuid'], 'dnbd3', 'proxy', - json_encode(compact('bgr', 'firewall')), false); + json_encode(compact('bgr', 'firewall', 'advancedSettings')), false); } - private function toggleUsage() + private function saveGenericSettings() { User::assertPermission('toggle-usage'); $enabled = Request::post('enabled', false, 'bool'); $nfs = Request::post('with-nfs', false, 'bool'); - $task = Dnbd3::setEnabled($enabled); + $preferLocal = Request::post('prefer-local', false, 'bool'); + Dnbd3::setEnabled($enabled); Dnbd3::setNfsFallback($nfs); - Taskmanager::waitComplete($task, 5000); + Dnbd3::setPreferLocal($preferLocal); } private function saveServerLocations() { - $server = $this->getServerById(); + $server = $this->getServerFromQuery(); $this->assertPermission($server); $locids = Request::post('location', [], 'array'); if (empty($locids)) { @@ -123,7 +134,7 @@ class Page_Dnbd3 extends Page private function deleteServer() { - $server = $this->getServerById(); + $server = $this->getServerFromQuery(); $this->assertPermission($server); if ($server['fixedip'] === '<self>') return; @@ -168,7 +179,7 @@ class Page_Dnbd3 extends Page $NOW = time(); $externalAllowed = User::hasPermission('configure.external'); $locsRunmode = User::getAllowedLocations('configure.proxy'); - while ($server = $res->fetch(PDO::FETCH_ASSOC)) { + foreach ($res as $server) { if (!is_null($server['machineuuid'])) { // Auto proxy if (!isset($dynClients[$server['machineuuid']])) { @@ -202,7 +213,7 @@ class Page_Dnbd3 extends Page $server['diskUsePercent'] = 0; } $server['self'] = ($server['fixedip'] === '<self>'); - if (isset($server['clientip']) && !is_null($server['clientip'])) { + if (isset($server['clientip'])) { if ($NOW - $server['lastseen'] > 360) { $server['slxDown'] = true; } else { @@ -245,7 +256,9 @@ class Page_Dnbd3 extends Page 'enabled' => Dnbd3::isEnabled(), 'enabled_checked_s' => Dnbd3::isEnabled() ? 'checked' : '', 'nfs_checked_s' => Dnbd3::hasNfsFallback() ? 'checked' : '', - 'rebootcontrol' => Module::isAvailable('rebootcontrol', false) + 'local_checked_s' => Dnbd3::preferLocal() ? 'checked' : '', + 'rebootcontrol' => Module::isAvailable('rebootcontrol', false), + 'show_enable_warning' => count($servers) > 1 && !Dnbd3::isEnabled(), ); Permission::addGlobalTags($data['perms'], null, ['view.details', 'refresh', 'toggle-usage', 'configure.proxy', 'configure.external']); Render::addTemplate('page-serverlist', $data); @@ -254,9 +267,11 @@ class Page_Dnbd3 extends Page private function showProxyDetails() { User::assertPermission('view.details'); - $server = $this->getServerById(); + Module::isAvailable('js_stupidtable'); + $server = $this->getServerFromQuery(); Render::addTemplate('page-proxy-header', $server); - $stats = Dnbd3Rpc::query($server['ip'], true, true, true, true, true, true); + $stats = Dnbd3Rpc::query($server['ip'], [Dnbd3Rpc::QUERY_STATS, Dnbd3Rpc::QUERY_CLIENTS, + Dnbd3Rpc::QUERY_IMAGES, Dnbd3Rpc::QUERY_SPACE, Dnbd3Rpc::QUERY_CONFIG, Dnbd3Rpc::QUERY_ALTSERVERS]); if (!is_array($stats) || !isset($stats['runId'])) { Message::addError('server-unreachable'); return; @@ -276,15 +291,6 @@ class Page_Dnbd3 extends Page $stats['tab_altservers'] = is_array($stats['altservers']); Render::addTemplate('page-proxy-stats', $stats); Render::openTag('div', ['class' => 'tab-content']); - $ips = array(); - $sort = array(); - foreach ($stats['clients'] as &$c) { - $c['bytesSent_s'] = Util::readableFileSize($c['bytesSent']); - $sort[] = $c['bytesSent']; - $ips[preg_replace('/:\d+$/', '', $c['address'])] = true; - } - $ips = array_keys($ips); - array_multisort($sort, SORT_DESC, $stats['clients']); // Config if (is_string($stats['config'])) { preg_match_all('/^((?<sec>\[.*\])|(?<key>[^=]+)=(?<val>.*)|(?<other>[^\[][^=]*))$/m', $stats['config'], $out, PREG_SET_ORDER); @@ -333,6 +339,17 @@ class Page_Dnbd3 extends Page unset($as); Render::addTemplate('page-proxy-altservers', $stats); } + // CLIENT TAB + $ips = array(); + $sort = array(); + foreach ($stats['clients'] as &$c) { + $c['bytesSent_s'] = Util::readableFileSize($c['bytesSent']); + $sort[] = $c['bytesSent']; + $c['ip'] = preg_replace('/:\d+$/', '', $c['address']); + $ips[$c['ip']] = true; + } + $ips = array_keys($ips); + array_multisort($sort, SORT_DESC, $stats['clients']); // Count locations $res = Database::simpleQuery("SELECT locationid, Count(*) AS cnt FROM machine WHERE clientip IN (:ips) AND state IN ('IDLE', 'OCCUPIED') GROUP BY locationid", compact('ips')); @@ -345,8 +362,9 @@ class Page_Dnbd3 extends Page $loc['clientCount'] = 0; $loc['recCount'] = 0; } + unset($loc); $showLocs = false; - while ($row = $res->fetch(PDO::FETCH_ASSOC)) { + foreach ($res as $row) { settype($row['locationid'], 'int'); $loc =& $locCount[$row['locationid']]; $loc['clientCount'] = $row['cnt']; @@ -373,7 +391,7 @@ class Page_Dnbd3 extends Page if (isset($image['idle'])) { if ($image['idle'] < 90) { $image['idle_s'] = Dictionary::translate('now'); - } elseif ($image['idle'] < $stats['uptime']) { + } elseif ($image['idle'] < 86400000) { // 1000 days $image['idle_s'] = Util::formatDuration($image['idle'], false); } else { $image['idle_s'] = '∞'; @@ -398,7 +416,7 @@ class Page_Dnbd3 extends Page private function showServerLocationEdit() { - $server = $this->getServerById(); + $server = $this->getServerFromQuery(); $this->assertPermission($server); // Get selected ones $res = Database::simpleQuery('SELECT locationid FROM dnbd3_server_x_location WHERE serverid = :serverid', @@ -424,11 +442,9 @@ class Page_Dnbd3 extends Page Render::addTemplate('page-server-locations', $server); } - private function getServerById($serverId = false) + private function getServerFromQuery(): array { - if ($serverId === false) { - $serverId = Request::any('server', false, 'int'); - } + $serverId = Request::any('server', false, 'int'); if ($serverId === false) { if (AJAX) die('Missing parameter'); @@ -483,6 +499,8 @@ class Page_Dnbd3 extends Page $this->ajaxReboot(); } elseif ($action === 'cachemap') { $this->ajaxCacheMap(); + } elseif ($action === 'stats') { + $this->ajaxStats(); } else { die($action . '???'); } @@ -504,12 +522,12 @@ class Page_Dnbd3 extends Page if ($res !== false) die('{"error": "Server with this IP already exists", "fatal": true}'); // Query - $reply = Dnbd3Rpc::query($ip,true, false, false, true); - if ($reply === Dnbd3Rpc::QUERY_UNREACHABLE) + $reply = Dnbd3Rpc::query($ip, [Dnbd3Rpc::QUERY_STATS, Dnbd3Rpc::QUERY_SPACE]); + if ($reply === Dnbd3Rpc::ERROR_UNREACHABLE) die('{"error": "Could not reach server"}'); - if ($reply === Dnbd3Rpc::QUERY_NOT_200) + if ($reply === Dnbd3Rpc::ERROR_NOT_200) die('{"error": "Server did not reply with 200 OK"}'); - if ($reply === Dnbd3Rpc::QUERY_NOT_JSON) + if ($reply === Dnbd3Rpc::ERROR_NOT_JSON) die('{"error": "No JSON received from server"}'); if (!is_array($reply) || !isset($reply['uptime']) || !isset($reply['clientCount'])) die('{"error": "Reply does not suggest this is a dnbd3 server"}'); @@ -518,7 +536,7 @@ class Page_Dnbd3 extends Page private function ajaxEditServer() { - $server = $this->getServerById(); + $server = $this->getServerFromQuery(); if (!isset($server['machineuuid'])) { echo 'Not automatic server.'; return; @@ -531,12 +549,26 @@ class Page_Dnbd3 extends Page } $modeData = (array)json_decode($rm[$server['machineuuid']]['modedata'], true); $server += $modeData + Dnbd3Util::defaultRunmodeConfig(); + $extraSettings = $server['advancedSettings'] ?? []; + $server['advancedSettings'] = []; + foreach (['dnbd3.serverPenalty', + 'dnbd3.clientPenalty', + 'dnbd3.bgrMinClients', + 'dnbd3.bgrWindowSize', + 'dnbd3.autoFreeDiskSpaceDelay', + 'dnbd3.sparseFiles', + 'limits.maxClients', + 'limits.maxImages', + 'limits.maxPayload', + 'limits.maxReplicationSize'] as $item) { + $server['advancedSettings'][] = ['name' => $item, 'value' => $extraSettings[$item] ?? '']; + } echo Render::parse('fragment-server-settings', $server); } private function ajaxReboot() { - $server = $this->getServerById(); + $server = $this->getServerFromQuery(); if (!isset($server['machineuuid'])) { die('Not automatic server.'); } @@ -575,18 +607,18 @@ class Page_Dnbd3 extends Page private function ajaxCacheMap() { - $server = $this->getServerById(); + $server = $this->getServerFromQuery(); $imgId = Request::any('id', 0, 'int'); if ($imgId <= 0) { Header('HTTP/1.1 400 Bad Request'); die('Invalid/no image id'); } $data = Dnbd3Rpc::getCacheMap($server['ip'], $imgId); - if ($data === Dnbd3Rpc::QUERY_UNREACHABLE) { + if ($data === Dnbd3Rpc::ERROR_UNREACHABLE) { Header('HTTP/1.1 504 Gateway Timeout'); die('Proxy not reachable'); } - if ($data === Dnbd3Rpc::QUERY_NOT_200) { + if ($data === Dnbd3Rpc::ERROR_NOT_200) { Header('HTTP/1.1 503 Service Unavailable'); die("Proxy didn't reply with 200 OK"); } @@ -594,30 +626,16 @@ class Page_Dnbd3 extends Page die($data); } - private function genChunk($acc) + private function ajaxStats() { - static $last = -1; - static $count = 0; - if ($acc !== false) { - if ($acc > 15) { - $acc = 15; - } - $acc = round($acc); - if ($last === $acc) { - $count++; - return ''; - } + $lookup = Dnbd3::getActiveServers(); + $result = Dnbd3Rpc::getStatsMulti(array_keys($lookup), [Dnbd3Rpc::QUERY_STATS]); + $return = []; + foreach ($result as $ip => $data) { + $return[$lookup[$ip]] = $data; } - if ($last !== -1) { - if ($count === 1) - return '<b style="background:#0' . dechex($acc) . '0"></b>'; - $line = '<b style="background:#0' . dechex($last) . '0;flex-grow:' . $count . '"></b>'; - } else { - $line = ''; - } - $last = $acc; - $count = 1; - return $line; + Header('Content-Type: application/json; charset=utf-8'); + die(json_encode($return)); } } |