Project

General

Profile

Download (53.4 KB) Statistics
| Branch: | Tag: | Revision:
1 e9f147c8 Scott Ullrich
<?php
2 b46bfcf5 Bill Marquette
/* $Id$ */
3 5b237745 Scott Ullrich
/*
4
	services_dhcp.php
5
	part of m0n0wall (http://m0n0.ch/wall)
6 e9f147c8 Scott Ullrich
7 5b237745 Scott Ullrich
	Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
8
	All rights reserved.
9 e9f147c8 Scott Ullrich
10 5b237745 Scott Ullrich
	Redistribution and use in source and binary forms, with or without
11
	modification, are permitted provided that the following conditions are met:
12 e9f147c8 Scott Ullrich
13 5b237745 Scott Ullrich
	1. Redistributions of source code must retain the above copyright notice,
14
	   this list of conditions and the following disclaimer.
15 e9f147c8 Scott Ullrich
16 5b237745 Scott Ullrich
	2. Redistributions in binary form must reproduce the above copyright
17
	   notice, this list of conditions and the following disclaimer in the
18
	   documentation and/or other materials provided with the distribution.
19 e9f147c8 Scott Ullrich
20 5b237745 Scott Ullrich
	THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
21
	INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
22
	AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
23
	AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
24
	OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
	POSSIBILITY OF SUCH DAMAGE.
30
*/
31 1d333258 Scott Ullrich
/*
32
	pfSense_BUILDER_BINARIES:	/bin/rm
33
	pfSense_MODULE:	interfaces
34
*/
35 5b237745 Scott Ullrich
36 6b07c15a Matthew Grooms
##|+PRIV
37
##|*IDENT=page-services-dhcpserver
38
##|*NAME=Services: DHCP server page
39
##|*DESCR=Allow access to the 'Services: DHCP server' page.
40
##|*MATCH=services_dhcp.php*
41
##|-PRIV
42
43 b7597d4e Bill Marquette
require("guiconfig.inc");
44 d9f2de9a Phil Davis
require_once("filter.inc");
45 5b237745 Scott Ullrich
46 2ee0410f Scott Ullrich
if(!$g['services_dhcp_server_enable']) {
47
	Header("Location: /");
48
	exit;
49
}
50
51 c2ffc6c1 jim-p
/* This function will remove entries from dhcpd.leases that would otherwise
52
 * overlap with static DHCP reservations. If we don't clean these out,
53
 * then DHCP will print a warning in the logs about a duplicate lease
54
 */
55
function dhcp_clean_leases() {
56
	global $g, $config;
57
	$leasesfile = "{$g['dhcpd_chroot_path']}/var/db/dhcpd.leases";
58 69ec9ecf jim-p
	if (!file_exists($leasesfile))
59
		return;
60 c2ffc6c1 jim-p
	/* Build list of static MACs */
61
	$staticmacs = array();
62
	foreach($config['interfaces'] as $ifname => $ifarr)
63
		if (is_array($config['dhcpd'][$ifname]['staticmap']))
64
			foreach($config['dhcpd'][$ifname]['staticmap'] as $static)
65
				$staticmacs[] = $static['mac'];
66
	/* Read existing leases */
67
	$leases_contents = explode("\n", file_get_contents($leasesfile));
68
	$newleases_contents = array();
69
	$i=0;
70
	while ($i < count($leases_contents)) {
71
		/* Find a lease definition */
72
		if (substr($leases_contents[$i], 0, 6) == "lease ") {
73
			$templease = array();
74
			$thismac = "";
75
			/* Read to the end of the lease declaration */
76
			do {
77
				if (substr($leases_contents[$i], 0, 20) == "  hardware ethernet ")
78
					$thismac = substr($leases_contents[$i], 20, 17);
79
				$templease[] = $leases_contents[$i];
80
				$i++;
81
			} while ($leases_contents[$i-1] != "}");
82
			/* Check for a matching MAC address and if not present, keep it. */
83
			if (! in_array($thismac, $staticmacs))
84
				$newleases_contents = array_merge($newleases_contents, $templease);
85
		} else {
86
			/* It's a line we want to keep, copy it over. */
87
			$newleases_contents[] = $leases_contents[$i];
88
			$i++;
89
		}
90
	}
91
	/* Write out the new leases file */
92
	$fd = fopen($leasesfile, 'w');
93
	fwrite($fd, implode("\n", $newleases_contents));
94
	fclose($fd);
95
}
96
97 5b237745 Scott Ullrich
$if = $_GET['if'];
98 cba980f6 jim-p
if (!empty($_POST['if']))
99 5b237745 Scott Ullrich
	$if = $_POST['if'];
100 e9f147c8 Scott Ullrich
101 11bc553c Scott Ullrich
/* if OLSRD is enabled, allow WAN to house DHCP. */
102 a3b466b5 Scott Ullrich
if($config['installedpackages']['olsrd']) {
103
	foreach($config['installedpackages']['olsrd']['config'] as $olsrd) {
104 bc15a1b9 Scott Ullrich
			if($olsrd['enable']) {
105 48ab0cd2 Scott Ullrich
				$is_olsr_enabled = true;
106 a3b466b5 Scott Ullrich
				break;
107
			}
108
	}
109 11bc553c Scott Ullrich
}
110
111 934240ef Ermal Luçi
if (!$_GET['if'])
112 a4510ca0 Carlos Eduardo Ramos
	$savemsg = "<b>" . gettext("The DHCP Server can only be enabled on interfaces configured with static IP addresses") . ".<p>" . gettext("Only interfaces configured with a static IP will be shown") . ".</p></b>";
113 5b237745 Scott Ullrich
114 934240ef Ermal Luçi
$iflist = get_configured_interface_with_descr();
115 5b237745 Scott Ullrich
116 1c451b06 Scott Ullrich
/* set the starting interface */
117 f19651d1 Ermal
if (!$if || !isset($iflist[$if])) {
118 01fdb2d3 Erik Fonnesbeck
	foreach ($iflist as $ifent => $ifname) {
119 de792e62 jim-p
		$oc = $config['interfaces'][$ifent];
120 e5770bc2 Bill Marquette
		if ((is_array($config['dhcpd'][$ifent]) && !isset($config['dhcpd'][$ifent]['enable']) && (!is_ipaddrv4($oc['ipaddr']))) ||
121
			(!is_array($config['dhcpd'][$ifent]) && (!is_ipaddrv4($oc['ipaddr']))))
122 01fdb2d3 Erik Fonnesbeck
			continue;
123
		$if = $ifent;
124
		break;
125
	}
126 f19651d1 Ermal
}
127 0a2c6a5b Scott Ullrich
128 cba980f6 jim-p
$act = $_GET['act'];
129
if (!empty($_POST['act']))
130
	$act = $_POST['act'];
