diff options
-rw-r--r-- | modules-available/dnbd3/inc/dnbd3util.inc.php | 7 | ||||
-rw-r--r-- | modules-available/dnbd3/page.inc.php | 83 | ||||
-rw-r--r-- | modules-available/dnbd3/templates/page-serverlist.html | 86 |
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 |