Project

General

Profile

Download (15.7 KB) Statistics
| Branch: | Tag: | Revision:
1 5b237745 Scott Ullrich
<?php
2
/*
3 c5d81585 Renato Botelho
 * services_dnsmasq.php
4 191cb31d Stephen Beaver
 *
5 c5d81585 Renato Botelho
 * part of pfSense (https://www.pfsense.org)
6 880ed461 jim-p
 * Copyright (c) 2004-2020 Rubicon Communications, LLC (Netgate)
7 c5d81585 Renato Botelho
 * Copyright (c) 2003-2004 Bob Zoller <bob@kludgebox.com>
8
 * All rights reserved.
9 191cb31d Stephen Beaver
 *
10 c5d81585 Renato Botelho
 * originally based on m0n0wall (http://m0n0.ch/wall)
11
 * Copyright (c) 2003-2004 Manuel Kasper <mk@neon1.net>.
12
 * All rights reserved.
13 191cb31d Stephen Beaver
 *
14 b12ea3fb Renato Botelho
 * Licensed under the Apache License, Version 2.0 (the "License");
15
 * you may not use this file except in compliance with the License.
16
 * You may obtain a copy of the License at
17 191cb31d Stephen Beaver
 *
18 b12ea3fb Renato Botelho
 * http://www.apache.org/licenses/LICENSE-2.0
19 191cb31d Stephen Beaver
 *
20 b12ea3fb Renato Botelho
 * Unless required by applicable law or agreed to in writing, software
21
 * distributed under the License is distributed on an "AS IS" BASIS,
22
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23
 * See the License for the specific language governing permissions and
24
 * limitations under the License.
25 191cb31d Stephen Beaver
 */