131
132 cc6052f0 Renato Botelho
$a_pools = array();
133 cba980f6 jim-p
134 89019922 Ermal Luçi
if (is_array($config['dhcpd'][$if])){
135 cba980f6 jim-p
	$pool = $_GET['pool'];
136
	if (is_numeric($_POST['pool']))
137
		$pool = $_POST['pool'];
138
139
	// If we have a pool but no interface name, that's not valid. Redirect away.
140
	if (is_numeric($pool) && empty($if)) {
141
		header("Location: services_dhcp.php");
142
		exit;
143 de792e62 jim-p
	}
144 cba980f6 jim-p
145
	if (!is_array($config['dhcpd'][$if]['pool']))
146
		$config['dhcpd'][$if]['pool'] = array();
147
	$a_pools = &$config['dhcpd'][$if]['pool'];
148
149
	if (is_numeric($pool) && $a_pools[$pool])
150
		$dhcpdconf = &$a_pools[$pool];
151
	elseif ($act == "newpool")
152
		$dhcpdconf = array();
153
	else
154
		$dhcpdconf = &$config['dhcpd'][$if];
155
}
156
if (is_array($dhcpdconf)) {
157
	// Global Options
158
	if (!is_numeric($pool) && !($act == "newpool")) {
159
		$pconfig['enable'] = isset($dhcpdconf['enable']);
160
		$pconfig['staticarp'] = isset($dhcpdconf['staticarp']);
161
		// No reason to specify this per-pool, per the dhcpd.conf man page it needs to be in every
162
		//   pool and should be specified in every pool both nodes share, so we'll treat it as global
163
		$pconfig['failover_peerip'] = $dhcpdconf['failover_peerip'];
164
		$pconfig['dhcpleaseinlocaltime'] = $dhcpdconf['dhcpleaseinlocaltime'];
165
		if (!is_array($dhcpdconf['staticmap']))
166
			$dhcpdconf['staticmap'] = array();
167
		$a_maps = &$dhcpdconf['staticmap'];
168 ee1fb205 jim-p
	} else {
169
		// Options that exist only in pools
170
		$pconfig['descr'] = $dhcpdconf['descr'];
171 cba980f6 jim-p
	}
172
173
	// Options that can be global or per-pool.
174
	if (is_array($dhcpdconf['range'])) {
175
		$pconfig['range_from'] = $dhcpdconf['range']['from'];
176
		$pconfig['range_to'] = $dhcpdconf['range']['to'];
177
	}
178
	$pconfig['deftime'] = $dhcpdconf['defaultleasetime'];
179
	$pconfig['maxtime'] = $dhcpdconf['maxleasetime'];
180
	$pconfig['gateway'] = $dhcpdconf['gateway'];
181
	$pconfig['domain'] = $dhcpdconf['domain'];
182
	$pconfig['domainsearchlist'] = $dhcpdconf['domainsearchlist'];
183
	list($pconfig['wins1'],$pconfig['wins2']) = $dhcpdconf['winsserver'];
184
	list($pconfig['dns1'],$pconfig['dns2']) = $dhcpdconf['dnsserver'];
185
	$pconfig['denyunknown'] = isset($dhcpdconf['denyunknown']);
186
	$pconfig['ddnsdomain'] = $dhcpdconf['ddnsdomain'];
187
	$pconfig['ddnsupdate'] = isset($dhcpdconf['ddnsupdate']);
188
	$pconfig['mac_allow'] = $dhcpdconf['mac_allow'];
189
	$pconfig['mac_deny'] = $dhcpdconf['mac_deny'];
190
	list($pconfig['ntp1'],$pconfig['ntp2']) = $dhcpdconf['ntpserver'];
191
	$pconfig['tftp'] = $dhcpdconf['tftp'];
192
	$pconfig['ldap'] = $dhcpdconf['ldap'];
193
	$pconfig['netboot'] = isset($dhcpdconf['netboot']);
194
	$pconfig['nextserver'] = $dhcpdconf['nextserver'];
195
	$pconfig['filename'] = $dhcpdconf['filename'];
196
	$pconfig['rootpath'] = $dhcpdconf['rootpath'];
197
	$pconfig['netmask'] = $dhcpdconf['netmask'];
198
	$pconfig['numberoptions'] = $dhcpdconf['numberoptions'];
199 89019922 Ermal Luçi
}
200 31c59d0d Scott Ullrich
201 51cd7a1e Evgeny Yurchenko
$ifcfgip = $config['interfaces'][$if]['ipaddr'];
202
$ifcfgsn = $config['interfaces'][$if]['subnet'];
203 5b237745 Scott Ullrich
204 1f1a08c8 jim-p
function validate_partial_mac_list($maclist) {
205
	$macs = explode(',', $maclist);
206
207
	// Loop through and look for invalid MACs.
208
	foreach ($macs as $mac)
209
		if (!is_macaddr($mac, true))
210
			return false;
211
	return true;
212
}
213
214 5b237745 Scott Ullrich
if ($_POST) {
215
216
	unset($input_errors);
217 b7597d4e Bill Marquette
218 5b237745 Scott Ullrich
	$pconfig = $_POST;
219
220 6d1af0e9 jim-p
	$numberoptions = array();
221
	for($x=0; $x<99; $x++) {
222
		if(isset($_POST["number{$x}"]) && ctype_digit($_POST["number{$x}"])) {
223
			$numbervalue = array();
224
			$numbervalue['number'] = htmlspecialchars($_POST["number{$x}"]);
225 678dfd0f Erik Fonnesbeck
			$numbervalue['type'] = htmlspecialchars($_POST["itemtype{$x}"]);
226
			$numbervalue['value'] = str_replace('&quot;', '"', htmlspecialchars($_POST["value{$x}"]));
227 6d1af0e9 jim-p
			$numberoptions['item'][] = $numbervalue;
228
		}
229
	}
230
	// Reload the new pconfig variable that the forum uses.
231
	$pconfig['numberoptions'] = $numberoptions;
232
233 5b237745 Scott Ullrich
	/* input validation */
234 cba980f6 jim-p
	if ($_POST['enable'] || is_numeric($pool) || $act == "newpool") {
235 5b237745 Scott Ullrich
		$reqdfields = explode(" ", "range_from range_to");
236 40ad67e0 Rafael Lucas
		$reqdfieldsn = array(gettext("Range begin"),gettext("Range end"));
237 e9f147c8 Scott Ullrich
238 507628d5 Renato Botelho
		do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
239 de792e62 jim-p
240 e5770bc2 Bill Marquette
		if (($_POST['range_from'] && !is_ipaddrv4($_POST['range_from'])))
241 40ad67e0 Rafael Lucas
			$input_errors[] = gettext("A valid range must be specified.");
242 e5770bc2 Bill Marquette
		if (($_POST['range_to'] && !is_ipaddrv4($_POST['range_to'])))
243 40ad67e0 Rafael Lucas
			$input_errors[] = gettext("A valid range must be specified.");
244 e5770bc2 Bill Marquette
		if (($_POST['gateway'] && !is_ipaddrv4($_POST['gateway'])))
245 40ad67e0 Rafael Lucas
			$input_errors[] = gettext("A valid IP address must be specified for the gateway.");
246 e5770bc2 Bill Marquette
		if (($_POST['wins1'] && !is_ipaddrv4($_POST['wins1'])) || ($_POST['wins2'] && !is_ipaddrv4($_POST['wins2'])))
247 40ad67e0 Rafael Lucas
			$input_errors[] = gettext("A valid IP address must be specified for the primary/secondary WINS servers.");
248 9bc59815 Evgeny Yurchenko
		$parent_ip = get_interface_ip($_POST['if']);
249 8b6313a4 jim-p
		if (is_ipaddrv4($parent_ip) && $_POST['gateway']) {
250 9bc59815 Evgeny Yurchenko
			$parent_sn = get_interface_subnet($_POST['if']);
251 b75d7fd5 Renato Botelho
			if(!ip_in_subnet($_POST['gateway'], gen_subnet($parent_ip, $parent_sn) . "/" . $parent_sn) && !ip_in_interface_alias_subnet($_POST['if'], $_POST['gateway']))
252 9bc59815 Evgeny Yurchenko
				$input_errors[] = sprintf(gettext("The gateway address %s does not lie within the chosen interface's subnet."), $_POST['gateway']);
253 45d1024d Scott Ullrich
		}
254 e5770bc2 Bill Marquette
		if (($_POST['dns1'] && !is_ipaddrv4($_POST['dns1'])) || ($_POST['dns2'] && !is_ipaddrv4($_POST['dns2'])))
255 40ad67e0 Rafael Lucas
			$input_errors[] = gettext("A valid IP address must be specified for the primary/secondary DNS servers.");
256 26e3ca70 sullrich
257 de792e62 jim-p
		if ($_POST['deftime'] && (!is_numeric($_POST['deftime']) || ($_POST['deftime'] < 60)))
258 e680b2f9 Renato Botelho
				$input_errors[] = gettext("The default lease time must be at least 60 seconds.");
259
260
		if (isset($config['captiveportal']) && is_array($config['captiveportal'])) {
261
			$deftime = 7200; // Default value if it's empty
262
			if (is_numeric($_POST['deftime']))
263
				$deftime = $_POST['deftime'];
264
265
			foreach ($config['captiveportal'] as $cpZone => $cpdata) {
266
				if (!isset($cpdata['enable']))
267
					continue;
268
				if (!isset($cpdata['timeout']) || !is_numeric($cpdata['timeout']))
269
					continue;
270
				$cp_ifs = explode(',', $cpdata['interface']);
271
				if (!in_array($if, $cp_ifs))
272
					continue;
273
				if ($cpdata['timeout'] > $deftime)
274
					$input_errors[] = sprintf(gettext(
275
						"The Captive Portal zone '%s' has Hard Timeout parameter set to a value bigger than Default lease time (%s)."), $cpZone, $deftime);
276
			}
277
		}
278
279 de792e62 jim-p
		if ($_POST['maxtime'] && (!is_numeric($_POST['maxtime']) || ($_POST['maxtime'] < 60) || ($_POST['maxtime'] <= $_POST['deftime'])))
280 40ad67e0 Rafael Lucas
			$input_errors[] = gettext("The maximum lease time must be at least 60 seconds and higher than the default lease time.");
281 de792e62 jim-p
		if (($_POST['ddnsdomain'] && !is_domain($_POST['ddnsdomain'])))
282 40ad67e0 Rafael Lucas
			$input_errors[] = gettext("A valid domain name must be specified for the dynamic DNS registration.");
283 42a3cbab Pierre POMES
		if ($_POST['domainsearchlist']) {
284
			$domain_array=preg_split("/[ ;]+/",$_POST['domainsearchlist']);
285
			foreach ($domain_array as $curdomain) {
286
				if (!is_domain($curdomain)) {
287
					$input_errors[] = gettext("A valid domain search list must be specified.");
288
					break;
289
				}
290
			}
291
		}
292 1f1a08c8 jim-p
293
		// Validate MACs
294
		if (!empty($_POST['mac_allow']) && !validate_partial_mac_list($_POST['mac_allow']))
295
			$input_errors[] = gettext("If you specify a mac allow list, it must contain only valid partial MAC addresses.");
296
		if (!empty($_POST['mac_deny']) && !validate_partial_mac_list($_POST['mac_deny']))
297
			$input_errors[] = gettext("If you specify a mac deny list, it must contain only valid partial MAC addresses.");
298
299 e5770bc2 Bill Marquette
		if (($_POST['ntp1'] && !is_ipaddrv4($_POST['ntp1'])) || ($_POST['ntp2'] && !is_ipaddrv4($_POST['ntp2'])))
300 40ad67e0 Rafael Lucas
			$input_errors[] = gettext("A valid IP address must be specified for the primary/secondary NTP servers.");
301 26e3ca70 sullrich
		if (($_POST['domain'] && !is_domain($_POST['domain'])))
302 40ad67e0 Rafael Lucas
			$input_errors[] = gettext("A valid domain name must be specified for the DNS domain.");
303 e5770bc2 Bill Marquette
		if ($_POST['tftp'] && !is_ipaddrv4($_POST['tftp']) && !is_domain($_POST['tftp']) && !is_URL($_POST['tftp']))
304 40ad67e0 Rafael Lucas
			$input_errors[] = gettext("A valid IP address or hostname must be specified for the TFTP server.");
305 e5770bc2 Bill Marquette
		if (($_POST['nextserver'] && !is_ipaddrv4($_POST['nextserver'])))
306 40ad67e0 Rafael Lucas
			$input_errors[] = gettext("A valid IP address must be specified for the network boot server.");
307 2c75b451 sullrich
308 26e3ca70 sullrich
		if(gen_subnet($ifcfgip, $ifcfgsn) == $_POST['range_from'])
309 40ad67e0 Rafael Lucas
			$input_errors[] = gettext("You cannot use the network address in the starting subnet range.");
310 26e3ca70 sullrich
		if(gen_subnet_max($ifcfgip, $ifcfgsn) == $_POST['range_to'])
311 40ad67e0 Rafael Lucas
			$input_errors[] = gettext("You cannot use the broadcast address in the ending subnet range.");
312 e9f147c8 Scott Ullrich
313 2c75b451 sullrich
		// Disallow a range that includes the virtualip
314 7dfa60fa Ermal Lu?i
		if (is_array($config['virtualip']['vip'])) {
315
			foreach($config['virtualip']['vip'] as $vip) {
316 de792e62 jim-p
				if($vip['interface'] == $if)
317 54404519 Renato Botelho
					if($vip['subnet'] && is_inrange_v4($vip['subnet'], $_POST['range_from'], $_POST['range_to']))
318 3a3fb8ea Erik Fonnesbeck
						$input_errors[] = sprintf(gettext("The subnet range cannot overlap with virtual IP address %s."),$vip['subnet']);
319 7dfa60fa Ermal Lu?i
			}
320 2c75b451 sullrich
		}
321
322 073a2697 jim-p
		$noip = false;
323 2c7497cb Scott Ullrich
		if(is_array($a_maps))
324
			foreach ($a_maps as $map)
325
				if (empty($map['ipaddr']))
326
					$noip = true;
327 073a2697 jim-p
		if ($_POST['staticarp'] && $noip)
328
			$input_errors[] = "Cannot enable static ARP when you have static map entries without IP addresses. Ensure all static maps have IP addresses and try again.";
329
330 678dfd0f Erik Fonnesbeck
		if(is_array($pconfig['numberoptions']['item'])) {
331
			foreach ($pconfig['numberoptions']['item'] as $numberoption) {
332
				if ( $numberoption['type'] == 'text' && strstr($numberoption['value'], '"') )
333
					$input_errors[] = gettext("Text type cannot include quotation marks.");
334 1452fa57 Erik Fonnesbeck
				else if ( $numberoption['type'] == 'string' && !preg_match('/^"[^"]*"$/', $numberoption['value']) && !preg_match('/^[0-9a-f]{2}(?:\:[0-9a-f]{2})*$/i', $numberoption['value']) )
335 678dfd0f Erik Fonnesbeck
					$input_errors[] = gettext("String type must be enclosed in quotes like \"this\" or must be a series of octets specified in hexadecimal, separated by colons, like 01:23:45:67:89:ab:cd:ef");
336 1452fa57 Erik Fonnesbeck
				else if ( $numberoption['type'] == 'boolean' && $numberoption['value'] != 'true' && $numberoption['value'] != 'false' && $numberoption['value'] != 'on' && $numberoption['value'] != 'off' )
337 678dfd0f Erik Fonnesbeck
					$input_errors[] = gettext("Boolean type must be true, false, on, or off.");
338 1452fa57 Erik Fonnesbeck
				else if ( $numberoption['type'] == 'unsigned integer 8' && (!is_numeric($numberoption['value']) || $numberoption['value'] < 0 || $numberoption['value'] > 255) )
339 678dfd0f Erik Fonnesbeck
					$input_errors[] = gettext("Unsigned 8-bit integer type must be a number in the range 0 to 255.");
340 1452fa57 Erik Fonnesbeck
				else if ( $numberoption['type'] == 'unsigned integer 16' && (!is_numeric($numberoption['value']) || $numberoption['value'] < 0 || $numberoption['value'] > 65535) )
341 678dfd0f Erik Fonnesbeck
					$input_errors[] = gettext("Unsigned 16-bit integer type must be a number in the range 0 to 65535.");
342 1452fa57 Erik Fonnesbeck
				else if ( $numberoption['type'] == 'unsigned integer 32' && (!is_numeric($numberoption['value']) || $numberoption['value'] < 0 || $numberoption['value'] > 4294967295) )
343 678dfd0f Erik Fonnesbeck
					$input_errors[] = gettext("Unsigned 32-bit integer type must be a number in the range 0 to 4294967295.");
344 1452fa57 Erik Fonnesbeck
				else if ( $numberoption['type'] == 'signed integer 8' && (!is_numeric($numberoption['value']) || $numberoption['value'] < -128 || $numberoption['value'] > 127) )
345 678dfd0f Erik Fonnesbeck
					$input_errors[] = gettext("Signed 8-bit integer type must be a number in the range -128 to 127.");
346 1452fa57 Erik Fonnesbeck
				else if ( $numberoption['type'] == 'signed integer 16' && (!is_numeric($numberoption['value']) || $numberoption['value'] < -32768 || $numberoption['value'] > 32767) )
347 678dfd0f Erik Fonnesbeck
					$input_errors[] = gettext("Signed 16-bit integer type must be a number in the range -32768 to 32767.");
348 1452fa57 Erik Fonnesbeck
				else if ( $numberoption['type'] == 'signed integer 32' && (!is_numeric($numberoption['value']) || $numberoption['value'] < -2147483648 || $numberoption['value'] > 2147483647) )
349 678dfd0f Erik Fonnesbeck
					$input_errors[] = gettext("Signed 32-bit integer type must be a number in the range -2147483648 to 2147483647.");
350 e5770bc2 Bill Marquette
				else if ( $numberoption['type'] == 'ip-address' && !is_ipaddrv4($numberoption['value']) && !is_hostname($numberoption['value']) )
351 678dfd0f Erik Fonnesbeck
					$input_errors[] = gettext("IP address or host type must be an IP address or host name.");
352
			}
353
		}
354
355 5b237745 Scott Ullrich
		if (!$input_errors) {
356
			/* make sure the range lies within the current subnet */
357 96033063 Erik Fonnesbeck
			$subnet_start = ip2ulong(long2ip32(ip2long($ifcfgip) & gen_subnet_mask_long($ifcfgsn)));
358
			$subnet_end = ip2ulong(long2ip32(ip2long($ifcfgip) | (~gen_subnet_mask_long($ifcfgsn))));
359 e9f147c8 Scott Ullrich
360 96033063 Erik Fonnesbeck
			if ((ip2ulong($_POST['range_from']) < $subnet_start) || (ip2ulong($_POST['range_from']) > $subnet_end) ||
361
			    (ip2ulong($_POST['range_to']) < $subnet_start) || (ip2ulong($_POST['range_to']) > $subnet_end)) {
362 40ad67e0 Rafael Lucas
				$input_errors[] = gettext("The specified range lies outside of the current subnet.");
363 5b237745 Scott Ullrich
			}
364 e9f147c8 Scott Ullrich
365 96033063 Erik Fonnesbeck
			if (ip2ulong($_POST['range_from']) > ip2ulong($_POST['range_to']))
366 40ad67e0 Rafael Lucas
				$input_errors[] = gettext("The range is invalid (first element higher than second element).");
367 e9f147c8 Scott Ullrich
368 f657f5e1 Renato Botelho
			if (is_numeric($pool) || ($act == "newpool")) {
369
				$rfrom = $config['dhcpd'][$if]['range']['from'];
370
				$rto = $config['dhcpd'][$if]['range']['to'];
371
372
				if (is_inrange_v4($_POST['range_from'], $rfrom, $rto) || is_inrange_v4($_POST['range_to'], $rfrom, $rto))
373
					$input_errors[] = gettext("The specified range must not be within the DHCP range for this interface.");
374
			}
375
376
			foreach ($a_pools as $id => $p) {
377
				if (is_numeric($pool) && ($id == $pool))
378
					continue;
379
380
				if (is_inrange_v4($_POST['range_from'], $p['range']['from'], $p['range']['to']) ||
381
				    is_inrange_v4($_POST['range_to'], $p['range']['from'], $p['range']['to'])) {
382
					$input_errors[] = gettext("The specified range must not be within the range configured on a DHCP pool for this interface.");
383
					break;
384
				}
385
			}
386 cba980f6 jim-p
387 5b237745 Scott Ullrich
			/* make sure that the DHCP Relay isn't enabled on this interface */
388 0a35ca7c jim-p
			if (isset($config['dhcrelay']['enable']) && (stristr($config['dhcrelay']['interface'], $if) !== false))
389 3a3fb8ea Erik Fonnesbeck
				$input_errors[] = sprintf(gettext("You must disable the DHCP relay on the %s interface before enabling the DHCP server."),$iflist[$if]);
390 630d7025 jim-p
391
			$dynsubnet_start = ip2ulong($_POST['range_from']);
392
			$dynsubnet_end = ip2ulong($_POST['range_to']);
393 f02f0675 Erik Fonnesbeck
			if (is_array($a_maps)) {
394
				foreach ($a_maps as $map) {
395
					if (empty($map['ipaddr']))
396
						continue;
397
					if ((ip2ulong($map['ipaddr']) > $dynsubnet_start) &&
398
						(ip2ulong($map['ipaddr']) < $dynsubnet_end)) {
399
						$input_errors[] = sprintf(gettext("The DHCP range cannot overlap any static DHCP mappings."));
400
						break;
401
					}
402 630d7025 jim-p
				}
403
			}
404 5b237745 Scott Ullrich
		}
405
	}
406
407
	if (!$input_errors) {
408 cba980f6 jim-p
		if (!is_numeric($pool)) {
409
			if ($act == "newpool") {
410
				$dhcpdconf = array();
411
			} else {
412
				if (!is_array($config['dhcpd'][$if]))
413
					$config['dhcpd'][$if] = array();
414
				$dhcpdconf = $config['dhcpd'][$if];
415
			}
416
		} else {
417
			if (is_array($a_pools[$pool])) {
418
				$dhcpdconf = $a_pools[$pool];
419
			} else {
420
				// Someone specified a pool but it doesn't exist. Punt.
421
				header("Location: services_dhcp.php");
422
				exit;
423
			}
424
		}
425
		if (!is_array($dhcpdconf['range']))
426
			$dhcpdconf['range'] = array();
427
428 d9f2de9a Phil Davis
		$dhcpd_enable_changed = false;
429
430 cba980f6 jim-p
		// Global Options
431
		if (!is_numeric($pool) && !($act == "newpool")) {
432 d9f2de9a Phil Davis
			$old_dhcpd_enable = isset($dhcpdconf['enable']);
433
			$new_dhcpd_enable = ($_POST['enable']) ? true : false;
434
			if ($old_dhcpd_enable != $new_dhcpd_enable) {
435
				/* DHCP has been enabled or disabled. The pf ruleset will need to be rebuilt to allow or disallow DHCP. */
436
				$dhcpd_enable_changed = true;
437
			}
438
			$dhcpdconf['enable'] = $new_dhcpd_enable;
439 cba980f6 jim-p
			$dhcpdconf['staticarp'] = ($_POST['staticarp']) ? true : false;
440
			$previous = $dhcpdconf['failover_peerip'];
441
			if($previous <> $_POST['failover_peerip'])
442
				mwexec("/bin/rm -rf /var/dhcpd/var/db/*");
443
			$dhcpdconf['failover_peerip'] = $_POST['failover_peerip'];
444
			$dhcpdconf['dhcpleaseinlocaltime'] = $_POST['dhcpleaseinlocaltime'];
445 ee1fb205 jim-p
		} else {
446
			// Options that exist only in pools
447
			$dhcpdconf['descr'] = $_POST['descr'];
448 cba980f6 jim-p
		}
449
450
		// Options that can be global or per-pool.
451
		$dhcpdconf['range']['from'] = $_POST['range_from'];
452
		$dhcpdconf['range']['to'] = $_POST['range_to'];
453
		$dhcpdconf['defaultleasetime'] = $_POST['deftime'];
454
		$dhcpdconf['maxleasetime'] = $_POST['maxtime'];
455
		$dhcpdconf['netmask'] = $_POST['netmask'];
456
457
		unset($dhcpdconf['winsserver']);
458 5b237745 Scott Ullrich
		if ($_POST['wins1'])
459 cba980f6 jim-p
			$dhcpdconf['winsserver'][] = $_POST['wins1'];
460 5b237745 Scott Ullrich
		if ($_POST['wins2'])
461 cba980f6 jim-p
			$dhcpdconf['winsserver'][] = $_POST['wins2'];
462 4cab31d0 Scott Ullrich
463 cba980f6 jim-p
		unset($dhcpdconf['dnsserver']);
464 e9f147c8 Scott Ullrich
		if ($_POST['dns1'])
465 cba980f6 jim-p
			$dhcpdconf['dnsserver'][] = $_POST['dns1'];
466 e9f147c8 Scott Ullrich
		if ($_POST['dns2'])
467 cba980f6 jim-p
			$dhcpdconf['dnsserver'][] = $_POST['dns2'];
468
469
		$dhcpdconf['gateway'] = $_POST['gateway'];
470
		$dhcpdconf['domain'] = $_POST['domain'];
471
		$dhcpdconf['domainsearchlist'] = $_POST['domainsearchlist'];
472
		$dhcpdconf['denyunknown'] = ($_POST['denyunknown']) ? true : false;
473
		$dhcpdconf['ddnsdomain'] = $_POST['ddnsdomain'];
474
		$dhcpdconf['ddnsupdate'] = ($_POST['ddnsupdate']) ? true : false;
475
		$dhcpdconf['mac_allow'] = $_POST['mac_allow'];
476
		$dhcpdconf['mac_deny'] = $_POST['mac_deny'];
477
478
		unset($dhcpdconf['ntpserver']);
479 ad171999 Seth Mos
		if ($_POST['ntp1'])
480 cba980f6 jim-p
			$dhcpdconf['ntpserver'][] = $_POST['ntp1'];
481 ad171999 Seth Mos
		if ($_POST['ntp2'])
482 cba980f6 jim-p
			$dhcpdconf['ntpserver'][] = $_POST['ntp2'];
483 ad171999 Seth Mos
484 cba980f6 jim-p
		$dhcpdconf['tftp'] = $_POST['tftp'];
485
		$dhcpdconf['ldap'] = $_POST['ldap'];
486
		$dhcpdconf['netboot'] = ($_POST['netboot']) ? true : false;
487
		$dhcpdconf['nextserver'] = $_POST['nextserver'];
488
		$dhcpdconf['filename'] = $_POST['filename'];
489
		$dhcpdconf['rootpath'] = $_POST['rootpath'];
490 9c748b70 Scott Ullrich
491 d72b4114 Scott Ullrich
		// Handle the custom options rowhelper
492 cba980f6 jim-p
		if(isset($dhcpdconf['numberoptions']['item']))
493
			unset($dhcpdconf['numberoptions']['item']);
494 6d1af0e9 jim-p
495 cba980f6 jim-p
		$dhcpdconf['numberoptions'] = $numberoptions;
496
497
		if (is_numeric($pool) && is_array($a_pools[$pool])) {
498
			$a_pools[$pool] = $dhcpdconf;
499
		} elseif ($act == "newpool") {
500
			$a_pools[] = $dhcpdconf;
501
		} else {
502
			$config['dhcpd'][$if] = $dhcpdconf;
503
		}
504 518030b3 Scott Ullrich
505 5b237745 Scott Ullrich
		write_config();
506 80933129 Bill Marquette
507 5b237745 Scott Ullrich
		$retval = 0;
508 6a01ea44 Bill Marquette
		$retvaldhcp = 0;
509
		$retvaldns = 0;
510 c2ffc6c1 jim-p
		/* Stop DHCP so we can cleanup leases */
511
		killbyname("dhcpd");
512
		dhcp_clean_leases();
513 6a01ea44 Bill Marquette
		/* dnsmasq_configure calls dhcpd_configure */
514
		/* no need to restart dhcpd twice */
515 ea1aca13 Renato Botelho
		if (isset($config['dnsmasq']['enable']) && isset($config['dnsmasq']['regdhcpstatic']))	{
516 6a01ea44 Bill Marquette
			$retvaldns = services_dnsmasq_configure();
517
			if ($retvaldns == 0) {
518 a368a026 Ermal Lu?i
				clear_subsystem_dirty('hosts');
519
				clear_subsystem_dirty('staticmaps');
520 de792e62 jim-p
			}
521 6a01ea44 Bill Marquette
		} else {
522 de792e62 jim-p
			$retvaldhcp = services_dhcpd_configure();
523 a368a026 Ermal Lu?i
			if ($retvaldhcp == 0)
524
				clear_subsystem_dirty('staticmaps');
525 de792e62 jim-p
		}
526 d9f2de9a Phil Davis
		if ($dhcpd_enable_changed)
527
			$retvalfc = filter_configure();
528
529
		if($retvaldhcp == 1 || $retvaldns == 1 || $retvalfc == 1)
530 6a01ea44 Bill Marquette
			$retval = 1;
531 5b237745 Scott Ullrich
		$savemsg = get_std_save_message($retval);
532
	}
533
}
534
535 cba980f6 jim-p
if ($act == "delpool") {
536
	if ($a_pools[$_GET['id']]) {
537
		unset($a_pools[$_GET['id']]);
538
		write_config();
539
		header("Location: services_dhcp.php?if={$if}");
540
		exit;
541
	}
542
}
543
544
if ($act == "del") {
545 5b237745 Scott Ullrich
	if ($a_maps[$_GET['id']]) {
546
		unset($a_maps[$_GET['id']]);
547
		write_config();
548 6a01ea44 Bill Marquette
		if(isset($config['dhcpd'][$if]['enable'])) {
549 a368a026 Ermal Lu?i
			mark_subsystem_dirty('staticmaps');
550 ea1aca13 Renato Botelho
			if (isset($config['dnsmasq']['enable']) && isset($config['dnsmasq']['regdhcpstatic']))
551 a368a026 Ermal Lu?i
				mark_subsystem_dirty('hosts');
552 6a01ea44 Bill Marquette
		}
553 5b237745 Scott Ullrich
		header("Location: services_dhcp.php?if={$if}");
554
		exit;
555
	}
556
}
557 4df96eff Scott Ullrich
558 40ad67e0 Rafael Lucas
$pgtitle = array(gettext("Services"),gettext("DHCP server"));
559 b32dd0a6 jim-p
$shortcut_section = "dhcp";
560 5224b8e7 jim-p
561 4df96eff Scott Ullrich
include("head.inc");
562
563 5b237745 Scott Ullrich
?>
564 4df96eff Scott Ullrich
565 518030b3 Scott Ullrich
<script type="text/javascript" src="/javascript/row_helper.js">
566
</script>
567 4e9cd828 Seth Mos
568 518030b3 Scott Ullrich
<script type="text/javascript">
569 678dfd0f Erik Fonnesbeck
	function itemtype_field(fieldname, fieldsize, n) {
570
		return '<select name="' + fieldname + n + '" class="formselect" id="' + fieldname + n + '"><?php
571 1452fa57 Erik Fonnesbeck
			$customitemtypes = array('text' => gettext('Text'), 'string' => gettext('String'), 'boolean' => gettext('Boolean'),
572
				'unsigned integer 8' => gettext('Unsigned 8-bit integer'), 'unsigned integer 16' => gettext('Unsigned 16-bit integer'), 'unsigned integer 32' => gettext('Unsigned 32-bit integer'),
573
				'signed integer 8' => gettext('Signed 8-bit integer'), 'signed integer 16' => gettext('Signed 16-bit integer'), 'signed integer 32' => gettext('Signed 32-bit integer'), 'ip-address' => gettext('IP address or host'));
574 678dfd0f Erik Fonnesbeck
			foreach ($customitemtypes as $typename => $typedescr) {
575
				echo "<option value=\"{$typename}\">{$typedescr}</option>";
576
			}
577
		?></select>';
578
	}
