summaryrefslogtreecommitdiffstats
path: root/modules-available/dnbd3/page.inc.php
diff options
context:
space:
mode:
authorSimon Rettberg2017-10-11 16:01:18 +0200
committerSimon Rettberg2017-10-11 16:01:18 +0200
commit2bf954897109fc761a6aa39bfc4479e087671200 (patch)
tree5879636d5ec5a363074edf0243d2b088a7abe8ca /modules-available/dnbd3/page.inc.php
parent[dnbd3] Fix CIDR generation for proxies, add baseconfig hook for clients (diff)
downloadslx-admin-2bf954897109fc761a6aa39bfc4479e087671200.tar.gz
slx-admin-2bf954897109fc761a6aa39bfc4479e087671200.tar.xz
slx-admin-2bf954897109fc761a6aa39bfc4479e087671200.zip
[dnbd3] Implement adding and deleting servers
Diffstat (limited to 'modules-available/dnbd3/page.inc.php')
-rw-r--r--modules-available/dnbd3/page.inc.php83
1 files changed, 81 insertions, 2 deletions
diff --git a/modules-available/dnbd3/page.inc.php b/modules-available/dnbd3/page.inc.php
index 213afa03..3489cc5b 100644
--- a/modules-available/dnbd3/page.inc.php
+++ b/modules-available/dnbd3/page.inc.php
@@ -16,6 +16,8 @@ class Page_Dnbd3 extends Page
Dnbd3Util::updateServerStatus();
} elseif ($action === 'delserver') {
$this->deleteServer();
+ } elseif ($action === 'addserver') {
+ $this->addServer();
} elseif ($action === 'savelocations') {
$this->saveServerLocations();
}
@@ -41,6 +43,45 @@ class Page_Dnbd3 extends Page
}
}
+ private function addServer()
+ {
+ $ip = Request::post('newip', false, 'string');
+ if ($ip === false) {
+ Message::addError('main.parameter-missing', 'ip');
+ return;
+ }
+ $ip = ip2long(trim($ip));
+ if ($ip !== false) {
+ $ip = long2ip($ip);
+ }
+ if ($ip === false) {
+ Message::addError('invalid-ipv4', $ip);
+ return;
+ }
+ $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) {
+ Message::addError('server-already-exists', $ip);
+ return;
+ }
+ Database::exec('INSERT INTO dnbd3_server (fixedip) VALUES (:ip)', compact('ip'));
+ Message::addSuccess('server-added', $ip);
+ }
+
+ private function deleteServer()
+ {
+ $server = $this->getServerById();
+ if ($server['fixedip'] === '<self>')
+ return;
+ if (!is_null($server['machineuuid'])) {
+ RunMode::setRunMode($server['machineuuid'], 'dnbd3', null, null, null);
+ }
+ Database::exec('DELETE FROM dnbd3_server WHERE serverid = :serverid',
+ array('serverid' => $server['serverid']));
+ Message::addSuccess('server-deleted', $server['ip']);
+ }
+
/*
* RENDER
*/
@@ -185,14 +226,16 @@ class Page_Dnbd3 extends Page
$serverId = Request::any('server', false, 'int');
}
if ($serverId === false) {
- // TODO: Missing param
+ Message::addError('parameter-missing', 'server');
+ Util::redirect('?do=dnbd3');
}
$server = Database::queryFirst('SELECT s.serverid, 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
+ Message::addError('server-non-existent', 'server');
+ Util::redirect('?do=dnbd3');
}
if (!is_null($server['clientip'])) {
$server['ip'] = $server['clientip'];
@@ -204,4 +247,40 @@ class Page_Dnbd3 extends Page
return $server;
}
+ /*
+ * AJAX
+ */
+
+ protected function doAjax()
+ {
+ $action = Request::post('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(true, false, false, $ip);
+ 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);
+ }
+ }
+
}