diff --git a/src/etc/inc/plugins.inc.d/dhcpd.inc b/src/etc/inc/plugins.inc.d/dhcpd.inc index da2ce6b1c..a0bea2b65 100644 --- a/src/etc/inc/plugins.inc.d/dhcpd.inc +++ b/src/etc/inc/plugins.inc.d/dhcpd.inc @@ -1129,14 +1129,12 @@ EOD; } $dhcpdifs[] = get_real_interface($dhcpif); - if (!empty($newzone['domain-name'])) { - if (isset($dhcpifconf['ddnsupdate'])) { - $newzone['dns-servers'] = array($dhcpifconf['ddnsdomainprimary']); - $newzone['ddnsdomainkeyname'] = $dhcpifconf['ddnsdomainkeyname']; - $newzone['ddnsdomainkey'] = $dhcpifconf['ddnsdomainkey']; - $newzone['ddnsdomainalgorithm'] = !empty($dhcpifconf['ddnsdomainalgorithm']) ? $dhcpifconf['ddnsdomainalgorithm'] : "hmac-md5"; - $ddns_zones[] = $newzone; - } + if (!empty($newzone['domain-name']) && isset($dhcpifconf['ddnsupdate']) && is_ipaddrv4($dhcpifconf['ddnsdomainprimary'])) { + $newzone['dns-servers'] = array($dhcpifconf['ddnsdomainprimary']); + $newzone['ddnsdomainkeyname'] = $dhcpifconf['ddnsdomainkeyname']; + $newzone['ddnsdomainkey'] = $dhcpifconf['ddnsdomainkey']; + $newzone['ddnsdomainalgorithm'] = !empty($dhcpifconf['ddnsdomainalgorithm']) ? $dhcpifconf['ddnsdomainalgorithm'] : "hmac-md5"; + $ddns_zones[] = $newzone; } if ($dhcpifconf['omapi'] && !$omapi_added) { @@ -1173,40 +1171,21 @@ EOD; } } -function dhcpd_zones($ddns_zones) +function dhcpd_zones($ddns_zones, $ipproto = 'inet') { $dhcpdconf = ''; - if (is_array($ddns_zones)) { $added_zones = array(); $added_keys = array(); foreach ($ddns_zones as $zone) { - if (!is_array($zone) || empty($zone) || !is_array($zone['dns-servers'])) { - continue; - } - - $primary = $zone['dns-servers'][0]; - $secondary = empty($zone['dns-servers'][1]) ? "" : $zone['dns-servers'][1]; - - // Make sure we aren't using any invalid or IPv6 DNS servers. - if (!is_ipaddrv4($primary)) { - if (is_ipaddrv4($secondary)) { - $primary = $secondary; - $secondary = ""; - } else { - continue; - } - } - + $versionsuffix = $ipproto == "inet6" ? "6" : ""; // We don't need to add zones multiple times. foreach (array($zone['domain-name'], $zone['ptr-domain']) as $domain) { if (!empty($domain) && !in_array($domain, $added_zones)) { /* dhcpdconf2 is injected *after* the key */ $dhcpdconf2 = "zone {$domain}. {\n"; - $dhcpdconf2 .= " primary {$primary};\n"; - if (is_ipaddrv4($secondary)) { - $dhcpdconf2 .= " secondary {$secondary};\n"; - } + // XXX: $zone['dns-servers'] only contains one item, ref $newzone['dns-servers'] + $dhcpdconf2 .= " primary{$versionsuffix} {$zone['dns-servers'][0]};\n"; if (!empty($zone['ddnsdomainkeyname']) && !empty($zone['ddnsdomainkey'])) { if (!in_array($zone['ddnsdomainkeyname'], $added_keys)) { $dhcpdconf .= "key {$zone['ddnsdomainkeyname']} {\n"; @@ -1406,7 +1385,7 @@ EOD; $dhcpdv6ifs = array(); $ddns_zones = array(); - $nsupdate = false; + $need_ddns_updates = false; foreach ($dhcpdv6cfg as $dhcpv6if => $dhcpv6ifconf) { if (!isset($dhcpv6ifconf['enable']) || !isset($iflist[$dhcpv6if])) { @@ -1434,6 +1413,7 @@ EOD; $newzone = array(); if (isset($dhcpv6ifconf['ddnsupdate'])) { + $need_ddns_updates = true; if (!empty($dhcpv6ifconf['ddnsdomain'])) { $dnscfgv6 .= " ddns-domainname \"{$dhcpv6ifconf['ddnsdomain']}\";\n"; $newzone['domain-name'] = $dhcpv6ifconf['ddnsdomain']; @@ -1441,7 +1421,20 @@ EOD; $newzone['domain-name'] = $config['system']['domain']; } - $nsupdate = true; + $subnetv6 = explode("/", $networkv6)[0]; + $addr = inet_pton($subnetv6); + $addr_unpack = unpack('H*hex', $addr); + $addr_hex = $addr_unpack['hex']; + $revsubnet = array_reverse(str_split($addr_hex)); + foreach ($revsubnet as $octet) { + if ($octet == "0") { + array_shift($revsubnet); + } else { + break; + } + } + + $newzone['ptr-domain'] = implode(".", $revsubnet) . ".ip6.arpa"; } if (isset($dhcpv6ifconf['dnsserver'][0])) { @@ -1544,15 +1537,12 @@ EOD; } } - if (!empty($newzone['domain-name'])) { - if (isset($dhcpv6ifconf['ddnsupdate'])) { - $newzone['dns-servers'] = array($dhcpv6ifconf['ddnsdomainprimary']); - $newzone['ddnsdomainkeyname'] = $dhcpv6ifconf['ddnsdomainkeyname']; - $newzone['ddnsdomainkey'] = $dhcpv6ifconf['ddnsdomainkey']; - /* XXX not implemented for IPv6 */ - $newzone['ddnsdomainalgorithm'] = 'hmac-md5'; - $ddns_zones[] = $newzone; - } + if (!empty($newzone['domain-name']) && isset($dhcpv6ifconf['ddnsupdate']) && is_ipaddrv6($dhcpv6ifconf['ddnsdomainprimary'])) { + $newzone['dns-servers'] = array($dhcpv6ifconf['ddnsdomainprimary']); + $newzone['ddnsdomainkeyname'] = $dhcpv6ifconf['ddnsdomainkeyname']; + $newzone['ddnsdomainkey'] = $dhcpv6ifconf['ddnsdomainkey']; + $newzone['ddnsdomainalgorithm'] = !empty($dhcpv6ifconf['ddnsdomainalgorithm']) ? $dhcpv6ifconf['ddnsdomainalgorithm'] : "hmac-md5"; + $ddns_zones[] = $newzone; } if (preg_match("/poes/si", $dhcpv6if)) { @@ -1571,9 +1561,10 @@ EOD; } } - if ($nsupdate) { + if ($need_ddns_updates) { $dhcpdv6conf .= "\nddns-update-style interim;\n"; - $dhcpdv6conf .= dhcpd_zones($ddns_zones); + $dhcpdv6conf .= "update-static-leases on;\n"; + $dhcpdv6conf .= dhcpd_zones($ddns_zones, "inet6"); } else { $dhcpdv6conf .= "\nddns-update-style none;\n"; } diff --git a/src/www/services_dhcpv6.php b/src/www/services_dhcpv6.php index c000116ef..b637c5b91 100644 --- a/src/www/services_dhcpv6.php +++ b/src/www/services_dhcpv6.php @@ -64,7 +64,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') { $pconfig['prefixrange_length'] = $config['dhcpdv6'][$if]['prefixrange']['prefixlength']; } $config_copy_fieldsnames = array('defaultleasetime', 'maxleasetime', 'domainsearchlist', 'ddnsdomain', - 'ddnsdomainprimary', 'ddnsdomainkeyname', 'ddnsdomainkey', 'bootfile_url', 'netmask', + 'ddnsdomainprimary', 'ddnsdomainkeyname', 'ddnsdomainkey', 'ddnsdomainalgorithm', 'bootfile_url', 'netmask', 'numberoptions', 'dhcpv6leaseinlocaltime', 'staticmap'); foreach ($config_copy_fieldsnames as $fieldname) { if (isset($config['dhcpdv6'][$if][$fieldname])) { @@ -235,7 +235,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') { // simple 1-on-1 copy $config_copy_fieldsnames = array('defaultleasetime', 'maxleasetime', 'netmask', 'domainsearchlist', - 'ddnsdomain', 'ddnsdomainprimary', 'ddnsdomainkeyname', 'ddnsdomainkey', 'bootfile_url', + 'ddnsdomain', 'ddnsdomainprimary', 'ddnsdomainkeyname', 'ddnsdomainkey', 'ddnsdomainalgorithm', 'bootfile_url', 'dhcpv6leaseinlocaltime'); foreach ($config_copy_fieldsnames as $fieldname) { if (!empty($pconfig[$fieldname])) { @@ -612,6 +612,16 @@ if (isset($config['interfaces'][$if]['dhcpd6track6allowoverride'])) { +
+