summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rettberg2019-12-07 15:28:30 +0100
committerSimon Rettberg2019-12-07 15:28:30 +0100
commit7d6275514cd4e0ab2903f8c0891c85f3b0e66539 (patch)
treee5bb9520cc6e715dbfa8e24650e97167ea8126d1
parentMerge branch 'master' into wol (diff)
downloadslx-admin-7d6275514cd4e0ab2903f8c0891c85f3b0e66539.tar.gz
slx-admin-7d6275514cd4e0ab2903f8c0891c85f3b0e66539.tar.xz
slx-admin-7d6275514cd4e0ab2903f8c0891c85f3b0e66539.zip
[rebootcontrol] Implement assigning subnets to jump host
Also fix removing all jump hosts from a subnet. Update translations.
-rw-r--r--modules-available/rebootcontrol/lang/de/messages.json9
-rw-r--r--modules-available/rebootcontrol/lang/de/module.json4
-rw-r--r--modules-available/rebootcontrol/lang/de/permissions.json11
-rw-r--r--modules-available/rebootcontrol/lang/de/template-tags.json28
-rw-r--r--modules-available/rebootcontrol/pages/jumphost.inc.php57
-rw-r--r--modules-available/rebootcontrol/pages/subnet.inc.php4
-rw-r--r--modules-available/rebootcontrol/templates/jumphost-list.html12
-rw-r--r--modules-available/rebootcontrol/templates/jumphost-subnets.html28
-rw-r--r--modules-available/rebootcontrol/templates/subnet-list.html2
9 files changed, 121 insertions, 34 deletions
diff --git a/modules-available/rebootcontrol/lang/de/messages.json b/modules-available/rebootcontrol/lang/de/messages.json
index 81ddcb67..7b122554 100644
--- a/modules-available/rebootcontrol/lang/de/messages.json
+++ b/modules-available/rebootcontrol/lang/de/messages.json
@@ -1,16 +1,17 @@
{
+ "invalid-cidr": "Ung\u00fcltige CIDR-Angabe: {{0}}",
"invalid-ip-address": "Ung\u00fcltige IP-Adresse: {{0}}",
"invalid-port": "Ung\u00fcltiger Port: {{0}}",
- "invalid-subnet": "Ung\u00fcltiges Subnet: {{0}}",
+ "invalid-subnet": "Ung\u00fcltiges Subnetz: {{0}}",
"jumphost-saved": "Sprung-Host {{0}} gespeichert",
"no-clients-selected": "Keine Clients ausgew\u00e4hlt",
"no-current-tasks": "Keine aktuellen oder k\u00fcrzlich abgeschlossenen Aufgaben",
"no-such-jumphost": "Sprung-Host {{0}} existiert nicht",
"no-such-task": "Task {{0}} existiert nicht",
"some-machine-not-found": "Einige Clients aus dem POST request wurden nicht gefunden",
- "subnet-already-exists": "Subnet existiert bereits",
- "subnet-created": "Subnet angelegt",
- "subnet-updated": "Subnet aktualisiert",
+ "subnet-already-exists": "Subnetz existiert bereits",
+ "subnet-created": "Subnetz angelegt",
+ "subnet-updated": "Subnetz aktualisiert",
"unknown-task-type": "Unbekannter Task-Typ",
"woldiscover-disabled": "Automatische WOL-Ermittlung deaktiviert",
"woldiscover-enabled": "Automatische WOL-Ermittlung aktiviert"
diff --git a/modules-available/rebootcontrol/lang/de/module.json b/modules-available/rebootcontrol/lang/de/module.json
index 47d91e98..24dae3f1 100644
--- a/modules-available/rebootcontrol/lang/de/module.json
+++ b/modules-available/rebootcontrol/lang/de/module.json
@@ -1,4 +1,6 @@
{
+ "jumphosts": "Sprung-Hosts",
"module_name": "WakeOnLAN",
- "page_title": "WakeOnLAN"
+ "page_title": "WakeOnLAN",
+ "subnets": "Subnetze"
} \ No newline at end of file
diff --git a/modules-available/rebootcontrol/lang/de/permissions.json b/modules-available/rebootcontrol/lang/de/permissions.json
index 405fd9f5..a5ae8c9c 100644
--- a/modules-available/rebootcontrol/lang/de/permissions.json
+++ b/modules-available/rebootcontrol/lang/de/permissions.json
@@ -1,13 +1,14 @@
{
+ "action.exec": "Befehle als root auf laufenden Clients ausf\u00fchren.",
"action.reboot": "Client neustarten.",
"action.shutdown": "Client herunterfahren.",
"action.wol": "Client per WOL starten.",
- "jumphost.assign-subnet": "Einem Sprung-Host ein Subnet zuweisen.",
+ "jumphost.assign-subnet": "Einem Sprung-Host ein Subnetz zuweisen.",
"jumphost.edit": "Einen Sprung-Host bearbeiten.",
"jumphost.view": "Liste der Sprung-Hosts sehen.",
"newkeypair": "Neues Schl\u00fcsselpaar generieren.",
- "subnet.edit": "Subnets hinzuf\u00fcgen\/entfernen.",
- "subnet.flag": "Eigenschaften eines Subnets bearbeiten.",
- "subnet.view": "Liste der Subnets sehen.",
- "woldiscover": "Automatische Ermittlung von subnet\u00fcbergreifender WOL-F\u00e4higkeit."
+ "subnet.edit": "Subnetze hinzuf\u00fcgen\/entfernen.",
+ "subnet.flag": "Eigenschaften eines Subnetzs bearbeiten.",
+ "subnet.view": "Liste der Subnetzs sehen.",
+ "woldiscover": "Automatische Ermittlung von subnetz\u00fcbergreifender WOL-F\u00e4higkeit."
} \ No newline at end of file
diff --git a/modules-available/rebootcontrol/lang/de/template-tags.json b/modules-available/rebootcontrol/lang/de/template-tags.json
index 37b01e35..d27a0773 100644
--- a/modules-available/rebootcontrol/lang/de/template-tags.json
+++ b/modules-available/rebootcontrol/lang/de/template-tags.json
@@ -1,9 +1,10 @@
{
+ "lang_aWolJob": "WakeOnLAN-Job",
"lang_activeTasks": "Laufende Jobs",
"lang_add": "Hinzuf\u00fcgen",
- "lang_addNewSubnet": "Ein Subnet manuell hinzuf\u00fcgen",
+ "lang_addNewSubnet": "Ein Subnetz manuell hinzuf\u00fcgen",
"lang_assignedJumpHosts": "Zugewiesene Sprung-Hosts",
- "lang_assignedSubnets": "Subnets",
+ "lang_assignedSubnets": "Zugewiesene Subnetze",
"lang_authFail": "Authentifizierung fehlgeschlagen",
"lang_check": "Testen",
"lang_checkOutputLabel": "Ausgabe",
@@ -12,10 +13,10 @@
"lang_clientCount": "# Clients",
"lang_connecting": "Verbinde...",
"lang_editJumpHost": "Sprung-Host bearbeiten",
- "lang_editSubnet": "Subnet bearbeiten",
+ "lang_editSubnet": "Subnetz bearbeiten",
"lang_error": "Nicht erreichbar",
- "lang_fixSubnetDesc": "Wenn aktiviert, wird die Erreichbarkeit f\u00fcr ideses Subnet nicht mehr automatisch ermittelt. Sie k\u00f6nnen in diesem Fall selber festlegen, ob das Subnet WOL-Pakete vom Satelliten-Server empfangen kann. Au\u00dferdem wird das Subnet bei Setzen dieser Option nicht mehr automatisch aus der Datenbank gel\u00f6scht, wenn 6 Monate lang kein Client in diesem Subnet gesehen wurde.",
- "lang_fixSubnetSettings": "Subnet-Einstellungen manuell festlegen",
+ "lang_fixSubnetDesc": "Wenn aktiviert, wird die Erreichbarkeit f\u00fcr ideses Subnetz nicht mehr automatisch ermittelt. Sie k\u00f6nnen in diesem Fall selber festlegen, ob das Subnetz WOL-Pakete vom Satelliten-Server empfangen kann. Au\u00dferdem wird das Subnetz bei Setzen dieser Option nicht mehr automatisch aus der Datenbank gel\u00f6scht, wenn 6 Monate lang kein Client in diesem Subnetz gesehen wurde.",
+ "lang_fixSubnetSettings": "Subnetz-Einstellungen manuell festlegen",
"lang_genNew": "Neues Schl\u00fcsselpaar generieren",
"lang_host": "Host",
"lang_hostDeleteConfirm": "Diesen Sprung-Host l\u00f6schen?",
@@ -25,14 +26,16 @@
"lang_ip": "IP",
"lang_isDirect": "Vom Satellit erreichbar",
"lang_isFixed": "Manuell konfiguriert",
+ "lang_jumpHost": "Sprung-Host",
"lang_jumpHosts": "Sprung-Hosts",
"lang_keypairConfirmCheck": "Ich bin sicher",
"lang_lastseen": "Zuletzt gesehen",
"lang_location": "Standort",
- "lang_mode": "Modus",
"lang_moduleHeading": "WakeOnLAN",
"lang_new": "Neu",
"lang_newKeypairExplanation": "Sie k\u00f6nnen ein neues Schl\u00fcsselpaar erzeugen lassen. In diesem Fall wird das alte Schl\u00fcsselpaar verworfen, sodass alle zum jetzigen Zeitpunkt bereits gestarteten Rechner nicht mehr aus der Ferne bedient werden k\u00f6nnen, bis diese manuell neugestartet wurden.",
+ "lang_noTasksForJob": "Keine Tasks f\u00fcr diesen Job",
+ "lang_numAssignedSubnets": "# Netze",
"lang_online": "Online",
"lang_port": "Port",
"lang_privkey": "Geheimer Schl\u00fcssel",
@@ -40,7 +43,7 @@
"lang_reachable": "Erreichbar",
"lang_reachableFrom": "Erreichbar von",
"lang_reachableFromServer": "Erreichbar vom Satelliten-Server",
- "lang_reachableFromServerDesc": "Wenn dieser Haken gesetzt ist wird angenommen, dass WOL-Pakete, die vom Server aus gesendet werden, dieses Subnet erreichen k\u00f6nnen. Dazu muss der Router des Ziel-Netzes sog. \"Directed Broadcasts\" unterst\u00fctzen bzw. nicht filtern.",
+ "lang_reachableFromServerDesc": "Wenn dieser Haken gesetzt ist wird angenommen, dass WOL-Pakete, die vom Server aus gesendet werden, dieses Subnetz erreichen k\u00f6nnen. Dazu muss der Router des Ziel-Netzes sog. \"Directed Broadcasts\" unterst\u00fctzen bzw. nicht filtern.",
"lang_rebootAt": "Neustart um:",
"lang_rebooting": "Neustart...",
"lang_saveWolAutoDiscover": "Auto-Erkennung ein\/ausschalten",
@@ -48,15 +51,16 @@
"lang_shutdown": "Herunterfahren",
"lang_shutdownAt": "Herunterfahren um: ",
"lang_status": "Status",
- "lang_subnet": "Subnet",
- "lang_subnets": "Subnets",
- "lang_subnetsDescription": "Dies sind dem Satelliten-Server bekannte Subnetze. Damit WOL \u00fcber Subnet-Grenzen hinaus funktioniert, muss bekannt sein, in welche Netze \"Directed Broadcasts\" gesendet werden k\u00f6nnen, bzw. f\u00fcr welche Netze ein \"Sprung-Host\" existiert. Diese Liste wird sich automatisch f\u00fcllen, wenn Clients gestartet werden. Au\u00dferdem wird automatisch ermittelt, welche Netze mittels \"Directed Broadcasts\" erreichbar sind, sofern diese Funktion nicht oben unter \"Einstellungen\" deaktiviert wird.",
+ "lang_subnet": "Subnetz",
+ "lang_subnets": "Subnetze",
+ "lang_subnetsDescription": "Dies sind dem Satelliten-Server bekannte Subnetze. Damit WOL \u00fcber Subnetz-Grenzen hinaus funktioniert, muss bekannt sein, in welche Netze \"Directed Broadcasts\" gesendet werden k\u00f6nnen, bzw. f\u00fcr welche Netze ein \"Sprung-Host\" existiert. Diese Liste wird sich automatisch f\u00fcllen, wenn Clients gestartet werden. Au\u00dferdem wird automatisch ermittelt, welche Netze mittels \"Directed Broadcasts\" erreichbar sind, sofern diese Funktion nicht oben unter \"Einstellungen\" deaktiviert wird.",
+ "lang_task": "Task",
"lang_taskListIntro": "Hier sehen Sie eine Liste k\u00fcrzlich gestarteter Aufgaben, wie z.B. WOL-Aktionen, das Neustarten oder Herunterfahren von Clients, etc.",
- "lang_time": "Zeit",
"lang_wakeScriptHelp": "Dieses Script wird auf dem Sprung-Host ausgef\u00fchrt, um den\/die gew\u00fcnschten Maschinen aufzuwecken. Es wird unter der Standard-Shell des oben angegebenen Benutzers ausgef\u00fchrt. Das Script kann zwei spezielle Platzhalter enthalten, die vor dem Ausf\u00fchren des Scripts vom Satellitenserver ersetzt werden: %MACS% ist eine durch Leerzeichen getrennte Liste von MAC-Adressen, die aufzuwecken sind. Das Tool \"wakeonlan\" unterst\u00fctzt direkt mehrere MAC-Adressen, sodass der Platzhalter %MACS% direkt als Kommandozeilenargument verwendet werden kann. Das Tool \"etherwake\" hingegen kann pro Aufruf immer nur einen Host aufwecken, weshalb eine for-Schleife notwendig ist. Au\u00dferdem wird der Platzhalter %IP% ersetzt, welcher je nach Ziel entweder \"255.255.255.255\" ist, oder bei einem netz\u00fcbergreifenden WOL-Paket die \"directed broadcast address\" des Zielnetzes. Netz\u00fcbergreifende WOL-Pakete werden vom \"etherwake\" nicht unterst\u00fctzt.",
"lang_wakeupScript": "Aufweck-Script",
- "lang_wolAutoDiscoverCheck": "WOL-Erreichbarkeit von Subnets automatisch ermitteln",
+ "lang_wolAutoDiscoverCheck": "WOL-Erreichbarkeit von Subnetzs automatisch ermitteln",
"lang_wolDiscoverDescription": "Ist diese Option aktiv, ermitteln Server und Clients automatisch, welche Netze von wo mittels WOL erreichbar sind.",
"lang_wolDiscoverHeading": "Automatische WOL-Ermittlung",
+ "lang_wolMachineSupportText": "Sind die technischen Voraussetzungen erf\u00fcllt, dass ein WOL-Paket den gew\u00fcnschten Rechner erreichen kann, ist es weiterhin erforderlich, dass der Rechner mittels BIOS und evtl. vorhandenem Betriebssystem so konfiguriert wird, dass er auch auf WOL-Pakete reagiert. Zum einen muss die Funktion im BIOS aktiviert sein. Hier ist auch darauf zu achten, ob es eine zus\u00e4tzliche Einstellung gibt, die die normale Bootreihenfolge \u00fcberschreibt, und dass diese wie gew\u00fcnscht konfiguriert wird. Ist WOL im BIOS aktiviert, kann das Betriebssystem die Funktionalit\u00e4t noch per Software ein- und ausschalten. Unter Windows erfolgt dies im Ger\u00e4temanager in den Eigenschaften der Netzwerkkarte. Dies ist relevant, wenn parallel zu bwLehrpool noch ein Windows von der lokaler Platte betrieben wird. Unter Linux kann die WOL-Funktion mit dem ethtool beeinflusst werden. bwLehrpool aktiviert WOL automatisch bei jedem Boot.",
"lang_wolReachability": "WOL-Erreichbarkeit"
} \ No newline at end of file
diff --git a/modules-available/rebootcontrol/pages/jumphost.inc.php b/modules-available/rebootcontrol/pages/jumphost.inc.php
index 7dcdd52c..da5badb5 100644
--- a/modules-available/rebootcontrol/pages/jumphost.inc.php
+++ b/modules-available/rebootcontrol/pages/jumphost.inc.php
@@ -8,6 +8,8 @@ class SubPage
$action = Request::post('action', false, 'string');
if ($action === 'save') {
self::saveJumpHost();
+ } elseif ($action === 'assign') {
+ self::saveSubnetAssignment();
} elseif ($action === 'list') {
self::listAction();
}
@@ -22,6 +24,7 @@ class SubPage
$id = Request::post('checkid', false, 'int');
if ($id !== false) {
// Check connectivity
+ User::assertPermission('jumphost.edit');
self::execCheckConnection($id);
return;
}
@@ -65,22 +68,44 @@ class SubPage
}
}
if ($ret > 0) {
- Message::addSuccess('jumphost-saved', $id);
+ Message::addSuccess('jumphost-saved', $host);
self::execCheckConnection($id);
} else {
Message::addError('no-such-jumphost', $id);
}
}
+ private static function saveSubnetAssignment()
+ {
+ User::assertPermission('jumphost.edit');
+ $id = Request::post('hostid', Request::REQUIRED, 'string');
+ $host = self::getJumpHost($id);
+ $nets = Request::post('subnet', [], 'array');
+ if (empty($nets)) {
+ Database::exec('DELETE FROM reboot_jumphost_x_subnet WHERE hostid = :id', ['id' => $id]);
+ } else {
+ $nets = array_keys($nets);
+ Database::exec('DELETE FROM reboot_jumphost_x_subnet WHERE hostid = :id AND subnetid NOT IN (:nets)',
+ ['id' => $id, 'nets' => $nets]);
+ $nets = array_map(function($item) use ($id) {
+ return [$id, $item];
+ }, $nets);
+ Database::exec('INSERT IGNORE INTO reboot_jumphost_x_subnet (hostid, subnetid) VALUES :nets', ['nets' => $nets]);
+ }
+ Message::addSuccess('jumphost-saved', $host['host']);
+ }
+
/*
* Render
*/
public static function doRender()
{
- $id = Request::get('id', false, 'string');
- if ($id !== false) {
- self::showJumpHost($id);
+ $what = Request::get('what', 'list', 'string');
+ if ($what === 'edit') {
+ self::showJumpHost();
+ } elseif ($what === 'assign') {
+ self::showAssignSubnets();
} else {
self::showJumpHosts();
}
@@ -105,9 +130,10 @@ class SubPage
Render::addTemplate('jumphost-list', $data);
}
- private static function showJumpHost($id)
+ private static function showJumpHost()
{
User::assertPermission('jumphost.edit');
+ $id = Request::get('id', Request::REQUIRED, 'string');
if ($id === 'new') {
$host = ['hostid' => 'new', 'port' => 22, 'script' => "# Assume bash\n"
. "MACS='%MACS%'\n"
@@ -137,6 +163,27 @@ class SubPage
Render::addTemplate('jumphost-edit', $host);
}
+ private static function showAssignSubnets()
+ {
+ User::assertPermission('jumphost.assign-subnet');
+ $id = Request::get('id', Request::REQUIRED, 'int');
+ $host = self::getJumpHost($id);
+ $res = Database::simpleQuery('SELECT s.subnetid, s.start, s.end, jxs.hostid FROM reboot_subnet s
+ LEFT JOIN reboot_jumphost_x_subnet jxs ON (s.subnetid = jxs.subnetid AND jxs.hostid = :id)
+ ORDER BY start ASC',
+ ['id' => $id]);
+ $list = [];
+ while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
+ $row['cidr'] = IpUtil::rangeToCidr($row['start'], $row['end']);
+ if ($row['hostid'] !== null) {
+ $row['checked'] = 'checked';
+ }
+ $list[] = $row;
+ }
+ $host['list'] = $list;
+ Render::addTemplate('jumphost-subnets', $host);
+ }
+
public static function doAjax()
{
diff --git a/modules-available/rebootcontrol/pages/subnet.inc.php b/modules-available/rebootcontrol/pages/subnet.inc.php
index c38c7595..45151954 100644
--- a/modules-available/rebootcontrol/pages/subnet.inc.php
+++ b/modules-available/rebootcontrol/pages/subnet.inc.php
@@ -58,7 +58,9 @@ class SubPage
WHERE subnetid = :id', $params);
if (User::hasPermission('jumphost.assign-subnet')) {
$hosts = Request::post('jumphost', [], 'array');
- if (!empty($hosts)) {
+ if (empty($hosts)) {
+ Database::exec('DELETE FROM reboot_jumphost_x_subnet WHERE subnetid = :id AND', ['id' => $id]);
+ } else {
$hosts = array_keys($hosts);
Database::exec('DELETE FROM reboot_jumphost_x_subnet WHERE subnetid = :id AND hostid NOT IN (:hosts)',
['id' => $id, 'hosts' => $hosts]);
diff --git a/modules-available/rebootcontrol/templates/jumphost-list.html b/modules-available/rebootcontrol/templates/jumphost-list.html
index 8453d2bb..6023c872 100644
--- a/modules-available/rebootcontrol/templates/jumphost-list.html
+++ b/modules-available/rebootcontrol/templates/jumphost-list.html
@@ -12,7 +12,7 @@
<thead>
<tr>
<th>{{lang_host}}</th>
- <th class="slx-smallcol">{{lang_assignedSubnets}}</th>
+ <th class="slx-smallcol">{{lang_numAssignedSubnets}}</th>
<th class="slx-smallcol">{{lang_reachable}}</th>
<th class="slx-smallcol"></th>
</tr>
@@ -22,11 +22,11 @@
<tr>
<td>{{host}}:{{port}}</td>
<td class="text-nowrap text-right">
- {{subnetCount}}
<a class="btn btn-xs btn-default {{perms.jumphost.assign-subnet.disabled}}"
- href="?do=rebootcontrol&amp;show=jumphost-assign&amp;id={{hostid}}">
- <span class="glyphicon glyphicon-edit"></span>
+ href="?do=rebootcontrol&amp;show=jumphost&amp;what=assign&amp;id={{hostid}}">
+ <span class="glyphicon glyphicon-tasks"></span>
</a>
+ <span class="badge">{{subnetCount}}</span>
</td>
<td class="text-nowrap text-center">
{{#reachable}}
@@ -42,7 +42,7 @@
</td>
<td class="text-nowrap text-center">
<a class="btn btn-xs btn-default {{perms.jumphost.edit.disabled}}"
- href="?do=rebootcontrol&amp;show=jumphost&amp;id={{hostid}}">
+ href="?do=rebootcontrol&amp;show=jumphost&amp;what=edit&amp;id={{hostid}}">
<span class="glyphicon glyphicon-edit"></span>
</a>
<button type="submit" name="deleteid" value="{{hostid}}" class="btn btn-xs btn-danger"
@@ -56,7 +56,7 @@
</table>
</form>
<div class="buttonbar text-right">
- <a class="btn btn-success" href="?do=rebootcontrol&amp;show=jumphost&amp;id=new">
+ <a class="btn btn-success" href="?do=rebootcontrol&amp;show=jumphost&amp;what=edit&amp;id=new">
<span class="glyphicon glyphicon-plus"></span>
{{lang_new}}
</a>
diff --git a/modules-available/rebootcontrol/templates/jumphost-subnets.html b/modules-available/rebootcontrol/templates/jumphost-subnets.html
new file mode 100644
index 00000000..9b418667
--- /dev/null
+++ b/modules-available/rebootcontrol/templates/jumphost-subnets.html
@@ -0,0 +1,28 @@
+<h2>{{lang_jumpHost}} {{host}} - {{lang_assignedSubnets}}</h2>
+
+<form method="post" action="?do=rebootcontrol">
+ <input type="hidden" name="token" value="{{token}}">
+ <input type="hidden" name="show" value="jumphost">
+ <input type="hidden" name="action" value="assign">
+ <input type="hidden" name="hostid" value="{{hostid}}">
+ <div class="list-group">
+ <div class="list-group-item">
+ {{#list}}
+ <div class="row">
+ <div class="col-md-12">
+ <div class="checkbox">
+ <input id="check-{{subnetid}}" type="checkbox" name="subnet[{{subnetid}}]" {{checked}}>
+ <label for="check-{{subnetid}}">{{cidr}}</label>
+ </div>
+ </div>
+ </div>
+ {{/list}}
+ <div class="text-right">
+ <button type="submit" class="btn btn-primary">
+ <span class="glyphicon glyphicon-floppy-disk"></span>
+ {{lang_save}}
+ </button>
+ </div>
+ </div>
+ </div>
+</form> \ No newline at end of file
diff --git a/modules-available/rebootcontrol/templates/subnet-list.html b/modules-available/rebootcontrol/templates/subnet-list.html
index c5faae2b..bf6cee1c 100644
--- a/modules-available/rebootcontrol/templates/subnet-list.html
+++ b/modules-available/rebootcontrol/templates/subnet-list.html
@@ -4,6 +4,8 @@
<p>{{lang_subnetsDescription}}</p>
+<p>{{lang_wolMachineSupportText}}</p>
+
<table class="table">
<thead>
<tr>