From da6ecc50178f51d4fefe9730d88d4aa88f90dba4 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Fri, 13 Oct 2017 15:13:38 +0200 Subject: [dnbd3] Implement settings dialog for automatic proxies --- modules-available/dnbd3/inc/dnbd3util.inc.php | 9 +- modules-available/dnbd3/lang/de/messages.json | 1 + modules-available/dnbd3/lang/de/template-tags.json | 5 ++ modules-available/dnbd3/page.inc.php | 97 +++++++++++++++------- .../dnbd3/templates/fragment-server-settings.html | 14 ++++ .../dnbd3/templates/page-serverlist.html | 29 ++++--- 6 files changed, 109 insertions(+), 46 deletions(-) create mode 100644 modules-available/dnbd3/templates/fragment-server-settings.html (limited to 'modules-available') diff --git a/modules-available/dnbd3/inc/dnbd3util.inc.php b/modules-available/dnbd3/inc/dnbd3util.inc.php index ae5e0cd7..03499413 100644 --- a/modules-available/dnbd3/inc/dnbd3util.inc.php +++ b/modules-available/dnbd3/inc/dnbd3util.inc.php @@ -38,7 +38,7 @@ class Dnbd3Util { array('machineuuid' => $client['machineuuid'])); // Missing from $servers now but we'll handle them in the next run, so don't bother } - // Same for this server - we use the special fixedip '' for it and need to prevent we don't have the + // Same for this server - we use the special fixedip '' for it and need to make surecx we don't have the // IP address of the server itself in the list. Database::exec('DELETE FROM dnbd3_server WHERE fixedip = :serverip', array('serverip' => $satServerIp)); Database::exec("INSERT IGNORE INTO dnbd3_server (fixedip) VALUES ('')"); @@ -93,7 +93,8 @@ class Dnbd3Util { while ($row = $res->fetch(PDO::FETCH_ASSOC)) { $assignedLocs[] = $row['locationid']; } - if (!empty($assignedLocs)) { + $modeData = (array)json_decode($modeData, true); + if (!empty($assignedLocs) && isset($modeData['firewall']) && $modeData['firewall']) { // Get all sub-locations too $recursiveLocs = $assignedLocs; $locations = Location::getLocationsAssoc(); @@ -140,6 +141,10 @@ class Dnbd3Util { if (!empty($private)) { ConfigHolder::add('SLX_DNBD3_PRIVATE', implode(' ', $private)); } + if (isset($modeData['bgr']) && $modeData['bgr']) { + // Background replication + ConfigHolder::add('SLX_DNBD3_BGR', '1'); + } ConfigHolder::add('SLX_ADDONS', '', 1000); ConfigHolder::add('SLX_SHUTDOWN_TIMEOUT', '', 1000); ConfigHolder::add('SLX_SHUTDOWN_SCHEDULE', '', 1000); diff --git a/modules-available/dnbd3/lang/de/messages.json b/modules-available/dnbd3/lang/de/messages.json index b5f455dd..630ebe31 100644 --- a/modules-available/dnbd3/lang/de/messages.json +++ b/modules-available/dnbd3/lang/de/messages.json @@ -1,5 +1,6 @@ { "invalid-ipv4": "{{0}} ist keine g\u00fcltige IPv4-Adresse", + "not-automatic-server": "{{0}} wird nicht \u00fcber den Satelliten verwaltet", "server-added": "Server {{0}} hinzugef\u00fcgt", "server-already-exists": "Server {{0}} existiert bereits", "server-deleted": "Server {{0}} gel\u00f6scht", diff --git a/modules-available/dnbd3/lang/de/template-tags.json b/modules-available/dnbd3/lang/de/template-tags.json index 0593950c..0f9920a2 100644 --- a/modules-available/dnbd3/lang/de/template-tags.json +++ b/modules-available/dnbd3/lang/de/template-tags.json @@ -1,6 +1,8 @@ { "lang_addServer": "Server hinzuf\u00fcgen", "lang_allowedSubnets": "Zum Zugriff freigegebene Subnets", + "lang_backgroundReplication": "Replikation im Hintergrund", + "lang_backgroundReplicationInfo": "Sobald eine VM \u00fcber den Proxy angefragt wird, spiegelt der Proxy im Hintergrund den vollst\u00e4ndigen Inhalt des VM-Abbildes, nicht nur die angefragten Bl\u00f6cke.", "lang_bytesSent": "Gesendet", "lang_changeDnbd3Status": "DNBD3 ein-\/ausschalten", "lang_client": "Client", @@ -13,12 +15,15 @@ "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_editProxyHeading": "Proxy-Einstellungen bearbeiten", "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_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_global": "Global", "lang_lastSeen": "Letzte Aktivit\u00e4t", "lang_location": "Ort", diff --git a/modules-available/dnbd3/page.inc.php b/modules-available/dnbd3/page.inc.php index a2d47f1e..cfe86e48 100644 --- a/modules-available/dnbd3/page.inc.php +++ b/modules-available/dnbd3/page.inc.php @@ -18,6 +18,8 @@ class Page_Dnbd3 extends Page $this->deleteServer(); } elseif ($action === 'addserver') { $this->addServer(); + } elseif ($action === 'editserver') { + $this->editServer(); } elseif ($action === 'savelocations') { $this->saveServerLocations(); } elseif ($action === 'toggle-usage') { @@ -28,6 +30,19 @@ class Page_Dnbd3 extends Page } } + private function editServer() + { + $server = $this->getServerById(); + if (!isset($server['machineuuid'])) { + Message::addError('not-automatic-server', $server['ip']); + return; + } + $bgr = Request::post('bgr', false, 'bool'); + $firewall = Request::post('firewall', false, 'bool'); + RunMode::setRunMode($server['machineuuid'], 'dnbd3', 'proxy', + json_encode(compact('bgr', 'firewall'))); + } + private function toggleUsage() { $enabled = Request::post('enabled', false, 'bool'); @@ -284,42 +299,60 @@ class Page_Dnbd3 extends Page { $action = Request::any('action', false, 'string'); if ($action === 'servertest') { - Header('Content-Type: application/json; charset=utf-8'); - $ip = Request::post('ip', false, 'string'); - if ($ip === false) - die('{"error": "Missing parameter", "fatal": true}'); - $ip = ip2long(trim($ip)); - if ($ip !== false) { - $ip = long2ip($ip); - } - if ($ip === false) - die('{"error": "Supports IPv4 only", "fatal": true}'); - // Dup? - $res = Database::queryFirst('SELECT serverid FROM dnbd3_server s - LEFT JOIN machine m USING (machineuuid) - WHERE s.fixedip = :ip OR m.clientip = :ip', compact('ip')); - if ($res !== false) - die('{"error": "Server with this IP already exists", "fatal": true}'); - // Query - $reply = Dnbd3Rpc::query($ip, 5003,true, false, false, true); - if ($reply === false) - die('{"error": "Could not reach server"}'); - if (!is_array($reply)) - die('{"error": "No JSON received from server"}'); - if (!isset($reply['uptime']) || !isset($reply['clientCount'])) - die('{"error": "Reply does not suggest this is a dnbd3 server"}'); - echo json_encode($reply); + $this->ajaxServerTest(); } elseif ($action === 'editserver') { - $server = $this->getServerById(); - if (isset($server['machineuuid'])) { - echo 'Not automatic server.'; - } else { - //RunMode::getForModule() - echo Render::parse('fragment-server-settings', $server); - } + $this->ajaxEditServer(); } else { die($action . '???'); } } + private function ajaxServerTest() + { + Header('Content-Type: application/json; charset=utf-8'); + $ip = Request::post('ip', false, 'string'); + if ($ip === false) + die('{"error": "Missing parameter", "fatal": true}'); + $ip = ip2long(trim($ip)); + if ($ip !== false) { + $ip = long2ip($ip); + } + if ($ip === false) + die('{"error": "Supports IPv4 only", "fatal": true}'); + // Dup? + $res = Database::queryFirst('SELECT serverid FROM dnbd3_server s + LEFT JOIN machine m USING (machineuuid) + WHERE s.fixedip = :ip OR m.clientip = :ip', compact('ip')); + if ($res !== false) + die('{"error": "Server with this IP already exists", "fatal": true}'); + // Query + $reply = Dnbd3Rpc::query($ip, 5003,true, false, false, true); + if ($reply === false) + die('{"error": "Could not reach server"}'); + if (!is_array($reply)) + die('{"error": "No JSON received from server"}'); + if (!isset($reply['uptime']) || !isset($reply['clientCount'])) + die('{"error": "Reply does not suggest this is a dnbd3 server"}'); + echo json_encode($reply); + } + + private function ajaxEditServer() + { + $server = $this->getServerById(); + if (!isset($server['machineuuid'])) { + echo 'Not automatic server.'; + return; + } + $rm = RunMode::getForMode(Page::getModule(), 'proxy', false, true); + if (!isset($rm[$server['machineuuid']])) { + echo 'Error: RunMode entry missing.'; + return; + } + $modeData = json_decode($rm[$server['machineuuid']]['modedata'], true); + if (is_array($modeData)) { + $server += $modeData; + } + echo Render::parse('fragment-server-settings', $server); + } + } diff --git a/modules-available/dnbd3/templates/fragment-server-settings.html b/modules-available/dnbd3/templates/fragment-server-settings.html new file mode 100644 index 00000000..61b0626d --- /dev/null +++ b/modules-available/dnbd3/templates/fragment-server-settings.html @@ -0,0 +1,14 @@ + + +
+ + +
+{{lang_backgroundReplicationInfo}} +
+
+ + +
+{{lang_firewallInfo}} +
diff --git a/modules-available/dnbd3/templates/page-serverlist.html b/modules-available/dnbd3/templates/page-serverlist.html index 84c587a2..2280511b 100644 --- a/modules-available/dnbd3/templates/page-serverlist.html +++ b/modules-available/dnbd3/templates/page-serverlist.html @@ -203,18 +203,23 @@ -- cgit v1.2.3-55-g7522