Skip to content

Commit

Permalink
Services: Kea DHCP [new]: Kea DHCPv4 - add Custom options tab
Browse files Browse the repository at this point in the history
Since our efforts to implement #7361 hasn't reached a functional state, lets move the code into a separate branch to keep master clean.
  • Loading branch information
AdSchellevis committed May 15, 2024
1 parent 7ee6033 commit a29dc9f
Show file tree
Hide file tree
Showing 6 changed files with 120 additions and 0 deletions.
1 change: 1 addition & 0 deletions plist
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,7 @@
/usr/local/opnsense/mvc/app/controllers/OPNsense/Kea/Api/ServiceController.php
/usr/local/opnsense/mvc/app/controllers/OPNsense/Kea/DhcpController.php
/usr/local/opnsense/mvc/app/controllers/OPNsense/Kea/forms/agentSettings.xml
/usr/local/opnsense/mvc/app/controllers/OPNsense/Kea/forms/dialogOption4.xml
/usr/local/opnsense/mvc/app/controllers/OPNsense/Kea/forms/dialogPeer4.xml
/usr/local/opnsense/mvc/app/controllers/OPNsense/Kea/forms/dialogReservation4.xml
/usr/local/opnsense/mvc/app/controllers/OPNsense/Kea/forms/dialogSubnet4.xml
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,4 +162,29 @@ public function delPeerAction($uuid)
{
return $this->delBase("ha_peers.peer", $uuid);
}

public function searchOptionAction()
{
return $this->searchBase("custom_options.option", null, "name");
}

public function setOptionAction($uuid)
{
return $this->setBase("option", "custom_options.option", $uuid);
}

public function addOptionAction()
{
return $this->addBase("option", "custom_options.option");
}

public function getOptionAction($uuid = null)
{
return $this->getBase("option", "custom_options.option", $uuid);
}

public function delOptionAction($uuid)
{
return $this->delBase("custom_options.option", $uuid);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ public function v4Action()
$this->view->formDialogSubnet = $this->getForm("dialogSubnet4");
$this->view->formDialogReservation = $this->getForm("dialogReservation4");
$this->view->formDialogPeer = $this->getForm("dialogPeer4");
$this->view->formDialogOption = $this->getForm("dialogOption4");
}

