diff --git a/net/quagga/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/BgpController.php b/net/quagga/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/BgpController.php index c71eb3cb2..38cc2cfb1 100644 --- a/net/quagga/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/BgpController.php +++ b/net/quagga/src/opnsense/mvc/app/controllers/OPNsense/Quagga/Api/BgpController.php @@ -81,7 +81,7 @@ class BgpController extends ApiMutableModelControllerBase $grid = new UIModelGrid($mdlBGP->neighbors->neighbor); return $grid->fetchBindRequest( $this->request, - array("enabled", "address", "remoteas", "updatesource", "nexthopself", "defaultoriginate", "linkedRoutemapIn", "linkedRoutemapOut" ) + array("enabled", "address", "remoteas", "updatesource", "nexthopself", "defaultoriginate", "linkedPrefixlistIn", "linkedPrefixlistOut", "linkedRoutemapIn", "linkedRoutemapOut" ) ); } @@ -269,6 +269,99 @@ class BgpController extends ApiMutableModelControllerBase return array("result" => "failed"); } + public function searchPrefixlistAction() + { + $this->sessionClose(); + $mdlBGP = $this->getModel(); + $grid = new UIModelGrid($mdlBGP->prefixlists->prefixlist); + return $grid->fetchBindRequest( + $this->request, + array("enabled", "name", "seqnumber", "action", "network" ) + ); + } + public function getPrefixlistAction($uuid = null) + { + $mdlBGP = $this->getModel(); + if ($uuid != null) { + $node = $mdlBGP->getNodeByReference('prefixlists.prefixlist.' . $uuid); + if ($node != null) { + // return node + return array("prefixlist" => $node->getNodes()); + } + } else { + $node = $mdlBGP->prefixlists->prefixlist->add(); + return array("prefixlist" => $node->getNodes()); + } + return array(); + } + public function addPrefixlistAction() + { + $result = array("result" => "failed"); + if ($this->request->isPost() && $this->request->hasPost("prefixlist")) { + $result = array("result" => "failed", "validations" => array()); + $mdlBGP = $this->getModel(); + $node = $mdlBGP->prefixlists->prefixlist->Add(); + $node->setNodes($this->request->getPost("prefixlist")); + $valMsgs = $mdlBGP->performValidation(); + foreach ($valMsgs as $field => $msg) { + $fieldnm = str_replace($node->__reference, "prefixlist", $msg->getField()); + $result["validations"][$fieldnm] = $msg->getMessage(); + } + if (count($result['validations']) == 0) { + // save config if validated correctly + $mdlBGP->serializeToConfig(); + Config::getInstance()->save(); + unset($result['validations']); + $result["result"] = "saved"; + } + } + return $result; + } + public function delPrefixlistAction($uuid) + { + $result = array("result" => "failed"); + if ($this->request->isPost()) { + $mdlBGP = $this->getModel(); + if ($uuid != null) { + if ($mdlBGP->prefixlists->prefixlist->del($uuid)) { + $mdlBGP->serializeToConfig(); + Config::getInstance()->save(); + $result['result'] = 'deleted'; + } else { + $result['result'] = 'not found'; + } + } + } + return $result; + } + public function setPrefixlistAction($uuid) + { + if ($this->request->isPost() && $this->request->hasPost("prefixlist")) { + $mdlNeighbor = $this->getModel(); + if ($uuid != null) { + $node = $mdlNeighbor->getNodeByReference('prefixlists.prefixlist.' . $uuid); + if ($node != null) { + $result = array("result" => "failed", "validations" => array()); + $prefixlistInfo = $this->request->getPost("prefixlist"); + $node->setNodes($prefixlistInfo); + $valMsgs = $mdlNeighbor->performValidation(); + foreach ($valMsgs as $field => $msg) { + $fieldnm = str_replace($node->__reference, "prefixlist", $msg->getField()); + $result["validations"][$fieldnm] = $msg->getMessage(); + } + if (count($result['validations']) == 0) { + // save config if validated correctly + $mdlNeighbor->serializeToConfig(); + Config::getInstance()->save(); + $result = array("result" => "saved"); + } + return $result; + } + } + } + return array("result" => "failed"); + } + public function searchRoutemapAction() { $this->sessionClose(); @@ -399,6 +492,11 @@ class BgpController extends ApiMutableModelControllerBase { return $this->toggle_handler($uuid, 'aspaths', 'aspath'); } + + public function togglePrefixlistAction($uuid) + { + return $this->toggle_handler($uuid, 'prefixlists', 'prefixlist'); + } public function toggleRoutemapAction($uuid) { diff --git a/net/quagga/src/opnsense/mvc/app/controllers/OPNsense/Quagga/BgpController.php b/net/quagga/src/opnsense/mvc/app/controllers/OPNsense/Quagga/BgpController.php index a1dc14457..116aba171 100644 --- a/net/quagga/src/opnsense/mvc/app/controllers/OPNsense/Quagga/BgpController.php +++ b/net/quagga/src/opnsense/mvc/app/controllers/OPNsense/Quagga/BgpController.php @@ -32,6 +32,7 @@ class BgpController extends \OPNsense\Base\IndexController $this->view->bgpForm = $this->getForm("bgp"); $this->view->formDialogEditBGPNeighbor = $this->getForm("dialogEditBGPNeighbor"); $this->view->formDialogEditBGPASPaths = $this->getForm("dialogEditBGPASPath"); + $this->view->formDialogEditBGPPrefixLists = $this->getForm("dialogEditBGPPrefixLists"); $this->view->formDialogEditBGPRouteMaps = $this->getForm("dialogEditBGPRouteMaps"); $this->view->pick('OPNsense/Quagga/bgp'); } diff --git a/net/quagga/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditBGPNeighbor.xml b/net/quagga/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditBGPNeighbor.xml index 15a093d02..f34aee3f4 100644 --- a/net/quagga/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditBGPNeighbor.xml +++ b/net/quagga/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditBGPNeighbor.xml @@ -32,6 +32,18 @@ checkbox + + neighbor.linkedPrefixlistIn + + dropdown + Prefix-List for inbound direction + + + neighbor.linkedPrefixlistOut + + dropdown + Prefix-List for outbound direction + neighbor.linkedRoutemapIn diff --git a/net/quagga/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditBGPPrefixLists.xml b/net/quagga/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditBGPPrefixLists.xml new file mode 100644 index 000000000..7fe5ced18 --- /dev/null +++ b/net/quagga/src/opnsense/mvc/app/controllers/OPNsense/Quagga/forms/dialogEditBGPPrefixLists.xml @@ -0,0 +1,32 @@ +
+ + prefixlist.enabled + + checkbox + Enable / Disable + + + prefixlist.name + + text + The name of your Prefix-List, please choose one near to the result you want to achieve. + + + prefixlist.seqnumber + + text + The ACL sequence number (10-99) + + + prefixlist.action + + select_multiple + Set permit for match or deny to negate the rule. + + + prefixlist.network + + text + The network pattern you want to match. You can also add "ge" or "le" additions after the network statement. It's not validated so please be careful! + +
diff --git a/net/quagga/src/opnsense/mvc/app/models/OPNsense/Quagga/BGP.xml b/net/quagga/src/opnsense/mvc/app/models/OPNsense/Quagga/BGP.xml index e380a1a81..78d6d49a9 100644 --- a/net/quagga/src/opnsense/mvc/app/models/OPNsense/Quagga/BGP.xml +++ b/net/quagga/src/opnsense/mvc/app/models/OPNsense/Quagga/BGP.xml @@ -65,12 +65,39 @@ 0 N + + + + + Related Prefix-List item not found + N + N + + + + + + Related Prefix-List item not found + N + N + Related Route-Map item not found @@ -83,6 +110,7 @@ OPNsense.quagga.bgp routemaps.routemap name + name Related Route-Map item not found @@ -117,6 +145,36 @@ + + + + 1 + Y + + + + Y + + + + Y + 10 + 99 + + + + Y + + Permit + Deny + + + + + Y + + + diff --git a/net/quagga/src/opnsense/mvc/app/views/OPNsense/Quagga/bgp.volt b/net/quagga/src/opnsense/mvc/app/views/OPNsense/Quagga/bgp.volt index f36fe29c1..2e0abfe6a 100644 --- a/net/quagga/src/opnsense/mvc/app/views/OPNsense/Quagga/bgp.volt +++ b/net/quagga/src/opnsense/mvc/app/views/OPNsense/Quagga/bgp.volt @@ -31,7 +31,8 @@ POSSIBILITY OF SUCH DAMAGE.
@@ -45,8 +46,6 @@ POSSIBILITY OF SUCH DAMAGE.
- -
@@ -57,8 +56,10 @@ POSSIBILITY OF SUCH DAMAGE. - - + + + + @@ -76,7 +77,6 @@ POSSIBILITY OF SUCH DAMAGE.
{{ lang._('Update Source Address') }} {{ lang._('Next Hop Self') }} {{ lang._('Default Originate') }}{{ lang._('Route-Map Inbound') }}{{ lang._('Route-Map Outbound') }}{{ lang._('Prefix List inbound') }}{{ lang._('Prefix List outbound') }}{{ lang._('Route Map inbound') }}{{ lang._('Route Map outbound') }} {{ lang._('ID') }} {{ lang._('Commands') }}
-
@@ -102,7 +102,32 @@ POSSIBILITY OF SUCH DAMAGE.
- +
+ + + + + + + + + + + + + + + + + + + + +
{{ lang._('Enabled') }}{{ lang._('Name') }}{{ lang._('Secquence Number') }}{{ lang._('Action') }}{{ lang._('Network') }}{{ lang._('ID') }}{{ lang._('Commands') }}
+ + +
+
@@ -124,13 +149,11 @@ POSSIBILITY OF SUCH DAMAGE.
-
- {{ partial("layout_partials/base_dialog",['fields':formDialogEditBGPNeighbor,'id':'DialogEditBGPNeighbor','label':lang._('Edit Neighbor')])}} -{{ partial("layout_partials/base_dialog",['fields':formDialogEditBGPASPaths,'id':'DialogEditBGPASPaths','label':lang._('Edit AS-Paths')])}} -{{ partial("layout_partials/base_dialog",['fields':formDialogEditBGPRouteMaps,'id':'DialogEditBGPRouteMaps','label':lang._('Edit Route-Maps')])}} +{{ partial("layout_partials/base_dialog",['fields':formDialogEditBGPASPaths,'id':'DialogEditBGPASPaths','label':lang._('Edit AS Paths')])}} +{{ partial("layout_partials/base_dialog",['fields':formDialogEditBGPPrefixLists,'id':'DialogEditBGPPrefixLists','label':lang._('Edit Prefix Lists')])}} +{{ partial("layout_partials/base_dialog",['fields':formDialogEditBGPRouteMaps,'id':'DialogEditBGPRouteMaps','label':lang._('Edit Route Maps')])}} diff --git a/net/quagga/src/opnsense/service/templates/OPNsense/Quagga/bgpd.conf b/net/quagga/src/opnsense/service/templates/OPNsense/Quagga/bgpd.conf index e32b4f9df..2e958875d 100644 --- a/net/quagga/src/opnsense/service/templates/OPNsense/Quagga/bgpd.conf +++ b/net/quagga/src/opnsense/service/templates/OPNsense/Quagga/bgpd.conf @@ -27,6 +27,22 @@ router bgp {{ OPNsense.quagga.bgp.asnumber }} {% if 'defaultoriginate' in neighbor and neighbor.defaultoriginate == '1' %} neighbor {{ neighbor.address }} default-originate {% endif %} +{% if neighbor.linkedPrefixlistIn|default("") != "" %} +{% for prefixlist in neighbor.linkedPrefixlistIn.split(",") %} +{% set prefixlist2_data = helpers.getUUID(prefixlist) %} +{% if prefixlist2_data != '' %} + neighbor {{ neighbor.address }} prefix-list {{ prefixlist2_data.name }} in +{% endif %} +{% endfor %} +{% endif %} +{% if neighbor.linkedPrefixlistOut|default("") != "" %} +{% for prefixlist in neighbor.linkedPrefixlistOut.split(",") %} +{% set prefixlist_data = helpers.getUUID(prefixlist) %} +{% if prefixlist_data != '' %} + neighbor {{ neighbor.address }} prefix-list {{ prefixlist_data.name }} out +{% endif %} +{% endfor %} +{% endif %} {% if neighbor.linkedRoutemapIn|default("") != "" %} {% for aspath in neighbor.linkedRoutemapIn.split(",") %} {% set routemap2_data = helpers.getUUID(aspath) %} @@ -47,6 +63,14 @@ router bgp {{ OPNsense.quagga.bgp.asnumber }} {% endfor %} {% endif %} ! +{% if helpers.exists('OPNsense.quagga.bgp.prefixlists.prefixlist') %} +{% for prefixlist in helpers.sortDictList(OPNsense.quagga.bgp.prefixlists.prefixlist, 'name', 'seqnumber' ) %} +{% if prefixlist.enabled == '1' %} +ip prefix-list {{ prefixlist.name }} seq {{ prefixlist.seqnumber }} {{ prefixlist.action }} {{ prefixlist.network }} +{% endif %} +{% endfor %} +{% endif %} +! {% if helpers.exists('OPNsense.quagga.bgp.aspaths.aspath') %} {% for aspath in helpers.sortDictList(OPNsense.quagga.bgp.aspaths.aspath, 'number' ) %} {% if aspath.enabled == '1' %}