summaryrefslogtreecommitdiffstats
path: root/modules-available/dnbd3
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
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')
-rw-r--r--modules-available/dnbd3/inc/dnbd3util.inc.php7
-rw-r--r--modules-available/dnbd3/page.inc.php83
-rw-r--r--modules-available/dnbd3/templates/page-serverlist.html86
3 files changed, 168 insertions, 8 deletions
diff --git a/modules-available/dnbd3/inc/dnbd3util.inc.php b/modules-available/dnbd3/inc/dnbd3util.inc.php
index 722cc5e3..45ae6135 100644
--- a/modules-available/dnbd3/inc/dnbd3util.inc.php
+++ b/modules-available/dnbd3/inc/dnbd3util.inc.php
@@ -18,8 +18,13 @@ class Dnbd3Util {
} else {
continue; // Huh?
}
- if (!is_null($row['machineuuid']) || $row['clientip'] === $satServerIp) {
+ if (!is_null($row['machineuuid'])) {
unset($dynClients[$row['machineuuid']]);
+ if ($row['clientip'] === $satServerIp) {
+ // Lolwut, sat server is openslx client configured for proxy mode!? baleeted.
+ RunMode::setRunMode($row['machineuuid'], 'dnbd3', null, null, null);
+ continue;
+ }
}
$server = array(
'serverid' => $row['serverid'],
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);
+ }
+ }
+
}
diff --git a/modules-available/dnbd3/templates/page-serverlist.html b/modules-available/dnbd3/templates/page-serverlist.html
index e50c6bcb..d9d02430 100644
--- a/modules-available/dnbd3/templates/page-serverlist.html
+++ b/modules-available/dnbd3/templates/page-serverlist.html
@@ -72,7 +72,9 @@
</td>
<td>
{{^self}}
- <button class="btn btn-danger btn-xs" name="serverid" value="{{serverid}}"><span class="glyphicon glyphicon-trash"></span></button>
+ <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>
@@ -101,12 +103,22 @@
</div>
<div class="modal-body">
<p>{{lang_enterIpOfServer}}</p>
- <form method="post">
+ <form id="addform" method="post" action="?do=dnbd3">
<input type="hidden" name="token" value="{{token}}">
- <input type="text" class="form-control" name="newip">
+ <input type="text" class="form-control" name="newip" id="newip">
<br>
- <button type="submit" class="btn btn-default btn-success pull-right" name="action" value="addserver">{{lang_save}}</button>
+ <div class="buttonbar pull-right">
+ <button id="testbtn" type="submit" class="btn btn-warning">
+ <span class="glyphicon glyphicon-question-sign"></span>
+ {{lang_test}}
+ </button>
+ <button id="savebtn" type="submit" class="btn btn-success" 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">
@@ -115,4 +127,68 @@
</div>
</div>
-<div class="clearfix"></div> \ No newline at end of file
+<div class="clearfix"></div>
+
+<script type="application/javascript"><!--
+document.addEventListener('DOMContentLoaded', function () {
+ var slxWorking = false;
+ const $form = $('#addform');
+ const $inputs = $form.find(':input');
+ const $result =$('#addtest');
+ const $ip = $('#newip');
+ const $save = $('#savebtn');
+
+ const changeFunc = function() {
+ console.log('sadf');
+ $save.prop('disabled', true);
+ };
+ $ip.change(changeFunc).keypress(changeFunc);
+
+ $form.submit(function (event) {
+ if (!$save.prop('disabled')) return;
+ event.preventDefault();
+ runTest();
+ });
+
+ $('#testbtn').click(function (event) {
+ event.preventDefault();
+ runTest();
+ });
+
+ function runTest() {
+ if (slxWorking === false) {
+ var ip = $ip.val();
+ var form = $('#addform');
+ slxWorking = Math.random();
+ var workCopy = slxWorking;
+ $inputs.prop('disabled', true);
+ $result.empty().removeClass('text-danger').text('...working...');
+ var resetFunc = function(ok) {
+ if (slxWorking === workCopy) {
+ slxWorking = false;
+ $inputs.prop('disabled', false);
+ if (!ok) $result.empty().addClass('text-danger').text('Timeout.');
+ }
+ };
+ setTimeout(resetFunc, 3000);
+ $.post('?do=dnbd3', {action:'servertest', ip:ip, token:TOKEN}, function (data) {
+ if (workCopy !== slxWorking) return;
+ resetFunc(true);
+ if (!data || data.fatal) {
+ $save.prop('disabled', true);
+ }
+ if (data && data.error) {
+ $result.empty().addClass('text-danger').text(data.error);
+ } else {
+ $result.empty().removeClass('text-danger').text('OK, Uptime: ' + data.uptime + ', Clients: ' + data.clientCount);
+ }
+ }, 'json').fail(function(oh, what) {
+ resetFunc(true);
+ console.log(what);
+ $result.empty().addClass('text-danger').text('Fail ' + what);
+ });
+ }
+ }
+});
+
+//--></script> \ No newline at end of file