26 5b237745 Scott Ullrich
27 6b07c15a Matthew Grooms
##|+PRIV
28
##|*IDENT=page-services-dnsforwarder
29 5230f468 jim-p
##|*NAME=Services: DNS Forwarder
30 6b07c15a Matthew Grooms
##|*DESCR=Allow access to the 'Services: DNS Forwarder' page.
31
##|*MATCH=services_dnsmasq.php*
32
##|-PRIV
33
34 c81ef6e2 Phil Davis
require_once("guiconfig.inc");
35 7a927e67 Scott Ullrich
require_once("functions.inc");
36
require_once("filter.inc");
37 13fca9bc doktornotor
require_once("pfsense-utils.inc");
38 7a927e67 Scott Ullrich
require_once("shaper.inc");
39 4dbcf2fb Renato Botelho
require_once("system.inc");
40 5b237745 Scott Ullrich
41 d622a62e Phil Davis
// Sort host entries for display in alphabetical order
42 8e7fea67 Steve Beaver
function hostcmp($a, $b) {
43
	return strcasecmp($a['host'], $b['host']);
44
}
45
46
function hosts_sort() {
47
	global $a_hosts;
48
49
	if (!is_array($a_hosts)) {
50
		return;
51
	}
52
53 3ea92441 jburel-clever-age
	uasort($a_hosts, "hostcmp");
54 8e7fea67 Steve Beaver
}
55
56 d622a62e Phil Davis
// Sort domain entries for display in alphabetical order
57 8e7fea67 Steve Beaver
function domaincmp($a, $b) {
58
	return strcasecmp($a['domain'], $b['domain']);
59
}
60
61
function domains_sort() {
62
	global $a_domainOverrides;
63
64
	if (!is_array($a_domainOverrides)) {
65
		return;
66
	}
67
68 3ea92441 jburel-clever-age
	uasort($a_domainOverrides, "domaincmp");
69 8e7fea67 Steve Beaver
}
70
71 70edf50d jim-p
$pconfig['enable'] = isset($config['dnsmasq']['enable']);
72 5b237745 Scott Ullrich
$pconfig['regdhcp'] = isset($config['dnsmasq']['regdhcp']);
73 6a01ea44 Bill Marquette
$pconfig['regdhcpstatic'] = isset($config['dnsmasq']['regdhcpstatic']);
74 aa994814 Andrew Thompson
$pconfig['dhcpfirst'] = isset($config['dnsmasq']['dhcpfirst']);
75 96ea7162 N0YB
$pconfig['strict_order'] = isset($config['dnsmasq']['strict_order']);
76
$pconfig['domain_needed'] = isset($config['dnsmasq']['domain_needed']);
77 7bdd28fb Phil Davis
$pconfig['no_private_reverse'] = isset($config['dnsmasq']['no_private_reverse']);
78 e6c49e3d jim-p
$pconfig['port'] = $config['dnsmasq']['port'];
79 8f9bffbc Andrew Thompson
$pconfig['custom_options'] = $config['dnsmasq']['custom_options'];
80 b4323f39 jim-p
$pconfig['strictbind'] = isset($config['dnsmasq']['strictbind']);
81 8e7fea67 Steve Beaver
82 966ed611 Phil Davis
if (!empty($config['dnsmasq']['interface'])) {
83 79d03c40 jim-p
	$pconfig['interface'] = explode(",", $config['dnsmasq']['interface']);
84 966ed611 Phil Davis
} else {
85 79d03c40 jim-p
	$pconfig['interface'] = array();
86 966ed611 Phil Davis
}
87 b4323f39 jim-p
88 b09f48fb jim-p
init_config_arr(array('dnsmasq', 'hosts'));
89 70edf50d jim-p
$a_hosts = &$config['dnsmasq']['hosts'];
90 589634a9 Steve Beaver
91
// Add a temporary index so we don't lose the order after sorting
92
for ($idx=0; $idx<count($a_hosts); $idx++) {
93
	$a_hosts[$idx]['idx'] = $idx;
94
}
95
96 8e7fea67 Steve Beaver
hosts_sort();
97 589634a9 Steve Beaver
98 01cb6a79 jim-p
init_config_arr(array('dnsmasq', 'domainoverrides'));
99 0c2b5df7 Scott Ullrich
$a_domainOverrides = &$config['dnsmasq']['domainoverrides'];
100 589634a9 Steve Beaver
101
// Add a temporary index so we don't lose the order after sorting
102
for ($idx=0; $idx<count($a_domainOverrides); $idx++) {
103
	$a_domainOverrides[$idx]['idx'] = $idx;
104
}
105
106 8e7fea67 Steve Beaver
domains_sort();
107 5b237745 Scott Ullrich
108 6e3488e9 Phil Davis
109 13541a81 Steve Beaver
if ($_POST['apply']) {
110
	$retval = 0;
111
	$retval |= services_dnsmasq_configure();
112
113
	// Reload filter (we might need to sync to CARP hosts)
114
	filter_configure();
115
	/* Update resolv.conf in case the interface bindings exclude localhost. */
116
	system_resolvconf_generate();
117
	/* Start or restart dhcpleases when it's necessary */
118
	system_dhcpleases_configure();
119
120
	if ($retval == 0) {
121
		clear_subsystem_dirty('hosts');
122
	}
123
}
124 6e3488e9 Phil Davis
125 13541a81 Steve Beaver
if ($_POST['save']) {
126
	$pconfig = $_POST;
127
	unset($input_errors);
128
129
	$config['dnsmasq']['enable'] = ($_POST['enable']) ? true : false;
130
	$config['dnsmasq']['regdhcp'] = ($_POST['regdhcp']) ? true : false;
131
	$config['dnsmasq']['regdhcpstatic'] = ($_POST['regdhcpstatic']) ? true : false;
132
	$config['dnsmasq']['dhcpfirst'] = ($_POST['dhcpfirst']) ? true : false;
133
	$config['dnsmasq']['strict_order'] = ($_POST['strict_order']) ? true : false;
134
	$config['dnsmasq']['domain_needed'] = ($_POST['domain_needed']) ? true : false;
135
	$config['dnsmasq']['no_private_reverse'] = ($_POST['no_private_reverse']) ? true : false;
136
	$config['dnsmasq']['custom_options'] = str_replace("\r\n", "\n", $_POST['custom_options']);
137
	$config['dnsmasq']['strictbind'] = ($_POST['strictbind']) ? true : false;
138
139
	if (isset($_POST['enable']) && isset($config['unbound']['enable'])) {
140
		if ($_POST['port'] == $config['unbound']['port']) {
141
			$input_errors[] = gettext("The DNS Resolver is enabled using this port. Choose a non-conflicting port, or disable DNS Resolver.");
142 966ed611 Phil Davis
		}
143 13541a81 Steve Beaver
	}
144 6e3488e9 Phil Davis
145 13fca9bc doktornotor
	if ((isset($_POST['regdhcp']) || isset($_POST['regdhcpstatic']) || isset($_POST['dhcpfirst'])) && !is_dhcp_server_enabled()) {
146
		$input_errors[] = gettext("DHCP Server must be enabled for DHCP Registration to work in DNS Forwarder.");
147
	}
148
149 13541a81 Steve Beaver
	if ($_POST['port']) {
150
		if (is_port($_POST['port'])) {
151
			$config['dnsmasq']['port'] = $_POST['port'];
152
		} else {
153
			$input_errors[] = gettext("A valid port number must be specified.");
154 c85b1242 Stephen Beaver
		}
155 13541a81 Steve Beaver
	} else if (isset($config['dnsmasq']['port'])) {
156
		unset($config['dnsmasq']['port']);
157
	}
158 6e3488e9 Phil Davis
159 13541a81 Steve Beaver
	if (is_array($_POST['interface'])) {
160
		$config['dnsmasq']['interface'] = implode(",", $_POST['interface']);
161
	} elseif (isset($config['dnsmasq']['interface'])) {
162
		unset($config['dnsmasq']['interface']);
163
	}
164
165
	if ($config['dnsmasq']['custom_options']) {
166
		$args = '';
167
		foreach (preg_split('/\s+/', $config['dnsmasq']['custom_options']) as $c) {
168
			$args .= escapeshellarg("--{$c}") . " ";
169 966ed611 Phil Davis
		}
170 13541a81 Steve Beaver
		exec("/usr/local/sbin/dnsmasq --test $args", $output, $rc);
171
		if ($rc != 0) {
172
			$input_errors[] = gettext("Invalid custom options");
173
		}
174
	}
175
176
	if (!$input_errors) {
177
		write_config();
178
		mark_subsystem_dirty('hosts');
179 8f9bffbc Andrew Thompson
	}
180 5b237745 Scott Ullrich
}
181
182 13541a81 Steve Beaver
183
if ($_POST['act'] == "del") {
184
	if ($_POST['type'] == 'host') {
185
		if ($a_hosts[$_POST['id']]) {
186
			unset($a_hosts[$_POST['id']]);
187 70edf50d jim-p
			write_config();
188 a368a026 Ermal Lu?i
			mark_subsystem_dirty('hosts');
189 70edf50d jim-p
			header("Location: services_dnsmasq.php");
190
			exit;
191
		}
192 13541a81 Steve Beaver
	} elseif ($_POST['type'] == 'doverride') {
193
		if ($a_domainOverrides[$_POST['id']]) {
194
			unset($a_domainOverrides[$_POST['id']]);
195 70edf50d jim-p
			write_config();
196 a368a026 Ermal Lu?i
			mark_subsystem_dirty('hosts');
197 70edf50d jim-p
			header("Location: services_dnsmasq.php");
198
			exit;
199
		}
200
	}
201 5b237745 Scott Ullrich
}
202 0c2b5df7 Scott Ullrich
203 e6363160 sbeaver
function build_if_list() {
204 b1895639 Stephen Beaver
	global $pconfig;
205
206 e6363160 sbeaver
	$interface_addresses = get_possible_listen_ips(true);
207
	$iflist = array('options' => array(), 'selected' => array());
208
209
	$iflist['options'][""]	= "All";
210 6e3488e9 Phil Davis
	if (empty($pconfig['interface']) || empty($pconfig['interface'][0])) {
211 e6363160 sbeaver
		array_push($iflist['selected'], "");
212 6e3488e9 Phil Davis
	}
213 e6363160 sbeaver
214
	foreach ($interface_addresses as $laddr => $ldescr) {
215
		$iflist['options'][$laddr] = htmlspecialchars($ldescr);
216
217 6e3488e9 Phil Davis
		if ($pconfig['interface'] && in_array($laddr, $pconfig['interface'])) {
218 e6363160 sbeaver
			array_push($iflist['selected'], $laddr);
219 6e3488e9 Phil Davis
		}
220 e6363160 sbeaver
	}
221
222
	unset($interface_addresses);
223
224
	return($iflist);
225
}
226
227 9f5aa90f Phil Davis
$pgtitle = array(gettext("Services"), gettext("DNS Forwarder"));
228 db88a3a2 Phil Davis
$shortcut_section = "forwarder";
229 b63695db Scott Ullrich
include("head.inc");
230 0c2b5df7 Scott Ullrich
231 6e3488e9 Phil Davis
if ($input_errors) {
232 e6363160 sbeaver
	print_input_errors($input_errors);
233 6e3488e9 Phil Davis
}
234 5b237745 Scott Ullrich
235 44c42356 Phil Davis
if ($_POST['apply']) {
236
	print_apply_result_box($retval);
237 6e3488e9 Phil Davis
}
238 e6363160 sbeaver
239 6e3488e9 Phil Davis
if (is_subsystem_dirty('hosts')) {
240 c9a66c65 NOYB
	print_apply_box(gettext("The DNS forwarder configuration has been changed.") . "<br />" . gettext("The changes must be applied for them to take effect."));
241 6e3488e9 Phil Davis
}
242 e6363160 sbeaver
243 fae9a73c sbeaver
$form = new Form();
244 e6363160 sbeaver
245
$section = new Form_Section('General DNS Forwarder Options');
246
247
$section->addInput(new Form_Checkbox(
248
	'enable',
249
	'Enable',
250
	'Enable DNS forwarder',
251
	$pconfig['enable']
252 08d1762e Sjon Hortensius
))->toggles('.toggle-dhcp', 'disable');
253 e6363160 sbeaver
254
$section->addInput(new Form_Checkbox(
255
	'regdhcp',
256
	'DHCP Registration',
257
	'Register DHCP leases in DNS forwarder',
258
	$pconfig['regdhcp']
259 d2a2f018 Steve Beaver
))->setHelp('If this option is set machines that specify'.
260 702fa4d0 Phil Davis
			' their hostname when requesting a DHCP lease will be registered'.
261
			' in the DNS forwarder, so that their name can be resolved.'.
262
			' The domain in %1$sSystem: General Setup%2$s should also'.
263 3fd41815 Phil Davis
			' be set to the proper value.', '<a href="system.php">', '</a>')
