From e41d5f80e6054b08454f18e2cb9401be38a496ab Mon Sep 17 00:00:00 2001 From: Frank Brendel Date: Tue, 5 Jun 2018 12:30:16 +0200 Subject: [PATCH] net/relayd: UI improvements; use configd backend (#697) --- net/relayd/Makefile | 2 +- net/relayd/src/etc/rc.d/os-relayd | 113 ++++++ .../OPNsense/Relayd/Api/ServiceController.php | 64 ++++ .../Relayd/Api/SettingsController.php | 29 +- .../OPNsense/Relayd/Api/StatusController.php | 17 +- .../mvc/app/models/OPNsense/Relayd/Relayd.php | 26 ++ .../mvc/app/views/OPNsense/Relayd/index.volt | 334 +++++++++--------- .../mvc/app/views/OPNsense/Relayd/status.volt | 73 ++-- .../compound/OPNsense/Relayd/RelaydTest.php | 32 +- .../conf/actions.d/actions_relayd.conf | 21 +- .../templates/OPNsense/Relayd/+TARGETS | 2 +- .../templates/OPNsense/Relayd/rc.conf.d | 4 +- 12 files changed, 483 insertions(+), 234 deletions(-) create mode 100755 net/relayd/src/etc/rc.d/os-relayd diff --git a/net/relayd/Makefile b/net/relayd/Makefile index f8539d307..33867402c 100644 --- a/net/relayd/Makefile +++ b/net/relayd/Makefile @@ -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 diff --git a/net/relayd/src/etc/rc.d/os-relayd b/net/relayd/src/etc/rc.d/os-relayd new file mode 100755 index 000000000..04dade24f --- /dev/null +++ b/net/relayd/src/etc/rc.d/os-relayd @@ -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 diff --git a/net/relayd/src/opnsense/mvc/app/controllers/OPNsense/Relayd/Api/ServiceController.php b/net/relayd/src/opnsense/mvc/app/controllers/OPNsense/Relayd/Api/ServiceController.php index 502b7055f..157510da3 100644 --- a/net/relayd/src/opnsense/mvc/app/controllers/OPNsense/Relayd/Api/ServiceController.php +++ b/net/relayd/src/opnsense/mvc/app/controllers/OPNsense/Relayd/Api/ServiceController.php @@ -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 */ diff --git a/net/relayd/src/opnsense/mvc/app/controllers/OPNsense/Relayd/Api/SettingsController.php b/net/relayd/src/opnsense/mvc/app/controllers/OPNsense/Relayd/Api/SettingsController.php index 54513bea0..04cd42736 100644 --- a/net/relayd/src/opnsense/mvc/app/controllers/OPNsense/Relayd/Api/SettingsController.php +++ b/net/relayd/src/opnsense/mvc/app/controllers/OPNsense/Relayd/Api/SettingsController.php @@ -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; } } diff --git a/net/relayd/src/opnsense/mvc/app/controllers/OPNsense/Relayd/Api/StatusController.php b/net/relayd/src/opnsense/mvc/app/controllers/OPNsense/Relayd/Api/StatusController.php index 9bd79ee5f..2435cfb7f 100644 --- a/net/relayd/src/opnsense/mvc/app/controllers/OPNsense/Relayd/Api/StatusController.php +++ b/net/relayd/src/opnsense/mvc/app/controllers/OPNsense/Relayd/Api/StatusController.php @@ -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"]); } } } diff --git a/net/relayd/src/opnsense/mvc/app/models/OPNsense/Relayd/Relayd.php b/net/relayd/src/opnsense/mvc/app/models/OPNsense/Relayd/Relayd.php index bf8cf9a05..e80a832e0 100644 --- a/net/relayd/src/opnsense/mvc/app/models/OPNsense/Relayd/Relayd.php +++ b/net/relayd/src/opnsense/mvc/app/models/OPNsense/Relayd/Relayd.php @@ -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"); + } } diff --git a/net/relayd/src/opnsense/mvc/app/views/OPNsense/Relayd/index.volt b/net/relayd/src/opnsense/mvc/app/views/OPNsense/Relayd/index.volt index 2fd38a74f..8b9f56056 100644 --- a/net/relayd/src/opnsense/mvc/app/views/OPNsense/Relayd/index.volt +++ b/net/relayd/src/opnsense/mvc/app/views/OPNsense/Relayd/index.volt @@ -29,179 +29,182 @@ POSSIBILITY OF SUCH DAMAGE. +
- {{ 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'])}} +
+ + + + +
+ +
+
@@ -331,13 +343,13 @@ POSSIBILITY OF SUCH DAMAGE.
-
+
{# include dialogs #} {{ partial("layout_partials/base_dialog",['fields':formDialogEditHost, 'id':'DialogEditHost', 'label':'Edit Host'])}} diff --git a/net/relayd/src/opnsense/mvc/app/views/OPNsense/Relayd/status.volt b/net/relayd/src/opnsense/mvc/app/views/OPNsense/Relayd/status.volt index 01e03c96d..0bcee42f7 100644 --- a/net/relayd/src/opnsense/mvc/app/views/OPNsense/Relayd/status.volt +++ b/net/relayd/src/opnsense/mvc/app/views/OPNsense/Relayd/status.volt @@ -29,55 +29,55 @@ POSSIBILITY OF SUCH DAMAGE.