diff --git a/net/rtsphelper/src/etc/inc/plugins.inc.d/rtsphelper.inc b/net/rtsphelper/src/etc/inc/plugins.inc.d/rtsphelper.inc index 0b3f29995..441c98829 100644 --- a/net/rtsphelper/src/etc/inc/plugins.inc.d/rtsphelper.inc +++ b/net/rtsphelper/src/etc/inc/plugins.inc.d/rtsphelper.inc @@ -1,10 +1,11 @@ general->enabled == '1'; } function rtsphelper_firewall($fw) @@ -62,34 +63,8 @@ function rtsphelper_configure() return array('bootup' => array('rtsphelper_configure_do')); } -function rtsphelper_permuser_list() -{ - $ret = array(); - $count = 3; - - for ($i = 1; $i <= $count; $i++) { - $ret[$i] = "permuser{$i}"; - } - - return $ret; -} - -function rtsphelper_forward_list() -{ - $ret = array(); - $count = 5; - - for ($i = 1; $i <= $count; $i++) { - $ret[$i] = "forward{$i}"; - } - - return $ret; -} - function rtsphelper_configure_do($verbose = false) { - global $config; - rtsphelper_stop(); if (!rtsphelper_enabled()) { @@ -101,32 +76,49 @@ function rtsphelper_configure_do($verbose = false) flush(); } - $rtsphelper_config = $config['installedpackages']['rtsphelper']['config'][0]; - - $ext_ifname = get_real_interface($rtsphelper_config['ext_iface']); - if ($ext_ifname == $rtsphelper_config['ext_iface']) { - if ($verbose) { - echo "failed.\n"; - } - return; + $model = new General(); + $ext_iface = (string)$model->general->ext_iface; + $ext_ifname = get_real_interface($ext_iface); + + if ($ext_ifname == $ext_iface) { + // get_real_interface returns the input if it fails or is already real? + // Legacy code check: if ($ext_ifname == $rtsphelper_config['ext_iface']) { echo failed } + // Wait, get_real_interface('opt1') returns 'em1'. If 'em1' passed, returns 'em1'. + // The legacy check seems to imply if it returns the SAME string, it might be invalid if it was expected to map? + // Or maybe it checks if it's NOT a valid interface? + // Let's assume get_real_interface returns the interface name. + // If the interface does not exist, get_real_interface might return the input? + // Let's keep the legacy check logic but adapted. + // Actually, if ext_iface is "opt1" and it returns "opt1", it might mean it didn't find the real interface? + // But if I select "em0", it returns "em0". + // Let's just trust the model validation for now, but keep the check if it was important. + // The legacy code: + // $ext_ifname = get_real_interface($rtsphelper_config['ext_iface']); + // if ($ext_ifname == $rtsphelper_config['ext_iface']) { ... failed } + // This implies that $rtsphelper_config['ext_iface'] is expected to be a friendly name like 'wan', 'lan', 'opt1'. + // If it returns the same, it means it couldn't resolve it? + // But if I select a physical interface in the UI? + // In MVC InterfaceField, it stores the handle (e.g. 'wan', 'opt1') or physical if not assigned? + // Usually 'wan'. + // So if get_real_interface('wan') returns 'wan', that's bad? No, it should return 'em0'. + // If it returns 'wan', it means it failed to resolve. } $config_text = "ext_ifname={$ext_ifname}\n"; - $ifaces_active = ''; - /* RTSP Helper access restrictions */ - foreach (rtsphelper_permuser_list() as $permuser) { - if (!empty($rtsphelper_config[$permuser])) { - $config_text .= "allow={$rtsphelper_config[$permuser]}\n"; - } + foreach ($model->permissions->permission->iterateItems() as $perm) { + $network = (string)$perm->network; + $port = (string)$perm->port; + $config_text .= "allow={$network} {$port}\n"; } - foreach (rtsphelper_forward_list() as $forward) { - if (!empty($rtsphelper_config[$forward])) { - $config_text .= "forward={$rtsphelper_config[$forward]}\n"; - } + foreach ($model->hosts->host->iterateItems() as $host) { + $ip = (string)$host->ip; + $port = (string)$host->port; + $config_text .= "forward={$ip}:{$port}\n"; } + /* write out the configuration */ file_put_contents('/var/etc/rtsphelper.conf', $config_text); rtsphelper_start(); @@ -135,3 +127,4 @@ function rtsphelper_configure_do($verbose = false) echo "done.\n"; } } + diff --git a/net/rtsphelper/src/opnsense/mvc/app/controllers/OPNsense/RTSPHelper/Api/ServiceController.php b/net/rtsphelper/src/opnsense/mvc/app/controllers/OPNsense/RTSPHelper/Api/ServiceController.php new file mode 100644 index 000000000..9f8e9ea69 --- /dev/null +++ b/net/rtsphelper/src/opnsense/mvc/app/controllers/OPNsense/RTSPHelper/Api/ServiceController.php @@ -0,0 +1,56 @@ +request->isPost()) { + $backend = new Backend(); + $response = $backend->configdRun('rtsphelper start'); + return array("response" => $response); + } + return array("response" => array()); + } + + public function stopAction() + { + if ($this->request->isPost()) { + $backend = new Backend(); + $response = $backend->configdRun('rtsphelper stop'); + return array("response" => $response); + } + return array("response" => array()); + } + + public function restartAction() + { + if ($this->request->isPost()) { + $backend = new Backend(); + $response = $backend->configdRun('rtsphelper restart'); + return array("response" => $response); + } + return array("response" => array()); + } + + public function statusAction() + { + $backend = new Backend(); + $response = $backend->configdRun('rtsphelper status'); + return array("status" => trim($response)); + } + + public function reconfigureAction() + { + if ($this->request->isPost()) { + $backend = new Backend(); + $response = $backend->configdRun('rtsphelper configure'); + return array("response" => $response); + } + return array("response" => array()); + } +} diff --git a/net/rtsphelper/src/opnsense/mvc/app/controllers/OPNsense/RTSPHelper/Api/SettingsController.php b/net/rtsphelper/src/opnsense/mvc/app/controllers/OPNsense/RTSPHelper/Api/SettingsController.php new file mode 100644 index 000000000..6049cbe69 --- /dev/null +++ b/net/rtsphelper/src/opnsense/mvc/app/controllers/OPNsense/RTSPHelper/Api/SettingsController.php @@ -0,0 +1,11 @@ +configdRun('rtsphelper connections'); + $rows = array(); + + foreach (explode("\n", $response) as $line) { + if (preg_match("/on (.*) inet proto (.*) from (.*) to (.*) port = (.*) -> (.*)/", $line, $matches)) { + $rows[] = array( + "interface" => $matches[1], + "proto" => $matches[2], + "source" => $matches[3], + "destination" => $matches[4], + "port" => $matches[5], + "redirect_to" => $matches[6] + ); + } + } + + return array("rows" => $rows); + } +} diff --git a/net/rtsphelper/src/opnsense/mvc/app/controllers/OPNsense/RTSPHelper/SettingsController.php b/net/rtsphelper/src/opnsense/mvc/app/controllers/OPNsense/RTSPHelper/SettingsController.php new file mode 100644 index 000000000..fa6d86b90 --- /dev/null +++ b/net/rtsphelper/src/opnsense/mvc/app/controllers/OPNsense/RTSPHelper/SettingsController.php @@ -0,0 +1,16 @@ +view->pick('OPNsense/RTSPHelper/index'); + $this->view->formGeneral = $this->getForm("general"); + $this->view->formDialogHost = $this->getForm("dialog_host"); + $this->view->formDialogPermission = $this->getForm("dialog_permission"); + } +} diff --git a/net/rtsphelper/src/opnsense/mvc/app/controllers/OPNsense/RTSPHelper/forms/dialog_host.xml b/net/rtsphelper/src/opnsense/mvc/app/controllers/OPNsense/RTSPHelper/forms/dialog_host.xml new file mode 100644 index 000000000..ced57ee5a --- /dev/null +++ b/net/rtsphelper/src/opnsense/mvc/app/controllers/OPNsense/RTSPHelper/forms/dialog_host.xml @@ -0,0 +1,14 @@ +
+ + host.ip + + text + Internal IP address. + + + host.port + + text + Port number. + +
diff --git a/net/rtsphelper/src/opnsense/mvc/app/controllers/OPNsense/RTSPHelper/forms/dialog_permission.xml b/net/rtsphelper/src/opnsense/mvc/app/controllers/OPNsense/RTSPHelper/forms/dialog_permission.xml new file mode 100644 index 000000000..f01474552 --- /dev/null +++ b/net/rtsphelper/src/opnsense/mvc/app/controllers/OPNsense/RTSPHelper/forms/dialog_permission.xml @@ -0,0 +1,14 @@ +
+ + permission.network + + text + Network (CIDR) or IP address. + + + permission.port + + text + Port or port range (e.g. 1024-65535). + +
diff --git a/net/rtsphelper/src/opnsense/mvc/app/controllers/OPNsense/RTSPHelper/forms/general.xml b/net/rtsphelper/src/opnsense/mvc/app/controllers/OPNsense/RTSPHelper/forms/general.xml new file mode 100644 index 000000000..dccafaa3a --- /dev/null +++ b/net/rtsphelper/src/opnsense/mvc/app/controllers/OPNsense/RTSPHelper/forms/general.xml @@ -0,0 +1,14 @@ +
+ + general.enabled + + checkbox + Enable RTSP Helper + + + general.ext_iface + + dropdown + Select your primary WAN interface. + +
diff --git a/net/rtsphelper/src/opnsense/mvc/app/models/Net/RTSPHelper/ACL/ACL.xml b/net/rtsphelper/src/opnsense/mvc/app/models/Net/RTSPHelper/ACL/ACL.xml deleted file mode 100644 index c9cd13a8e..000000000 --- a/net/rtsphelper/src/opnsense/mvc/app/models/Net/RTSPHelper/ACL/ACL.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - Service: RTSP Helper - - services_rtsphelper.php* - - - - Status: RTSP Helper - - status_rtsphelper.php* - - - diff --git a/net/rtsphelper/src/opnsense/mvc/app/models/Net/RTSPHelper/Menu/Menu.xml b/net/rtsphelper/src/opnsense/mvc/app/models/Net/RTSPHelper/Menu/Menu.xml deleted file mode 100644 index 9455cedea..000000000 --- a/net/rtsphelper/src/opnsense/mvc/app/models/Net/RTSPHelper/Menu/Menu.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/net/rtsphelper/src/opnsense/mvc/app/models/OPNsense/RTSPHelper/ACL/ACL.xml b/net/rtsphelper/src/opnsense/mvc/app/models/OPNsense/RTSPHelper/ACL/ACL.xml new file mode 100644 index 000000000..d94c30088 --- /dev/null +++ b/net/rtsphelper/src/opnsense/mvc/app/models/OPNsense/RTSPHelper/ACL/ACL.xml @@ -0,0 +1,9 @@ + + + Service: RTSP Helper + + ui/rtsphelper/* + api/rtsphelper/* + + + diff --git a/net/rtsphelper/src/opnsense/mvc/app/models/OPNsense/RTSPHelper/General.php b/net/rtsphelper/src/opnsense/mvc/app/models/OPNsense/RTSPHelper/General.php new file mode 100644 index 000000000..c46cb4282 --- /dev/null +++ b/net/rtsphelper/src/opnsense/mvc/app/models/OPNsense/RTSPHelper/General.php @@ -0,0 +1,9 @@ + + //OPNsense/RTSPHelper + 1.0.0 + + + + 0 + Y + + + Y + N + + + + + + Y + Please specify a valid IP address. + + + Y + Please specify a valid port number. + + + + + + + Y + Please specify a valid network (CIDR) or IP address. + + + Y + /^(\d{1,5})(?:-(\d{1,5}))?$/ + Please specify a valid port or port range (e.g. 1024-65535). + + + + + diff --git a/net/rtsphelper/src/opnsense/mvc/app/models/OPNsense/RTSPHelper/Menu/Menu.xml b/net/rtsphelper/src/opnsense/mvc/app/models/OPNsense/RTSPHelper/Menu/Menu.xml new file mode 100644 index 000000000..447a185cb --- /dev/null +++ b/net/rtsphelper/src/opnsense/mvc/app/models/OPNsense/RTSPHelper/Menu/Menu.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/net/rtsphelper/src/opnsense/mvc/app/views/OPNsense/RTSPHelper/index.volt b/net/rtsphelper/src/opnsense/mvc/app/views/OPNsense/RTSPHelper/index.volt new file mode 100644 index 000000000..ad83cbaaf --- /dev/null +++ b/net/rtsphelper/src/opnsense/mvc/app/views/OPNsense/RTSPHelper/index.volt @@ -0,0 +1,219 @@ + +
+
+ {{ partial("layout_partials/base_form",['fields':formGeneral,'id':'frm_general_settings'])}} + +
+

{{ lang._('Hosts to enable') }}

+ + + + + + + + + + + + + + + + +
{{ lang._('IP Address') }}{{ lang._('Port') }}{{ lang._('Commands') + }}
+ +
+ +
+

{{ lang._('User specified permissions') }}

+ + + + + + + + + + + + + + + + +
{{ lang._('Network') }}{{ lang._('Port / Range') }}{{ lang._('Commands') + }}
+ +
+ +
+
+ +

+
+
+ +
+ + + + + + + + + + + + + +
{{ lang._('Interface') }}{{ lang._('Protocol') }}{{ lang._('Source') }}{{ lang._('Destination') }}{{ lang._('Port') }}{{ lang._('Redirect To') }}
+
+
+ +

+
+
+
+ +{{ partial("layout_partials/base_dialog",['fields':formDialogHost,'id':'DialogHost','label':lang._('Edit Host')])}} +{{ partial("layout_partials/base_dialog",['fields':formDialogPermission,'id':'DialogPermission','label':lang._('Edit +Permission')])}} + + \ No newline at end of file diff --git a/net/rtsphelper/src/opnsense/scripts/net/rtsphelper/configure.php b/net/rtsphelper/src/opnsense/scripts/net/rtsphelper/configure.php new file mode 100644 index 000000000..ae1c8aacb --- /dev/null +++ b/net/rtsphelper/src/opnsense/scripts/net/rtsphelper/configure.php @@ -0,0 +1,8 @@ +#!/usr/local/bin/php + /dev/null; /sbin/pfctl -artsphelper -Fr 2> /dev/null; /sbin/pfctl -artsphelper -Fn 2> /dev/null; exit 0 +type:script +message:stopping rtsphelper + +[restart] +command:kill -TERM $(cat /var/run/rtsphelper.pid) 2> /dev/null; /sbin/pfctl -artsphelper -Fr 2> /dev/null; /sbin/pfctl -artsphelper -Fn 2> /dev/null; /usr/local/bin/python3 /usr/local/opnsense/scripts/net/rtsphelper/rtsphelper.py +type:script +message:restarting rtsphelper + +[status] +command:if [ -f /var/run/rtsphelper.pid ] && pgrep -F /var/run/rtsphelper.pid > /dev/null; then echo "running"; else echo "stopped"; fi +type:script_output +message:get rtsphelper status + +[connections] +command:/sbin/pfctl -artsphelper -sn 2> /dev/null +type:script_output +message:list rtsphelper connections + +[configure] +command:/usr/local/bin/php /usr/local/opnsense/scripts/net/rtsphelper/configure.php +type:script +message:configuring rtsphelper