579
580 518030b3 Scott Ullrich
	rowname[0] = "number";
581
	rowtype[0] = "textbox";
582 4e10cf0a Scott Ullrich
	rowsize[0] = "10";
583 678dfd0f Erik Fonnesbeck
	rowname[1] = "itemtype";
584
	rowtype[1] = itemtype_field;
585
	rowname[2] = "value";
586
	rowtype[2] = "textbox";
587
	rowsize[2] = "40";
588 518030b3 Scott Ullrich
</script>
589 4e9cd828 Seth Mos
590 518030b3 Scott Ullrich
<script type="text/javascript" language="JavaScript">
591
	function enable_change(enable_over) {
592
		var endis;
593 cba980f6 jim-p
		<?php if (is_numeric($pool) || ($act == "newpool")): ?>
594
			enable_over = true;
595
		<?php endif; ?>
596 518030b3 Scott Ullrich
		endis = !(document.iform.enable.checked || enable_over);
597 ee1fb205 jim-p
		<?php if (is_numeric($pool) || ($act == "newpool")): ?>
598
			document.iform.descr.disabled = endis;
599
		<?php endif; ?>
600 518030b3 Scott Ullrich
		document.iform.range_from.disabled = endis;
601
		document.iform.range_to.disabled = endis;
602
		document.iform.wins1.disabled = endis;
603
		document.iform.wins2.disabled = endis;
604
		document.iform.dns1.disabled = endis;
605
		document.iform.dns2.disabled = endis;
606
		document.iform.deftime.disabled = endis;
607
		document.iform.maxtime.disabled = endis;
608
		document.iform.gateway.disabled = endis;
609
		document.iform.failover_peerip.disabled = endis;
610
		document.iform.domain.disabled = endis;
611
		document.iform.domainsearchlist.disabled = endis;
612
		document.iform.staticarp.disabled = endis;
613 f365fa90 Joecowboy
		document.iform.dhcpleaseinlocaltime.disabled = endis;
614 518030b3 Scott Ullrich
		document.iform.ddnsdomain.disabled = endis;
615
		document.iform.ddnsupdate.disabled = endis;
616 1f1a08c8 jim-p
		document.iform.mac_allow.disabled = endis;
617
		document.iform.mac_deny.disabled = endis;
618 518030b3 Scott Ullrich
		document.iform.ntp1.disabled = endis;
619
		document.iform.ntp2.disabled = endis;
620
		document.iform.tftp.disabled = endis;
621
		document.iform.ldap.disabled = endis;
622
		document.iform.netboot.disabled = endis;
623
		document.iform.nextserver.disabled = endis;
624
		document.iform.filename.disabled = endis;
625
		document.iform.rootpath.disabled = endis;
626
		document.iform.denyunknown.disabled = endis;
627
	}
