summaryrefslogtreecommitdiffstats
path: root/modules-available/dnbd3
diff options
context:
space:
mode:
authorSimon Rettberg2017-10-12 16:14:39 +0200
committerSimon Rettberg2017-10-12 16:14:39 +0200
commite10e538a0c46012175b98f8fbda6910a1295a722 (patch)
tree295ea1024db58ff4a084b227dad43754ce3223ef /modules-available/dnbd3
parent[runmode] Return lastseen too in detailed mode (diff)
downloadslx-admin-e10e538a0c46012175b98f8fbda6910a1295a722.tar.gz
slx-admin-e10e538a0c46012175b98f8fbda6910a1295a722.tar.xz
slx-admin-e10e538a0c46012175b98f8fbda6910a1295a722.zip
[dnbd3] Show free space, fix styling, add help texts and strings (de)
Diffstat (limited to 'modules-available/dnbd3')
-rw-r--r--modules-available/dnbd3/inc/dnbd3rpc.inc.php10
-rw-r--r--modules-available/dnbd3/inc/dnbd3util.inc.php8
-rw-r--r--modules-available/dnbd3/lang/de/messages.json5
-rw-r--r--modules-available/dnbd3/lang/de/template-tags.json34
-rw-r--r--modules-available/dnbd3/page.inc.php59
-rw-r--r--modules-available/dnbd3/templates/page-server-locations.html2
-rw-r--r--modules-available/dnbd3/templates/page-serverlist.html326
7 files changed, 331 insertions, 113 deletions
diff --git a/modules-available/dnbd3/inc/dnbd3rpc.inc.php b/modules-available/dnbd3/inc/dnbd3rpc.inc.php
index 6134489a..27713bfb 100644
--- a/modules-available/dnbd3/inc/dnbd3rpc.inc.php
+++ b/modules-available/dnbd3/inc/dnbd3rpc.inc.php
@@ -5,14 +5,15 @@ class Dnbd3Rpc {
/**
* Query given DNBD3 server for status information.
*
+ * @param string $server server address
+ * @param int $port server port
* @param bool $stats include general stats
* @param bool $clients include client list
* @param bool $images include image list
- * @param string $server server address
- * @param int $port server port
+ * @param bool $diskSpace include disk space stats
* @return false|array the queried data as an array, or false on error
*/
- public static function query($stats, $clients, $images, $server, $port = 5003)
+ public static function query($server, $port, $stats, $clients, $images, $diskSpace)
{
// Special case - local server
if ($server === '<self>') {
@@ -28,6 +29,9 @@ class Dnbd3Rpc {
if ($images) {
$url .= 'q=images&';
}
+ if ($diskSpace) {
+ $url .= 'q=space&';
+ }
$str = Download::asString($url, 3, $code);
if ($str === false || $code !== 200)
return false;
diff --git a/modules-available/dnbd3/inc/dnbd3util.inc.php b/modules-available/dnbd3/inc/dnbd3util.inc.php
index 45ae6135..ae5e0cd7 100644
--- a/modules-available/dnbd3/inc/dnbd3util.inc.php
+++ b/modules-available/dnbd3/inc/dnbd3util.inc.php
@@ -49,7 +49,7 @@ class Dnbd3Util {
// Now query them all
$NOW = time();
foreach ($servers as $server) {
- $data = Dnbd3Rpc::query(true, false, false, $server['addr']);
+ $data = Dnbd3Rpc::query($server['addr'], 5003, true, false, false, true);
if (!is_array($data) || !isset($data['runId'])) {
Database::exec('UPDATE dnbd3_server SET uptime = 0, clientcount = 0 WHERE serverid = :serverid',
array('serverid' => $server['serverid']));
@@ -60,7 +60,7 @@ class Dnbd3Util {
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
+ lastup = :up, lastdown = :down, clientcount = :clientcount, disktotal = :disktotal, diskfree = :diskfree
WHERE serverid = :serverid', array(
'runid' => $data['runId'],
'now' => $NOW,
@@ -68,7 +68,9 @@ class Dnbd3Util {
'up' => $data['bytesSent'],
'down' => $data['bytesReceived'],
'clientcount' => $data['clientCount'],
- 'serverid' => $server['serverid']
+ 'serverid' => $server['serverid'],
+ 'disktotal' => $data['spaceTotal'],
+ 'diskfree' => $data['spaceFree'],
));
}
}
diff --git a/modules-available/dnbd3/lang/de/messages.json b/modules-available/dnbd3/lang/de/messages.json
index 9d7c143b..b5f455dd 100644
--- a/modules-available/dnbd3/lang/de/messages.json
+++ b/modules-available/dnbd3/lang/de/messages.json
@@ -1,3 +1,8 @@
{
+ "invalid-ipv4": "{{0}} ist keine g\u00fcltige IPv4-Adresse",
+ "server-added": "Server {{0}} hinzugef\u00fcgt",
+ "server-already-exists": "Server {{0}} existiert bereits",
+ "server-deleted": "Server {{0}} gel\u00f6scht",
+ "server-non-existent": "Server {{0}} existiert nicht",
"server-unreachable": "Server nicht erreichbar"
} \ 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
index 8c8f6d7a..0593950c 100644
--- a/modules-available/dnbd3/lang/de/template-tags.json
+++ b/modules-available/dnbd3/lang/de/template-tags.json
@@ -1,8 +1,40 @@
{
+ "lang_addServer": "Server hinzuf\u00fcgen",
+ "lang_allowedSubnets": "Zum Zugriff freigegebene Subnets",
+ "lang_bytesSent": "Gesendet",
+ "lang_changeDnbd3Status": "DNBD3 ein-\/ausschalten",
+ "lang_client": "Client",
"lang_clientCount": "Clients",
+ "lang_clientList": "Liste der Clients",
+ "lang_clientsByLocation": "Clients nach Raum\/Ort",
+ "lang_count": "Anzahl",
+ "lang_disabled": "Deaktiviert",
+ "lang_diskFree": "Freier Speicher",
+ "lang_dnbd3IntroText": "DNBD3 ist ganz toll. Einfach einschalten und los gehts, zu beachten gibt es rein gar nichts!",
+ "lang_dnbd3Management": "DNBD3 Verwaltung",
+ "lang_dnbd3Status": "DNBD3 Status",
+ "lang_enableDnbd3": "DNBD3 aktivieren",
+ "lang_enabled": "Aktiviert",
+ "lang_enterIpOfServer": "Bitte geben Sie die IP-Adresse des hinzuzuf\u00fcgenden Servers ein",
+ "lang_externalServer": "Externer DNBD3-Server",
+ "lang_externalServerAdd": "Externen Server hinzuf\u00fcgen",
+ "lang_externalServerHelp": "Ein externer Server wird nicht \u00fcber den Satellitenserver konfiguriert und verwaltet. Das Installieren, Einrichten und ggf. Aktualisieren der DNBD3-Serversoftware muss manuell durchgef\u00fchrt werden.\r\nDies bietet mehr Flexibilit\u00e4t bei der Konfiguration und Anpassung, z.B. bei der Verwendung von RAID- oder bcache-Setups, oder wenn der DNBD3-Server auf einer Maschine laufen soll, die noch andere Services bereitstellt.\r\nWeitere Informationen dazu finden Sie im Wiki.",
+ "lang_global": "Global",
"lang_lastSeen": "Letzte Aktivit\u00e4t",
+ "lang_location": "Ort",
+ "lang_locations": "Orte",
+ "lang_manageAccessTo": "Zugriff auf Server festlegen:",
+ "lang_managedServer": "Automatisch konfigurierter DNBD3-Proxy",
+ "lang_managedServerAdd": "Automatisch konfigurierten Proxy hinzuf\u00fcgen",
+ "lang_managedServerHelp": "Automatisch konfigurierte DNBD3-Proxies booten wie gew\u00f6hnliche bwLehrpool-Clients via PXE \u00fcber den Satelliten-Server. Sobald ein bwLehrpool-Client als DNBD3-Proxy konfiguriert wird, erh\u00e4lt er beim Booten eine gesonderte Konfiguration, sodass er fortan exklusiv als DNBD3-Proxy arbeitet, und nicht mehr als Arbeitsstation zur Verf\u00fcgung steht.\r\nDer Vorteil ist, dass die Konfiguration automatisiert erfolgt, und durch w\u00f6chentliche Reboots sichergestellt wird, dass eventuelle Updates des MiniLinux angewendet werden.\r\nIn diesem Fall legen Sie bitte eine Partition mit der ID 45 auf der Festplatte des Proxy-Servers an; diese wird persistent Behandelt und im Gegensatz zur ID44-Partition nicht beim Booten formatiert. Generell sollte diese Partition so gro\u00df wie m\u00f6glich sein, abh\u00e4ngig von der Anzahl der genutzten VMs. Bei Platzmangel l\u00f6scht der Proxy automatisch die VM, die am l\u00e4ngsten nicht verwendet wurde, um neuen VMs Platz zu machen.\r\nWeitere Informationen dazu finden Sie im Wiki.",
+ "lang_proxyLocationText": "Bla bla bla BLA!!!!",
"lang_proxyServerTHead": "Server\/Proxy",
+ "lang_recursiveCount": "Rekursiv",
"lang_rxTotal": "Gesamt empfangen",
+ "lang_serverList": "Serverliste",
+ "lang_storageSize": "Speichergr\u00f6\u00dfe",
+ "lang_test": "Testen",
"lang_txTotal": "Gesamt gesendet",
- "lang_uptime": "Aktuelle Laufzeit"
+ "lang_uptime": "Aktuelle Laufzeit",
+ "lang_wantToDelete": "Wollen Sie diesen Server wirklich entfernen? (Rebooten\/Ausschalten muss in diesem Fall manuell vorgenommen werden)"
} \ No newline at end of file
diff --git a/modules-available/dnbd3/page.inc.php b/modules-available/dnbd3/page.inc.php
index 3489cc5b..a2d47f1e 100644
--- a/modules-available/dnbd3/page.inc.php
+++ b/modules-available/dnbd3/page.inc.php
@@ -20,12 +20,20 @@ class Page_Dnbd3 extends Page
$this->addServer();
} elseif ($action === 'savelocations') {
$this->saveServerLocations();
+ } elseif ($action === 'toggle-usage') {
+ $this->toggleUsage();
}
if (Request::isPost()) {
Util::redirect('?do=dnbd3');
}
}
+ private function toggleUsage()
+ {
+ $enabled = Request::post('enabled', false, 'bool');
+ Dnbd3::setEnabled($enabled);
+ }
+
private function saveServerLocations()
{
$server = $this->getServerById();
@@ -103,8 +111,8 @@ class Page_Dnbd3 extends Page
private function showServerList()
{
$dynClients = RunMode::getForMode(Page::getModule(), 'proxy', true, true);
- $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
+ $res = Database::simpleQuery('SELECT s.serverid, s.machineuuid, s.fixedip, s.lastseen AS dnbd3lastseen,
+ s.uptime, s.totalup, s.totaldown, s.clientcount, s.disktotal, s.diskfree, Count(sxl.locationid) AS locations
FROM dnbd3_server s
LEFT JOIN dnbd3_server_x_location sxl USING (serverid)
GROUP BY s.serverid');
@@ -117,33 +125,54 @@ class Page_Dnbd3 extends Page
unset($dynClients[$server['machineuuid']]);
}
if ($server['uptime'] != 0) {
- $server['uptime'] += ($NOW - $server['lastseen']);
+ $server['uptime'] += ($NOW - $server['dnbd3lastseen']);
}
- $server['lastseen_s'] = $server['lastseen'] ? date('d.m.Y H:i', $server['lastseen']) : '-';
+ $server['dnbd3lastseen_s'] = $server['dnbd3lastseen'] ? date('d.m.Y H:i', $server['dnbd3lastseen']) : '-';
$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']);
+ if ($server['disktotal'] > 0) {
+ $server['disktotal_s'] = Util::readableFileSize($server['disktotal']);
+ $server['diskfree_s'] = Util::readableFileSize($server['diskfree']);
+ $server['diskUsePercent'] = floor(100 - 100 * $server['diskfree'] / $server['disktotal']);
+ } else {
+ $server['disktotal_s'] = '?';
+ $server['diskfree_s'] = '?';
+ $server['diskUsePercent'] = 0;
+ }
$server['self'] = ($server['fixedip'] === '<self>');
- $servers[] = $server;
+ if (isset($server['clientip']) && !is_null($server['clientip'])) {
+ if ($NOW - $server['lastseen'] > 360) {
+ $server['slxDown'] = true;
+ } else {
+ $server['slxOk'] = true;
+ }
+ }
if ($server['self']) {
$sort[] = '---';
} else {
$sort[] = $server['fixedip'] . '.' . $server['machineuuid'];
}
+ $servers[] = $server;
}
foreach ($dynClients as $server) {
$servers[] = $server;
$sort[] = '-' . $server['machineuuid'];
+ Database::exec('INSERT INTO dnbd3_server (machineuuid) VALUES (:uuid)', array('uuid' => $server['machineuuid']));
}
array_multisort($sort, SORT_ASC, $servers);
- Render::addTemplate('page-serverlist', array('list' => $servers));
+ Render::addTemplate('page-serverlist', array(
+ 'list' => $servers,
+ 'enabled' => Dnbd3::isEnabled(),
+ 'checked_s' => Dnbd3::isEnabled() ? 'checked' : '',
+ ));
}
private function showClientList()
{
$server = $this->getServerById();
Render::addTemplate('page-header-servername', $server);
- $data = Dnbd3Rpc::query(false, true, false, $server['ip']);
+ $data = Dnbd3Rpc::query($server['ip'], 5003,false, true, false, false);
if ($data === false || !isset($data['clients'])) {
Message::addError('server-unreachable');
return;
@@ -226,7 +255,7 @@ class Page_Dnbd3 extends Page
$serverId = Request::any('server', false, 'int');
}
if ($serverId === false) {
- Message::addError('parameter-missing', 'server');
+ Message::addError('main.parameter-missing', 'server');
Util::redirect('?do=dnbd3');
}
$server = Database::queryFirst('SELECT s.serverid, s.machineuuid, s.fixedip, m.clientip, m.hostname
@@ -253,7 +282,7 @@ class Page_Dnbd3 extends Page
protected function doAjax()
{
- $action = Request::post('action', false, 'string');
+ $action = Request::any('action', false, 'string');
if ($action === 'servertest') {
Header('Content-Type: application/json; charset=utf-8');
$ip = Request::post('ip', false, 'string');
@@ -272,7 +301,7 @@ class Page_Dnbd3 extends Page
if ($res !== false)
die('{"error": "Server with this IP already exists", "fatal": true}');
// Query
- $reply = Dnbd3Rpc::query(true, false, false, $ip);
+ $reply = Dnbd3Rpc::query($ip, 5003,true, false, false, true);
if ($reply === false)
die('{"error": "Could not reach server"}');
if (!is_array($reply))
@@ -280,6 +309,16 @@ class Page_Dnbd3 extends Page
if (!isset($reply['uptime']) || !isset($reply['clientCount']))
die('{"error": "Reply does not suggest this is a dnbd3 server"}');
echo json_encode($reply);
+ } elseif ($action === 'editserver') {
+ $server = $this->getServerById();
+ if (isset($server['machineuuid'])) {
+ echo 'Not automatic server.';
+ } else {
+ //RunMode::getForModule()
+ echo Render::parse('fragment-server-settings', $server);
+ }
+ } else {
+ die($action . '???');
}
}
diff --git a/modules-available/dnbd3/templates/page-server-locations.html b/modules-available/dnbd3/templates/page-server-locations.html
index 8e76a68d..20dddaac 100644
--- a/modules-available/dnbd3/templates/page-server-locations.html
+++ b/modules-available/dnbd3/templates/page-server-locations.html
@@ -7,7 +7,7 @@
<input type="hidden" name="server" value="{{serverid}}">
<div class="buttonbar text-right">
- <button type="submit" class="btn btn-success" name="action" value="savelocations">
+ <button type="submit" class="btn btn-primary" name="action" value="savelocations">
<span class="glyphicon glyphicon-floppy-disk"></span>
{{lang_save}}
</button>
diff --git a/modules-available/dnbd3/templates/page-serverlist.html b/modules-available/dnbd3/templates/page-serverlist.html
index 76f9ca35..84c587a2 100644
--- a/modules-available/dnbd3/templates/page-serverlist.html
+++ b/modules-available/dnbd3/templates/page-serverlist.html
@@ -1,128 +1,252 @@
<h1>{{lang_dnbd3Management}}</h1>
<p><i>{{lang_dnbd3IntroText}}</i></p>
-<form method="post">
+<div class="panel panel-default">
+ <div class="panel-heading">
+ {{lang_dnbd3Status}}:
+ <b>
+ {{#enabled}}{{lang_enabled}}{{/enabled}}
+ {{^enabled}}{{lang_disabled}} (NFS/CIFS){{/enabled}}
+ </b>
+ – <a href="#" data-toggle="collapse" data-target="#toggle-div">{{lang_changeDnbd3Status}}</a>
+ </div>
+ <div class="panel-collapse collapse" id="toggle-div">
+ <div class="panel-body">
+ <form method="post" action="?do=dnbd3">
+ <input type="hidden" name="token" value="{{token}}">
+ <div class="checkbox">
+ <input id="enable-dnbd3" type="checkbox" name="enabled" {{checked_s}}>
+ <label for="enable-dnbd3">{{lang_enableDnbd3}}</label>
+ </div>
+ <button type="submit" name="action" value="toggle-usage" class="btn btn-success">
+ <span class="glyphicon glyphicon-floppy-disk"></span>
+ {{lang_save}}
+ </button>
+ </form>
+ </div>
+ </div>
+</div>
+
+<form method="post" onsubmit="$('#refbtn').prop('disabled', true).find('span').addClass('slx-rotation')" action="?do=dnbd3">
<input type="hidden" name="token" value="{{token}}">
+ <input type="hidden" name="action" value="refresh">
<h2>
{{lang_serverList}}
- <button type="submit" class="btn btn-default" name="action" value="refresh"><span class="glyphicon glyphicon-refresh"></span></button>
+ <button id="refbtn" type="submit" class="btn btn-default"><span class="glyphicon glyphicon-refresh"></span></button>
</h2>
</form>
+
<form method="post" action="?do=dnbd3">
<input type="hidden" name="token" value="{{token}}">
<input type="hidden" name="action" value="delserver">
<table class="table">
- <tr>
- <th>{{lang_proxyServerTHead}}</th>
- <th class="text-right">{{lang_clientCount}}</th>
- <th class="text-right">{{lang_lastSeen}}</th>
- <th class="text-right">{{lang_uptime}}</th>
- <th class="text-right">{{lang_txTotal}}</th>
- <th class="text-right">{{lang_rxTotal}}</th>
- <th class="text-right">{{lang_locations}}</th>
- <th>&nbsp;</th>
- </tr>
- {{#list}}
- <tr>
- <td class="{{#self}}slx-bold{{/self}}">
- {{#uptime}}
- <span class="glyphicon glyphicon-ok text-success"></span>
- {{/uptime}}
- {{^uptime}}
- <span class="glyphicon glyphicon-off"></span>
- {{/uptime}}
- {{fixedip}}
- {{#machineuuid}}
- <a href="?do=Statistics&uuid={{machineuuid}}">{{clientip}}</a>
- <div class="small">{{hostname}}</div>
- {{/machineuuid}}
- </td>
- <td data-sort="int" data-sort-default="desc" class="text-right">
- {{#uptime}}
- <a href="?do=dnbd3&amp;show=clients&amp;server={{serverid}}">{{clientcount}}</a>
- {{/uptime}}
- {{^uptime}}
- -
- {{/uptime}}
- </td>
- <td data-sort="int" data-sort-default="desc" data-sort-value="{{lastseen}}" class="text-right text-nowrap">
- {{lastseen_s}}
- </td>
- <td data-sort="int" data-sort-default="desc" data-sort-value="{{uptime}}" class="text-right text-nowrap">
- {{uptime_s}}
- </td>
- <td data-sort="int" data-sort-default="desc" data-sort-value="{{totalup}}" class="text-right text-nowrap">
- {{totalup_s}}
- </td>
- <td data-sort="int" data-sort-default="desc" data-sort-value="{{totaldown}}" class="text-right text-nowrap">
- {{totaldown_s}}
- </td>
- <td class="text-right text-nowrap">
- {{^self}}
- {{^locations}}
- <i>{{lang_global}}</i>
- {{/locations}}
- {{#locations}}
- {{locations}}
- {{/locations}}
- <a href="?do=dnbd3&amp;show=locations&amp;server={{serverid}}" class="btn btn-default btn-xs">
- <span class="glyphicon glyphicon-map-marker"></span>
- </a>
- {{/self}}
- </td>
- <td>
- {{^self}}
- <button class="btn btn-danger btn-xs" name="server" value="{{serverid}}" onclick="return confirm('{{lang_wantToDelete}}')">
- <span class="glyphicon glyphicon-trash"></span>
- </button>
- {{/self}}
- </td>
- </tr>
- {{/list}}
+ <thead>
+ <tr>
+ <th></th>
+ <th></th>
+ <th>{{lang_proxyServerTHead}}</th>
+ <th class="text-right">{{lang_storageSize}}</th>
+ <th class="text-right">{{lang_clientCount}}</th>
+ <th class="text-right">{{lang_lastSeen}}</th>
+ <th class="text-right">{{lang_uptime}}</th>
+ <th class="text-right">{{lang_txTotal}}</th>
+ <th class="text-right">{{lang_rxTotal}}</th>
+ <th class="text-right">{{lang_locations}}</th>
+ <th></th>
+ </tr>
+ </thead>
+
+ <tbody>
+ {{#list}}
+ <tr>
+ <td>
+ {{#slxOk}}
+ <span class="glyphicon glyphicon-ok text-success"></span>
+ {{/slxOk}}
+ {{#slxDown}}
+ <span class="glyphicon glyphicon-off"></span>
+ {{/slxDown}}
+ </td>
+ <td>
+ {{#uptime}}
+ <span class="glyphicon glyphicon-ok text-success"></span>
+ {{/uptime}}
+ {{^uptime}}
+ <span class="glyphicon glyphicon-remove text-danger"></span>
+ {{/uptime}}
+ </td>
+ <td class="{{#self}}slx-bold{{/self}}">
+ {{fixedip}}
+ {{#machineuuid}}
+ <a href="?do=Statistics&uuid={{machineuuid}}">{{clientip}}</a>
+ <div class="small">{{hostname}}</div>
+ {{/machineuuid}}
+ </td>
+ <td data-sort="int" data-sort-default="desc" data-sort-value="{{disktotal}}">
+ <div style="border:1px solid #ddd;background:linear-gradient(to right, #f85 {{diskUsePercent}}%, transparent {{diskUsePercent}}%)"
+ class="text-center text-nowrap"
+ title="{{lang_diskFree}}: {{diskfree_s}}">
+ {{disktotal_s}}
+ </div>
+ </td>
+ <td data-sort="int" data-sort-default="desc" class="text-right">
+ {{#uptime}}
+ <a href="?do=dnbd3&amp;show=clients&amp;server={{serverid}}">{{clientcount}}</a>
+ {{/uptime}}
+ {{^uptime}}
+ -
+ {{/uptime}}
+ </td>
+ <td data-sort="int" data-sort-default="desc" data-sort-value="{{dnbd3lastseen}}" class="text-right text-nowrap">
+ {{dnbd3lastseen_s}}
+ </td>
+ <td data-sort="int" data-sort-default="desc" data-sort-value="{{uptime}}" class="text-right text-nowrap">
+ {{uptime_s}}
+ </td>
+ <td data-sort="int" data-sort-default="desc" data-sort-value="{{totalup}}" class="text-right text-nowrap">
+ {{totalup_s}}
+ </td>
+ <td data-sort="int" data-sort-default="desc" data-sort-value="{{totaldown}}" class="text-right text-nowrap">
+ {{totaldown_s}}
+ </td>
+ <td class="text-right text-nowrap">
+ {{^self}}
+ {{^locations}}
+ <i>{{lang_global}}</i>
+ {{/locations}}
+ {{#locations}}
+ {{locations}}
+ {{/locations}}
+ <a href="?do=dnbd3&amp;show=locations&amp;server={{serverid}}" class="btn btn-default btn-xs">
+ <span class="glyphicon glyphicon-map-marker"></span>
+ </a>
+ {{/self}}
+ </td>
+ <td class="text-right">
+ {{#machineuuid}}
+ <button class="btn btn-default btn-xs edit-btn" type="button" data-id="{{serverid}}"
+ data-toggle="modal" data-target="#server-edit-modal">
+ <span class="glyphicon glyphicon-cog"></span>
+ </button>
+ {{/machineuuid}}
+ {{^self}}
+ <button class="btn btn-danger btn-xs" name="server" value="{{serverid}}" onclick="return confirm('{{lang_wantToDelete}}')">
+ <span class="glyphicon glyphicon-trash"></span>
+ </button>
+ {{/self}}
+ </td>
+ </tr>
+ {{/list}}
+ </tbody>
</table>
</form>
-<div class="buttonbar pull-right">
- <button type="button" class="btn btn-success" data-toggle="modal" data-target="#add-modal">
- <span class="glyphicon glyphicon-plus"></span>
- {{lang_addExternalServer}}
- </button>
- <a class="btn btn-success" href="?do=runmode&amp;module=dnbd3&amp;modeid=proxy&amp;redirect=?do=dnbd3">
- <span class="glyphicon glyphicon-plus"></span>
- {{lang_addManagedProxy}}
- </a>
+<div class="btn-toolbar pull-right">
+ <div class="btn-group">
+ <button type="button" class="btn btn-success" data-toggle="modal" data-target="#add-modal">
+ <span class="glyphicon glyphicon-plus"></span>
+ {{lang_externalServerAdd}}
+ </button>
+ <button type="button" class="btn btn-default" data-toggle="modal" data-target="#help-external">
+ <span class="glyphicon glyphicon-question-sign"></span>
+ </button>
+ </div>
+ <div class="btn-group">
+ <a class="btn btn-success" href="?do=runmode&amp;module=dnbd3&amp;modeid=proxy&amp;redirect=?do=dnbd3">
+ <span class="glyphicon glyphicon-plus"></span>
+ {{lang_managedServerAdd}}
+ </a>
+ <button type="button" class="btn btn-default" data-toggle="modal" data-target="#help-automatic">
+ <span class="glyphicon glyphicon-question-sign"></span>
+ </button>
+ </div>
</div>
-<div id="add-modal" class="modal fade" role="dialog">
+<div id="help-external" class="modal fade" role="dialog">
<div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal">&times;</button>
+ <h4 class="modal-title"><b>{{lang_externalServer}}</b></h4>
+ </div>
+ <div class="modal-body">
+ {{lang_externalServerHelp}}
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-primary pull-right" data-dismiss="modal">
+ {{lang_close}}
+ </button>
+ </div>
+ </div>
+ </div>
+</div>
+<div id="help-automatic" class="modal fade" role="dialog">
+ <div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">&times;</button>
- <h4 class="modal-title"><b>{{lang_addServer}}</b></h4>
+ <h4 class="modal-title"><b>{{lang_managedServer}}</b></h4>
</div>
<div class="modal-body">
- <p>{{lang_enterIpOfServer}}</p>
- <form id="addform" method="post" action="?do=dnbd3">
+ {{lang_managedServerHelp}}
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-primary pull-right" data-dismiss="modal">
+ {{lang_close}}
+ </button>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div id="server-edit-modal" class="modal fade" role="dialog">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal">&times;</button>
+ <h4 class="modal-title"><b>{{lang_editProxyHeading}}</b></h4>
+ </div>
+ <div class="modal-body" id="server-edit-body">
+ .
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-primary pull-right" data-dismiss="modal">
+ {{lang_close}}
+ </button>
+ </div>
+ </div>
+ </div>
+</div>
+
+<div id="add-modal" class="modal fade" role="dialog">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal">&times;</button>
+ <h4 class="modal-title"><b>{{lang_addServer}}</b></h4>
+ </div>
+ <form id="addform" method="post" action="?do=dnbd3">
+ <div class="modal-body">
+ <p>{{lang_enterIpOfServer}}</p>
+
<input type="hidden" name="token" value="{{token}}">
<input type="text" class="form-control" name="newip" id="newip">
- <br>
- <div class="buttonbar pull-right">
- <button id="testbtn" type="submit" class="btn btn-warning">
+ <div id="addtest" class="text-danger"></div>
+ </div>
+ <div class="modal-footer">
+ <div class="btn-toolbar pull-right">
+ <button id="testbtn" type="submit" class="btn btn-warning" name="action" value="addserver">
<span class="glyphicon glyphicon-question-sign"></span>
{{lang_test}}
</button>
- <button id="savebtn" type="submit" class="btn btn-success" name="action" value="addserver" disabled>
+ <button id="savebtn" type="submit" class="btn btn-primary" name="action" value="addserver" disabled>
<span class="glyphicon glyphicon-floppy-disk"></span>
{{lang_save}}
</button>
</div>
- </form>
- <div id="addtest" class="text-danger"></div>
- <div class="clearfix"></div>
- </div>
- <div class="modal-footer">
- </div>
+ </div>
+ </form>
</div>
</div>
</div>
@@ -132,6 +256,7 @@
<script type="application/javascript"><!--
document.addEventListener('DOMContentLoaded', function () {
var slxWorking = false;
+ var testedIp;
const $form = $('#addform');
const $inputs = $form.find(':input');
const $result =$('#addtest');
@@ -139,17 +264,23 @@ document.addEventListener('DOMContentLoaded', function () {
const $save = $('#savebtn');
const changeFunc = function() {
- $save.prop('disabled', true);
+ $save.prop('disabled', $ip.val() !== testedIp);
};
- $ip.change(changeFunc).keypress(changeFunc);
+ $ip.change(changeFunc).keypress(function () { setTimeout(changeFunc, 1); });
$form.submit(function (event) {
+ console.log('pre-sub');
+ console.log($save.prop('disabled'));
if (!$save.prop('disabled')) return;
+ console.log('post-sub');
event.preventDefault();
runTest();
});
$('#testbtn').click(function (event) {
+ console.log('pre-focus');
+ if ($ip.is(':focus')) return;
+ console.log('post-focus');
event.preventDefault();
runTest();
});
@@ -170,6 +301,7 @@ document.addEventListener('DOMContentLoaded', function () {
}
};
setTimeout(resetFunc, 3000);
+ testedIp = ip;
$.post('?do=dnbd3', {action:'servertest', ip:ip, token:TOKEN}, function (data) {
if (workCopy !== slxWorking) return;
resetFunc(true);
@@ -183,11 +315,15 @@ document.addEventListener('DOMContentLoaded', function () {
}
}, 'json').fail(function(oh, what) {
resetFunc(true);
- console.log(what);
$result.empty().addClass('text-danger').text('Fail ' + what);
});
}
}
+
+ $('.edit-btn').click(function() {
+ var id = $(this).data('id');
+ $('#server-edit-body').text('loading').load('?do=dnbd3&action=editserver&server=' + id);
+ });
});
//--></script> \ No newline at end of file