diff --git a/src/etc/inc/system.inc b/src/etc/inc/system.inc index 3674abedd..8f8fb2b89 100644 --- a/src/etc/inc/system.inc +++ b/src/etc/inc/system.inc @@ -201,9 +201,15 @@ function system_resolvconf_generate($verbose = false) $search = array_merge($search, get_searchdomains()); foreach (get_nameservers(null, true) as $dnsserver) { + if (isset($routes[$dnsserver['host']])) { + log_error("Duplicated DNS route ignored for {$dnsserver['host']} on {$dnsserver['interface']}"); + continue; + } + $host = !empty($dnsserver['host']) ? $dnsserver['host'] : $dnsserver; $resolvconf .= "nameserver {$host}\n"; - $routes[] = $dnsserver; + + $routes[$dnsserver['host']] = $dnsserver['gateway']; } if (count($search)) { @@ -229,8 +235,8 @@ function system_resolvconf_generate($verbose = false) rename($tempfile, '/etc/resolv.conf'); /* setup static routes for DNS servers as configured */ - foreach ($routes as $route) { - system_host_route($route['host'], $route['gateway']); + foreach ($routes as $host => $gateway) { + system_host_route($host, $gateway); } if ($verbose) { @@ -392,7 +398,12 @@ function get_nameservers($interface = null, $with_gateway = false) } if ($with_gateway) { - $master_list[] = ['host' => $dns, 'gateway' => $gw]; + $master_list[] = [ + 'host' => $dns, + 'gateway' => $gw, + 'interface' => convert_real_interface_to_friendly_interface_name($intf[0]), + 'source' => 'interface', + ]; } else { $master_list[] = $dns; } @@ -431,15 +442,22 @@ function get_nameservers($interface = null, $with_gateway = false) } if ($with_gateway) { - $master_list[] = ['host' => $dns, 'gateway' => $gateway]; + $master_list[] = [ + 'host' => $dns, + 'gateway' => $gateway, + 'interface' => $dnsif, + 'source' => 'config', + ]; } else { $master_list[] = $dns; } } - /* XXX check for overlapping host routes in gateway mode? */ + if (!$with_gateway) { + $master_list = array_unique($master_list); + } - return array_unique($master_list, SORT_REGULAR); + return $master_list; } function system_hosts_generate($verbose = false) diff --git a/src/opnsense/scripts/system/nameservers.php b/src/opnsense/scripts/system/nameservers.php index ea1eb336b..95fea41c5 100755 --- a/src/opnsense/scripts/system/nameservers.php +++ b/src/opnsense/scripts/system/nameservers.php @@ -32,4 +32,4 @@ require_once 'system.inc'; require_once 'util.inc'; require_once 'interfaces.inc'; -echo json_encode(get_nameservers()) . PHP_EOL; +echo json_encode(get_nameservers(null, !empty($argv[1]))) . PHP_EOL; diff --git a/src/opnsense/service/conf/actions.d/actions_system.conf b/src/opnsense/service/conf/actions.d/actions_system.conf index 155ef733a..19b2439f9 100644 --- a/src/opnsense/service/conf/actions.d/actions_system.conf +++ b/src/opnsense/service/conf/actions.d/actions_system.conf @@ -75,7 +75,7 @@ description: HA update and reconfigure backup [list.nameservers] command:/usr/local/opnsense/scripts/system/nameservers.php -parameters: +parameters:%s type:script_output message:list nameservers