628 4e9cd828 Seth Mos
629 b1d132f5 Scott Ullrich
	function show_shownumbervalue() {
630
		document.getElementById("shownumbervaluebox").innerHTML='';
631
		aodiv = document.getElementById('shownumbervalue');
632
		aodiv.style.display = "block";
633
	}
634
635 518030b3 Scott Ullrich
	function show_ddns_config() {
636
		document.getElementById("showddnsbox").innerHTML='';
637
		aodiv = document.getElementById('showddns');
638
		aodiv.style.display = "block";
639
	}
640 ad171999 Seth Mos
641 1f1a08c8 jim-p
	function show_maccontrol_config() {
642
		document.getElementById("showmaccontrolbox").innerHTML='';
643
		aodiv = document.getElementById('showmaccontrol');
644
		aodiv.style.display = "block";
645
	}
646
647 518030b3 Scott Ullrich
	function show_ntp_config() {
648
		document.getElementById("showntpbox").innerHTML='';
649
		aodiv = document.getElementById('showntp');
650
		aodiv.style.display = "block";
651
	}
652 6c23757b Martin Fuchs
653 518030b3 Scott Ullrich
	function show_tftp_config() {
654
		document.getElementById("showtftpbox").innerHTML='';
655
		aodiv = document.getElementById('showtftp');
656
		aodiv.style.display = "block";
657
	}