264 08d1762e Sjon Hortensius
	->addClass('toggle-dhcp');
265 e6363160 sbeaver
266
$section->addInput(new Form_Checkbox(
267
	'regdhcpstatic',
268
	'Static DHCP',
269
	'Register DHCP static mappings in DNS forwarder',
270
	$pconfig['regdhcpstatic']
271 ecf4b407 Isaac McDonald
))->setHelp('If this option is set, IPv4 DHCP static mappings will '.
272 e7d76457 Isaac McDonald
					'be registered in the DNS forwarder so that their name can be '.
273 702fa4d0 Phil Davis
					'resolved. The domain in %1$sSystem: General Setup%2$s should also '.
274 3fd41815 Phil Davis
					'be set to the proper value.', '<a href="system.php">', '</a>')
275 08d1762e Sjon Hortensius
	->addClass('toggle-dhcp');
276 e6363160 sbeaver
277
$section->addInput(new Form_Checkbox(
278
	'dhcpfirst',
279
	'Prefer DHCP',
280
	'Resolve DHCP mappings first',
281
	$pconfig['dhcpfirst']
282 d2a2f018 Steve Beaver
))->setHelp("If this option is set DHCP mappings will ".
283 aa994814 Andrew Thompson
					"be resolved before the manual list of names below. This only ".
284 d2a2f018 Steve Beaver
					"affects the name given for a reverse lookup (PTR).")
