Project

General

Profile

Download (22.5 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
/*
3
 * services_unbound.php
4
 *
5
 * part of pfSense (https://www.pfsense.org)
6
 * Copyright (c) 2004-2018 Rubicon Communications, LLC (Netgate)
7
 * Copyright (c) 2014 Warren Baker (warren@pfsense.org)
8
 * All rights reserved.
9
 *
10
 * Licensed under the Apache License, Version 2.0 (the "License");
11
 * you may not use this file except in compliance with the License.
12
 * You may obtain a copy of the License at
13
 *
14
 * http://www.apache.org/licenses/LICENSE-2.0
15
 *
16
 * Unless required by applicable law or agreed to in writing, software
17
 * distributed under the License is distributed on an "AS IS" BASIS,
18
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19
 * See the License for the specific language governing permissions and
20
 * limitations under the License.
21
 */
22

    
23
##|+PRIV
24
##|*IDENT=page-services-dnsresolver
25
##|*NAME=Services: DNS Resolver
26
##|*DESCR=Allow access to the 'Services: DNS Resolver' page.
27
##|*MATCH=services_unbound.php*
28
##|-PRIV
29

    
30
require_once("guiconfig.inc");
31
require_once("unbound.inc");
32
require_once("pfsense-utils.inc");
33
require_once("system.inc");
34

    
35
init_config_arr(array('unbound', 'hosts'));
36
init_config_arr(array('unbound', 'domainoverrides'));
37
$a_unboundcfg = &$config['unbound'];
38
$a_hosts = &$a_unboundcfg['hosts'];
39
$a_domainOverrides = &$a_unboundcfg['domainoverrides'];
40

    
41
if (isset($a_unboundcfg['enable'])) {
42
	$pconfig['enable'] = true;
43
}
44
if (isset($a_unboundcfg['enablessl'])) {
45
	$pconfig['enablessl'] = true;
46
}
47
if (isset($a_unboundcfg['dnssec'])) {
48
	$pconfig['dnssec'] = true;
49
}
50
if (isset($a_unboundcfg['forwarding'])) {
51
	$pconfig['forwarding'] = true;
52
}
53
if (isset($a_unboundcfg['forward_tls_upstream'])) {
54
	$pconfig['forward_tls_upstream'] = true;
55
}
56
if (isset($a_unboundcfg['regdhcp'])) {
57
	$pconfig['regdhcp'] = true;
58
}
59
if (isset($a_unboundcfg['regdhcpstatic'])) {
60
	$pconfig['regdhcpstatic'] = true;
61
}
62
if (isset($a_unboundcfg['regovpnclients'])) {
63
	$pconfig['regovpnclients'] = true;
64
}
65

    
66
$pconfig['port'] = $a_unboundcfg['port'];
67
$pconfig['sslport'] = $a_unboundcfg['sslport'];
68
$pconfig['sslcertref'] = $a_unboundcfg['sslcertref'];
69
$pconfig['custom_options'] = base64_decode($a_unboundcfg['custom_options']);
70

    
71
if (empty($a_unboundcfg['active_interface'])) {
72
	$pconfig['active_interface'] = array();
73
} else {
74
	$pconfig['active_interface'] = explode(",", $a_unboundcfg['active_interface']);
75
}
76

    
77
if (empty($a_unboundcfg['outgoing_interface'])) {
78
	$pconfig['outgoing_interface'] = array();
79
} else {
80
	$pconfig['outgoing_interface'] = explode(",", $a_unboundcfg['outgoing_interface']);
81
}
82

    
83
if (empty($a_unboundcfg['system_domain_local_zone_type'])) {
84
	$pconfig['system_domain_local_zone_type'] = "transparent";
85
} else {
86
	$pconfig['system_domain_local_zone_type'] = $a_unboundcfg['system_domain_local_zone_type'];
87
}
88

    
89
init_config_arr(array('cert'));
90
$a_cert = &$config['cert'];
91
$certs_available = false;
92

    
93
if (is_array($a_cert) && count($a_cert)) {
94
	$certs_available = true;
95
} else {
96
	$a_cert = array();
97
}
98

    
99
if ($_POST['apply']) {
100
	$retval = 0;
101
	$retval |= services_unbound_configure();
102
	if ($retval == 0) {
103
		clear_subsystem_dirty('unbound');
104
	}
105
	/* Update resolv.conf in case the interface bindings exclude localhost. */
106
	system_resolvconf_generate();
107
	/* Start or restart dhcpleases when it's necessary */
108
	system_dhcpleases_configure();
109
}
110

    
111
if ($_POST['save']) {
112
	$pconfig = $_POST;
113
	unset($input_errors);
114

    
115
	if (isset($pconfig['enable']) && isset($config['dnsmasq']['enable'])) {
116
		if ($pconfig['port'] == $config['dnsmasq']['port']) {
117
			$input_errors[] = gettext("The DNS Forwarder is enabled using this port. Choose a non-conflicting port, or disable the DNS Forwarder.");
118
		}
119
	}
120

    
121
	if (isset($pconfig['enablessl']) && (!$certs_available || empty($pconfig['sslcertref']))) {
122
		$input_errors[] = gettext("Acting as an SSL/TLS server requires a valid server certificate");
123
	}
124

    
125
	// forwarding mode requires having valid DNS servers
126
	if (isset($pconfig['forwarding'])) {
127
		$founddns = false;
128
		if (isset($config['system']['dnsallowoverride'])) {
129
			$dns_servers = get_dns_servers();
130
			if (is_array($dns_servers)) {
131
				foreach ($dns_servers as $dns_server) {
132
					if (!ip_in_subnet($dns_server, "127.0.0.0/8")) {
133
						$founddns = true;
134
					}
135
				}
136
			}
137
		}
138
		if (is_array($config['system']['dnsserver'])) {
139
			foreach ($config['system']['dnsserver'] as $dnsserver) {
140
				if (is_ipaddr($dnsserver)) {
141
					$founddns = true;
142
				}
143
			}
144
		}
145
		if ($founddns == false) {
146
			$input_errors[] = gettext("At least one DNS server must be specified under System &gt; General Setup to enable Forwarding mode.");
147
		}
148
	}
149

    
150
	if (empty($pconfig['active_interface'])) {
151
		$input_errors[] = gettext("One or more Network Interfaces must be selected for binding.");
152
	} else if (!isset($config['system']['dnslocalhost']) && (!in_array("lo0", $pconfig['active_interface']) && !in_array("all", $pconfig['active_interface']))) {
153
		$input_errors[] = gettext("This system is configured to use the DNS Resolver as its DNS server, so Localhost or All must be selected in Network Interfaces.");
154
	}
155

    
156
	if (empty($pconfig['outgoing_interface'])) {
157
		$input_errors[] = gettext("One or more Outgoing Network Interfaces must be selected.");
158
	}
159

    
160
	if ($pconfig['port'] && !is_port($pconfig['port'])) {
161
		$input_errors[] = gettext("A valid port number must be specified.");
162
	}
163
	if ($pconfig['sslport'] && !is_port($pconfig['sslport'])) {
164
		$input_errors[] = gettext("A valid SSL/TLS port number must be specified.");
165
	}
166

    
167
	if (is_array($pconfig['active_interface']) && !empty($pconfig['active_interface'])) {
168
		$display_active_interface = $pconfig['active_interface'];
169
		$pconfig['active_interface'] = implode(",", $pconfig['active_interface']);
170
	}
171

    
172
	if ((isset($pconfig['regdhcp']) || isset($pconfig['regdhcpstatic'])) && !is_dhcp_server_enabled()) {
173
		$input_errors[] = gettext("DHCP Server must be enabled for DHCP Registration to work in DNS Resolver.");
174
	}
175

    
176
	if (($pconfig['system_domain_local_zone_type'] == "redirect") && isset($pconfig['regdhcp'])) {
177
		$input_errors[] = gettext('A System Domain Local Zone Type of "redirect" is not compatible with dynamic DHCP Registration.');
178
	}
179

    
180
	$display_custom_options = $pconfig['custom_options'];
181
	$pconfig['custom_options'] = base64_encode(str_replace("\r\n", "\n", $pconfig['custom_options']));
182

    
183
	if (is_array($pconfig['outgoing_interface']) && !empty($pconfig['outgoing_interface'])) {
184
		$display_outgoing_interface = $pconfig['outgoing_interface'];
185
		$pconfig['outgoing_interface'] = implode(",", $pconfig['outgoing_interface']);
186
	}
187

    
188
	$test_output = array();
189
	if (test_unbound_config($pconfig, $test_output)) {
190
		$input_errors[] = gettext("The generated config file cannot be parsed by unbound. Please correct the following errors:");
191
		$input_errors = array_merge($input_errors, $test_output);
192
	}
193

    
194
	if (!$input_errors) {
195
		$a_unboundcfg['enable'] = isset($pconfig['enable']);
196
		$a_unboundcfg['enablessl'] = isset($pconfig['enablessl']);
197
		$a_unboundcfg['port'] = $pconfig['port'];
198
		$a_unboundcfg['sslport'] = $pconfig['sslport'];
199
		$a_unboundcfg['sslcertref'] = $pconfig['sslcertref'];
200
		$a_unboundcfg['dnssec'] = isset($pconfig['dnssec']);
201
		$a_unboundcfg['forwarding'] = isset($pconfig['forwarding']);
202
		$a_unboundcfg['forward_tls_upstream'] = isset($pconfig['forward_tls_upstream']);
203
		$a_unboundcfg['regdhcp'] = isset($pconfig['regdhcp']);
204
		$a_unboundcfg['regdhcpstatic'] = isset($pconfig['regdhcpstatic']);
205
		$a_unboundcfg['regovpnclients'] = isset($pconfig['regovpnclients']);
206
		$a_unboundcfg['active_interface'] = $pconfig['active_interface'];
207
		$a_unboundcfg['outgoing_interface'] = $pconfig['outgoing_interface'];
208
		$a_unboundcfg['system_domain_local_zone_type'] = $pconfig['system_domain_local_zone_type'];
209
		$a_unboundcfg['custom_options'] = $pconfig['custom_options'];
210

    
211
		write_config(gettext("DNS Resolver configured."));
212
		mark_subsystem_dirty('unbound');
213
	}
214

    
215
	$pconfig['active_interface'] = $display_active_interface;
216
	$pconfig['outgoing_interface'] = $display_outgoing_interface;
217
	$pconfig['custom_options'] = $display_custom_options;
218
}
219

    
220

    
221
if ($pconfig['custom_options']) {
222
	$customoptions = true;
223
} else {
224
	$customoptions = false;
225
}
226

    
227
if ($_POST['act'] == "del") {
228
	if ($_POST['type'] == 'host') {
229
		if ($a_hosts[$_POST['id']]) {
230
			unset($a_hosts[$_POST['id']]);
231
			write_config(gettext("Host override deleted from DNS Resolver."));
232
			mark_subsystem_dirty('unbound');
233
			header("Location: services_unbound.php");
234
			exit;
235
		}
236
	} elseif ($_POST['type'] == 'doverride') {
237
		if ($a_domainOverrides[$_POST['id']]) {
238
			unset($a_domainOverrides[$_POST['id']]);
239
			write_config(gettext("Domain override deleted from DNS Resolver."));
240
			mark_subsystem_dirty('unbound');
241
			header("Location: services_unbound.php");
242
			exit;
243
		}
244
	}
245
}
246

    
247
function build_if_list($selectedifs) {
248
	$interface_addresses = get_possible_listen_ips(true);
249
	$iflist = array('options' => array(), 'selected' => array());
250

    
251
	$iflist['options']['all']	= gettext("All");
252
	if (empty($selectedifs) || empty($selectedifs[0]) || in_array("all", $selectedifs)) {
253
		array_push($iflist['selected'], "all");
254
	}
255

    
256
	foreach ($interface_addresses as $laddr => $ldescr) {
257
		$iflist['options'][$laddr] = htmlspecialchars($ldescr);
258

    
259
		if ($selectedifs && in_array($laddr, $selectedifs)) {
260
			array_push($iflist['selected'], $laddr);
261
		}
262
	}
263

    
264
	unset($interface_addresses);
265

    
266
	return($iflist);
267
}
268

    
269
$pgtitle = array(gettext("Services"), gettext("DNS Resolver"), gettext("General Settings"));
270
$pglinks = array("", "@self", "@self");
271
$shortcut_section = "resolver";
272

    
273
include_once("head.inc");
274

    
275
if ($input_errors) {
276
	print_input_errors($input_errors);
277
}
278

    
279
if ($_POST['apply']) {
280
	print_apply_result_box($retval);
281
}
282

    
283
if (is_subsystem_dirty('unbound')) {
284
	print_apply_box(gettext("The DNS resolver configuration has been changed.") . "<br />" . gettext("The changes must be applied for them to take effect."));
285
}
286

    
287
$tab_array = array();
288
$tab_array[] = array(gettext("General Settings"), true, "services_unbound.php");
289
$tab_array[] = array(gettext("Advanced Settings"), false, "services_unbound_advanced.php");
290
$tab_array[] = array(gettext("Access Lists"), false, "/services_unbound_acls.php");
291
display_top_tabs($tab_array, true);
292

    
293
$form = new Form();
294

    
295
$section = new Form_Section('General DNS Resolver Options');
296

    
297
$section->addInput(new Form_Checkbox(
298
	'enable',
299
	'Enable',
300
	'Enable DNS resolver',
301
	$pconfig['enable']
302
));
303

    
304
$section->addInput(new Form_Input(
305
	'port',
306
	'Listen Port',
307
	'number',
308
	$pconfig['port'],
309
	['placeholder' => '53']
310
))->setHelp('The port used for responding to DNS queries. It should normally be left blank unless another service needs to bind to TCP/UDP port 53.');
311

    
312
$section->addInput(new Form_Checkbox(
313
	'enablessl',
314
	'Enable SSL/TLS Service',
315
	'Respond to incoming SSL/TLS queries from local clients',
316
	$pconfig['enablessl']
317
))->setHelp('Configures the DNS Resolver to act as a DNS over SSL/TLS server which can answer queries from clients which also support DNS over TLS. ' .
318
		'Activating this option disables automatic interface response routing behavior, thus it works best with specific interface bindings.' );
319

    
320
if ($certs_available) {
321
	$values = array();
322
	foreach ($a_cert as $cert) {
323
		$values[ $cert['refid'] ] = $cert['descr'];
324
	}
325

    
326
	$section->addInput($input = new Form_Select(
327
		'sslcertref',
328
		'SSL/TLS Certificate',
329
		$pconfig['sslcertref'],
330
		$values
331
	))->setHelp('The server certificate to use for SSL/TLS service. The CA chain will be determined automatically.');
332
} else {
333
	$section->addInput(new Form_StaticText(
334
		'SSL/TLS Certificate',
335
		sprintf('No Certificates have been defined. A certificate is required before SSL/TLS can be enabled. %1$s Create or Import %2$s a Certificate.',
336
		'<a href="system_certmanager.php">', '</a>')
337
	));
338
}
339

    
340
$section->addInput(new Form_Input(
341
	'sslport',
342
	'SSL/TLS Listen Port',
343
	'number',
344
	$pconfig['sslport'],
345
	['placeholder' => '853']
346
))->setHelp('The port used for responding to SSL/TLS DNS queries. It should normally be left blank unless another service needs to bind to TCP/UDP port 853.');
347

    
348
$activeiflist = build_if_list($pconfig['active_interface']);
349

    
350
$section->addInput(new Form_Select(
351
	'active_interface',
352
	'*Network Interfaces',
353
	$activeiflist['selected'],
354
	$activeiflist['options'],
355
	true
356
))->addClass('general', 'resizable')->setHelp('Interface IPs used by the DNS Resolver for responding to queries from clients. If an interface has both IPv4 and IPv6 IPs, both are used. Queries to other interface IPs not selected below are discarded. ' .
357
			'The default behavior is to respond to queries on every available IPv4 and IPv6 address.');
358

    
359
$outiflist = build_if_list($pconfig['outgoing_interface']);
360

    
361
$section->addInput(new Form_Select(
362
	'outgoing_interface',
363
	'*Outgoing Network Interfaces',
364
	$outiflist['selected'],
365
	$outiflist['options'],
366
	true
367
))->addClass('general', 'resizable')->setHelp('Utilize different network interface(s) that the DNS Resolver will use to send queries to authoritative servers and receive their replies. By default all interfaces are used.');
368

    
369
$section->addInput(new Form_Select(
370
	'system_domain_local_zone_type',
371
	'*System Domain Local Zone Type',
372
	$pconfig['system_domain_local_zone_type'],
373
	unbound_local_zone_types()
374
))->setHelp('The local-zone type used for the pfSense system domain (System | General Setup | Domain).  Transparent is the default.  Local-Zone type descriptions are available in the unbound.conf(5) manual pages.');
375

    
376
$section->addInput(new Form_Checkbox(
377
	'dnssec',
378
	'DNSSEC',
379
	'Enable DNSSEC Support',
380
	$pconfig['dnssec']
381
));
382

    
383
$section->addInput(new Form_Checkbox(
384
	'forwarding',
385
	'DNS Query Forwarding',
386
	'Enable Forwarding Mode',
387
	$pconfig['forwarding']
388
))->setHelp('If this option is set, DNS queries will be forwarded to the upstream DNS servers defined under'.
389
					' %1$sSystem &gt; General Setup%2$s or those obtained via DHCP/PPP on WAN'.
390
					' (if DNS Server Override is enabled there).','<a href="system.php">','</a>');
391

    
392
$section->addInput(new Form_Checkbox(
393
	'forward_tls_upstream',
394
	null,
395
	'Use SSL/TLS for outgoing DNS Queries to Forwarding Servers',
396
	$pconfig['forward_tls_upstream']
397
))->setHelp('When set in conjunction with DNS Query Forwarding, queries to all upstream forwarding DNS servers will be sent using SSL/TLS on the default port of 853. Note that ALL configured forwarding servers MUST support SSL/TLS queries on port 853.');
398

    
399
$section->addInput(new Form_Checkbox(
400
	'regdhcp',
401
	'DHCP Registration',
402
	'Register DHCP leases in the DNS Resolver',
403
	$pconfig['regdhcp']
404
))->setHelp('If this option is set, then machines that specify their hostname when requesting an IPv4 DHCP lease will be registered'.
405
					' in the DNS Resolver so that their name can be resolved.'.
406
					' The domain in %1$sSystem &gt; General Setup%2$s should also be set to the proper value.','<a href="system.php">','</a>');
407

    
408
$section->addInput(new Form_Checkbox(
409
	'regdhcpstatic',
410
	'Static DHCP',
411
	'Register DHCP static mappings in the DNS Resolver',
412
	$pconfig['regdhcpstatic']
413
))->setHelp('If this option is set, then DHCP static mappings will be registered in the DNS Resolver, so that their name can be resolved. '.
414
					'The domain in %1$sSystem &gt; General Setup%2$s should also be set to the proper value.','<a href="system.php">','</a>');
415

    
416
$section->addInput(new Form_Checkbox(
417
	'regovpnclients',
418
	'OpenVPN Clients',
419
	'Register connected OpenVPN clients in the DNS Resolver',
420
	$pconfig['regovpnclients']
421
))->setHelp(sprintf('If this option is set, then the common name (CN) of connected OpenVPN clients will be registered in the DNS Resolver, so that their name can be resolved. This only works for OpenVPN servers (Remote Access SSL/TLS) operating in "tun" mode. '.
422
					'The domain in %sSystem: General Setup%s should also be set to the proper value.','<a href="system.php">','</a>'));
423

    
424
$btnadv = new Form_Button(
425
	'btnadvcustom',
426
	'Custom options',
427
	null,
428
	'fa-cog'
429
);
430

    
431
$btnadv->setAttribute('type','button')->addClass('btn-info btn-sm');
432

    
433
$section->addInput(new Form_StaticText(
434
	'Display Custom Options',
435
	$btnadv
436
));
437

    
438
$section->addInput(new Form_Textarea (
439
	'custom_options',
440
	'Custom options',
441
	$pconfig['custom_options']
442
))->setHelp('Enter any additional configuration parameters to add to the DNS Resolver configuration here, separated by a newline.');
443

    
444
$form->add($section);
445
print($form);
446
?>
447

    
448
<script type="text/javascript">
449
//<![CDATA[
450
events.push(function() {
451

    
452
	// Show advanced custom options ==============================================
453
	var showadvcustom = false;
454

    
455
	function show_advcustom(ispageload) {
456
		var text;
457
		// On page load decide the initial state based on the data.
458
		if (ispageload) {
459
			showadvcustom = <?=($customoptions ? 'true' : 'false');?>;
460
		} else {
461
			// It was a click, swap the state.
462
			showadvcustom = !showadvcustom;
463
		}
464

    
465
		hideInput('custom_options', !showadvcustom);
466

    
467
		if (showadvcustom) {
468
			text = "<?=gettext('Hide Custom Options');?>";
469
		} else {
470
			text = "<?=gettext('Display Custom Options');?>";
471
		}
472
		$('#btnadvcustom').html('<i class="fa fa-cog"></i> ' + text);
473
	}
474

    
475
	// If the enable checkbox is not checked, hide all inputs
476
	function hideGeneral() {
477
		var hide = ! $('#enable').prop('checked');
478

    
479
		hideMultiClass('general', hide);
480
		hideInput('port', hide);
481
		hideSelect('system_domain_local_zone_type', hide);
482
		hideCheckbox('dnssec', hide);
483
		hideCheckbox('forwarding', hide);
484
		hideCheckbox('regdhcp', hide);
485
		hideCheckbox('regdhcpstatic', hide);
486
		hideCheckbox('regovpnclients', hide);
487
		hideInput('btnadvcustom', hide);
488
		hideInput('custom_options', hide || !showadvcustom);
489
	}
490

    
491
	// Un-hide additional controls
492
	$('#btnadvcustom').click(function(event) {
493
		show_advcustom();
494
	});
495

    
496
	// When 'enable' is clicked, disable/enable the following hide inputs
497
	$('#enable').click(function() {
498
		hideGeneral();
499
	});
500

    
501
	// On initial load
502
	if ($('#custom_options').val().length == 0) {
503
		hideInput('custom_options', true);
504
	}
505

    
506
	hideGeneral();
507
	show_advcustom(true);
508

    
509
});
510
//]]>
511
</script>
512

    
513
<div class="panel panel-default">
514
	<div class="panel-heading"><h2 class="panel-title"><?=gettext("Host Overrides")?></h2></div>
515
	<div class="panel-body table-responsive">
516
		<table class="table table-striped table-hover table-condensed sortable-theme-bootstrap table-rowdblclickedit" data-sortable>
517
			<thead>
518
				<tr>
519
					<th><?=gettext("Host")?></th>
520
					<th><?=gettext("Parent domain of host")?></th>
521
					<th><?=gettext("IP to return for host")?></th>
522
					<th><?=gettext("Description")?></th>
523
					<th><?=gettext("Actions")?></th>
524
				</tr>
525
			</thead>
526
			<tbody>
527
<?php
528
$i = 0;
529
foreach ($a_hosts as $hostent):
530
?>
531
				<tr>
532
					<td>
533
						<?=$hostent['host']?>
534
					</td>
535
					<td>
536
						<?=$hostent['domain']?>
537
					</td>
538
					<td>
539
						<?=$hostent['ip']?>
540
					</td>
541
					<td>
542
						<?=htmlspecialchars($hostent['descr'])?>
543
					</td>
544
					<td>
545
						<a class="fa fa-pencil"	title="<?=gettext('Edit host override')?>" href="services_unbound_host_edit.php?id=<?=$i?>"></a>
546
						<a class="fa fa-trash"	title="<?=gettext('Delete host override')?>" href="services_unbound.php?type=host&amp;act=del&amp;id=<?=$i?>" usepost></a>
547
					</td>
548
				</tr>
549

    
550
<?php
551
	if ($hostent['aliases']['item'] && is_array($hostent['aliases']['item'])):
552
		foreach ($hostent['aliases']['item'] as $alias):
553
?>
554
				<tr>
555
					<td>
556
						<?=$alias['host']?>
557
					</td>
558
					<td>
559
						<?=$alias['domain']?>
560
					</td>
561
					<td>
562
						<?=gettext("Alias for ");?><?=$hostent['host'] ? $hostent['host'] . '.' . $hostent['domain'] : $hostent['domain']?>
563
					</td>
564
					<td>
565
						<i class="fa fa-angle-double-right text-info"></i>
566
						<?=htmlspecialchars($alias['description'])?>
567
					</td>
568
					<td>
569
						<a class="fa fa-pencil"	title="<?=gettext('Edit host override')?>" 	href="services_unbound_host_edit.php?id=<?=$i?>"></a>
570
					</td>
571
				</tr>
572
<?php
573
		endforeach;
574
	endif;
575
	$i++;
576
endforeach;
577
?>
578
			</tbody>
579
		</table>
580
	</div>
581
</div>
582

    
583
<span class="help-block">
584
	Enter any individual hosts for which the resolver's standard DNS lookup process should be overridden and a specific
585
	IPv4 or IPv6 address should automatically be returned by the resolver. Standard and also non-standard names and parent domains
586
	can be entered, such as 'test', 'mycompany.localdomain', '1.168.192.in-addr.arpa', or 'somesite.com'. Any lookup attempt for
587
	the host will automatically return the given IP address, and the usual lookup server for the domain will not be queried for
588
	the host's records.
589
</span>
590

    
591
<nav class="action-buttons">
592
	<a href="services_unbound_host_edit.php" class="btn btn-sm btn-success">
593
		<i class="fa fa-plus icon-embed-btn"></i>
594
		<?=gettext('Add')?>
595
	</a>
596
</nav>
597

    
598
<div class="panel panel-default">
599
	<div class="panel-heading"><h2 class="panel-title"><?=gettext("Domain Overrides")?></h2></div>
600
	<div class="panel-body table-responsive">
601
		<table class="table table-striped table-hover table-condensed sortable-theme-bootstrap table-rowdblclickedit" data-sortable>
602
			<thead>
603
				<tr>
604
					<th><?=gettext("Domain")?></th>
605
					<th><?=gettext("Lookup Server IP Address")?></th>
606
					<th><?=gettext("Description")?></th>
607
					<th><?=gettext("Actions")?></th>
608
				</tr>
609
			</thead>
610

    
611
			<tbody>
612
<?php
613
$i = 0;
614
foreach ($a_domainOverrides as $doment):
615
?>
616
				<tr>
617
					<td>
618
						<?=$doment['domain']?>&nbsp;
619
					</td>
620
					<td>
621
						<?=$doment['ip']?>&nbsp;
622
					</td>
623
					<td>
624
						<?=htmlspecialchars($doment['descr'])?>&nbsp;
625
					</td>
626
					<td>
627
						<a class="fa fa-pencil"	title="<?=gettext('Edit domain override')?>" href="services_unbound_domainoverride_edit.php?id=<?=$i?>"></a>
628
						<a class="fa fa-trash"	title="<?=gettext('Delete domain override')?>" href="services_unbound.php?act=del&amp;type=doverride&amp;id=<?=$i?>" usepost></a>
629
					</td>
630
				</tr>
631
<?php
632
	$i++;
633
endforeach;
634
?>
635
			</tbody>
636
		</table>
637
	</div>
638
</div>
639

    
640
<span class="help-block">
641
	Enter any domains for which the resolver's standard DNS lookup process should be overridden and a different (non-standard)
642
	lookup server should be queried instead. Non-standard, 'invalid' and local domains, and subdomains, can also be entered,
643
	such as 'test', 'mycompany.localdomain', '1.168.192.in-addr.arpa', or 'somesite.com'. The IP address is treated as the
644
	authoritative lookup server for the domain (including all of its subdomains), and other lookup servers will not be queried.
645
</span>
646

    
647
<nav class="action-buttons">
648
	<a href="services_unbound_domainoverride_edit.php" class="btn btn-sm btn-success">
649
		<i class="fa fa-plus icon-embed-btn"></i>
650
		<?=gettext('Add')?>
651
	</a>
652
</nav>
653

    
654
<div class="infoblock">
655
	<?php print_info_box(sprintf(gettext('If the DNS Resolver is enabled, the DHCP'.
656
		' service (if enabled) will automatically serve the LAN IP'.
657
		' address as a DNS server to DHCP clients so they will use'.
658
		' the DNS Resolver. If Forwarding is enabled, the DNS Resolver will use the DNS servers'.
659
		' entered in %1$sSystem &gt; General Setup%2$s'.
660
		' or those obtained via DHCP or PPP on WAN if &quot;Allow'.
661
		' DNS server list to be overridden by DHCP/PPP on WAN&quot;'.
662
		' is checked.'), '<a href="system.php">', '</a>'), 'info', false); ?>
663
</div>
664

    
665
<?php include("foot.inc");
(147-147/234)