net/relayd: UI improvements; use configd backend (#697)

This commit is contained in:
Frank Brendel
2018-06-05 12:30:16 +02:00
committed by Franco Fichtner
parent 7db74cef82
commit e41d5f80e6
12 changed files with 483 additions and 234 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
PLUGIN_NAME= relayd
PLUGIN_VERSION= 2.0.d
PLUGIN_REVISION= 6
PLUGIN_REVISION= 7
PLUGIN_DEPENDS= relayd
PLUGIN_COMMENT= Relayd Load Balancer
PLUGIN_MAINTAINER= frank.brendel@eurolog.com
+113
View File
@@ -0,0 +1,113 @@
#!/bin/sh
#
# $FreeBSD$
#
# PROVIDE: os-relayd
# REQUIRE: NETWORKING syslogd
# BEFORE: DAEMON
# KEYWORD: shutdown
. /etc/rc.subr
name="osrelayd"
rcvar="osrelayd_enable"
load_rc_config $name
: ${relayd_enable="NO"}
command="/usr/local/sbin/relayd"
cmd_string="relayd: parent"
relayctl="/usr/local/sbin/relayctl"
pidfile="/var/run/osrelayd.pid"
relayd_start () {
relayd_status
if [ $? -eq 0 ]; then
debug "relayd_start: relayd ist already running"
return 0
fi
debug "relayd_start: start relayd"
run_rc_command "start"
if [ $? -eq 0 ]; then
i=0
status="nok"
# give relayd some time to start
while [ $i -ne 3 ]; do
ps_pid=`ps ax -o pid= -o command= | grep "$cmd_string" | grep -v grep | awk '{ print $1 }'`
if [ -z "$ps_pid" ]; then
status="Cannot get pid for $command"
else
status="ok"
break
fi
echo $status
sleep 1
i=$(( $i + 1 ))
done
if [ $status != 'ok' ]; then
err 1 "$status"
fi
echo $ps_pid > $pidfile
return $?
fi
return 1
}
relayd_stop () {
relayd_status
if [ $? -eq 1 ]; then
return 0
fi
run_rc_command "stop"
if [ $? -ne 0 ]; then
err 1 "Cannot stop relayd with pid from $pidfile"
fi
rm -f $pidfile
return $?
}
relayd_restart () {
relayd_stop
if [ $? -ne 0 ]; then
return $?
fi
sleep 1
relayd_start
return $?
}
relayd_status () {
run_rc_command "status"
return $?
}
relayd_reload () {
$relayctl reload
}
case $1 in
start)
relayd_start
exit $?
;;
stop)
relayd_stop
exit $?
;;
restart)
relayd_restart
exit $?
;;
status)
relayd_status
exit $?
;;
reload)
relayd_reload;
exit $?
;;
esac
@@ -42,6 +42,25 @@ class ServiceController extends ApiMutableServiceControllerBase
static protected $internalServiceEnabled = 'general.enabled';
static protected $internalServiceTemplate = 'OPNsense/Relayd';
static protected $internalServiceName = 'relayd';
private $internalLockHandle = null;
/**
* simple lock mechanism
*/
private function lock($release = null)
{
if ($release != null) {
flock($this->internalLockHandle, LOCK_UN);
fclose($this->internalLockHandle);
return true;
}
$this->internalLockHandle = fopen("/tmp/relayd.lock", "w+");
if ($this->internalLockHandle != null && flock($this->internalLockHandle, LOCK_EX)) {
return true;
}
return false;
}
/**
* test relayd configuration
@@ -50,6 +69,7 @@ class ServiceController extends ApiMutableServiceControllerBase
public function configtestAction()
{
if ($this->request->isPost()) {
$result['status'] = 'ok';
$this->sessionClose();
$backend = new Backend();
@@ -67,6 +87,50 @@ class ServiceController extends ApiMutableServiceControllerBase
}
}
/**
* reconfigure relayd
* @return array
*/
public function reconfigureAction()
{
if ($this->request->isPost()) {
if ($this->lock()) {
$this->sessionClose();
$result['function'] = "reconfigure";
$result['status'] = 'failed';
$mdlRelayd = new Relayd();
$backend = new Backend();
$status = $this->statusAction();
if ($mdlRelayd->general->enabled->__toString() == 1) {
$result = $this->configtestAction();
if ($result['template'] == 'OK' && preg_match('/configuration OK$/', $result['result']) == 1) {
if ($status['status'] != 'running') {
$result['result'] = trim($backend->configdRun('relayd start'));
} else {
$result['result'] = trim($backend->configdRun('relayd reload'));
}
} else {
return $result;
}
} else {
if ($status['status'] == 'running') {
$result['result'] = trim($backend->configdRun('relayd stop'));
}
}
$this->lock(1);
$mdlRelayd = new Relayd();
if ($mdlRelayd->configClean()) {
$result['status'] = 'ok';
}
return $result;
} else {
throw new \Exception("Cannot get lock");
}
} else {
return array('status' => 'failed');
}
}
/**
* avoid restarting Relayd on reconfigure
*/
@@ -59,6 +59,17 @@ class SettingsController extends ApiControllerBase
$this->mdlRelayd = new Relayd();
}
/**
* check if changes to the relayd settings were made
* @return result array
*/
public function dirtyAction()
{
$result = array('status' => 'ok');
$result['relayd']['dirty'] = $this->mdlRelayd->configChanged();
return $result;
}
/**
* query relayd settings
* @param $nodeType
@@ -81,7 +92,7 @@ class SettingsController extends ApiControllerBase
}
if ($node != null) {
$result['relayd'] = array($nodeType => $node->getNodes());
$result['result'] = 'ok';
$result['status'] = 'ok';
}
}
return $result;
@@ -192,12 +203,10 @@ class SettingsController extends ApiControllerBase
}
if (empty($result["validations"])) {
unset($result["validations"]);
$result['result'] = 'ok';
$this->mdlRelayd->serializeToConfig();
Config::getInstance()->save();
if ($nodeType == 'general') {
$svcRelayd = new ServiceController();
$result = $svcRelayd->reconfigureAction();
$cfgRelayd = Config::getInstance()->save();
if ($this->mdlRelayd->configDirty()) {
$result['status'] = 'ok';
}
}
}
@@ -282,7 +291,9 @@ class SettingsController extends ApiControllerBase
}
$this->mdlRelayd->serializeToConfig();
Config::getInstance()->save();
$result['result'] = 'ok';
if ($this->mdlRelayd->configDirty()) {
$result['status'] = 'ok';
}
}
}
}
@@ -319,7 +330,9 @@ class SettingsController extends ApiControllerBase
$fields = array('enabled', 'name', 'type');
break;
}
return $grid->fetchBindRequest($this->request, $fields);
$result = $grid->fetchBindRequest($this->request, $fields);
$result['dirty'] = $this->mdlRelayd->configChanged();
return $result;
}
}
@@ -31,6 +31,7 @@
namespace OPNsense\Relayd\Api;
use \OPNsense\Base\ApiControllerBase;
use \OPNsense\Core\Backend;
use \OPNsense\Relayd\Relayd;
/**
@@ -45,11 +46,10 @@ class StatusController extends ApiControllerBase
public function sumAction()
{
$result = array("result" => "failed");
$backend = new Backend();
$output = array();
$exitcode;
exec('/usr/local/sbin/relayctl show summary 2>&1', $output, $exitcode);
if ($exitcode != 0) {
$result["output"] = join(' ', $output);
$output = explode("\n", trim($backend->configdRun('relayd summary')));
if (empty($output[0])) {
return $result;
}
$result["result"] = 'ok';
@@ -102,8 +102,6 @@ class StatusController extends ApiControllerBase
$this->sessionClose();
}
$result = array("result" => "failed", "function" => "toggle");
$output = array();
$exitcode;
if ($nodeType != null &&
($nodeType == 'redirect' ||
$nodeType == 'table' ||
@@ -112,11 +110,12 @@ class StatusController extends ApiControllerBase
($action == 'enable' ||
$action == 'disable')) {
if ($id != null && $id > 0) {
exec("/usr/local/sbin/relayctl $nodeType $action $id 2>&1", $output, $exitcode);
$result["output"] = join(' ', $output);
if ($exitcode == 0) {
$backend = new Backend();
$result["output"] = $backend->configdRun("relayd toggle $nodeType $action $id");
if (isset($result["output"])) {
$result["result"] = 'ok';
}
$result["output"] = trim($result["output"]);
}
}
}
@@ -38,4 +38,30 @@ use OPNsense\Base\BaseModel;
*/
class Relayd extends BaseModel
{
/**
* get configuration state
* @return bool
*/
public function configChanged()
{
return file_exists("/tmp/relayd.dirty");
}
/**
* mark configuration as changed
* @return bool
*/
public function configDirty()
{
return @touch("/tmp/relayd.dirty");
}
/**
* mark configuration as consistent with the running config
* @return bool
*/
public function configClean()
{
return @unlink("/tmp/relayd.dirty");
}
}
@@ -29,179 +29,182 @@ POSSIBILITY OF SUCH DAMAGE.
<script>
$( document ).ready(function() {
/**
* get the isSubsystemDirty value and print a notice
*/
function isSubsystemDirty() {
ajaxGet(url="/api/relayd/settings/dirty", sendData={}, callback=function(data,status) {
if (status == "success") {
if (data.relayd.dirty === true) {
$("#configChangedMsg").removeClass("hidden");
} else {
$("#configChangedMsg").addClass("hidden");
}
}
});
}
$('#btnConfigTest').unbind('click').click(function(){
$("#responseMsg").addClass("hidden");
$('#btnConfigTestProgress').addClass("fa fa-spinner fa-pulse");
ajaxCall(url="/api/relayd/service/configtest", sendData={}, callback=function(data,status) {
$('#btnConfigTestProgress').removeClass("fa fa-spinner fa-pulse");
$('#btnConfigTest').blur();
$("#responseMsg").removeClass("hidden");
$("#responseMsg").html(data['result']);
});
});
/**
* chain std_bootgrid_reload from opnsense_bootgrid_plugin.js
* to get the isSubsystemDirty state on "UIBootgrid" changes
*/
var opn_std_bootgrid_reload = std_bootgrid_reload;
std_bootgrid_reload = function(gridId) {
opn_std_bootgrid_reload(gridId);
isSubsystemDirty();
};
$('#btnReload').unbind('click').click(function(){
$("#responseMsg").addClass("hidden");
$('#btnReloadProgress').addClass("fa fa-spinner fa-pulse");
ajaxCall(url="/api/relayd/service/reconfigure", sendData={}, callback=function(data,status) {
updateServiceControlUI('relayd');
$('#btnReloadProgress').removeClass("fa fa-spinner fa-pulse");
$('#btnReload').blur();
updateServiceControlUI('relayd');
});
});
/**
* general settings
*/
mapDataToFormUI({'frm_GeneralSettings':"/api/relayd/settings/get/general/"}).done(function(){
formatTokenizersUI();
$('#relayd\\.general\\.log').selectpicker('refresh');
updateServiceControlUI('relayd');
});
$('#btn_ApplyGeneralSettings').unbind('click').click(function(){
$("#frm_GeneralSettings_progress").addClass("fa fa-spinner fa-pulse");
var frm_id = 'frm_GeneralSettings';
saveFormToEndpoint(url = "/api/relayd/settings/set/general/",formid=frm_id,callback_ok=function(){
$("#"+frm_id+"_progress").removeClass("fa fa-spinner fa-pulse");
$("#btn_ApplyGeneralSettings").blur();
updateServiceControlUI('relayd');
});
});
/**
* apply changes and reload relayd
*/
$('#btnApplyConfig').unbind('click').click(function(){
$('#btnApplyConfigProgress').addClass("fa fa-spinner fa-pulse");
ajaxCall(url="/api/relayd/service/reconfigure", sendData={}, callback=function(data,status) {
$("#responseMsg").addClass("hidden");
isSubsystemDirty();
updateServiceControlUI('relayd');
if (data.result) {
$("#responseMsg").html(data['result']);
$("#responseMsg").removeClass("hidden");
}
$('#btnApplyConfigProgress').removeClass("fa fa-spinner fa-pulse");
$('#btnApplyConfig').blur();
});
});
$("#grid-host").UIBootgrid({
'search': '/api/relayd/settings/search/host/',
'get': '/api/relayd/settings/get/host/',
'set': '/api/relayd/settings/set/host/',
'add': '/api/relayd/settings/set/host/',
'del': '/api/relayd/settings/del/host/'
});
$("#grid-tablecheck").UIBootgrid({
'search': '/api/relayd/settings/search/tablecheck/',
'get': '/api/relayd/settings/get/tablecheck/',
'set': '/api/relayd/settings/set/tablecheck/',
'add': '/api/relayd/settings/set/tablecheck/',
'del': '/api/relayd/settings/del/tablecheck/'
});
$("#grid-table").UIBootgrid({
'search': '/api/relayd/settings/search/table/',
'get': '/api/relayd/settings/get/table/',
'set': '/api/relayd/settings/set/table/',
'add': '/api/relayd/settings/set/table/',
'del': '/api/relayd/settings/del/table/'
});
$("#grid-protocol").UIBootgrid({
'search': '/api/relayd/settings/search/protocol/',
'get': '/api/relayd/settings/get/protocol/',
'set': '/api/relayd/settings/set/protocol/',
'add': '/api/relayd/settings/set/protocol/',
'del': '/api/relayd/settings/del/protocol/'
});
$("#grid-virtualserver").UIBootgrid({
'search': '/api/relayd/settings/search/virtualserver/',
'get': '/api/relayd/settings/get/virtualserver/',
'set': '/api/relayd/settings/set/virtualserver/',
'add': '/api/relayd/settings/set/virtualserver/',
'del': '/api/relayd/settings/del/virtualserver/'
});
/**
* general settings
*/
mapDataToFormUI({'frm_GeneralSettings':"/api/relayd/settings/get/general/"}).done(function() {
$("#responseMsg").addClass("hidden");
formatTokenizersUI();
$('#relayd\\.general\\.log').selectpicker('refresh');
updateServiceControlUI('relayd');
isSubsystemDirty();
});
$('#btnSaveGeneral').unbind('click').click(function() {
$("#btnSaveGeneralProgress").addClass("fa fa-spinner fa-pulse");
var frm_id = 'frm_GeneralSettings';
saveFormToEndpoint(url = "/api/relayd/settings/set/general/",formid=frm_id,callback_ok=function() {
$("#responseMsg").addClass("hidden");
updateServiceControlUI('relayd');
isSubsystemDirty();
$("#btnSaveGeneralProgress").removeClass("fa fa-spinner fa-pulse");
$("#btnSaveGeneral").blur();
});
});
// show/hide options depending on other options
function ShowHideVSFields(){
var servertype = $('#relayd\\.virtualserver\\.type').val();
var backuptransport_table = $('#relayd\\.virtualserver\\.backuptransport_table').val();
['host', 'tablecheck', 'table', 'protocol', 'virtualserver'].forEach(function(element) {
$("#grid-" + element).UIBootgrid({
'search': '/api/relayd/settings/search/' + element + '/',
'get': '/api/relayd/settings/get/' + element + '/',
'set': '/api/relayd/settings/set/' + element + '/',
'add': '/api/relayd/settings/set/' + element + '/',
'del': '/api/relayd/settings/del/' + element + '/'
});
});
$('tr[id="row_relayd.virtualserver.transport_type"]').addClass('hidden');
$('tr[id="row_relayd.virtualserver.stickyaddress"]').addClass('hidden');
$('tr[id="row_relayd.virtualserver.protocol"]').addClass('hidden');
$('tr[id="row_relayd.virtualserver.backuptransport_tablemode"]').addClass('hidden');
$('tr[id="row_relayd.virtualserver.backuptransport_timeout"]').addClass('hidden');
$('tr[id="row_relayd.virtualserver.backuptransport_interval"]').addClass('hidden');
// show/hide options depending on other options
function ShowHideVSFields(){
var servertype = $('#relayd\\.virtualserver\\.type').val();
var backuptransport_table = $('#relayd\\.virtualserver\\.backuptransport_table').val();
$('tr[id="row_relayd.virtualserver.transport_type"]').addClass('hidden');
$('tr[id="row_relayd.virtualserver.stickyaddress"]').addClass('hidden');
$('tr[id="row_relayd.virtualserver.protocol"]').addClass('hidden');
$('tr[id="row_relayd.virtualserver.backuptransport_tablemode"]').addClass('hidden');
$('tr[id="row_relayd.virtualserver.backuptransport_timeout"]').addClass('hidden');
$('tr[id="row_relayd.virtualserver.backuptransport_interval"]').addClass('hidden');
$('tr[id="row_relayd.virtualserver.backuptransport_tablecheck"]').addClass('hidden');
$('#relayd\\.virtualserver\\.transport_tablemode').empty().append('<option value="roundrobin">Round Robin </option>');
$('#relayd\\.virtualserver\\.backuptransport_tablemode').empty().append('<option value="roundrobin">Round Robin </option>');
$('#relayd\\.virtualserver\\.transport_tablemode').empty().append('<option value="roundrobin">Round Robin </option>');
$('#relayd\\.virtualserver\\.backuptransport_tablemode').empty().append('<option value="roundrobin">Round Robin </option>');
if(servertype == 'redirect'){
$('tr[id="row_relayd.virtualserver.transport_type"]').removeClass('hidden');
$('tr[id="row_relayd.virtualserver.stickyaddress"]').removeClass('hidden');
$('#relayd\\.virtualserver\\.transport_tablemode').append('<option value="least-states">Least States </option>');
$('#relayd\\.virtualserver\\.backuptransport_tablemode').append('<option value="least-states">Least States </option>');
$('#relayd\\.virtualserver\\.transport_tablemode').val('roundrobin');
$('#relayd\\.virtualserver\\.backuptransport_tablemode').val('roundrobin');
} else {
$('tr[id="row_relayd.virtualserver.protocol"]').removeClass('hidden');
$('#relayd\\.virtualserver\\.transport_tablemode').append('<option value="hash">Hash </option>');
$('#relayd\\.virtualserver\\.backuptransport_tablemode').append('<option value="hash">Hash </option>');
$('#relayd\\.virtualserver\\.transport_tablemode').append('<option value="loadbalance">Load Balance </option>');
$('#relayd\\.virtualserver\\.backuptransport_tablemode').append('<option value="loadbalance">Load Balance </option>');
$('#relayd\\.virtualserver\\.transport_tablemode').append('<option value="random">Random </option>');
$('#relayd\\.virtualserver\\.backuptransport_tablemode').append('<option value="random">Random </option>');
$('#relayd\\.virtualserver\\.transport_tablemode').append('<option value="source-hash">Source Hash </option>');
$('#relayd\\.virtualserver\\.backuptransport_tablemode').append('<option value="source-hash">Source Hash </option>');
$('#relayd\\.virtualserver\\.transport_tablemode').val('roundrobin');
$('#relayd\\.virtualserver\\.backuptransport_tablemode').val('roundrobin');
}
if(servertype == 'redirect'){
$('tr[id="row_relayd.virtualserver.transport_type"]').removeClass('hidden');
$('tr[id="row_relayd.virtualserver.stickyaddress"]').removeClass('hidden');
$('#relayd\\.virtualserver\\.transport_tablemode').append('<option value="least-states">Least States </option>');
$('#relayd\\.virtualserver\\.backuptransport_tablemode').append('<option value="least-states">Least States </option>');
$('#relayd\\.virtualserver\\.transport_tablemode').val('roundrobin');
$('#relayd\\.virtualserver\\.backuptransport_tablemode').val('roundrobin');
} else {
$('tr[id="row_relayd.virtualserver.protocol"]').removeClass('hidden');
$('#relayd\\.virtualserver\\.transport_tablemode').append('<option value="hash">Hash </option>');
$('#relayd\\.virtualserver\\.backuptransport_tablemode').append('<option value="hash">Hash </option>');
$('#relayd\\.virtualserver\\.transport_tablemode').append('<option value="loadbalance">Load Balance </option>');
$('#relayd\\.virtualserver\\.backuptransport_tablemode').append('<option value="loadbalance">Load Balance </option>');
$('#relayd\\.virtualserver\\.transport_tablemode').append('<option value="random">Random </option>');
$('#relayd\\.virtualserver\\.backuptransport_tablemode').append('<option value="random">Random </option>');
$('#relayd\\.virtualserver\\.transport_tablemode').append('<option value="source-hash">Source Hash </option>');
$('#relayd\\.virtualserver\\.backuptransport_tablemode').append('<option value="source-hash">Source Hash </option>');
$('#relayd\\.virtualserver\\.transport_tablemode').val('roundrobin');
$('#relayd\\.virtualserver\\.backuptransport_tablemode').val('roundrobin');
}
$('#relayd\\.virtualserver\\.transport_tablemode').selectpicker('refresh');
$('#relayd\\.virtualserver\\.backuptransport_tablemode').selectpicker('refresh');
$('#relayd\\.virtualserver\\.transport_tablemode').selectpicker('refresh');
$('#relayd\\.virtualserver\\.backuptransport_tablemode').selectpicker('refresh');
if(backuptransport_table !== '') {
$('tr[id="row_relayd.virtualserver.backuptransport_tablemode"]').removeClass('hidden');
$('tr[id="row_relayd.virtualserver.backuptransport_tablecheck"]').removeClass('hidden');
$('tr[id="row_relayd.virtualserver.backuptransport_timeout"]').removeClass('hidden');
$('tr[id="row_relayd.virtualserver.backuptransport_interval"]').removeClass('hidden');
}
};
$('#DialogEditVirtualServer').on('shown.bs.modal', function() {ShowHideVSFields();});
$('#relayd\\.virtualserver\\.type').on('changed.bs.select', function(e) {ShowHideVSFields();});
$('#relayd\\.virtualserver\\.backuptransport_table').on('changed.bs.select', function(e) {ShowHideVSFields();});
if(backuptransport_table !== '') {
$('tr[id="row_relayd.virtualserver.backuptransport_tablemode"]').removeClass('hidden');
$('tr[id="row_relayd.virtualserver.backuptransport_tablecheck"]').removeClass('hidden');
$('tr[id="row_relayd.virtualserver.backuptransport_timeout"]').removeClass('hidden');
$('tr[id="row_relayd.virtualserver.backuptransport_interval"]').removeClass('hidden');
}
};
$('#DialogEditVirtualServer').on('shown.bs.modal', function() {ShowHideVSFields();});
$('#relayd\\.virtualserver\\.type').on('changed.bs.select', function(e) {ShowHideVSFields();});
$('#relayd\\.virtualserver\\.backuptransport_table').on('changed.bs.select', function(e) {ShowHideVSFields();});
function ShowHideTCFields(){
var tablechecktype = $('#relayd\\.tablecheck\\.type').val();
function ShowHideTCFields(){
var tablechecktype = $('#relayd\\.tablecheck\\.type').val();
$('tr[id="row_relayd.tablecheck.path"]').addClass('hidden');
$('tr[id="row_relayd.tablecheck.host"]').addClass('hidden');
$('tr[id="row_relayd.tablecheck.code"]').addClass('hidden');
$('tr[id="row_relayd.tablecheck.digest"]').addClass('hidden');
$('tr[id="row_relayd.tablecheck.data"]').addClass('hidden');
$('tr[id="row_relayd.tablecheck.expect"]').addClass('hidden');
$('tr[id="row_relayd.tablecheck.ssl"]').addClass('hidden');
$('tr[id="row_relayd.tablecheck.path"]').addClass('hidden');
$('tr[id="row_relayd.tablecheck.host"]').addClass('hidden');
$('tr[id="row_relayd.tablecheck.code"]').addClass('hidden');
$('tr[id="row_relayd.tablecheck.digest"]').addClass('hidden');
$('tr[id="row_relayd.tablecheck.data"]').addClass('hidden');
$('tr[id="row_relayd.tablecheck.expect"]').addClass('hidden');
$('tr[id="row_relayd.tablecheck.ssl"]').addClass('hidden');
switch (tablechecktype) {
case 'send':
$('tr[id="row_relayd.tablecheck.data"]').removeClass('hidden');
$('tr[id="row_relayd.tablecheck.expect"]').removeClass('hidden');
$('tr[id="row_relayd.tablecheck.ssl"]').removeClass('hidden');
break;
case 'script':
$('tr[id="row_relayd.tablecheck.path"]').removeClass('hidden');
break;
case 'http':
var code = $('#relayd\\.tablecheck\\.code').val();
var digest = $('#relayd\\.tablecheck\\.digest').val();
$('tr[id="row_relayd.tablecheck.path"]').removeClass('hidden');
$('tr[id="row_relayd.tablecheck.host"]').removeClass('hidden');
if (code !== '') {
$('tr[id="row_relayd.tablecheck.code"]').removeClass('hidden');
$('tr[id="row_relayd.tablecheck.digest"]').addClass('hidden');
} else if (digest !== '') {
$('tr[id="row_relayd.tablecheck.code"]').addClass('hidden');
$('tr[id="row_relayd.tablecheck.digest"]').removeClass('hidden');
} else {
$('tr[id="row_relayd.tablecheck.code"]').removeClass('hidden');
$('tr[id="row_relayd.tablecheck.digest"]').removeClass('hidden');
}
$('tr[id="row_relayd.tablecheck.ssl"]').removeClass('hidden');
break;
}
};
switch (tablechecktype) {
case 'send':
$('tr[id="row_relayd.tablecheck.data"]').removeClass('hidden');
$('tr[id="row_relayd.tablecheck.expect"]').removeClass('hidden');
$('tr[id="row_relayd.tablecheck.ssl"]').removeClass('hidden');
break;
case 'script':
$('tr[id="row_relayd.tablecheck.path"]').removeClass('hidden');
break;
case 'http':
var code = $('#relayd\\.tablecheck\\.code').val();
var digest = $('#relayd\\.tablecheck\\.digest').val();
$('tr[id="row_relayd.tablecheck.path"]').removeClass('hidden');
$('tr[id="row_relayd.tablecheck.host"]').removeClass('hidden');
if (code !== '') {
$('tr[id="row_relayd.tablecheck.code"]').removeClass('hidden');
$('tr[id="row_relayd.tablecheck.digest"]').addClass('hidden');
} else if (digest !== '') {
$('tr[id="row_relayd.tablecheck.code"]').addClass('hidden');
$('tr[id="row_relayd.tablecheck.digest"]').removeClass('hidden');
} else {
$('tr[id="row_relayd.tablecheck.code"]').removeClass('hidden');
$('tr[id="row_relayd.tablecheck.digest"]').removeClass('hidden');
}
$('tr[id="row_relayd.tablecheck.ssl"]').removeClass('hidden');
break;
}
};
$('#DialogEditTableCheck').on('shown.bs.modal', function() {ShowHideTCFields();});
$('#relayd\\.tablecheck\\.type').on('changed.bs.select', function(e) {ShowHideTCFields();});
$('#relayd\\.tablecheck\\.code').on('input', function() {ShowHideTCFields();});
$('#relayd\\.tablecheck\\.digest').on('input', function() {ShowHideTCFields();});
$('#DialogEditTableCheck').on('shown.bs.modal', function() {ShowHideTCFields();});
$('#relayd\\.tablecheck\\.type').on('changed.bs.select', function(e) {ShowHideTCFields();});
$('#relayd\\.tablecheck\\.code').on('input', function() {ShowHideTCFields();});
$('#relayd\\.tablecheck\\.digest').on('input', function() {ShowHideTCFields();});
});
</script>
<div class="alert alert-info hidden" role="alert" id="configChangedMsg">
<button class="btn btn-primary pull-right" id="btnApplyConfig" type="button"><b>{{ lang._('Apply changes') }}</b> <i id="btnApplyConfigProgress"></i></button>
{{ lang._('The Relayd configuration has been changed') }} <br /> {{ lang._('You must apply the changes in order for them to take effect.')}}
</div>
<div class="alert alert-info hidden" role="alert" id="responseMsg"></div>
<ul class="nav nav-tabs" role="tablist" id="maintabs">
<li class="active"><a data-toggle="tab" href="#general">{{ lang._('General Settings') }}</a></li>
@@ -213,7 +216,16 @@ POSSIBILITY OF SUCH DAMAGE.
</ul>
<div class="tab-content content-box tab-content">
<div id="general" class="tab-pane fade in active">
{{ partial("layout_partials/base_form",['fields':formGeneralSettings,'id':'frm_GeneralSettings','apply_btn_id':'btn_ApplyGeneralSettings'])}}
{{ partial("layout_partials/base_form",['fields':formGeneralSettings,'id':'frm_GeneralSettings'])}}
<div class="table-responsive">
<table class="table table-striped table-condensed table-responsive">
<tr>
<td>
<button class="btn btn-primary" id="btnSaveGeneral" type="button"><b>{{ lang._('Save changes') }}</b> <i id="btnSaveGeneralProgress"></i></button>
</td>
</tr>
</table>
</div>
</div>
<div id="host" class="tab-pane fade in">
<table id="grid-host" class="table table-condensed table-hover table-striped table-responsive" data-editDialog="DialogEditHost">
@@ -331,13 +343,13 @@ POSSIBILITY OF SUCH DAMAGE.
</tfoot>
</table>
</div>
<div class="col-md-12">
<!-- <div class="col-md-12">
<hr/>
<button class="btn btn-primary" id="btnConfigTest" type="button"><b>{{ lang._('Test Configuration') }}</b> <i id="btnConfigTestProgress"></i></button>
<button class="btn btn-primary" id="btnReload" type="button"><b>{{ lang._('Reload Configuration') }}</b> <i id="btnReloadProgress"></i></button>
<button class="btn btn-primary" id="btnApplyConfig" type="button"><b>{{ lang._('Apply Configuration') }}</b> <i id="btnApplyConfigProgress"></i></button>
<br/>
<br/>
</div>
-->
</div>
{# include dialogs #}
{{ partial("layout_partials/base_dialog",['fields':formDialogEditHost, 'id':'DialogEditHost', 'label':'Edit Host'])}}
@@ -29,55 +29,55 @@ POSSIBILITY OF SUCH DAMAGE.
<script type="text/javascript">
$( document ).ready(function() {
updateServiceControlUI('relayd');
// get status and build the table body
// get status and build the table body
$('#btnRefresh').unbind('click').click(function() {
ajaxCall(url = "/api/relayd/status/sum", sendData={}, callback = function(result, status) {
if (status == "success" && result.result === 'ok') {
$('#tableStatus > tbody').empty();
$('#tableStatus > tbody').attr('style', 'display:none;');
/* create a table row for each host and combine
virtualserver/table fields afterwards via rowspan */
$.each(result.rows, function (vkey, virtualserver) {
var vrowspan = 0;
var trowspan = [];
var html = '<tr class="vrow"><td id="virtualServer' + vkey + '">';
html += getControlButtons(virtualserver.status, virtualserver.id, virtualserver.type);
html += virtualserver.name + ' (' + virtualserver.type + '): ' + virtualserver.status + '</td>';
var tfirst = true;
$.each(virtualserver.tables, function(tkey, table) {
trowspan[tkey] = 0;
if (tfirst == true) {
tfirst = false;
} else {
html += '<tr>';
}
html += '<td id="table' + tkey + '">';
html += getControlButtons(table.status, tkey, 'table');
html += table.name + ' ' + table.status + '</td>';
var hfirst = true;
$('#tableStatus > tbody').empty();
$('#tableStatus > tbody').attr('style', 'display:none;');
/* create a table row for each host and combine
virtualserver/table fields afterwards via rowspan */
$.each(result.rows, function (vkey, virtualserver) {
var vrowspan = 0;
var trowspan = [];
var html = '<tr class="vrow"><td id="virtualServer' + vkey + '">';
html += getControlButtons(virtualserver.status, virtualserver.id, virtualserver.type);
html += virtualserver.name + ' (' + virtualserver.type + '): ' + virtualserver.status + '</td>';
var tfirst = true;
$.each(virtualserver.tables, function(tkey, table) {
trowspan[tkey] = 0;
if (tfirst == true) {
tfirst = false;
} else {
html += '<tr>';
}
html += '<td id="table' + tkey + '">';
html += getControlButtons(table.status, tkey, 'table');
html += table.name + ' ' + table.status + '</td>';
var hfirst = true;
$.each(table.hosts, function(hkey, host) {
if (hfirst == true) {
hfirst = false;
if (hfirst == true) {
hfirst = false;
} else {
html += '<tr>';
html += '<tr>';
}
vrowspan++;
trowspan[tkey]++;
html += '<td>';
html += getControlButtons(host.status, hkey, 'host');
html += host.name + ' ' + host.status + '</td></tr>';
vrowspan++;
trowspan[tkey]++;
html += '<td>';
html += getControlButtons(host.status, hkey, 'host');
html += host.name + ' ' + host.status + '</td></tr>';
});
// dummy host for disabled tables
if (hfirst == true) {
vrowspan++;
html += '<td></td>';
vrowspan++;
html += '<td></td>';
}
});
$('#tableStatus > tbody').append(html);
$('#virtualServer' + vkey).attr('rowspan', vrowspan);
$.each(trowspan, function(tid, trowspan) {
$('#table' + tid).attr('rowspan', trowspan);
$('#table' + tid).attr('rowspan', trowspan);
});
$('#tableStatus > tbody > tr.vrow > td').css('border-top', '2px solid #ddd');
$('#tableStatus > tbody').fadeIn();
@@ -85,10 +85,11 @@ POSSIBILITY OF SUCH DAMAGE.
} else {
$("#tableStatus").html("<tr><td><br/>{{ lang._('The status could not be fetched. Is Relayd running?') }}</td></tr>");
}
$('#btnRefresh').blur();
});
});
// initial load
// initial load
$("#btnRefresh").click();
});
@@ -143,7 +144,7 @@ POSSIBILITY OF SUCH DAMAGE.
<tr>
<td>
<div class="pull-right">
<button class="btn btn-primary" id="btnRefresh" type="button"><b>{{ lang._('Refresh') }}</b> <span class="fa fa-refresh"> </span></button>
<button class="btn btn-primary" id="btnRefresh" type="button"><b>{{ lang._('Refresh') }}</b> <span id="btnRefreshProgress" class="fa fa-refresh"> </span></button>
</div>
</td>
</tr>
@@ -65,7 +65,7 @@ class RelaydTest extends \PHPUnit\Framework\TestCase
$response = self::$setRelayd->getAction('general');
$testConfig['general'] = $response['relayd']['general'];
$this->assertEquals($response['result'], 'ok');
$this->assertEquals($response['status'], 'ok');
$this->assertArrayHasKey('enabled', $response['relayd']['general']);
return $testConfig;
@@ -100,7 +100,7 @@ class RelaydTest extends \PHPUnit\Framework\TestCase
foreach (array_reverse($this->nodeTypes) as $nodeType) {
foreach ($testConfig[$nodeType] as $node) {
$response = self::$setRelayd->delAction($nodeType, $node['uuid']);
$this->assertEquals($response['result'], 'ok');
$this->assertEquals($response['status'], 'ok');
}
}
// need an assertion here to succeed this test on empty config
@@ -128,6 +128,18 @@ class RelaydTest extends \PHPUnit\Framework\TestCase
$this->assertEquals($response['status'], 'ok');
}
/**
* test dirtyAction
* @depends testSetGeneral
*/
public function testDirtyAction()
{
$this->assertInstanceOf('\OPNsense\Relayd\Api\SettingsController', self::$setRelayd);
$response = self::$setRelayd->dirtyAction();
$this->assertEquals($response['status'], 'ok');
$this->assertEquals($response['relayd']['dirty'], true);
}
/**
* test setAction for hosts
* @depends testReset
@@ -156,7 +168,7 @@ class RelaydTest extends \PHPUnit\Framework\TestCase
// create host for ServiceControllerTest
$_POST = array('relayd' => ['host' => ['name' => 'testHost', 'address' => '127.0.0.1']]);
$response = self::$setRelayd->setAction('host');
$this->assertEquals($response['result'], 'ok');
$this->assertEquals($response['status'], 'ok');
}
/**
@@ -241,7 +253,7 @@ class RelaydTest extends \PHPUnit\Framework\TestCase
'code' => '403',
'ssl' => '1']]);
$response = self::$setRelayd->setAction('tablecheck');
$this->assertEquals($response['result'], 'ok');
$this->assertEquals($response['status'], 'ok');
}
/**
@@ -267,7 +279,7 @@ class RelaydTest extends \PHPUnit\Framework\TestCase
'protocol' => ['name' => 'testProtocol', 'type' => 'tcp', 'options' => 'nodelay, socket buffer 65536']
]);
$response = self::$setRelayd->setAction('protocol');
$this->assertEquals($response['result'], 'ok');
$this->assertEquals($response['status'], 'ok');
}
/**
@@ -360,7 +372,7 @@ class RelaydTest extends \PHPUnit\Framework\TestCase
'protocol' => $protocolUuid
]]);
$response = self::$setRelayd->setAction('virtualserver');
$this->assertEquals($response['result'], 'ok');
$this->assertEquals($response['status'], 'ok');
}
/**
@@ -377,6 +389,10 @@ class RelaydTest extends \PHPUnit\Framework\TestCase
$svcRelayd = new \OPNsense\Relayd\Api\ServiceController;
$_SERVER['REQUEST_METHOD'] = 'POST';
// stop possibly running service
$response = $svcRelayd->stopAction();
$this->assertEquals($response['response'], "OK\n\n");
// generate template and test it by Relayd
$response = $svcRelayd->configtestAction();
$this->assertEquals($response['template'], 'OK');
@@ -404,10 +420,6 @@ class RelaydTest extends \PHPUnit\Framework\TestCase
$response = $svcRelayd->reconfigureAction();
$this->assertEquals($response['status'], 'ok');
// start
$response = $svcRelayd->startAction();
$this->assertEquals($response['response'], "OK\n\n");
// status
$response = $svcRelayd->statusAction();
$this->assertEquals($response['status'], 'running');
@@ -1,29 +1,38 @@
[start]
command:/usr/local/etc/rc.d/relayd start
command:/usr/local/etc/rc.d/os-relayd start
type:script
message:starting relayd
[stop]
command:/usr/local/etc/rc.d/relayd stop
command:/usr/local/etc/rc.d/os-relayd stop
type:script
message:stopping relayd
[status]
command:/usr/local/etc/rc.d/relayd status; exit 0
command:/usr/local/etc/rc.d/os-relayd status; exit 0
type:script_output
message:get relayd status
[restart]
command:/usr/local/etc/rc.d/relayd restart
command:/usr/local/etc/rc.d/os-relayd restart
type:script
message:restarting relayd
[reload]
command:/usr/local/etc/rc.d/relayd reload
command:/usr/local/etc/rc.d/os-relayd reload
type:script
message:reload relayd configuration
[configtest]
command: /usr/local/sbin/relayd -n 2>&1 || exit 0
command: /usr/local/sbin/relayd -n 2>&1; exit 0
type:script_output
message:testing relayd configuration
[summary]
command: /usr/local/sbin/relayctl show summary; exit 0
type:script_output
[toggle]
command: /usr/local/sbin/relayctl
parameters:%s %s %s
type:script_output
@@ -1,2 +1,2 @@
relayd.conf:/usr/local/etc/relayd.conf
rc.conf.d:/etc/rc.conf.d/relayd
rc.conf.d:/etc/rc.conf.d/osrelayd
@@ -1,6 +1,6 @@
# DO NOT EDIT THIS FILE -- OPNsense auto-generated file
{% if helpers.exists('OPNsense.relayd.general.enabled') and OPNsense.relayd.general.enabled|default("0") == "1" %}
relayd_enable="YES"
osrelayd_enable="YES"
{% else %}
relayd_enable="NO"
osrelayd_enable="NO"
{% endif %}