From 2933768b0dc7d58f0b0ba7f2efcbaf1806eb275b Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Fri, 6 Oct 2017 18:00:59 +0200 Subject: [dnbd3] New module for managing dnbd3 servers - WIP --- modules-available/dnbd3/config.json | 4 + modules-available/dnbd3/inc/dnbd3rpc.inc.php | 33 ++++++++ modules-available/dnbd3/inc/dnbd3util.inc.php | 62 ++++++++++++++ modules-available/dnbd3/lang/de/messages.json | 3 + modules-available/dnbd3/lang/de/module.json | 4 + modules-available/dnbd3/lang/de/template-tags.json | 8 ++ modules-available/dnbd3/lang/en/messages.json | 3 + modules-available/dnbd3/lang/en/module.json | 4 + modules-available/dnbd3/lang/pt/module.json | 3 + modules-available/dnbd3/page.inc.php | 96 ++++++++++++++++++++++ .../dnbd3/templates/page-clientlist.html | 12 +++ .../dnbd3/templates/page-serverlist.html | 51 ++++++++++++ 12 files changed, 283 insertions(+) create mode 100644 modules-available/dnbd3/config.json create mode 100644 modules-available/dnbd3/inc/dnbd3rpc.inc.php create mode 100644 modules-available/dnbd3/inc/dnbd3util.inc.php create mode 100644 modules-available/dnbd3/lang/de/messages.json create mode 100644 modules-available/dnbd3/lang/de/module.json create mode 100644 modules-available/dnbd3/lang/de/template-tags.json create mode 100644 modules-available/dnbd3/lang/en/messages.json create mode 100644 modules-available/dnbd3/lang/en/module.json create mode 100644 modules-available/dnbd3/lang/pt/module.json create mode 100644 modules-available/dnbd3/page.inc.php create mode 100644 modules-available/dnbd3/templates/page-clientlist.html create mode 100644 modules-available/dnbd3/templates/page-serverlist.html (limited to 'modules-available/dnbd3') diff --git a/modules-available/dnbd3/config.json b/modules-available/dnbd3/config.json new file mode 100644 index 00000000..f06dda5c --- /dev/null +++ b/modules-available/dnbd3/config.json @@ -0,0 +1,4 @@ +{ + "category":"main.settings-server", + "dependencies":["runmode"] +} diff --git a/modules-available/dnbd3/inc/dnbd3rpc.inc.php b/modules-available/dnbd3/inc/dnbd3rpc.inc.php new file mode 100644 index 00000000..41dcefd4 --- /dev/null +++ b/modules-available/dnbd3/inc/dnbd3rpc.inc.php @@ -0,0 +1,33 @@ +fetch(PDO::FETCH_ASSOC)) { + if (!is_null($row['clientip'])) { + $ip = $row['clientip']; + } elseif (!is_null($row['fixedip'])) { + $ip = $row['fixedip']; + } else { + continue; // Huh? + } + if (!is_null($row['machineuuid'])) { + unset($dynClients[$row['machineuuid']]); + } + $server = array( + 'serverid' => $row['serverid'], + 'addr' => $ip, + ); + $servers[] = $server; + } + // See if any clients are in dnbd3 proxy mode but don't have a matching row in the dnbd3_server table + foreach ($dynClients as $client) { + Database::exec('INSERT IGNORE INTO dnbd3_server (machineuuid) VALUES (:machineuuid)', + array('machineuuid' => $client['machineuuid'])); + // Missing from $servers now but we'll handle them in the next run, so don't bother + } + // Now query them all + $NOW = time(); + foreach ($servers as $server) { + $data = Dnbd3Rpc::query(true, false, false, $server['addr']); + if (!is_array($data) || !isset($data['runId'])) { + Database::exec('UPDATE dnbd3_server SET uptime = 0, clientcount = 0 WHERE serverid = :serverid', + array('serverid' => $server['serverid'])); + continue; + } + // Seems up - since we only get absolute rx/tx values from the server, we have to prevent update race conditions + // and make sure the server was not restarted in the meantime (use runid and uptime for this) + Database::exec('UPDATE dnbd3_server SET runid = :runid, lastseen = :now, uptime = :uptime, + totalup = totalup + If(runid = :runid AND uptime <= :uptime, If(lastup < :up, :up - lastup, 0), If(:uptime < 1800, :up, 0)), + totaldown = totaldown + If(runid = :runid AND uptime <= :uptime, If(lastdown < :down, :down - lastdown, 0), If(:uptime < 1800, :up, 0)), + lastup = :up, lastdown = :down, clientcount = :clientcount + WHERE serverid = :serverid', array( + 'runid' => $data['runId'], + 'now' => $NOW, + 'uptime' => $data['uptime'], + 'up' => $data['bytesSent'], + 'down' => $data['bytesReceived'], + 'clientcount' => $data['clientCount'], + 'serverid' => $server['serverid'] + )); + } + } + +} \ No newline at end of file diff --git a/modules-available/dnbd3/lang/de/messages.json b/modules-available/dnbd3/lang/de/messages.json new file mode 100644 index 00000000..9d7c143b --- /dev/null +++ b/modules-available/dnbd3/lang/de/messages.json @@ -0,0 +1,3 @@ +{ + "server-unreachable": "Server nicht erreichbar" +} \ No newline at end of file diff --git a/modules-available/dnbd3/lang/de/module.json b/modules-available/dnbd3/lang/de/module.json new file mode 100644 index 00000000..cf748a49 --- /dev/null +++ b/modules-available/dnbd3/lang/de/module.json @@ -0,0 +1,4 @@ +{ + "module_name": "DNBD3", + "page_title": "DNBD3-Verwaltung" +} \ No newline at end of file diff --git a/modules-available/dnbd3/lang/de/template-tags.json b/modules-available/dnbd3/lang/de/template-tags.json new file mode 100644 index 00000000..8c8f6d7a --- /dev/null +++ b/modules-available/dnbd3/lang/de/template-tags.json @@ -0,0 +1,8 @@ +{ + "lang_clientCount": "Clients", + "lang_lastSeen": "Letzte Aktivit\u00e4t", + "lang_proxyServerTHead": "Server\/Proxy", + "lang_rxTotal": "Gesamt empfangen", + "lang_txTotal": "Gesamt gesendet", + "lang_uptime": "Aktuelle Laufzeit" +} \ No newline at end of file diff --git a/modules-available/dnbd3/lang/en/messages.json b/modules-available/dnbd3/lang/en/messages.json new file mode 100644 index 00000000..4c658e11 --- /dev/null +++ b/modules-available/dnbd3/lang/en/messages.json @@ -0,0 +1,3 @@ +{ + "server-unreachable": "Server not reachable" +} \ No newline at end of file diff --git a/modules-available/dnbd3/lang/en/module.json b/modules-available/dnbd3/lang/en/module.json new file mode 100644 index 00000000..d2bb6fd3 --- /dev/null +++ b/modules-available/dnbd3/lang/en/module.json @@ -0,0 +1,4 @@ +{ + "module_name": "DNBD3", + "page_title": "DNBD3 management" +} \ No newline at end of file diff --git a/modules-available/dnbd3/lang/pt/module.json b/modules-available/dnbd3/lang/pt/module.json new file mode 100644 index 00000000..8cc7f8e4 --- /dev/null +++ b/modules-available/dnbd3/lang/pt/module.json @@ -0,0 +1,3 @@ +{ + "module_name": "Log do Servidor" +} \ No newline at end of file diff --git a/modules-available/dnbd3/page.inc.php b/modules-available/dnbd3/page.inc.php new file mode 100644 index 00000000..309680a6 --- /dev/null +++ b/modules-available/dnbd3/page.inc.php @@ -0,0 +1,96 @@ +showClientList(); + } elseif ($show === false) { + $this->showServerList(); + } else { + Util::redirect('?do=dnbd3'); + } + } + + 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'); + $servers = array(); + $sort = array(); + $NOW = time(); + while ($server = $res->fetch(PDO::FETCH_ASSOC)) { + if (isset($dynClients[$server['machineuuid']])) { + $server += $dynClients[$server['machineuuid']]; + unset($dynClients[$server['machineuuid']]); + } + if ($server['uptime'] != 0) { + $server['uptime'] += ($NOW - $server['lastseen']); + } + $server['lastseen_s'] = $server['lastseen'] ? date('d.m.Y H:i', $server['lastseen']) : '-'; + $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']); + $servers[] = $server; + $sort[] = $server['fixedip'] . '.' . $server['machineuuid']; + } + foreach ($dynClients as $server) { + $servers[] = $server; + $sort[] = 'A' . $server['machineuuid']; + } + array_multisort($sort, SORT_ASC, $servers); + Render::addTemplate('page-serverlist', array('list' => $servers)); + } + + private function showClientList() + { + $serverId = Request::get('server', false, 'int'); + if ($serverId === false) { + // TODO: Missing param + } + $server = Database::queryFirst('SELECT s.machineuuid, s.fixedip, m.clientip, m.hostname + FROM dnbd3_server s + LEFT JOIN machine m USING (machineuuid) + WHERE s.serverid = :serverId', compact('serverId')); + if ($server === false) { + // TODO: Not found + } + if (!is_null($server['clientip'])) { + $ip = $server['clientip']; + } elseif (!is_null($server['fixedip'])) { + $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); + } + } + +} diff --git a/modules-available/dnbd3/templates/page-clientlist.html b/modules-available/dnbd3/templates/page-clientlist.html new file mode 100644 index 00000000..3fd4442c --- /dev/null +++ b/modules-available/dnbd3/templates/page-clientlist.html @@ -0,0 +1,12 @@ + + {{#clients}} + + + + + {{/clients}} +
+ {{address}} + + {{bytesSent_s}} +
\ No newline at end of file diff --git a/modules-available/dnbd3/templates/page-serverlist.html b/modules-available/dnbd3/templates/page-serverlist.html new file mode 100644 index 00000000..b7fe9038 --- /dev/null +++ b/modules-available/dnbd3/templates/page-serverlist.html @@ -0,0 +1,51 @@ +
+ + +
+ + + + + + + + + + + {{#list}} + + + + + + + + + {{/list}} +
{{lang_proxyServerTHead}}{{lang_lastSeen}}{{lang_uptime}}{{lang_txTotal}}{{lang_rxTotal}}{{lang_clientCount}}
+ {{#uptime}} + + {{/uptime}} + {{^uptime}} + + {{/uptime}} + {{fixedip}} + {{#machineuuid}} + {{hostname}} ({{clientip}}) + {{/machineuuid}} + + {{lastseen_s}} + + {{uptime_s}} + + {{totalup_s}} + + {{totaldown_s}} + + {{#uptime}} + {{clientcount}} + {{/uptime}} + {{^uptime}} + - + {{/uptime}} +
\ No newline at end of file -- cgit v1.2.3-55-g7522