public function leases4Action()
Expand Down
26 changes: 26 additions & 0 deletions src/opnsense/mvc/app/models/OPNsense/Kea/KeaDhcpv4.php
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,17 @@ private function getConfigSubnets()
];
}
}
/* custom dhcp options */
foreach ($this->custom_options->option->iterateItems() as $option) {
if (in_array($subnet_uuid, explode(',', $option->subnet))) {
$record['option-data'][] = [
"name" => sprintf("%s_%s", $option->space, $option->code),
"code" => (int)((string)$option->code),
"space" => (string)$option->space,
"data" => (string)$option->data
];
}
}
/* add pools */
foreach (array_filter(explode("\n", $subnet->pools)) as $pool) {
$record['pools'][] = ['pool' => $pool];
Expand Down Expand Up @@ -242,6 +253,21 @@ public function generateConfig($target = '/usr/local/etc/kea/kea-dhcp4.conf')
'subnet4' => $this->getConfigSubnets(),
]
];
$option_def = [];
foreach ($this->custom_options->option->iterateItems() as $option) {
$option_def[sprintf("%s_%s", $option->space, $option->code)] = [
"name" => sprintf("%s_%s", $option->space, $option->code),
"code" => (int)((string)$option->code),
"type" => (string)$option->type,
"array" => !empty((string)$option->array),
"record-types" => "",
"space" => (string)$option->space,
"encapsulate" => ""
];
}
if (!empty($option_def)) {
$cnf['Dhcp4']['option-def'] = array_values($option_def);
}
if (!empty((string)(new KeaCtrlAgent())->general->enabled)) {
$cnf['Dhcp4']['hooks-libraries'] = [];
$cnf['Dhcp4']['hooks-libraries'][] = [
Expand Down
56 changes: 56 additions & 0 deletions src/opnsense/mvc/app/models/OPNsense/Kea/KeaDhcpv4.xml
Original file line number Diff line number Diff line change
Expand Up @@ -158,5 +158,61 @@
</url>
</peer>
</ha_peers>
<custom_options>
<option type="ArrayField">
<description type="DescriptionField"/>
<code type="IntegerField">
<Required>Y</Required>
<MinimumValue>0</MinimumValue>
<MaximumValue>255</MaximumValue>
</code>
<space type="OptionField">
<Required>Y</Required>
<Default>vendor</Default>
<OptionValues>
<vendor value='vendor-encapsulated-options-space'>vendor-encapsulated-options-space</vendor>
</OptionValues>
</space>
<type type="OptionField">
<Required>Y</Required>
<OptionValues>
<binary>binary</binary>
<boolean>boolean</boolean>
<fqdn>fqdn</fqdn>
<ipv4_address>ipv4-address</ipv4_address>
<ipv6_address>ipv6-address</ipv6_address>
<ipv6_prefix>ipv6-prefix</ipv6_prefix>
<psid>psid</psid>
<string>string</string>
<tuple>tuple</tuple>
<uint8>uint8</uint8>
<uint16>uint16</uint16>
<uint32>uint32</uint32>
<int8>int8</int8>
<int16>int16</int16>
<int32>int32</int32>
</OptionValues>
</type>
<array type="BooleanField">
<Required>Y</Required>
<Default>0</Default>
</array>
<subnet type="ModelRelationField">
<Model>
<subnets>
<source>OPNsense.Kea.KeaDhcpv4</source>
<items>subnets.subnet4</items>
<display>subnet</display>
</subnets>
</Model>
<ValidationMessage>Related subnet not found</ValidationMessage>
<Required>Y</Required>
<Multiple>Y</Multiple>
</subnet>
<data type="TextField">
<Required>Y</Required>
</data>
</option>
</custom_options>
</items>
</model>
11 changes: 11 additions & 0 deletions src/opnsense/mvc/app/views/OPNsense/Kea/dhcpv4.volt
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,15 @@
}
);

$("#grid-options").UIBootgrid(
{ search:'/api/kea/dhcpv4/search_option',
get:'/api/kea/dhcpv4/get_option/',
set:'/api/kea/dhcpv4/set_option/',
add:'/api/kea/dhcpv4/add_option/',
del:'/api/kea/dhcpv4/del_option/'
}
);

$("#reconfigureAct").SimpleActionButton({
onPreAction: function() {
const dfObj = new $.Deferred();
Expand Down Expand Up @@ -111,6 +120,7 @@
<li class="active"><a data-toggle="tab" href="#settings" id="tab_settings">{{ lang._('Settings') }}</a></li>
<li><a data-toggle="tab" href="#subnets" id="tab_pools"> {{ lang._('Subnets') }} </a></li>
<li><a data-toggle="tab" href="#reservations" id="tab_reservations"> {{ lang._('Reservations') }} </a></li>
<li><a data-toggle="tab" href="#options" id="tab_options"> {{ lang._('Custom Options') }} </a></li>
<li><a data-toggle="tab" href="#ha-peers" id="tab_ha-peers"> {{ lang._('HA Peers') }} </a></li>
</ul>
<div class="tab-content content-box">
Expand Down Expand Up @@ -246,3 +256,4 @@
{{ partial("layout_partials/base_dialog",['fields':formDialogSubnet,'id':'DialogSubnet','label':lang._('Edit Subnet')])}}
{{ partial("layout_partials/base_dialog",['fields':formDialogReservation,'id':'DialogReservation','label':lang._('Edit Reservation')])}}
{{ partial("layout_partials/base_dialog",['fields':formDialogPeer,'id':'DialogPeer','label':lang._('Edit Peer')])}}
{{ partial("layout_partials/base_dialog",['fields':formDialogOption,'id':'DialogOption','label':lang._('Edit Option')])}}

0 comments on commit a29dc9f

Please sign in to comment.