285 08d1762e Sjon Hortensius
	->addClass('toggle-dhcp');
286 e6363160 sbeaver
287 08d1762e Sjon Hortensius
$group = new Form_Group('DNS Query Forwarding');
288
289
$group->add(new Form_Checkbox(
290 e6363160 sbeaver
	'strict_order',
291
	'DNS Query Forwarding',
292
	'Query DNS servers sequentially',
293
	$pconfig['strict_order']
294 3fd41815 Phil Davis
))->setHelp('If this option is set %1$s DNS Forwarder (dnsmasq) will '.
295
					'query the DNS servers sequentially in the order specified (%2$sSystem - General Setup - DNS Servers%3$s), '.
296
					'rather than all at once in parallel. ', $g['product_name'], '<i>', '</i>');
297 e6363160 sbeaver
298 08d1762e Sjon Hortensius
$group->add(new Form_Checkbox(
299 e6363160 sbeaver
	'domain_needed',
300
	null,
301
	'Require domain',
302
	$pconfig['domain_needed']
303 d2a2f018 Steve Beaver
))->setHelp("If this option is set %s DNS Forwarder (dnsmasq) will ".
304 e6363160 sbeaver
					"not forward A or AAAA queries for plain names, without dots or domain parts, to upstream name servers.	 ".
305 d2a2f018 Steve Beaver
					"If the name is not known from /etc/hosts or DHCP then a \"not found\" answer is returned. ", $g['product_name']);
