summaryrefslogtreecommitdiffstats
path: root/modules-available/dnbd3/page.inc.php
diff options
context:
space:
mode:
authorSimon Rettberg2017-10-10 17:40:51 +0200
committerSimon Rettberg2017-10-10 17:40:51 +0200
commit0041e188f7ef4c936eb08f26e08f229e7ce1b550 (patch)
tree52f2cb90e2b44c1325bbc8a65b47b3c088750929 /modules-available/dnbd3/page.inc.php
parent[dnbd3] New module for managing dnbd3 servers - WIP (diff)
downloadslx-admin-0041e188f7ef4c936eb08f26e08f229e7ce1b550.tar.gz
slx-admin-0041e188f7ef4c936eb08f26e08f229e7ce1b550.tar.xz
slx-admin-0041e188f7ef4c936eb08f26e08f229e7ce1b550.zip
[dnbd3] More progress, manage location restrictions for proxies
Diffstat (limited to 'modules-available/dnbd3/page.inc.php')
-rw-r--r--modules-available/dnbd3/page.inc.php153
1 files changed, 132 insertions, 21 deletions
diff --git a/modules-available/dnbd3/page.inc.php b/modules-available/dnbd3/page.inc.php
index 309680a6..213afa03 100644
--- a/modules-available/dnbd3/page.inc.php
+++ b/modules-available/dnbd3/page.inc.php
@@ -11,17 +11,47 @@ class Page_Dnbd3 extends Page
Message::addError('main.no-permission');
Util::redirect('?do=Main');
}
- if (Request::post('re')) {
+ $action = Request::post('action', false, 'string');
+ if ($action === 'refresh') {
Dnbd3Util::updateServerStatus();
+ } elseif ($action === 'delserver') {
+ $this->deleteServer();
+ } elseif ($action === 'savelocations') {
+ $this->saveServerLocations();
+ }
+ if (Request::isPost()) {
Util::redirect('?do=dnbd3');
}
}
+ private function saveServerLocations()
+ {
+ $server = $this->getServerById();
+ $locids = Request::post('location', [], 'array');
+ if (empty($locids)) {
+ Database::exec('DELETE FROM dnbd3_server_x_location WHERE serverid = :serverid',
+ array('serverid' => $server['serverid']));
+ } else {
+ Database::exec('DELETE FROM dnbd3_server_x_location WHERE serverid = :serverid AND locationid NOT IN (:lids)',
+ array('serverid' => $server['serverid'], 'lids' => $locids));
+ foreach ($locids as $lid) {
+ Database::exec('INSERT IGNORE INTO dnbd3_server_x_location (serverid, locationid) VALUES (:serverid, :lid)',
+ array('serverid' => $server['serverid'], 'lid' => $lid));
+ }
+ }
+ }
+
+ /*
+ * RENDER
+ */
+
protected function doRender()
{
$show = Request::get('show', false, 'string');
if ($show === 'clients') {
$this->showClientList();
+ } elseif ($show === 'locations') {
+ $this->showServerLocationEdit();
} elseif ($show === false) {
$this->showServerList();
} else {
@@ -32,7 +62,11 @@ class Page_Dnbd3 extends Page
private function showServerList()
{
$dynClients = RunMode::getForMode(Page::getModule(), 'proxy', true, true);
- $res = Database::simpleQuery('SELECT serverid, machineuuid, fixedip, lastseen, uptime, totalup, totaldown, clientcount FROM dnbd3_server');
+ $res = Database::simpleQuery('SELECT s.serverid, s.machineuuid, s.fixedip, s.lastseen,
+ s.uptime, s.totalup, s.totaldown, s.clientcount, Count(sxl.locationid) AS locations
+ FROM dnbd3_server s
+ LEFT JOIN dnbd3_server_x_location sxl USING (serverid)
+ GROUP BY s.serverid');
$servers = array();
$sort = array();
$NOW = time();
@@ -48,12 +82,17 @@ class Page_Dnbd3 extends Page
$server['uptime_s'] = $server['uptime'] ? floor($server['uptime'] / 86400) . 'd ' . gmdate('H:i', $server['uptime']) : '-';
$server['totalup_s'] = Util::readableFileSize($server['totalup']);
$server['totaldown_s'] = Util::readableFileSize($server['totaldown']);
+ $server['self'] = ($server['fixedip'] === '<self>');
$servers[] = $server;
- $sort[] = $server['fixedip'] . '.' . $server['machineuuid'];
+ if ($server['self']) {
+ $sort[] = '---';
+ } else {
+ $sort[] = $server['fixedip'] . '.' . $server['machineuuid'];
+ }
}
foreach ($dynClients as $server) {
$servers[] = $server;
- $sort[] = 'A' . $server['machineuuid'];
+ $sort[] = '-' . $server['machineuuid'];
}
array_multisort($sort, SORT_ASC, $servers);
Render::addTemplate('page-serverlist', array('list' => $servers));
@@ -61,11 +100,94 @@ class Page_Dnbd3 extends Page
private function showClientList()
{
- $serverId = Request::get('server', false, 'int');
+ $server = $this->getServerById();
+ Render::addTemplate('page-header-servername', $server);
+ $data = Dnbd3Rpc::query(false, true, false, $server['ip']);
+ if ($data === false || !isset($data['clients'])) {
+ Message::addError('server-unreachable');
+ return;
+ }
+ $ips = array();
+ $sort = array();
+ foreach ($data['clients'] as &$c) {
+ $c['bytesSent_s'] = Util::readableFileSize($c['bytesSent']);
+ $sort[] = $c['bytesSent'];
+ $ips[] = preg_replace('/:\d+$/', '', $c['address']);
+ }
+ array_multisort($sort, SORT_DESC, $data['clients']);
+ Render::openTag('div', ['class' => 'row']);
+ // Count locations
+ $res = Database::simpleQuery('SELECT locationid, Count(*) AS cnt FROM machine WHERE clientip IN (:ips) GROUP BY locationid', compact('ips'));
+ $locCount = Location::getLocationsAssoc();
+ $locCount[0] = array(
+ 'locationname' => '/',
+ 'depth' => 0,
+ 'recCount' => 0,
+ );
+ foreach ($locCount as &$loc) {
+ $loc['recCount'] = 0;
+ }
+ $showLocs = false;
+ while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
+ settype($row['locationid'], 'int');
+ $loc =& $locCount[$row['locationid']];
+ $loc['clientCount'] = $row['cnt'];
+ $loc['recCount'] += $row['cnt'];
+ if ($row['locationid'] !== 0) {
+ $showLocs = true;
+ }
+ $loc['keep'] = true;
+ if (isset($loc['parents'])) {
+ foreach ($loc['parents'] as $p) {
+ $locCount[$p]['keep'] = true;
+ $locCount[$p]['recCount'] += $row['cnt'];
+ }
+ }
+ }
+ if ($showLocs) {
+ $locCount = array_filter($locCount, function ($v) { return isset($v['keep']); });
+ Render::addTemplate('page-client-loclist', array('list' => array_values($locCount)));
+ }
+ Render::addTemplate('page-clientlist', $data);
+ Render::closeTag('div');
+ }
+
+ private function showServerLocationEdit()
+ {
+ $server = $this->getServerById();
+ // Get selected ones
+ $res = Database::simpleQuery('SELECT locationid FROM dnbd3_server_x_location WHERE serverid = :serverid',
+ array('serverid' => $server['serverid']));
+ $selectedLocations = array();
+ while ($loc = $res->fetchColumn(0)) {
+ $selectedLocations[$loc] = true;
+ }
+ // Build location list
+ $server['locations'] = array_values(Location::getSubnetsByLocation());
+ $filtered = array();
+ foreach ($server['locations'] as &$loc) {
+ $filtered['l'.$loc['locationid']] = array(
+ 'children' => $loc['children'],
+ 'subnets' => $loc['subnets']
+ );
+ if (isset($selectedLocations[$loc['locationid']])) {
+ $loc['checked_s'] = 'checked';
+ }
+ }
+ unset($loc);
+ $server['jsonLocations'] = json_encode($filtered);
+ Render::addTemplate('page-server-locations', $server);
+ }
+
+ private function getServerById($serverId = false)
+ {
+ if ($serverId === false) {
+ $serverId = Request::any('server', false, 'int');
+ }
if ($serverId === false) {
// TODO: Missing param
}
- $server = Database::queryFirst('SELECT s.machineuuid, s.fixedip, m.clientip, m.hostname
+ $server = Database::queryFirst('SELECT s.serverid, s.machineuuid, s.fixedip, m.clientip, m.hostname
FROM dnbd3_server s
LEFT JOIN machine m USING (machineuuid)
WHERE s.serverid = :serverId', compact('serverId'));
@@ -73,24 +195,13 @@ class Page_Dnbd3 extends Page
// TODO: Not found
}
if (!is_null($server['clientip'])) {
- $ip = $server['clientip'];
+ $server['ip'] = $server['clientip'];
} elseif (!is_null($server['fixedip'])) {
- $ip = $server['fixedip'];
+ $server['ip'] = $server['fixedip'];
} else {
- $ip = '127.0.0.1';
- }
- $data = Dnbd3Rpc::query(false, true, false, $ip);
- if ($data === false || !isset($data['clients'])) {
- Message::addError('server-unreachable');
- } else {
- $sort = array();
- foreach ($data['clients'] as &$c) {
- $c['bytesSent_s'] = Util::readableFileSize($c['bytesSent']);
- $sort[] = $c['bytesSent'];
- }
- array_multisort($sort, SORT_DESC, $data['clients']);
- Render::addTemplate('page-clientlist', $data);
+ $server['ip'] = '127.0.0.1';
}
+ return $server;
}
}