summaryrefslogtreecommitdiffstats
path: root/modules-available/dnbd3
diff options
context:
space:
mode:
authorSimon Rettberg2018-03-20 11:30:53 +0100
committerSimon Rettberg2018-03-20 11:30:53 +0100
commit02111ed9a4935baf6c1f2968e50daf1b663702fe (patch)
tree44330c1b93538967d77eb9332ba1e8562c94835d /modules-available/dnbd3
parentDelete old unused lang files (diff)
downloadslx-admin-02111ed9a4935baf6c1f2968e50daf1b663702fe.tar.gz
slx-admin-02111ed9a4935baf6c1f2968e50daf1b663702fe.tar.xz
slx-admin-02111ed9a4935baf6c1f2968e50daf1b663702fe.zip
[dnbd3] Redesign proxy detail view, add image list
Diffstat (limited to 'modules-available/dnbd3')
-rw-r--r--modules-available/dnbd3/lang/de/template-tags.json14
-rw-r--r--modules-available/dnbd3/lang/en/template-tags.json8
-rw-r--r--modules-available/dnbd3/page.inc.php33
-rw-r--r--modules-available/dnbd3/templates/page-proxy-altservers.html12
-rw-r--r--modules-available/dnbd3/templates/page-proxy-clients.html69
-rw-r--r--modules-available/dnbd3/templates/page-proxy-config.html2
-rw-r--r--modules-available/dnbd3/templates/page-proxy-header.html3
-rw-r--r--modules-available/dnbd3/templates/page-proxy-images.html31
-rw-r--r--modules-available/dnbd3/templates/page-proxy-loclist.html27
-rw-r--r--modules-available/dnbd3/templates/page-proxy-stats.html26
10 files changed, 152 insertions, 73 deletions
diff --git a/modules-available/dnbd3/lang/de/template-tags.json b/modules-available/dnbd3/lang/de/template-tags.json
index 5406f1b5..4f3116a0 100644
--- a/modules-available/dnbd3/lang/de/template-tags.json
+++ b/modules-available/dnbd3/lang/de/template-tags.json
@@ -10,12 +10,14 @@
"lang_client": "Client",
"lang_clientCount": "Clients",
"lang_clientList": "Liste der Clients",
+ "lang_clients": "Clients",
"lang_clientsByLocation": "Clients nach Raum\/Ort",
"lang_comment": "Kommentar",
+ "lang_complete": "Komplett",
"lang_count": "Anzahl",
"lang_disabled": "Deaktiviert",
"lang_diskFree": "Freier Speicher",
- "lang_dnbd3IntroText": "DNBD3 ist ein verteiltes Speichersystem speziell f\u00fcr die Anforderungen von bwLehrpool. Erst in Verbindung mit mindestens einem Proxy (zus\u00e4tzlich zum Satellitenserver) kann das System seine Geschwindigkeitsvorteile gegen\u00fcber NFS\/CIFS ausspielen. F\u00fcr schlecht angebundene Poolr\u00e4ume empfiehlt sich jeweils ein eigener Proxy-Server.\r\nBitte beachten Sie die Hinweise im Wiki.",
+ "lang_dnbd3IntroText": "DNBD3 ist ein verteiltes Speichersystem speziell f\u00fcr die Anforderungen von bwLehrpool. Erst in Verbindung mit mindestens einem Proxy (zus\u00e4tzlich zum Satellitenserver) kann das System seine Geschwindigkeitsvorteile gegen\u00fcber NFS\/CIFS ausspielen. F\u00fcr schlecht angebundene Poolr\u00e4ume empfiehlt sich jeweils ein eigener Proxy-Server. Bitte beachten Sie die Hinweise im Wiki.",
"lang_dnbd3Management": "DNBD3 Verwaltung",
"lang_dnbd3Status": "DNBD3 Status",
"lang_editProxyHeading": "Proxy-Einstellungen bearbeiten",
@@ -24,11 +26,13 @@
"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_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. Dies 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. Weitere Informationen dazu finden Sie im Wiki.",
"lang_firewallInfo": "Wird ein Proxy auf einen oder mehrere R\u00e4ume beschr\u00e4nkt, werden Clients aus anderen R\u00e4umen diesen Proxy nicht verwenden. Technisch ist der Zugriff aus anderen R\u00e4umen jedoch trotzdem noch m\u00f6glich. Mit aktivieren dieser Option wird der Zugriff aus anderen R\u00e4umen per Firewall verhindert.",
"lang_firewalled": "Zugriff auf zugewiesene R\u00e4ume beschr\u00e4nken",
"lang_flags": "Flags",
"lang_global": "Global",
+ "lang_image": "Image",
+ "lang_imageList": "Image-Liste",
"lang_lastSeen": "Letzte Aktivit\u00e4t",
"lang_latency": "Latenz",
"lang_location": "Ort",
@@ -36,7 +40,9 @@
"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_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. Der Vorteil ist, dass die Konfiguration automatisiert erfolgt, und durch w\u00f6chentliche Reboots sichergestellt wird, dass eventuelle Updates des MiniLinux angewendet werden. In 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. Weitere Informationen dazu finden Sie im Wiki.",
+ "lang_manualRefresh": "Jetzt abfragen",
+ "lang_manualRefreshInfo": "Normalerweile werden die in dieser Tabelle angezeigten Daten alle 5 Minuten aktualisiert. Mit diesem Button k\u00f6nnen Sie die Daten sofort aktualisieren.",
"lang_numFails": "Fehler",
"lang_overrideIp": "Zu verwendende IP-Adresse",
"lang_overrideIpInfo": "Normalerweise wird die automatisch per DHCP zugewiesene Adresse auf dem Boot-Interface verwendet. Falls der Proxy mit weiteren Netzwerkkarten ausgestattet ist (die ebenfalls per DHCP konfiguriert werden) kann durch Angabe einer solchen Alternativadresse hier die Verwendung der entsprechenden Karte erzwungen werden.",
@@ -52,9 +58,11 @@
"lang_sessionRx": "Seit Neustart empfangen",
"lang_sessionTx": "Seit Neustart gesendet",
"lang_settings": "Einstellungen",
+ "lang_size": "Gr\u00f6\u00dfe",
"lang_storageSize": "Speichergr\u00f6\u00dfe",
"lang_test": "Testen",
"lang_txTotal": "Gesamt gesendet",
+ "lang_uplink": "Uplink",
"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/lang/en/template-tags.json b/modules-available/dnbd3/lang/en/template-tags.json
index 81b9d538..aef8ae75 100644
--- a/modules-available/dnbd3/lang/en/template-tags.json
+++ b/modules-available/dnbd3/lang/en/template-tags.json
@@ -10,8 +10,10 @@
"lang_client": "Client",
"lang_clientCount": "Clients",
"lang_clientList": "List of clients",
+ "lang_clients": "Clients",
"lang_clientsByLocation": "Clients by location",
"lang_comment": "Comment",
+ "lang_complete": "Complete",
"lang_count": "Count",
"lang_disabled": "Disabled",
"lang_diskFree": "Free space",
@@ -29,6 +31,8 @@
"lang_firewalled": "Limit access to corresponding locations",
"lang_flags": "Flags",
"lang_global": "Global",
+ "lang_image": "Image",
+ "lang_imageList": "Image list",
"lang_lastSeen": "Last seen",
"lang_latency": "Latency",
"lang_location": "Location",
@@ -37,6 +41,8 @@
"lang_managedServer": "Automatically configured DNBD3-Proxy",
"lang_managedServerAdd": "Add automatically configured proxy",
"lang_managedServerHelp": "Automatically configured DNBD3-Proxies will boot like normal bwLehrpool-Clients over PXE and the satellite server. If a client is configured as proxy it will boot with a different configuration and acts exclusively as proxy. The client can therefore not be used as a normal working station.\r\nThe advantage is that you don't need to install or configure anything else. The client will reboot every week to get possible updates ot the minilinux.\r\nIf you want to use this feature, please create a partition with ID 45 on the local hard disk of the proxy server. In contrast to the ID 44 partition which is formated after every reboot, this partition is persistent. As a rule of thumb the partition should be as big as possible. If there is no space left the proxy will delete the VM which hasn't be used for the longest time. More information in the wiki.",
+ "lang_manualRefresh": "Manual refresh",
+ "lang_manualRefreshInfo": "All servers are queried every 5 minutes to update the table below. Hit the refresh button to update the table immediately.",
"lang_numFails": "Errors",
"lang_overrideIp": "IP address to use",
"lang_overrideIpInfo": "Usually the address that the DHCP server assigns to the boot interface of the proxy will be used. If the proxy has multiple interfaces (that also get an address assigned via DHCP) you can specify that address here to enforce their usage instead.",
@@ -52,9 +58,11 @@
"lang_sessionRx": "Received since boot",
"lang_sessionTx": "Sent since boot",
"lang_settings": "Settings",
+ "lang_size": "Size",
"lang_storageSize": "Storage size",
"lang_test": "Test",
"lang_txTotal": "Total sent",
+ "lang_uplink": "Uplink",
"lang_uptime": "Uptime",
"lang_wantToDelete": "Do you really want to delete this server? (Reboot\/Shutdown has to be done manually)"
} \ No newline at end of file
diff --git a/modules-available/dnbd3/page.inc.php b/modules-available/dnbd3/page.inc.php
index afcb9b2c..8a9abdc1 100644
--- a/modules-available/dnbd3/page.inc.php
+++ b/modules-available/dnbd3/page.inc.php
@@ -264,26 +264,31 @@ class Page_Dnbd3 extends Page
User::assertPermission('view.details');
$server = $this->getServerById();
Render::addTemplate('page-proxy-header', $server);
- $stats = Dnbd3Rpc::query($server['ip'], 5003, true, true, false, true);
+ $stats = Dnbd3Rpc::query($server['ip'], 5003, true, true, true, true);
if (!is_array($stats) || !isset($stats['runId'])) {
Message::addError('server-unreachable');
return;
}
- $stats['bytesSent_s'] = Util::readableFileSize($stats['bytesSent']);
- $stats['bytesReceived_s'] = Util::readableFileSize($stats['bytesReceived']);
+ foreach (['bytesSent', 'bytesReceived', 'spaceTotal', 'spaceFree'] as $key) {
+ $stats[$key . '_s'] = Util::readableFileSize($stats[$key]);
+ }
+ if ($stats['spaceTotal'] > 0) {
+ $stats['percentFree'] = ($stats['spaceFree'] / $stats['spaceTotal']) * 100;
+ $stats['percentFree'] = round($stats['percentFree'], $stats['percentFree'] < 10 ? 1 : 0);
+ }
$stats['uptime_s'] = floor($stats['uptime'] / 86400) . 'd ' . gmdate('H:i:s', $stats['uptime']);
Render::addTemplate('page-proxy-stats', $stats);
- // TODO $images = Dnbd3Rpc::query($server['ip'], 5003, false, false, true);
+ Render::openTag('div', ['class' => 'tab-content']);
$confAlts = Dnbd3Rpc::query($server['ip'], 5003, false, false, false, false, true, true);
$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']);
+ $ips[preg_replace('/:\d+$/', '', $c['address'])] = true;
}
+ $ips = array_keys($ips);
array_multisort($sort, SORT_DESC, $stats['clients']);
- Render::openTag('div', ['class' => 'row']);
// Config
if (is_string($confAlts['config'])) {
Render::addTemplate('page-proxy-config', $confAlts);
@@ -295,10 +300,9 @@ class Page_Dnbd3 extends Page
unset($as);
Render::addTemplate('page-proxy-altservers', $confAlts);
}
- Render::closeTag('div');
- 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'));
+ $res = Database::simpleQuery("SELECT locationid, Count(*) AS cnt FROM machine
+ WHERE clientip IN (:ips) AND state IN ('IDLE', 'OCCUPIED') GROUP BY locationid", compact('ips'));
$locCount = Location::getLocationsAssoc();
$locCount[0] = array(
'locationname' => '/',
@@ -326,10 +330,17 @@ class Page_Dnbd3 extends Page
}
}
if ($showLocs) {
- $locCount = array_filter($locCount, function ($v) { return isset($v['keep']); });
- Render::addTemplate('page-proxy-loclist', array('list' => array_values($locCount)));
+ $stats['loclist'] = array_values(array_filter($locCount, function ($v) { return isset($v['keep']); }));
}
Render::addTemplate('page-proxy-clients', $stats);
+ $sort1 = $sort2 = [];
+ foreach ($stats['images'] as &$image) {
+ $image['size_s'] = Util::readableFileSize($image['size']);
+ $sort1[] = $image['users'];
+ $sort2[] = $image['name'];
+ }
+ array_multisort($sort1, SORT_NUMERIC | SORT_DESC, $sort2, SORT_ASC, $stats['images']);
+ Render::addTemplate('page-proxy-images', $stats);
Render::closeTag('div');
}
diff --git a/modules-available/dnbd3/templates/page-proxy-altservers.html b/modules-available/dnbd3/templates/page-proxy-altservers.html
index 00a884cc..d2e520f9 100644
--- a/modules-available/dnbd3/templates/page-proxy-altservers.html
+++ b/modules-available/dnbd3/templates/page-proxy-altservers.html
@@ -1,11 +1,11 @@
-<div class="col-md-6">
+<div role="tabpanel" class="tab-pane" id="tab-altservers">
<h2>{{lang_altservers}}</h2>
<table class="table table-condensed">
<tr>
- <th>{{lang_proxyServerTHead}}</th>
- <th>{{lang_numFails}}</th>
- <th class="text-right">{{lang_latency}}</th>
- <th>{{lang_flags}}</th>
+ <th class="slx-smallcol">{{lang_proxyServerTHead}}</th>
+ <th class="slx-smallcol">{{lang_numFails}}</th>
+ <th class="text-right slx-smallcol">{{lang_latency}}</th>
+ <th class="slx-smallcol">{{lang_flags}}</th>
<th>{{lang_comment}}</th>
</tr>
{{#altservers}}
@@ -21,7 +21,7 @@
{{rtt}}&thinsp;ms
{{/isClientOnly}}
</td>
- <td>
+ <td class="text-nowrap">
{{#isClientOnly}}
[CO]
{{/isClientOnly}}
diff --git a/modules-available/dnbd3/templates/page-proxy-clients.html b/modules-available/dnbd3/templates/page-proxy-clients.html
index 9e7cec4c..dde20632 100644
--- a/modules-available/dnbd3/templates/page-proxy-clients.html
+++ b/modules-available/dnbd3/templates/page-proxy-clients.html
@@ -1,20 +1,53 @@
-<div class="col-md-6">
- <h2>{{lang_clientList}}</h2>
+<div role="tabpanel" class="tab-pane" id="tab-clients">
+ <div class="row">
+ <div class="col-md-6">
+ {{#loclist.0}}
+ <h2>{{lang_clientsByLocation}}</h2>
- <table class="table table-condensed">
- <tr>
- <th>{{lang_client}}</th>
- <th class="text-right">{{lang_bytesSent}}</th>
- </tr>
- {{#clients}}
- <tr>
- <td>
- {{address}}
- </td>
- <td data-sort="int" data-sort-value="{{bytesSent}}" class="text-right">
- {{bytesSent_s}}
- </td>
- </tr>
- {{/clients}}
- </table>
+ <table class="table table-condensed">
+ <tr>
+ <th>{{lang_location}}</th>
+ <th class="text-right">{{lang_count}}</th>
+ <th class="text-right">{{lang_recursiveCount}}</th>
+ </tr>
+ {{#loclist}}
+ <tr>
+ <td>
+ {{#depth}}
+ <div style="display:inline-block;width:{{depth}}em"></div>
+ {{/depth}}
+ {{locationname}}
+ </td>
+ <td class="text-right">
+ {{clientCount}}
+ </td>
+ <td class="text-right">
+ {{recCount}}
+ </td>
+ </tr>
+ {{/loclist}}
+ </table>
+ {{/loclist.0}}
+ </div>
+ <div class="col-md-6">
+ <h2>{{lang_clientList}}</h2>
+
+ <table class="table table-condensed">
+ <tr>
+ <th>{{lang_client}}</th>
+ <th class="text-right">{{lang_bytesSent}}</th>
+ </tr>
+ {{#clients}}
+ <tr>
+ <td>
+ {{address}}
+ </td>
+ <td data-sort="int" data-sort-value="{{bytesSent}}" class="text-right">
+ {{bytesSent_s}}
+ </td>
+ </tr>
+ {{/clients}}
+ </table>
+ </div>
+ </div>
</div> \ No newline at end of file
diff --git a/modules-available/dnbd3/templates/page-proxy-config.html b/modules-available/dnbd3/templates/page-proxy-config.html
index adc73a57..46e732c1 100644
--- a/modules-available/dnbd3/templates/page-proxy-config.html
+++ b/modules-available/dnbd3/templates/page-proxy-config.html
@@ -1,4 +1,4 @@
-<div class="col-md-6">
+<div role="tabpanel" class="tab-pane active" id="tab-config">
<h2>{{lang_proxyConfig}}</h2>
<pre>{{config}}</pre>
</div> \ No newline at end of file
diff --git a/modules-available/dnbd3/templates/page-proxy-header.html b/modules-available/dnbd3/templates/page-proxy-header.html
index 6f3f1b7f..7f3418cc 100644
--- a/modules-available/dnbd3/templates/page-proxy-header.html
+++ b/modules-available/dnbd3/templates/page-proxy-header.html
@@ -1 +1,2 @@
-<h1>{{ip}}</h1> \ No newline at end of file
+<h1>{{ip}}</h1>
+
diff --git a/modules-available/dnbd3/templates/page-proxy-images.html b/modules-available/dnbd3/templates/page-proxy-images.html
new file mode 100644
index 00000000..7e30de20
--- /dev/null
+++ b/modules-available/dnbd3/templates/page-proxy-images.html
@@ -0,0 +1,31 @@
+<div role="tabpanel" class="tab-pane" id="tab-images">
+ <h2>{{lang_imageList}}</h2>
+ <table class="table table-condensed">
+ <tr>
+ <th>{{lang_image}}</th>
+ <th class="text-right slx-smallcol">{{lang_clients}}</th>
+ <th class="text-right slx-smallcol">{{lang_size}}</th>
+ <th class="text-right slx-smallcol">{{lang_complete}}</th>
+ <th class="slx-smallcol">{{lang_uplink}}</th>
+ </tr>
+ {{#images}}
+ <tr>
+ <td class="text-nowrap">
+ {{name}}:{{rid}}
+ </td>
+ <td class="text-right text-nowrap">
+ {{users}}
+ </td>
+ <td class="text-right text-nowrap">
+ {{size_s}}
+ </td>
+ <td class="text-right text-nowrap">
+ {{complete}}&thinsp;%
+ </td>
+ <td class="text-nowrap">
+ {{uplinkServer}}
+ </td>
+ </tr>
+ {{/images}}
+ </table>
+</div> \ No newline at end of file
diff --git a/modules-available/dnbd3/templates/page-proxy-loclist.html b/modules-available/dnbd3/templates/page-proxy-loclist.html
deleted file mode 100644
index 67c90683..00000000
--- a/modules-available/dnbd3/templates/page-proxy-loclist.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<div class="col-md-6">
- <h2>{{lang_clientsByLocation}}</h2>
-
- <table class="table table-condensed">
- <tr>
- <th>{{lang_location}}</th>
- <th class="text-right">{{lang_count}}</th>
- <th class="text-right">{{lang_recursiveCount}}</th>
- </tr>
- {{#list}}
- <tr>
- <td>
- {{#depth}}
- <div style="display:inline-block;width:{{depth}}em"></div>
- {{/depth}}
- {{locationname}}
- </td>
- <td class="text-right">
- {{clientCount}}
- </td>
- <td class="text-right">
- {{recCount}}
- </td>
- </tr>
- {{/list}}
- </table>
-</div> \ No newline at end of file
diff --git a/modules-available/dnbd3/templates/page-proxy-stats.html b/modules-available/dnbd3/templates/page-proxy-stats.html
index e7811028..9a03b718 100644
--- a/modules-available/dnbd3/templates/page-proxy-stats.html
+++ b/modules-available/dnbd3/templates/page-proxy-stats.html
@@ -1,9 +1,23 @@
<div class="panel panel-default">
<div class="panel-body">
- {{lang_sessionTx}}: <b>{{bytesSent_s}}</b>
- ––
- {{lang_sessionRx}}: <b>{{bytesReceived_s}}</b>
- ––
- {{lang_uptime}}: <b>{{uptime_s}}</b>
+ <div>
+ {{lang_sessionTx}}: <b>{{bytesSent_s}}</b>
+ ––
+ {{lang_sessionRx}}: <b>{{bytesReceived_s}}</b>
+ ––
+ {{lang_uptime}}: <b>{{uptime_s}}</b>
+ </div>
+ <div>
+ {{lang_storageSize}}: <b>{{spaceTotal_s}}</b>
+ ––
+ {{lang_diskFree}}: <b>{{spaceFree_s}} ({{percentFree}}&thinsp;%)</b>
+ </div>
</div>
-</div> \ No newline at end of file
+</div>
+
+<ul class="nav nav-tabs text-center" role="tablist">
+ <li role="presentation" class="active"><a href="#tab-config" role="tab" data-toggle="tab">{{lang_proxyConfig}}</a></li>
+ <li role="presentation"><a href="#tab-clients" role="tab" data-toggle="tab">{{lang_clientList}}</a></li>
+ <li role="presentation"><a href="#tab-images" role="tab" data-toggle="tab">{{lang_imageList}}</a></li>
+ <li role="presentation"><a href="#tab-altservers" role="tab" data-toggle="tab">{{lang_altservers}}</a></li>
+</ul> \ No newline at end of file