306 e6363160 sbeaver
307 08d1762e Sjon Hortensius
$group->add(new Form_Checkbox(
308 e6363160 sbeaver
	'no_private_reverse',
309
	null,
310
	'Do not forward private reverse lookups',
311
	$pconfig['no_private_reverse']
312 d2a2f018 Steve Beaver
))->setHelp("If this option is set %s DNS Forwarder (dnsmasq) will ".
313 7bdd28fb Phil Davis
					"not forward reverse DNS lookups (PTR) for private addresses (RFC 1918) to upstream name servers.  ".
314
					"Any entries in the Domain Overrides section forwarding private \"n.n.n.in-addr.arpa\" names to a specific server are still forwarded. ".
315 d2a2f018 Steve Beaver
					"If the IP to name is not known from /etc/hosts, DHCP or a specific domain override then a \"not found\" answer is immediately returned. ", $g['product_name']);
316 e6363160 sbeaver
317 08d1762e Sjon Hortensius
$section->add($group);
318
319 e6363160 sbeaver
$section->addInput(new Form_Input(
320
	'port',
321
	'Listen Port',
322 08d1762e Sjon Hortensius
	'number',
323
	$pconfig['port'],
324
	['placeholder' => '53']
325 e6363160 sbeaver
))->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.');
326
327
$iflist = build_if_list();
328
329
$section->addInput(new Form_Select(
330
	'interface',
331 24b82516 Phil Davis
	'*Interfaces',
332 e6363160 sbeaver
	$iflist['selected'],
333
	$iflist['options'],
334
	true
335
))->setHelp('Interface IPs used by the DNS Forwarder 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. ' .
336
			'The default behavior is to respond to queries on every available IPv4 and IPv6 address.');
337
338
$section->addInput(new Form_Checkbox(
339
	'strictbind',
340 08d1762e Sjon Hortensius
	'Strict binding',
341 e6363160 sbeaver
	'Strict interface binding',
342
	$pconfig['strictbind']
343 fae9a73c sbeaver
))->setHelp('If this option is set, the DNS forwarder will only bind to the interfaces containing the IP addresses selected above, ' .
344 3fd41815 Phil Davis
					'rather than binding to all interfaces and discarding queries to other addresses.%1$s' .
345
					'This option does NOT work with IPv6. If set, dnsmasq will not bind to IPv6 addresses.', '<br /><br />');
346 e6363160 sbeaver
347 33ed4d60 Stephen Beaver
$section->addInput(new Form_Textarea(
348 e6363160 sbeaver
	'custom_options',
349
	'Custom options',
350
	$pconfig['custom_options']
351 e78ecb96 NOYB
))->setHelp('Enter any additional options to add to the dnsmasq configuration here, separated by a space or newline.')
352 b6b7ab7d Stephen Beaver
  ->addClass('advanced');