658 6c23757b Martin Fuchs
659 518030b3 Scott Ullrich
	function show_ldap_config() {
660
		document.getElementById("showldapbox").innerHTML='';
661
		aodiv = document.getElementById('showldap');
662
		aodiv.style.display = "block";
663
	}
664 4e9cd828 Seth Mos
665 518030b3 Scott Ullrich
	function show_netboot_config() {
666
		document.getElementById("shownetbootbox").innerHTML='';
667
		aodiv = document.getElementById('shownetboot');
668
		aodiv.style.display = "block";
669
	}
670 5b237745 Scott Ullrich
</script>
671
672
<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
673 b7597d4e Bill Marquette
<?php include("fbegin.inc"); ?>
674 5b237745 Scott Ullrich
<form action="services_dhcp.php" method="post" name="iform" id="iform">
675
<?php if ($input_errors) print_input_errors($input_errors); ?>
676
<?php if ($savemsg) print_info_box($savemsg); ?>
677 de792e62 jim-p
<?php
678 0a35ca7c jim-p
	if (isset($config['dhcrelay']['enable'])) {
679 40ad67e0 Rafael Lucas
		echo gettext("DHCP Relay is currently enabled. Cannot enable the DHCP Server service while the DHCP Relay is enabled on any interface.");
680 de792e62 jim-p
		include("fend.inc");
681 3d7b7757 Chris Buechler
		echo "</body>";
682
		echo "</html>";
683
		exit;
684
	}
685
?>
686 a368a026 Ermal Lu?i
<?php if (is_subsystem_dirty('staticmaps')): ?><p>
687 44d01644 Carlos Eduardo Ramos
<?php print_info_box_np(gettext("The static mapping configuration has been changed") . ".<br>" . gettext("You must apply the changes in order for them to take effect."));?><br>
688 5b237745 Scott Ullrich
<?php endif; ?>
689
<table width="100%" border="0" cellpadding="0" cellspacing="0">
690 de792e62 jim-p
<tr><td>
691
<?php
692 f0cdf141 Scott Ullrich
	/* active tabs */
693
	$tab_array = array();
694
	$tabscounter = 0;
695
	$i = 0;
696
	foreach ($iflist as $ifent => $ifname) {
697 de792e62 jim-p
		$oc = $config['interfaces'][$ifent];
698 e5770bc2 Bill Marquette
		if ((is_array($config['dhcpd'][$ifent]) && !isset($config['dhcpd'][$ifent]['enable']) && (!is_ipaddrv4($oc['ipaddr']))) ||
699
			(!is_array($config['dhcpd'][$ifent]) && (!is_ipaddrv4($oc['ipaddr']))))
700 934240ef Ermal Luçi
			continue;
701 f0cdf141 Scott Ullrich
		if ($ifent == $if)
702
			$active = true;
703
		else
704
			$active = false;
705
		$tab_array[] = array($ifname, $active, "services_dhcp.php?if={$ifent}");
706 934240ef Ermal Luçi
		$tabscounter++;
707
	}
708
	if ($tabscounter == 0) {
709
		echo "</td></tr></table></form>";
710
		include("fend.inc");
711
		echo "</body>";
712
		echo "</html>";
713
		exit;
714 f0cdf141 Scott Ullrich
	}
715
	display_top_tabs($tab_array);
716 de792e62 jim-p
?>
717
</td></tr>
718
<tr>
719
<td>
720 d732f186 Bill Marquette
	<div id="mainarea">
721 de792e62 jim-p
		<table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0">
722 cba980f6 jim-p
			<?php if (!is_numeric($pool) && !($act == "newpool")): ?>
723 de792e62 jim-p
			<tr>
724
			<td width="22%" valign="top" class="vtable">&nbsp;</td>
725
			<td width="78%" class="vtable">
726
				<input name="enable" type="checkbox" value="yes" <?php if ($pconfig['enable']) echo "checked"; ?> onClick="enable_change(false)">
727 44d01644 Carlos Eduardo Ramos
			<strong><?php printf(gettext("Enable DHCP server on " .
728
			"%s " .
729
			"interface"),htmlspecialchars($iflist[$if]));?></strong></td>
730 de792e62 jim-p
			</tr>
731 cba980f6 jim-p
			<?php else: ?>
732
			<tr>
733
				<td colspan="2" class="listtopic"><?php echo gettext("Editing Pool-Specific Options. To return to the Interface, click its tab above."); ?></td>
734
			</tr>
735
			<?php endif; ?>
736 de792e62 jim-p
			<tr>
737
			<td width="22%" valign="top" class="vtable">&nbsp;</td>
738
			<td width="78%" class="vtable">
739
				<input name="denyunknown" id="denyunknown" type="checkbox" value="yes" <?php if ($pconfig['denyunknown']) echo "checked"; ?>>
740 40ad67e0 Rafael Lucas
				<strong><?=gettext("Deny unknown clients");?></strong><br>
741
				<?=gettext("If this is checked, only the clients defined below will get DHCP leases from this server. ");?></td>
742 de792e62 jim-p
			</tr>
743 ee1fb205 jim-p
			<?php if (is_numeric($pool) || ($act == "newpool")): ?>
744
				<tr>
745
				<td width="22%" valign="top" class="vncell"><?=gettext("Pool Description");?></td>
746
				<td width="78%" class="vtable">
747
					<input name="descr" type="text" class="formfld unknown" id="descr" size="20" value="<?=htmlspecialchars($pconfig['descr']);?>">
748
				</td>
749
				</tr>
750
			<?php endif; ?>
751 de792e62 jim-p
			<tr>
752 40ad67e0 Rafael Lucas
			<td width="22%" valign="top" class="vncellreq"><?=gettext("Subnet");?></td>
753 de792e62 jim-p
			<td width="78%" class="vtable">
754
				<?=gen_subnet($ifcfgip, $ifcfgsn);?>
755
			</td>
756
			</tr>
757
			<tr>
758 40ad67e0 Rafael Lucas
			<td width="22%" valign="top" class="vncellreq"><?=gettext("Subnet mask");?></td>
759 de792e62 jim-p
			<td width="78%" class="vtable">
760
				<?=gen_subnet_mask($ifcfgsn);?>
761
			</td>
762
			</tr>
763
			<tr>
764 40ad67e0 Rafael Lucas
			<td width="22%" valign="top" class="vncellreq"><?=gettext("Available range");?></td>
765 de792e62 jim-p
			<td width="78%" class="vtable">
766
			<?php
767
				$range_from = ip2long(long2ip32(ip2long($ifcfgip) & gen_subnet_mask_long($ifcfgsn)));
768
				$range_from++;
769
				echo long2ip32($range_from);
770
			?>
771
			-
772
			<?php
773
				$range_to = ip2long(long2ip32(ip2long($ifcfgip) | (~gen_subnet_mask_long($ifcfgsn))));
774
				$range_to--;
775
				echo long2ip32($range_to);
776
			?>
777 cba980f6 jim-p
			<?php if (is_numeric($pool) || ($act == "newpool")): ?>
778
				<br/>In-use DHCP Pool Ranges:
779
				<?php if (is_array($config['dhcpd'][$if]['range'])): ?>
780
					<br/><?php echo $config['dhcpd'][$if]['range']['from']; ?>-<?php echo $config['dhcpd'][$if]['range']['to']; ?>
781
				<?php endif; ?>
782
				<?php foreach ($a_pools as $p): ?>
783 db4fb430 jim-p
					<?php if (is_array($p['range'])): ?>
784 cba980f6 jim-p
					<br/><?php echo $p['range']['from']; ?>-<?php echo $p['range']['to']; ?>
785 db4fb430 jim-p
					<?php endif; ?>
786 cba980f6 jim-p
				<?php endforeach; ?>
787
			<?php endif; ?>
788 de792e62 jim-p
			</td>
789
			</tr>
790
			<?php if($is_olsr_enabled): ?>
791
			<tr>
792 40ad67e0 Rafael Lucas
			<td width="22%" valign="top" class="vncellreq"><?=gettext("Subnet Mask");?></td>
793 de792e62 jim-p
			<td width="78%" class="vtable">
794
				<select name="netmask" class="formselect" id="netmask">
795
				<?php
796
				for ($i = 32; $i > 0; $i--) {
797
					if($i <> 31) {
798
						echo "<option value=\"{$i}\" ";
799
						if ($i == $pconfig['netmask']) echo "selected";
800
						echo ">" . $i . "</option>";
801
					}
802
				}
803
				?>
804
				</select>
805
			</td>
806
			</tr>
807
			<?php endif; ?>
808
			<tr>
809 40ad67e0 Rafael Lucas
			<td width="22%" valign="top" class="vncellreq"><?=gettext("Range");?></td>
810 de792e62 jim-p
			<td width="78%" class="vtable">
811
				<input name="range_from" type="text" class="formfld unknown" id="range_from" size="20" value="<?=htmlspecialchars($pconfig['range_from']);?>">
812 6c235a30 Carlos Eduardo Ramos
				&nbsp;<?=gettext("to"); ?>&nbsp; <input name="range_to" type="text" class="formfld unknown" id="range_to" size="20" value="<?=htmlspecialchars($pconfig['range_to']);?>">
813 de792e62 jim-p
			</td>
814
			</tr>
815 cba980f6 jim-p
			<?php if (!is_numeric($pool) && !($act == "newpool")): ?>
816
			<tr>
817
			<td width="22%" valign="top" class="vncell"><?=gettext("Additional Pools");?></td>
818
			<td width="78%" class="vtable">
819
				<?php echo gettext("If you need additional pools of addresses inside of this subnet outside the above Range, they may be specified here."); ?>
820
				<table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0">
821
				<tr>
822 ee1fb205 jim-p
					<td width="35%" class="listhdrr"><?=gettext("Pool Start");?></td>
823
					<td width="35%" class="listhdrr"><?=gettext("Pool End");?></td>
824
					<td width="20%" class="listhdrr"><?=gettext("Description");?></td>
825 cba980f6 jim-p
					<td width="10%" class="list">
826
					<table border="0" cellspacing="0" cellpadding="1">
