dhcrelay: migrate IPv6 data, consolidation cleanups #6983

Menu, ACL and XMLRPC wer consolidated into the IPv4 flag.  IPv6 is
no longer functional and operates from the shared reimplementation
now.  Syslog doesn't work on OpenBSD dhcrelay especially since we
start it with -d so it tries to spam to stderr which is ignored by
daemon -f to background it properly with a pid file (it's a long
story, don't ask).
This commit is contained in:
Franco Fichtner 2024-03-13 17:54:36 +01:00
parent 53a95b0190
commit ad5fed3c4d
13 changed files with 87 additions and 234 deletions

View File

@ -30,7 +30,6 @@ Copyright (c) 2009-2012 Jim Pingle <jimp@pfsense.org>
Copyright (c) 2012 Jonas von Andrian
Copyright (c) 2004-2005 Jonathan Watt <jwatt@jwatt.org>
Copyright (c) 2015 Jos Schellevis <jos@opnsense.org>
Copyright (c) 2003-2004 Justin Ellison <justin@techadvise.com>
Copyright (c) 2021 Kyle Evans <kevans@FreeBSD.org>
Copyright (c) 2015 Manuel Faux <mfaux@conf.at>
Copyright (c) 2003-2006 Manuel Kasper <mk@neon1.net>

2
plist
View File

@ -605,6 +605,7 @@
/usr/local/opnsense/mvc/app/models/OPNsense/DHCRelay/DHCRelay.xml
/usr/local/opnsense/mvc/app/models/OPNsense/DHCRelay/Menu/Menu.xml
/usr/local/opnsense/mvc/app/models/OPNsense/DHCRelay/Migrations/M1_0_0.php
/usr/local/opnsense/mvc/app/models/OPNsense/DHCRelay/Migrations/M1_0_1.php
/usr/local/opnsense/mvc/app/models/OPNsense/Diagnostics/ACL/ACL.xml
/usr/local/opnsense/mvc/app/models/OPNsense/Diagnostics/DnsDiagnostics.php
/usr/local/opnsense/mvc/app/models/OPNsense/Diagnostics/DnsDiagnostics.xml
@ -2080,7 +2081,6 @@
/usr/local/www/services_dhcp_edit.php
/usr/local/www/services_dhcpv6.php
/usr/local/www/services_dhcpv6_edit.php
/usr/local/www/services_dhcpv6_relay.php
/usr/local/www/services_dnsmasq.php
/usr/local/www/services_dnsmasq_domainoverride_edit.php
/usr/local/www/services_dnsmasq_edit.php

View File

@ -405,12 +405,6 @@ function core_xmlrpc_sync()
'id' => 'dhcpdv6',
'services' => ["dhcpdv6", "radvd"],
);
$result[] = array(
'description' => gettext('DHCPv6: Relay'),
'section' => 'dhcrelay6',
'id' => 'dhcrelay6',
'services' => ["dhcrelay6"],
);
$result[] = array(
'description' => gettext('Virtual IPs'),
'help' => gettext('Synchronize the CARP Virtual IPs to the other HA host.'),

View File

@ -115,16 +115,6 @@ function dhcpd_services()
$services[] = $pconfig;
}
if (isset($config['dhcrelay6']['enable'])) {
$pconfig = array();
$pconfig['name'] = "dhcrelay6";
$pconfig['description'] = gettext("DHCPv6 Relay");
$pconfig['php']['restart'] = array('dhcpd_dhcrelay6_configure');
$pconfig['php']['start'] = array('dhcpd_dhcrelay6_configure');
$pconfig['pidfile'] = '/var/run/dhcrelay6.pid';
$services[] = $pconfig;
}
if (dhcpd_dhcpv4_enabled()) {
$pconfig = array();
$pconfig['name'] = 'dhcpd';
@ -1599,13 +1589,6 @@ EOD;
service_log("done.\n", $verbose);
}
function dhcpd_dhcrelay_configure($verbose = false, $family = null, $id = null)
{
if ($family == null || $family == 'inet6') {
dhcpd_dhcrelay6_configure($verbose);
}
}
function dhcpd_dhcrelay6_configure($verbose = false)
{
global $config;

View File

@ -60,8 +60,8 @@ function dhcrelay_xmlrpc_sync()
$result = [];
$result[] = [
'description' => gettext('DHCPv4: Relay'),
'section' => 'dhcrelay,OPNsense.DHCRelay',
'description' => gettext('DHCRelay'),
'section' => 'dhcrelay,dhcrelay6,OPNsense.DHCRelay',
'services' => ['dhcrelay'],
'id' => 'dhcrelay',
];

View File

@ -420,12 +420,6 @@
<pattern>services_dhcp.php*</pattern>
</patterns>
</page-services-dhcpserver>
<page-services-dhcpv6relay>
<name>Services: DHCPv6 Relay</name>
<patterns>
<pattern>services_dhcpv6_relay.php*</pattern>
</patterns>
</page-services-dhcpv6relay>
<page-services-dhcpserverv6-editstaticmapping>
<name>Services: DHCPv6 Server: Edit static mapping</name>
<patterns>

View File

@ -174,7 +174,6 @@
<LogFile VisibleName="Log File" order="400" url="/ui/diagnostics/log/core/dhcpd"/>
</ISC_DHCPv4>
<ISC_DHCPv6 VisibleName="ISC DHCPv6" cssClass="fa fa-bullseye fa-fw">
<Relay order="300" url="/services_dhcpv6_relay.php"/>
<Leases order="400" url="/ui/dhcpv6/leases"/>
</ISC_DHCPv6>
<OpenDNS VisibleName="OpenDNS" url="/services_opendns.php" cssClass="fa fa-tags fa-fw"/>

View File

@ -1,6 +1,6 @@
<model>
<mount>//OPNsense/DHCRelay</mount>
<version>1.0.0</version>
<version>1.0.1</version>
<description>DHCRelay configuration</description>
<items>
<relays type="ArrayField">

View File

@ -60,8 +60,8 @@ class M1_0_0 extends BaseModelMigration
foreach (explode(',', (string)$legacy->interface) as $interface) {
$node = $model->relays->add();
$node->setNodes([
'agent_info' => !empty($legacy->agentoption),
'enabled' => !empty($legacy->enable),
'agent_info' => !empty($legacy->agentoption) ? '1' : '0',
'enabled' => !empty($legacy->enable) ? '1' : '0',
'interface' => (string)$interface,
'destination' => $dest_uuid,
]);

View File

@ -0,0 +1,80 @@
<?php
/*
* Copyright (C) 2024 Deciso B.V.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
namespace OPNsense\DHCRelay\Migrations;
use OPNsense\Base\BaseModelMigration;
use OPNsense\Base\FieldTypes\BooleanField;
use OPNsense\Base\FieldTypes\NetworkField;
use OPNsense\Base\FieldTypes\PortField;
use OPNsense\Core\Config;
class M1_0_1 extends BaseModelMigration
{
/**
* Migrate older models into shared model
* @param $model
*/
public function run($model)
{
$config = Config::getInstance()->object();
$legacy = $config->dhcrelay6;
if (empty($legacy->interface) || empty($legacy->server)) {
/* no value in partial migration so skip all */
return;
}
$node = $model->destinations->add();
$node->setNodes([
'name' => 'Migrated IPv6 server entry',
'server' => (string)$legacy->server,
]);
$dest_uuid = $node->getAttribute('uuid');
foreach (explode(',', (string)$legacy->interface) as $interface) {
$node = $model->relays->add();
$node->setNodes([
'agent_info' => !empty($legacy->agentoption) ? '1' : '0',
'enabled' => !empty($legacy->enable) ? '1' : '0',
'interface' => (string)$interface,
'destination' => $dest_uuid,
]);
$node->interface->normalizeValue();
if (empty((string)$node->interface)) {
$model->relays->del($node->getAttribute('uuid'));
}
}
}
public function post($model)
{
$config = Config::getInstance()->object();
unset($config->dhcrelay6);
}
}

View File

@ -2,5 +2,5 @@
# Local syslog-ng configuration filter definition [dhcpd].
###################################################################
filter f_local_dhcpd {
facility(local7) or program("dhcpd") or program("dhcrelay");
facility(local7) or program("dhcpd");
};

View File

@ -244,12 +244,6 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') {
}
}
}
/* make sure that the DHCP Relay isn't enabled on this interface */
if (isset($config['dhcrelay'][$if]['enable'])) {
$input_errors[] = sprintf(gettext("You must disable the DHCP relay on the %s interface before enabling the DHCP server."),
!empty($config['interfaces'][$if]['descr']) ? htmlspecialchars($config['interfaces'][$if]['descr']) : strtoupper($if));
}
}
if (count($input_errors) == 0) {
@ -424,9 +418,6 @@ include("head.inc");
<section class="page-content-main">
<div class="container-fluid">
<div class="row">
<?php if (!empty($config['dhcrelay6']['enabled'])): ?>
<?php print_info_box(gettext('DHCP Relay is currently enabled. Cannot enable the DHCP Server service while the DHCP Relay is enabled on any interface.')); ?>
<?php else: ?>
<?php if (isset($input_errors) && count($input_errors) > 0) print_input_errors($input_errors); ?>
<?php if (isset($savemsg)) print_info_box($savemsg); ?>
<?php if (is_subsystem_dirty('staticmaps')): ?><p>
@ -798,7 +789,6 @@ include("head.inc");
</table>
</div>
</div>
<?php endif; ?>
</section>
</div>
</div>

View File

@ -1,186 +0,0 @@
<?php
/*
* Copyright (C) 2014-2016 Deciso B.V.
* Copyright (C) 2003-2004 Justin Ellison <justin@techadvise.com>
* Copyright (C) 2010 Ermal Luçi
* Copyright (C) 2010 Seth Mos <seth.mos@dds.nl>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
require_once("guiconfig.inc");
require_once("interfaces.inc");
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
$pconfig['enable'] = isset($config['dhcrelay6']['enable']);
if (empty($config['dhcrelay6']['interface'])) {
$pconfig['interface'] = array();
} else {
$pconfig['interface'] = explode(",", $config['dhcrelay6']['interface']);
}
if (empty($config['dhcrelay6']['server'])) {
$pconfig['server'] = "";
} else {
$pconfig['server'] = $config['dhcrelay6']['server'];
}
$pconfig['agentoption'] = isset($config['dhcrelay6']['agentoption']);
} elseif ($_SERVER['REQUEST_METHOD'] === 'POST') {
$input_errors = array();
$pconfig = $_POST;
/* input validation */
$reqdfields = explode(" ", "server interface");
$reqdfieldsn = array(gettext("Destination Server"), gettext("Interface"));
do_input_validation($pconfig, $reqdfields, $reqdfieldsn, $input_errors);
if (!empty($pconfig['server'])) {
$checksrv = explode(",", $pconfig['server']);
foreach ($checksrv as $srv) {
if (!is_ipaddrv6($srv)) {
$input_errors[] = gettext("A valid Destination Server IPv6 address must be specified.");
}
}
}
if (count($input_errors) == 0) {
$config['dhcrelay6']['enable'] = !empty($pconfig['enable']);
$config['dhcrelay6']['interface'] = implode(",", $pconfig['interface']);
$config['dhcrelay6']['agentoption'] = !empty($pconfig['agentoption']);
$config['dhcrelay6']['server'] = $pconfig['server'];
write_config();
plugins_configure('dhcrelay', false, array('inet6'));
header(url_safe('Location: /services_dhcpv6_relay.php'));
exit;
}
}
/* set the enabled flag which will tell us if DHCP server is enabled
* on any interface. We will use this to disable dhcp-relay since
* the two are not compatible with each other.
*/
$dhcpd_enabled = false;
if (is_array($config['dhcpdv6'])) {
foreach($config['dhcpdv6'] as $intf => $dhcp) {
if (isset($dhcp['enable']) && !empty($config['interfaces'][$intf]['enable'])) {
$dhcpd_enabled = true;
}
}
}
$service_hook = 'dhcrelay6';
include("head.inc");
?>
<body>
<?php include("fbegin.inc"); ?>
<section class="page-content-main">
<div class="container-fluid">
<div class="row">
<?php if ($dhcpd_enabled):
print_info_box(gettext('The DHCPv6 server is currently enabled. Cannot enable the DHCPv6 relay while the DHCPv6 server is enabled on any interface.'));
else: ?>
<?php if (isset($input_errors) && count($input_errors) > 0) print_input_errors($input_errors); ?>
<?php if (isset($savemsg)) print_info_box($savemsg); ?>
<section class="col-xs-12">
<div class="content-box">
<form method="post" name="iform" id="iform">
<div>
<div class="table-responsive">
<table class="table table-striped opnsense_standard_table_form">
<tr>
<td style="width:22%"><strong><?=gettext("DHCPv6 Relay configuration"); ?></strong></td>
<td style="width:78%; text-align:right">
<small><?=gettext("full help"); ?> </small>
<i class="fa fa-toggle-off text-danger" style="cursor: pointer;" id="show_all_help_page"></i>
</td>
</tr>
<tr>
<td><i class="fa fa-info-circle text-muted"></i> <?= gettext('Enable') ?></td>
<td>
<input name="enable" type="checkbox" value="yes" <?=!empty($pconfig['enable']) ? "checked=\"checked\"" : ""; ?>/>
<strong><?=gettext("Enable DHCPv6 relay on interface");?></strong>
</td>
</tr>
<tr>
<td><a id="help_for_interface" href="#" class="showhelp"><i class="fa fa-info-circle"></i></a> <?= gettext('Interface(s)') ?></td>
<td>
<select name="interface[]" multiple="multiple" class="selectpicker">
<?php
$iflist = get_configured_interface_with_descr();
foreach ($iflist as $ifent => $ifdesc):
if (!is_ipaddrv6(get_interface_ipv6($ifent))) {
continue;
}?>
<option value="<?=$ifent;?>" <?=!empty($pconfig['interface']) && in_array($ifent, $pconfig['interface']) ? " selected=\"selected\"" : "";?> >
<?=$ifdesc;?>
</option>
<?php
endforeach;?>
</select>
<div class="hidden" data-for="help_for_interface">
<?=gettext("Interfaces without an IPv6 address will not be shown."); ?>
</div>
</td>
</tr>
<tr>
<td><a id="help_for_agentoption" href="#" class="showhelp"><i class="fa fa-info-circle"></i></a> <?=gettext("Append circuit ID");?></td>
<td>
<input name="agentoption" type="checkbox" value="yes" <?=!empty($pconfig['agentoption']) ? "checked=\"checked\"" : ""; ?> />
<div class="hidden" data-for="help_for_agentoption">
<?= gettext('If this is checked, the DHCPv6 relay will append the circuit ID (interface number) and the agent ID to the DHCPv6 request.') ?>
</div>
</td>
</tr>
<tr>
<td><a id="help_for_server" href="#" class="showhelp"><i class="fa fa-info-circle"></i></a> <?=gettext("Destination server");?></td>
<td>
<input name="server" type="text" value="<?=!empty($pconfig['server']) ? htmlspecialchars($pconfig['server']):"";?>" />
<div class="hidden" data-for="help_for_server">
<?= gettext('This is the IPv6 address of the server to which DHCPv6 requests are relayed. You can enter multiple server IPv6 addresses, separated by commas.') ?>
</div>
</td>
</tr>
<tr>
<td></td>
<td>
<input name="Submit" type="submit" class="btn btn-primary" value="<?=html_safe(gettext('Save'));?>" />
</td>
</tr>
</table>
</div>
</div>
</form>
</div>
</section>
<?php endif ?>
</div>
</div>
</section>
<?php include("foot.inc"); ?>