353 e6363160 sbeaver
354
$form->add($section);
355
print($form);
356 98f28b4e k-paulius
357 b6b7ab7d Stephen Beaver
?>
358 e6363160 sbeaver
<div class="panel panel-default">
359 c9679d8c Stephen Beaver
	<div class="panel-heading"><h2 class="panel-title"><?=gettext("Host Overrides")?></h2></div>
360 e6363160 sbeaver
	<div class="panel-body table-responsive">
361 1c10ce97 PiBa-NL
		<table class="table table-striped table-hover table-condensed sortable-theme-bootstrap table-rowdblclickedit" data-sortable>
362 e6363160 sbeaver
			<thead>
363 70edf50d jim-p
				<tr>
364 e6363160 sbeaver
					<th><?=gettext("Host")?></th>
365
					<th><?=gettext("Domain")?></th>
366
					<th><?=gettext("IP")?></th>
367
					<th><?=gettext("Description")?></th>
368 21d973b2 Phil Davis
					<th><?=gettext("Actions")?></th>
369 70edf50d jim-p
				</tr>
370 e6363160 sbeaver
			</thead>
371
			<tbody>
372
<?php
373 08d1762e Sjon Hortensius
foreach ($a_hosts as $i => $hostent):
374 e6363160 sbeaver
?>
375
				<tr>
376
					<td>
377 a15714cc NOYB
						<?=$hostent['host']?>
378 e6363160 sbeaver
					</td>
379
					<td>
380 a15714cc NOYB
						<?=$hostent['domain']?>
381 e6363160 sbeaver
					</td>
382
					<td>
383 08d1762e Sjon Hortensius
						<?=$hostent['ip']?>
384 e6363160 sbeaver
					</td>
385
					<td>
386
						<?=htmlspecialchars($hostent['descr'])?>
387
					</td>
388
					<td>
389 589634a9 Steve Beaver
						<a class="fa fa-pencil"	title="<?=gettext('Edit host override')?>" 	href="services_dnsmasq_edit.php?id=<?=$hostent['idx']?>"></a>
390 13541a81 Steve Beaver
						<a class="fa fa-trash"	title="<?=gettext('Delete host override')?>"	href="services_dnsmasq.php?type=host&amp;act=del&amp;id=<?=$hostent['idx']?>" usepost></a>
391 e6363160 sbeaver
					</td>
392
				</tr>
393
394
<?php
395
	if ($hostent['aliases']['item'] && is_array($hostent['aliases']['item'])):
396 231197bb Phil Davis
		foreach ($hostent['aliases']['item'] as $alias):
397 e6363160 sbeaver
?>
398 7bd5b320 Colin Fleming
				<tr>
399 e6363160 sbeaver
					<td>
400 a15714cc NOYB
						<?=$alias['host']?>
401 e6363160 sbeaver
					</td>
402
					<td>
403 a15714cc NOYB
						<?=$alias['domain']?>
404 e6363160 sbeaver
					</td>
405
					<td>
406 4bb7c0d1 bruno
						<?=gettext("Alias for ");?><?=$hostent['host'] ? $hostent['host'] . '.' . $hostent['domain'] : $hostent['domain']?>
407 e6363160 sbeaver
					</td>
408
					<td>
409 39609bf9 Stephen Beaver
						<i class="fa fa-angle-double-right text-info"></i>
410 e6363160 sbeaver
						<?=htmlspecialchars($alias['description'])?>
411
					</td>
412
					<td>
413 c84a6977 heper
						<a class="fa fa-pencil"	title="<?=gettext('Edit host override')?>" 	href="services_dnsmasq_edit.php?id=<?=$i?>"></a>
414 e6363160 sbeaver
					</td>
415 7bd5b320 Colin Fleming
				</tr>
416 e6363160 sbeaver
<?php
417
		endforeach;
418
	endif;
419
endforeach;
420
?>
421
			</tbody>
422
		</table>
423
	</div>
424
</div>
425
426 c10cb196 Stephen Beaver
<nav class="action-buttons">
427 c9679d8c Stephen Beaver
	<a href="services_dnsmasq_edit.php" class="btn btn-sm btn-success btn-sm">
428 9d5a20cf heper
		<i class="fa fa-plus icon-embed-btn"></i>