827
					<tr>
828
					<td valign="middle" width="17"></td>
829
					<td valign="middle"><a href="services_dhcp.php?if=<?=htmlspecialchars($if);?>&act=newpool"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0"></a></td>
830
					</tr>
831
					</table>
832
					</td>
833
				</tr>
834
					<?php if(is_array($a_pools)): ?>
835
					<?php $i = 0; foreach ($a_pools as $poolent): ?>
836
					<?php if(!empty($poolent['range']['from']) && !empty($poolent['range']['to'])): ?>
837
				<tr>
838
				<td class="listlr" ondblclick="document.location='services_dhcp.php?if=<?=htmlspecialchars($if);?>&pool=<?=$i;?>';">
839
					<?=htmlspecialchars($poolent['range']['from']);?>
840
				</td>
841
				<td class="listr" ondblclick="document.location='services_dhcp.php?if=<?=htmlspecialchars($if);?>&pool=<?=$i;?>';">
842
					<?=htmlspecialchars($poolent['range']['to']);?>&nbsp;
843
				</td>
844 ee1fb205 jim-p
				<td class="listr" ondblclick="document.location='services_dhcp.php?if=<?=htmlspecialchars($if);?>&pool=<?=$i;?>';">
845
					<?=htmlspecialchars($poolent['descr']);?>&nbsp;
846
				</td>
847 cba980f6 jim-p
				<td valign="middle" nowrap class="list">
848
					<table border="0" cellspacing="0" cellpadding="1">
849
					<tr>
850
					<td valign="middle"><a href="services_dhcp.php?if=<?=htmlspecialchars($if);?>&pool=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0"></a></td>
851
					<td valign="middle"><a href="services_dhcp.php?if=<?=htmlspecialchars($if);?>&act=delpool&id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this pool?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0"></a></td>
852
					</tr>
853
					</table>
854
				</td>
855
				</tr>
856
				<?php endif; ?>
857
				<?php $i++; endforeach; ?>
858
				<?php endif; ?>
859
				<tr>
860 ee1fb205 jim-p
				<td class="list" colspan="3"></td>
861 cba980f6 jim-p
				<td class="list">
862
					<table border="0" cellspacing="0" cellpadding="1">
863
					<tr>
864
					<td valign="middle" width="17"></td>
865
					<td valign="middle"><a href="services_dhcp.php?if=<?=htmlspecialchars($if);?>&act=newpool"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0"></a></td>
866
					</tr>
867
					</table>
868
				</td>
869
				</tr>
870
				</table>
871
			</td>
872
			</tr>
873
			<?php endif; ?>
874 de792e62 jim-p
			<tr>
875 40ad67e0 Rafael Lucas
			<td width="22%" valign="top" class="vncell"><?=gettext("WINS servers");?></td>
876 de792e62 jim-p
			<td width="78%" class="vtable">
877
				<input name="wins1" type="text" class="formfld unknown" id="wins1" size="20" value="<?=htmlspecialchars($pconfig['wins1']);?>"><br>
878
				<input name="wins2" type="text" class="formfld unknown" id="wins2" size="20" value="<?=htmlspecialchars($pconfig['wins2']);?>">
879
			</td>
880
			</tr>
881
			<tr>
882 40ad67e0 Rafael Lucas
			<td width="22%" valign="top" class="vncell"><?=gettext("DNS servers");?></td>
883 de792e62 jim-p
			<td width="78%" class="vtable">
884
				<input name="dns1" type="text" class="formfld unknown" id="dns1" size="20" value="<?=htmlspecialchars($pconfig['dns1']);?>"><br>
885
				<input name="dns2" type="text" class="formfld unknown" id="dns2" size="20" value="<?=htmlspecialchars($pconfig['dns2']);?>"><br>
886 40ad67e0 Rafael Lucas
				<?=gettext("NOTE: leave blank to use the system default DNS servers - this interface's IP if DNS forwarder is enabled, otherwise the servers configured on the General page.");?>
887 de792e62 jim-p
			</td>
888
			</tr>
889
			<tr>
890 40ad67e0 Rafael Lucas
			<td width="22%" valign="top" class="vncell"><?=gettext("Gateway");?></td>
891 de792e62 jim-p
			<td width="78%" class="vtable">
892
				<input name="gateway" type="text" class="formfld host" id="gateway" size="20" value="<?=htmlspecialchars($pconfig['gateway']);?>"><br>
893 b75d7fd5 Renato Botelho
				 <?=gettext("The default is to use the IP on this interface of the firewall as the gateway. Specify an alternate gateway here if this is not the correct gateway for your network.");?>
894 de792e62 jim-p
			</td>
895
			</tr>
896
			<tr>
897 40ad67e0 Rafael Lucas
			<td width="22%" valign="top" class="vncell"><?=gettext("Domain name");?></td>
898 de792e62 jim-p
			<td width="78%" class="vtable">
899
				<input name="domain" type="text" class="formfld unknown" id="domain" size="20" value="<?=htmlspecialchars($pconfig['domain']);?>"><br>
900 40ad67e0 Rafael Lucas
				 <?=gettext("The default is to use the domain name of this system as the default domain name provided by DHCP. You may specify an alternate domain name here.");?>
901 b75d7fd5 Renato Botelho
			</td>
902 de792e62 jim-p
			</tr>
903
			<tr>
904 40ad67e0 Rafael Lucas
			<td width="22%" valign="top" class="vncell"><?=gettext("Domain search list");?></td>
905 de792e62 jim-p
			<td width="78%" class="vtable">
906
				<input name="domainsearchlist" type="text" class="formfld unknown" id="domainsearchlist" size="20" value="<?=htmlspecialchars($pconfig['domainsearchlist']);?>"><br>
907 eab652e4 Renato Botelho
				<?=gettext("The DHCP server can optionally provide a domain search list. Use the semicolon character as separator ");?>
908 de792e62 jim-p
			</td>
909
			</tr>
910
			<tr>
911 40ad67e0 Rafael Lucas
			<td width="22%" valign="top" class="vncell"><?=gettext("Default lease time");?></td>
912 de792e62 jim-p
			<td width="78%" class="vtable">
913
				<input name="deftime" type="text" class="formfld unknown" id="deftime" size="10" value="<?=htmlspecialchars($pconfig['deftime']);?>">
914 40ad67e0 Rafael Lucas
				<?=gettext("seconds");?><br>
915 44d01644 Carlos Eduardo Ramos
				<?=gettext("This is used for clients that do not ask for a specific " .
916 16457bdd Renato Botelho
				"expiration time."); ?><br>
917
				<?=gettext("The default is 7200 seconds.");?>
918 de792e62 jim-p
			</td>
919
			</tr>
920
			<tr>
921 40ad67e0 Rafael Lucas
			<td width="22%" valign="top" class="vncell"><?=gettext("Maximum lease time");?></td>
922 de792e62 jim-p
			<td width="78%" class="vtable">
923
				<input name="maxtime" type="text" class="formfld unknown" id="maxtime" size="10" value="<?=htmlspecialchars($pconfig['maxtime']);?>">
924 40ad67e0 Rafael Lucas
				<?=gettext("seconds");?><br>
925
				<?=gettext("This is the maximum lease time for clients that ask".
926 16457bdd Renato Botelho
				" for a specific expiration time."); ?><br>
927
				<?=gettext("The default is 86400 seconds.");?>
928 de792e62 jim-p
			</td>
929
			</tr>
930 cba980f6 jim-p
			<?php if (!is_numeric($pool) && !($act == "newpool")): ?>
931 de792e62 jim-p
			<tr>
932 16457bdd Renato Botelho
			<td width="22%" valign="top" class="vncell"><?=gettext("Failover peer IP:");?></td>
933 de792e62 jim-p
			<td width="78%" class="vtable">
934 b5c78501 Seth Mos
				<input name="failover_peerip" type="text" class="formfld host" id="failover_peerip" size="20" value="<?=htmlspecialchars($pconfig['failover_peerip']);?>"><br>
935 83a9a1d2 framer99
				<?=gettext("Leave blank to disable.  Enter the interface IP address of the other machine.  Machines must be using CARP. Interface's advskew determines whether the DHCPd process is Primary or Secondary. Ensure one machine's advskew<20 (and the other is >20).");?>
936 ea166a33 Scott Ullrich
			</td>
937 518030b3 Scott Ullrich
			</tr>
938 cba980f6 jim-p
			<?php endif; ?>
939
			<?php if (!is_numeric($pool) && !($act == "newpool")): ?>
940 518030b3 Scott Ullrich
			<tr>
941 40ad67e0 Rafael Lucas
			<td width="22%" valign="top" class="vncell"><?=gettext("Static ARP");?></td>
942 de792e62 jim-p
			<td width="78%" class="vtable">
943
				<table>
944
					<tr>
945
					<td>
946
						<input valign="middle" type="checkbox" value="yes" name="staticarp" id="staticarp" <?php if($pconfig['staticarp']) echo " checked"; ?>>&nbsp;
947
					</td>
948 40ad67e0 Rafael Lucas
					<td><b><?=gettext("Enable Static ARP entries");?></b></td>
949 de792e62 jim-p
					</tr>
950
					<tr>
951
					<td>&nbsp;</td>
952
					<td>
953 808ba417 Renato Botelho
						<span class="red"><strong><?=gettext("Note:");?></strong></span> <?=gettext("This option persists even if DHCP server is disabled. Only the machines listed below will be able to communicate with the firewall on this NIC.");?>
954 de792e62 jim-p
					</td>
955
					</tr>
956
				</table>
957
			</td>
958 518030b3 Scott Ullrich
			</tr>
959 cba980f6 jim-p
			<?php endif; ?>
960
			<?php if (!is_numeric($pool) && !($act == "newpool")): ?>
961 6215694a Joecowboy
			<tr>
962
				<td width="22%" valign="top" class="vncell"><?=gettext("Time format change"); ?></td>
963
				<td width="78%" class="vtable">
964
				<table>
965
					<tr>
966
					<td>
967 f365fa90 Joecowboy
						<input name="dhcpleaseinlocaltime" type="checkbox" id="dhcpleaseinlocaltime" value="yes" <?php if ($pconfig['dhcpleaseinlocaltime']) echo "checked"; ?>>
968 6215694a Joecowboy
					</td>
969
					<td>
970
						<strong>
971
							<?=gettext("Change DHCP display lease time from UTC to local time."); ?>
972
						</strong>
973
					</td>
974
					</tr>
975
					<tr>
976
					<td>&nbsp;</td>
977
					<td>
