From 2ef75761fdf6867bccd4118d05683c0752bb4b59 Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Wed, 4 Mar 2020 18:49:17 +0100 Subject: [PATCH] firewall: add custom ArrayField type to contain rules and add serializer to internal firewall format. Example usage: ``` $mdlFilter = new OPNsense\Firewall\Filter(); foreach ($mdlFilter->rules->rule->iterateItems() as $key => $rule) { print_r($rule->serialize()); } ``` for https://github.com/opnsense/plugins/issues/1720 --- .../Firewall/FieldTypes/FilterRuleField.php | 103 ++++++++++++++++++ .../app/models/OPNsense/Firewall/Filter.xml | 4 +- 2 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/FilterRuleField.php diff --git a/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/FilterRuleField.php b/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/FilterRuleField.php new file mode 100644 index 000000000..5f989c56c --- /dev/null +++ b/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/FilterRuleField.php @@ -0,0 +1,103 @@ +iterateItems() as $key => $node) { + if (!in_array($key, $map_manual)) { + if (is_a($node, "OPNsense\\Base\\FieldTypes\\BooleanField")) { + $result[$key] = !empty((string)$node); + } else { + $result[$key] = (string)$node; + } + } + } + // source / destination mapping + $result['source'] = array(); + if (!empty((string)$this->source_net)) { + $result['source']['network'] = (string)$this->source_net; + $result['source']['not'] = !empty((string)$this->source_not); + if (!empty((string)$this->source_port)) { + $result['source']['port'] = (string)$this->source_port; + } + } + $result['destination'] = array(); + if (!empty((string)$this->destination_net)) { + $result['destination']['network'] = (string)$this->destination_net; + $result['destination']['not'] = !empty((string)$this->destination_not); + if (!empty((string)$this->source_port)) { + $result['destination']['port'] = (string)$this->destination_port; + } + } + // swap enabled + $result['disabled'] = empty((string)$this->enabled); + // + $result['descr'] = (string)$this->description; + $result['type'] = (string)$this->action; + return $result; + } +} + +/** + * Class FilterRuleField + * @package OPNsense\Firewall\FieldTypes + */ +class FilterRuleField extends ArrayField +{ + /** + * @inheritDoc + */ + public function newContainerField($ref, $tagname) + { + $container_node = new FilterRuleContainerField($ref, $tagname); + $parentmodel = $this->getParentModel(); + $container_node->setParentModel($parentmodel); + return $container_node; + } +} diff --git a/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/Filter.xml b/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/Filter.xml index 0404af5dd..0c07fe855 100644 --- a/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/Filter.xml +++ b/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/Filter.xml @@ -5,14 +5,14 @@ - + 1 Y 1 - 1000000 + 99999 provide a valid sequence for sorting Y 1