429 c9679d8c Stephen Beaver
		<?=gettext('Add')?>
430
	</a>
431 e6363160 sbeaver
</nav>
432
433
<div class="panel panel-default">
434 c9679d8c Stephen Beaver
	<div class="panel-heading"><h2 class="panel-title"><?=gettext("Domain Overrides")?></h2></div>
435 e6363160 sbeaver
	<div class="panel-body table-responsive">
436 1c10ce97 PiBa-NL
		<table class="table table-striped table-hover table-condensed sortable-theme-bootstrap table-rowdblclickedit" data-sortable>
437 e6363160 sbeaver
			<thead>
438 70edf50d jim-p
				<tr>
439 e6363160 sbeaver
					<th><?=gettext("Domain")?></th>
440
					<th><?=gettext("IP")?></th>
441
					<th><?=gettext("Description")?></th>
442 21d973b2 Phil Davis
					<th><?=gettext("Actions")?></th>
443 70edf50d jim-p
				</tr>
444 e6363160 sbeaver
			</thead>
445
446
			<tbody>
447
<?php
448 08d1762e Sjon Hortensius
foreach ($a_domainOverrides as $i => $doment):
449 e6363160 sbeaver
?>
450 70edf50d jim-p
				<tr>
451 e6363160 sbeaver
					<td>
452 a15714cc NOYB
						<?=$doment['domain']?>
453 e6363160 sbeaver
					</td>
454
					<td>
455 08d1762e Sjon Hortensius
						<?=$doment['ip']?>
456 e6363160 sbeaver
					</td>
457
					<td>
458 08d1762e Sjon Hortensius
						<?=htmlspecialchars($doment['descr'])?>
459 e6363160 sbeaver
					</td>
460
					<td>
461 589634a9 Steve Beaver
						<a class="fa fa-pencil"	title="<?=gettext('Edit domain override')?>" href="services_dnsmasq_domainoverride_edit.php?id=<?=$doment['idx']?>"></a>
462 13541a81 Steve Beaver
						<a class="fa fa-trash"	title="<?=gettext('Delete domain override')?>" href="services_dnsmasq.php?act=del&amp;type=doverride&amp;id=<?=$doment['idx']?>" usepost></a>
463 e6363160 sbeaver
					</td>
464 70edf50d jim-p
				</tr>
465 e6363160 sbeaver
<?php
466
endforeach;
467
?>
468
			</tbody>
469 7bd5b320 Colin Fleming
		</table>
470 e6363160 sbeaver
	</div>
471
</div>
472
473 c10cb196 Stephen Beaver
<nav class="action-buttons">
474 c9679d8c Stephen Beaver
	<a href="services_dnsmasq_domainoverride_edit.php" class="btn btn-sm btn-success btn-sm">
475 9d5a20cf heper
		<i class="fa fa-plus icon-embed-btn"></i>
476 c9679d8c Stephen Beaver
		<?=gettext('Add')?>
477
	</a>
478 e6363160 sbeaver
</nav>
479 bd3b483a Phil Davis
<div class="infoblock">
480
<?php
481
print_info_box(
482
	'<p>' .
483
	gettext('If the DNS forwarder is enabled, the DHCP service (if enabled) will automatically' .
484
		    ' serve the LAN IP address as a DNS server to DHCP clients so they will use the forwarder.') . '</p><p>' .
485
	sprintf(gettext('The DNS forwarder will use the DNS servers entered in %1$sSystem > General Setup%2$s or' .
486
				    ' those obtained via DHCP or PPP on WAN if &quot;Allow DNS server list to be overridden by DHCP/PPP on WAN&quot; is checked.' .
487
				    ' If that option is not used (or if a static IP address is used on WAN),' .
488
				    ' at least one DNS server must be manually specified on the %1$sSystem > General Setup%2$s page.'),
489
			'<a href="system.php">',
490
			'</a>') .
491
	'</p>',
492
	'info',
493
	false
494
);
495
?>
496
</div>
497 e6363160 sbeaver
498 c53fc00e Phil Davis
<?php
499 c84a6977 heper
include("foot.inc");