978 b75d7fd5 Renato Botelho
						<span class="red"><strong><?=gettext("Note:");?></strong></span> <?=gettext("By default DHCP leases are displayed in UTC time.  By checking this
979 6215694a Joecowboy
						box DHCP lease time will be displayed in local time and set to time zone selected.  This will be used for all DHCP interfaces lease time."); ?>
980
					</td>
981
					</tr>
982
				</table>
983
				</td>
984
			</tr>
985 cba980f6 jim-p
			<?php endif; ?>
986 518030b3 Scott Ullrich
			<tr>
987 40ad67e0 Rafael Lucas
			<td width="22%" valign="top" class="vncell"><?=gettext("Dynamic DNS");?></td>
988 de792e62 jim-p
			<td width="78%" class="vtable">
989
				<div id="showddnsbox">
990 44d01644 Carlos Eduardo Ramos
					<input type="button" onClick="show_ddns_config()" value="<?=gettext("Advanced");?>"></input> - <?=gettext("Show Dynamic DNS");?></a>
991 de792e62 jim-p
				</div>
992
				<div id="showddns" style="display:none">
993
					<input valign="middle" type="checkbox" value="yes" name="ddnsupdate" id="ddnsupdate" <?php if($pconfig['ddnsupdate']) echo " checked"; ?>>&nbsp;
994 40ad67e0 Rafael Lucas
					<b><?=gettext("Enable registration of DHCP client names in DNS.");?></b><br />
995 de792e62 jim-p
					<p>
996
					<input name="ddnsdomain" type="text" class="formfld unknown" id="ddnsdomain" size="20" value="<?=htmlspecialchars($pconfig['ddnsdomain']);?>"><br />
997 16457bdd Renato Botelho
					<?=gettext("Note: Leave blank to disable dynamic DNS registration.");?><br />
998
					<?=gettext("Enter the dynamic DNS domain which will be used to register client names in the DNS server.");?>
999 de792e62 jim-p
				</div>
1000
			</td>
1001
			</tr>
1002 518030b3 Scott Ullrich
			<tr>
1003 1f1a08c8 jim-p
			<td width="22%" valign="top" class="vncell"><?=gettext("MAC Address Control");?></td>
1004
			<td width="78%" class="vtable">
1005
				<div id="showmaccontrolbox">
1006
					<input type="button" onClick="show_maccontrol_config()" value="<?=gettext("Advanced");?>"></input> - <?=gettext("Show MAC Address Control");?></a>
1007
				</div>
1008
				<div id="showmaccontrol" style="display:none">
1009
					<input name="mac_allow" type="text" class="formfld unknown" id="mac_allow" size="20" value="<?=htmlspecialchars($pconfig['mac_allow']);?>"><br />
1010
					<?=gettext("Enter a list of partial MAC addresses to allow, comma separated, no spaces, such as ");?>00:00:00,01:E5:FF
1011
					<input name="mac_deny" type="text" class="formfld unknown" id="mac_deny" size="20" value="<?=htmlspecialchars($pconfig['mac_deny']);?>"><br />
1012
					<?=gettext("Enter a list of partial MAC addresses to deny access, comma separated, no spaces, such as ");?>00:00:00,01:E5:FF
1013
				</div>
1014
			</td>
1015
			</tr>
1016
			<tr>
1017 40ad67e0 Rafael Lucas
			<td width="22%" valign="top" class="vncell"><?=gettext("NTP servers");?></td>
1018 de792e62 jim-p
			<td width="78%" class="vtable">
1019 ad171999 Seth Mos
				<div id="showntpbox">
1020 44d01644 Carlos Eduardo Ramos
					<input type="button" onClick="show_ntp_config()" value="<?=gettext("Advanced");?>"></input> - <?=gettext("Show NTP configuration");?></a>
1021 ad171999 Seth Mos
				</div>
1022
				<div id="showntp" style="display:none">
1023 b5c78501 Seth Mos
					<input name="ntp1" type="text" class="formfld unknown" id="ntp1" size="20" value="<?=htmlspecialchars($pconfig['ntp1']);?>"><br>
1024
					<input name="ntp2" type="text" class="formfld unknown" id="ntp2" size="20" value="<?=htmlspecialchars($pconfig['ntp2']);?>">
1025 ad171999 Seth Mos
				</div>
1026
			</td>
1027 518030b3 Scott Ullrich
			</tr>
1028
			<tr>
1029 40ad67e0 Rafael Lucas
			<td width="22%" valign="top" class="vncell"><?=gettext("TFTP server");?></td>
1030 de792e62 jim-p
			<td width="78%" class="vtable">
1031
			<div id="showtftpbox">
1032 44d01644 Carlos Eduardo Ramos
				<input type="button" onClick="show_tftp_config()" value="<?=gettext("Advanced");?>"></input> - <?=gettext("Show TFTP configuration");?></a>
1033 de792e62 jim-p
			</div>
1034
			<div id="showtftp" style="display:none">
1035
				<input name="tftp" type="text" class="formfld unknown" id="tftp" size="50" value="<?=htmlspecialchars($pconfig['tftp']);?>"><br>
1036 40ad67e0 Rafael Lucas
				<?=gettext("Leave blank to disable.  Enter a full hostname or IP for the TFTP server.");?>
1037 de792e62 jim-p
			</div>
1038 6c23757b Martin Fuchs
			</td>
1039 518030b3 Scott Ullrich
			</tr>
1040
			<tr>
1041 40ad67e0 Rafael Lucas
			<td width="22%" valign="top" class="vncell"><?=gettext("LDAP URI");?></td>
1042 de792e62 jim-p
			<td width="78%" class="vtable">
1043
				<div id="showldapbox">
1044 44d01644 Carlos Eduardo Ramos
					<input type="button" onClick="show_ldap_config()" value="<?=gettext("Advanced");?>"></input> - <?=gettext("Show LDAP configuration");?></a>
1045 de792e62 jim-p
				</div>
1046
				<div id="showldap" style="display:none">
1047
					<input name="ldap" type="text" class="formfld unknown" id="ldap" size="80" value="<?=htmlspecialchars($pconfig['ldap']);?>"><br>
1048 40ad67e0 Rafael Lucas
					<?=gettext("Leave blank to disable.  Enter a full URI for the LDAP server in the form ldap://ldap.example.com/dc=example,dc=com");?>
1049 de792e62 jim-p
				</div>
1050
			</td>
1051 518030b3 Scott Ullrich
			</tr>
1052
			<tr>
1053 40ad67e0 Rafael Lucas
			<td width="22%" valign="top" class="vncell"><?=gettext("Enable network booting");?></td>
1054 de792e62 jim-p
			<td width="78%" class="vtable">
1055
				<div id="shownetbootbox">
1056 44d01644 Carlos Eduardo Ramos
					<input type="button" onClick="show_netboot_config()" value="<?=gettext("Advanced");?>"></input> - <?=gettext("Show Network booting");?></a>
1057 de792e62 jim-p
				</div>
1058
				<div id="shownetboot" style="display:none">
1059
					<input valign="middle" type="checkbox" value="yes" name="netboot" id="netboot" <?php if($pconfig['netboot']) echo " checked"; ?>>&nbsp;
1060 40ad67e0 Rafael Lucas
					<b><?=gettext("Enables network booting.");?></b>
1061 de792e62 jim-p
					<p>
1062 44d01644 Carlos Eduardo Ramos
					<?=gettext("Enter the IP of the"); ?> <b><?=gettext("next-server"); ?></b>
1063 de792e62 jim-p
					<input name="nextserver" type="text" class="formfld unknown" id="nextserver" size="20" value="<?=htmlspecialchars($pconfig['nextserver']);?>">
1064 40ad67e0 Rafael Lucas
					<?=gettext("and the filename");?>
1065 de792e62 jim-p
					<input name="filename" type="text" class="formfld unknown" id="filename" size="20" value="<?=htmlspecialchars($pconfig['filename']);?>"><br>
1066 40ad67e0 Rafael Lucas
					<?=gettext("Note: You need both a filename and a boot server configured for this to work!");?>
1067 de792e62 jim-p
					<p>
1068 44d01644 Carlos Eduardo Ramos
					<?=gettext("Enter the"); ?> <b><?=gettext("root-path"); ?></b>-<?=gettext("string");?>
1069 de792e62 jim-p
					<input name="rootpath" type="text" class="formfld unknown" id="rootpath" size="90" value="<?=htmlspecialchars($pconfig['rootpath']);?>"><br>
1070 40ad67e0 Rafael Lucas
					<?=gettext("Note: string-format: iscsi:(servername):(protocol):(port):(LUN):targetname");?>
1071 de792e62 jim-p
				</div>
1072 4e9cd828 Seth Mos
			</td>
1073 518030b3 Scott Ullrich
			</tr>
1074 cba980f6 jim-p
			<?php if (!is_numeric($pool) && !($act == "newpool")): ?>
1075 518030b3 Scott Ullrich
			<tr>
1076 40ad67e0 Rafael Lucas
			<td width="22%" valign="top" class="vncell"><?=gettext("Additional BOOTP/DHCP Options");?></td>
1077 de792e62 jim-p
			<td width="78%" class="vtable">
1078
				<div id="shownumbervaluebox">
1079 44d01644 Carlos Eduardo Ramos
					<input type="button" onClick="show_shownumbervalue()" value="<?=gettext("Advanced");?>"></input> - <?=gettext("Show Additional BOOTP/DHCP Options");?></a>
1080 de792e62 jim-p
				</div>
1081
				<div id="shownumbervalue" style="display:none">
1082
				<table id="maintable">
1083
				<tbody>
1084
				<tr>
1085
				<td colspan="3">
1086
					<div style="padding:5px; margin-top: 16px; margin-bottom: 16px; border:1px dashed #000066; background-color: #ffffff; color: #000000; font-size: 8pt;" id="itemhelp">
1087 44d01644 Carlos Eduardo Ramos
					<?=gettext("Enter the DHCP option number and the value for each item you would like to include in the DHCP lease information.  For a list of available options please visit this"); ?> <a href="http://www.iana.org/assignments/bootp-dhcp-parameters/" target="_new"><?=gettext("URL"); ?></a>
1088 b1d132f5 Scott Ullrich
					</div>
1089 de792e62 jim-p
				</td>
1090
				</tr>
1091
				<tr>
1092 40ad67e0 Rafael Lucas
				<td><div id="onecolumn"><?=gettext("Number");?></div></td>
1093 678dfd0f Erik Fonnesbeck
				<td><div id="twocolumn"><?=gettext("Type");?></div></td>
1094
				<td><div id="threecolumn"><?=gettext("Value");?></div></td>
1095 de792e62 jim-p
				</tr>
1096 518030b3 Scott Ullrich
				<?php $counter = 0; ?>
1097 de792e62 jim-p
				<?php
1098 518030b3 Scott Ullrich
					if($pconfig['numberoptions'])
1099 de792e62 jim-p
						foreach($pconfig['numberoptions']['item'] as $item):
1100 518030b3 Scott Ullrich
				?>
1101
					<?php
1102
						$number = $item['number'];
1103 678dfd0f Erik Fonnesbeck
						$itemtype = $item['type'];
1104 518030b3 Scott Ullrich
						$value = $item['value'];
1105
					?>
1106 de792e62 jim-p
				<tr>
1107
				<td>
1108 3440de72 Erik Fonnesbeck
					<input autocomplete="off" name="number<?php echo $counter; ?>" type="text" class="formfld unknown" id="number<?php echo $counter; ?>" size="10" value="<?=htmlspecialchars($number);?>" />
1109 de792e62 jim-p
				</td>
1110
				<td>
1111 678dfd0f Erik Fonnesbeck
					<select name="itemtype<?php echo $counter; ?>" class="formselect" id="itemtype<?php echo $counter; ?>">
1112
					<?php
1113
					foreach ($customitemtypes as $typename => $typedescr) {
1114
						echo "<option value=\"{$typename}\" ";
1115
						if ($itemtype == $typename) echo "selected";
1116
						echo ">" . $typedescr . "</option>";
1117
					}
1118
					?>
1119
					</select>
1120
				</td>
1121
				<td>
1122 3440de72 Erik Fonnesbeck
					<input autocomplete="off" name="value<?php echo $counter; ?>" type="text" class="formfld unknown" id="value<?php echo $counter; ?>" size="40" value="<?=htmlspecialchars($value);?>" />
1123 de792e62 jim-p
				</td>
1124
				<td>
1125 bddc8818 Erik Fonnesbeck
					<a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/<?echo $g['theme'];?>/images/icons/icon_x.gif" /></a>
1126 de792e62 jim-p
				</td>
1127
				</tr>
1128 518030b3 Scott Ullrich
				<?php $counter++; ?>
1129
				<?php endforeach; ?>
1130 de792e62 jim-p
				</tbody>
1131
				<tfoot>
1132
				</tfoot>
1133 518030b3 Scott Ullrich
				</table>
1134
				<a onclick="javascript:addRowTo('maintable', 'formfldalias'); return false;" href="#">
1135 40ad67e0 Rafael Lucas
					<img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="" title="<?=gettext("add another entry");?>" />
1136 518030b3 Scott Ullrich
				</a>
1137
				<script type="text/javascript">
1138 678dfd0f Erik Fonnesbeck
					field_counter_js = 3;
1139 518030b3 Scott Ullrich
					rows = 1;
1140
					totalrows = <?php echo $counter; ?>;
1141
					loaded = <?php echo $counter; ?>;
1142
				</script>
1143 b1d132f5 Scott Ullrich
				</div>
1144 518030b3 Scott Ullrich
1145
				</td>
1146
			</tr>
1147 cba980f6 jim-p
			<?php endif; ?>
1148 518030b3 Scott Ullrich
			<tr>
1149 de792e62 jim-p
			<td width="22%" valign="top">&nbsp;</td>
1150
			<td width="78%">
1151 cba980f6 jim-p
				<?php if ($act == "newpool"): ?>
1152
				<input type="hidden" name="act" value="newpool">
1153
				<?php endif; ?>
1154
				<?php if (is_numeric($pool)): ?>
1155
				<input type="hidden" name="pool" value="<?php echo $pool; ?>">
1156
				<?php endif; ?>
1157 dd5bf424 Scott Ullrich
				<input name="if" type="hidden" value="<?=htmlspecialchars($if);?>">
1158 40ad67e0 Rafael Lucas
				<input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" onclick="enable_change(true)">
1159 de792e62 jim-p
			</td>
1160
			</tr>
1161
			<tr>
1162
			<td width="22%" valign="top">&nbsp;</td>
1163 16457bdd Renato Botelho
			<td width="78%"> <p><span class="vexpl"><span class="red"><strong><?=gettext("Note:");?><br>
1164 6c235a30 Carlos Eduardo Ramos
				</strong></span><?=gettext("The DNS servers entered in"); ?> <a href="system.php"><?=gettext("System: " .
1165
				"General setup"); ?></a> <?=gettext("(or the"); ?> <a href="services_dnsmasq.php"><?=gettext("DNS " .
1166
				"forwarder"); ?></a>, <?=gettext("if enabled)"); ?> </span><span class="vexpl"><?=gettext("will " .
1167 16457bdd Renato Botelho
				"be assigned to clients by the DHCP server."); ?><br>
1168 de792e62 jim-p
				<br>
1169 44d01644 Carlos Eduardo Ramos
				<?=gettext("The DHCP lease table can be viewed on the"); ?> <a href="status_dhcp_leases.php"><?=gettext("Status: " .
1170 16457bdd Renato Botelho
				"DHCP leases"); ?></a> <?=gettext("page."); ?><br>
1171 de792e62 jim-p
				</span></p>
1172
			</td>
1173 518030b3 Scott Ullrich
			</tr>
1174
		</table>
1175 0d1b26ee jim-p
		<?php if (!is_numeric($pool) && !($act == "newpool")): ?>
1176 282f7bfc Scott Ullrich
		<table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0">
1177 f2ea45ef jim-p
		<tr>
1178
			<td colspan="5" valign="top" class="listtopic"><?=gettext("DHCP Static Mappings for this interface.");?></td>
1179
			<td>&nbsp;</td>
1180
		</tr>
1181 518030b3 Scott Ullrich
		<tr>
1182 25c1ebd5 N0YB
			<td width="7%" class="listhdrr"><?=gettext("Static ARP");?></td>
1183
			<td width="18%" class="listhdrr"><?=gettext("MAC address");?></td>
1184 40ad67e0 Rafael Lucas
			<td width="15%" class="listhdrr"><?=gettext("IP address");?></td>
1185
			<td width="20%" class="listhdrr"><?=gettext("Hostname");?></td>
1186
			<td width="30%" class="listhdr"><?=gettext("Description");?></td>
1187 518030b3 Scott Ullrich
			<td width="10%" class="list">
1188
			<table border="0" cellspacing="0" cellpadding="1">
1189 de792e62 jim-p
			<tr>
1190 d415d821 Seth Mos
			<td valign="middle" width="17"></td>
1191 dd5bf424 Scott Ullrich
			<td valign="middle"><a href="services_dhcp_edit.php?if=<?=htmlspecialchars($if);?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0"></a></td>
1192 518030b3 Scott Ullrich
			</tr>
1193
			</table>
1194
			</td>
1195 2af4c579 Scott Ullrich
		</tr>
1196 de792e62 jim-p
			<?php if(is_array($a_maps)): ?>
1197
			<?php $i = 0; foreach ($a_maps as $mapent): ?>
1198
			<?php if($mapent['mac'] <> "" or $mapent['ipaddr'] <> ""): ?>
1199
		<tr>
1200 25c1ebd5 N0YB
		<td align="center" class="listlr" ondblclick="document.location='services_dhcp_edit.php?if=<?=htmlspecialchars($if);?>&id=<?=$i;?>';">
1201
			<?php if (isset($mapent['arp_table_static_entry'])): ?>
1202
				<img src="./themes/<?= $g['theme']; ?>/images/icons/icon_alert.gif" alt="ARP Table Static Entry" width="17" height="17" border="0">
1203
			<?php endif; ?>
1204
		</td>
1205 dd5bf424 Scott Ullrich
		<td class="listlr" ondblclick="document.location='services_dhcp_edit.php?if=<?=htmlspecialchars($if);?>&id=<?=$i;?>';">
1206 de792e62 jim-p
			<?=htmlspecialchars($mapent['mac']);?>
1207
		</td>
1208 dd5bf424 Scott Ullrich
		<td class="listr" ondblclick="document.location='services_dhcp_edit.php?if=<?=htmlspecialchars($if);?>&id=<?=$i;?>';">
1209 de792e62 jim-p
			<?=htmlspecialchars($mapent['ipaddr']);?>&nbsp;
1210
		</td>
1211 dd5bf424 Scott Ullrich
		<td class="listr" ondblclick="document.location='services_dhcp_edit.php?if=<?=htmlspecialchars($if);?>&id=<?=$i;?>';">
1212 de792e62 jim-p
			<?=htmlspecialchars($mapent['hostname']);?>&nbsp;
1213
		</td>
1214 dd5bf424 Scott Ullrich
		<td class="listbg" ondblclick="document.location='services_dhcp_edit.php?if=<?=htmlspecialchars($if);?>&id=<?=$i;?>';">
1215 de792e62 jim-p
			<?=htmlspecialchars($mapent['descr']);?>&nbsp;
1216
		</td>
1217
		<td valign="middle" nowrap class="list">
1218
			<table border="0" cellspacing="0" cellpadding="1">
1219
			<tr>
1220 dd5bf424 Scott Ullrich
			<td valign="middle"><a href="services_dhcp_edit.php?if=<?=htmlspecialchars($if);?>&id=<?=$i;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0"></a></td>
1221
			<td valign="middle"><a href="services_dhcp.php?if=<?=htmlspecialchars($if);?>&act=del&id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this mapping?");?>')"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0"></a></td>
1222 de792e62 jim-p
			</tr>
1223
			</table>
1224
		</td>
1225
		</tr>
1226 6f5b2c3e Scott Ullrich
		<?php endif; ?>
1227 75a70796 Bill Marquette
		<?php $i++; endforeach; ?>
1228 6f5b2c3e Scott Ullrich
		<?php endif; ?>
1229 de792e62 jim-p
		<tr>
1230 25c1ebd5 N0YB
		<td class="list" colspan="5"></td>
1231 de792e62 jim-p
		<td class="list">
1232
			<table border="0" cellspacing="0" cellpadding="1">
1233
			<tr>
1234 d415d821 Seth Mos
			<td valign="middle" width="17"></td>
1235 dd5bf424 Scott Ullrich
			<td valign="middle"><a href="services_dhcp_edit.php?if=<?=htmlspecialchars($if);?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0"></a></td>
1236 de792e62 jim-p
			</tr>
1237
			</table>
1238
		</td>
1239
		</tr>
1240
		</table>
1241 0d1b26ee jim-p
		<?php endif; ?>
1242 d732f186 Bill Marquette
	</div>
1243 de792e62 jim-p
</td>
1244
</tr>
1245 5b237745 Scott Ullrich
</table>
1246
</form>
1247
<script language="JavaScript">
1248
<!--
1249
enable_change(false);
1250
//-->
1251
</script>
1252 b7597d4e Bill Marquette
<?php include("fend.inc"); ?>
1253 5b237745 Scott Ullrich
</body>
1254
</html>