Project

General

Profile

Download (17.7 KB) Statistics
| Branch: | Tag: | Revision:
1
#!/usr/local/bin/php
2
<?php
3
/* $Id$ */
4
/*
5
	interfaces_opt.php
6
	part of m0n0wall (http://m0n0.ch/wall)
7

    
8
	Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
9
	All rights reserved.
10

    
11
	Redistribution and use in source and binary forms, with or without
12
	modification, are permitted provided that the following conditions are met:
13

    
14
	1. Redistributions of source code must retain the above copyright notice,
15
	   this list of conditions and the following disclaimer.
16

    
17
	2. Redistributions in binary form must reproduce the above copyright
18
	   notice, this list of conditions and the following disclaimer in the
19
	   documentation and/or other materials provided with the distribution.
20

    
21
	THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
22
	INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
23
	AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24
	AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
25
	OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26
	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
	POSSIBILITY OF SUCH DAMAGE.
31
*/
32

    
33
require("guiconfig.inc");
34

    
35
unset($index);
36
if ($_GET['index'])
37
	$index = $_GET['index'];
38
else if ($_POST['index'])
39
	$index = $_POST['index'];
40

    
41
if (!$index)
42
	exit;
43

    
44
function remove_bad_chars($string) {
45
	return preg_replace('/[^a-z|_|0-9]/i','',$string);
46
}
47

    
48
$optcfg = &$config['interfaces']['opt' . $index];
49
$optcfg['descr'] = remove_bad_chars($optcfg['descr']);
50

    
51
$pconfig['descr'] = $optcfg['descr'];
52
$pconfig['bridge'] = $optcfg['bridge'];
53

    
54
$pconfig['bandwidth'] = $optcfg['bandwidth'];
55
$pconfig['bandwidthtype'] = $optcfg['bandwidthtype'];
56

    
57
$pconfig['enable'] = isset($optcfg['enable']);
58

    
59
$pconfig['blockpriv'] = isset($optcfg['blockpriv']);
60
$pconfig['blockbogons'] = isset($optcfg['blockbogons']);
61
$pconfig['spoofmac'] = $optcfg['spoofmac'];
62
$pconfig['mtu'] = $optcfg['mtu'];
63

    
64
$pconfig['disableftpproxy'] = isset($optcfg['disableftpproxy']);
65

    
66
/* Wireless interface? */
67
if (isset($optcfg['wireless'])) {
68
	require("interfaces_wlan.inc");
69
	wireless_config_init();
70
}
71

    
72
if ($optcfg['ipaddr'] == "dhcp") {
73
	$pconfig['type'] = "DHCP";
74
	$pconfig['dhcphostname'] = $optcfg['dhcphostname'];
75
} else {
76
	$pconfig['type'] = "Static";
77
	$pconfig['ipaddr'] = $optcfg['ipaddr'];
78
	$pconfig['subnet'] = $optcfg['subnet'];
79
	$pconfig['gateway'] = $optcfg['gateway'];
80
	$pconfig['pointtopoint'] = $optcfg['pointtopoint'];
81
}
82

    
83
if ($_POST) {
84

    
85
	unset($input_errors);
86

    
87
	/* filter out spaces from descriptions  */
88
	$POST['descr'] = remove_bad_chars($POST['descr']);
89

    
90
	$pconfig = $_POST;
91

    
92
	/* input validation */
93
	if ($_POST['enable']) {
94

    
95
		/* description unique? */
96
		for ($i = 1; isset($config['interfaces']['opt' . $i]); $i++) {
97
			if ($i != $index) {
98
				if ($config['interfaces']['opt' . $i]['descr'] == $_POST['descr']) {
99
					$input_errors[] = "An interface with the specified description already exists.";
100
				}
101
			}
102
		}
103

    
104
		if ($_POST['bridge']) {
105
			/* double bridging? */
106
			for ($i = 1; isset($config['interfaces']['opt' . $i]); $i++) {
107
				if ($i != $index) {
108
					if ($config['interfaces']['opt' . $i]['bridge'] == $_POST['bridge']) {
109
						//$input_errors[] = "Optional interface {$i} " .
110
						//	"({$config['interfaces']['opt' . $i]['descr']}) is already bridged to " .
111
						//	"the specified interface.";
112
					} else if ($config['interfaces']['opt' . $i]['bridge'] == "opt{$index}") {
113
						//$input_errors[] = "Optional interface {$i} " .
114
						//	"({$config['interfaces']['opt' . $i]['descr']}) is already bridged to " .
115
						//	"this interface.";
116
					}
117
				}
118
			}
119
			if ($config['interfaces'][$_POST['bridge']]['bridge']) {
120
				//$input_errors[] = "The specified interface is already bridged to " .
121
				//	"another interface.";
122
			}
123
			/* captive portal on? */
124
			if (isset($config['captiveportal']['enable'])) {
125
				//$input_errors[] = "Interfaces cannot be bridged while the captive portal is enabled.";
126
			}
127
		} else {
128
			if ($_POST['type'] <> "DHCP") {
129
				$reqdfields = explode(" ", "descr ipaddr subnet");
130
				$reqdfieldsn = explode(",", "Description,IP address,Subnet bit count");
131
				do_input_validation($_POST, $reqdfields, $reqdfieldsn, &$input_errors);
132
				if (($_POST['ipaddr'] && !is_ipaddr($_POST['ipaddr']))) {
133
					$input_errors[] = "A valid IP address must be specified.";
134
				}
135
				if (($_POST['subnet'] && !is_numeric($_POST['subnet']))) {
136
					$input_errors[] = "A valid subnet bit count must be specified.";
137
				}
138
				if($_POST['gateway'] <> "" && !is_ipaddr($_POST['gateway'])) {
139
					$input_errors[] = "A valid gateway must be specified.";
140
				}
141
			}
142
		}
143
	        if ($_POST['mtu'] && (($_POST['mtu'] < 576) || ($_POST['mtu'] > 1500))) {
144
			$input_errors[] = "The MTU must be between 576 and 1500 bytes.";
145
		}		
146
		if($_POST['bandwidth'] <> "" && !is_numeric($_POST['bandwidth'])) {
147
			$input_errors[] = "A valid bandwidth value is required 1-999999.";
148
		}
149
		if (($_POST['spoofmac'] && !is_macaddr($_POST['spoofmac']))) {
150
			$input_errors[] = "A valid MAC address must be specified.";
151
		}		
152
	}
153

    
154
	if($_POST['mtu']) {
155
		if($_POST['mtu'] < 24 or $_POST['mtu'] > 1501)
156
			$input_errors[] = "A valid MTU is required 24-1500.";
157
	}
158
	
159
	/* Wireless interface? */
160
	if (isset($optcfg['wireless'])) {
161
		$wi_input_errors = wireless_config_post();
162
		if ($wi_input_errors) {
163
			$input_errors = array_merge($input_errors, $wi_input_errors);
164
		}
165
	}
166

    
167
	if (!$input_errors) {
168

    
169
		$bridge = discover_bridge($optcfg['if'], filter_translate_type_to_real_interface($optcfg['bridge']));
170
		if($bridge <> "-1") {
171
			destroy_bridge($bridge);
172
		}
173

    
174
		unset($optcfg['dhcphostname']);
175
		unset($optcfg['disableftpproxy']);
176
		
177
		/* per interface pftpx helper */
178
		if($_POST['disableftpproxy'] == "yes") {
179
			$optcfg['disableftpproxy'] = true;
180
			system_start_ftp_helpers();
181
		} else {			
182
			system_start_ftp_helpers();
183
		}		
184

    
185
		$optcfg['descr'] = remove_bad_chars($_POST['descr']);
186
		$optcfg['bridge'] = $_POST['bridge'];
187
		$optcfg['enable'] = $_POST['enable'] ? true : false;
188
		
189
		if($_POST['bandwidth'] <> "" and $_POST['bandwidthtype'] <> "") {
190
			$optcfg['bandwidth'] = $_POST['bandwidth'];
191
			$optcfg['bandwidthtype'] = $_POST['bandwidthtype'];
192
		} else {
193
			unset($optcfg['bandwidth']);
194
			unset($optcfg['bandwidthtype']);
195
		}
196

    
197
		if ($_POST['type'] == "Static") {
198
			$optcfg['ipaddr'] = $_POST['ipaddr'];
199
			$optcfg['subnet'] = $_POST['subnet'];
200
			$optcfg['gateway'] = $_POST['gateway'];
201
			if (isset($optcfg['ispointtopoint']))
202
				$optcfg['pointtopoint'] = $_POST['pointtopoint'];
203
		} else if ($_POST['type'] == "DHCP") {
204
			$optcfg['ipaddr'] = "dhcp";
205
			$optcfg['dhcphostname'] = $_POST['dhcphostname'];
206
		}
207

    
208
		$optcfg['blockpriv'] = $_POST['blockpriv'] ? true : false;
209
		$optcfg['blockbogons'] = $_POST['blockbogons'] ? true : false;
210
		$optcfg['spoofmac'] = $_POST['spoofmac'];
211
		$optcfg['mtu'] = $_POST['mtu'];
212

    
213
		write_config();
214

    
215
		$retval = interfaces_optional_configure();
216

    
217
		/* is this the captive portal interface? */
218
		if (isset($config['captiveportal']['enable']) &&
219
			($config['captiveportal']['interface'] == ('opt' . $index))) {
220
			captiveportal_configure();
221
		}
222
		
223
		/* setup carp interfaces */
224
		interfaces_carp_configure();
225

    
226
		/* sync filter configuration */
227
		filter_configure();
228

    
229
		$savemsg = get_std_save_message($retval);
230
	}
231
}
232

    
233

    
234
$pgtitle = "Interfaces: Optional {$index} (" . htmlspecialchars($optcfg['descr']) . ")";
235
include("head.inc");
236

    
237
?>
238

    
239
<script type="text/javascript" language="javascript" src="ip_helper.js">
240
</script>
241
<script language="JavaScript">
242
<!--
243
function enable_change(enable_over) {
244
	var endis;
245
	endis = !((document.iform.bridge.selectedIndex == 0) || enable_over);
246
	document.iform.ipaddr.disabled = endis;
247
	document.iform.subnet.disabled = endis;
248
}
249
function ipaddr_change() {
250
	document.iform.subnet.selectedIndex = gen_bits_opt(document.iform.ipaddr.value);
251
}
252
function type_change(enable_change,enable_change_pptp) {
253
	switch (document.iform.type.selectedIndex) {
254
		case 0:
255
			document.iform.ipaddr.type.disabled = 0;
256
			document.iform.ipaddr.disabled = 0;
257
			document.iform.subnet.disabled = 0;
258
			document.iform.gateway.disabled = 0;
259
			break;
260
		case 1:
261
			document.iform.ipaddr.type.disabled = 1;
262
			document.iform.ipaddr.disabled = 1;
263
			document.iform.subnet.disabled = 1;
264
			document.iform.gateway.disabled = 1;
265
			break;
266
	}
267
}
268
//-->
269
</script>
270

    
271
<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
272
<?php include("fbegin.inc"); ?>
273
<p class="pgtitle"><?=$pgtitle?></p>
274
<?php if ($input_errors) print_input_errors($input_errors); ?>
275
<?php if ($savemsg) print_info_box($savemsg); ?>
276
<?php if ($optcfg['if']): ?>
277
            <form action="interfaces_opt.php" method="post" name="iform" id="iform">
278
              <table width="100%" border="0" cellpadding="6" cellspacing="0">
279
                <tr>
280
                  <td colspan="2" valign="top" class="listtopic">Optional Interface Configuration</td>
281
                </tr>	      
282
                <tr>
283
                  <td width="22%" valign="top" class="vtable">&nbsp;</td>
284
                  <td width="78%" class="vtable">
285
			<input name="enable" type="checkbox" value="yes" <?php if ($pconfig['enable']) echo "checked"; ?> onClick="enable_change(false)">
286
                    <strong>Enable Optional <?=$index;?> interface</strong></td>
287
		</tr>
288
                <tr>
289
                  <td width="22%" valign="top" class="vncell">Description</td>
290
                  <td width="78%" class="vtable">
291
                    <input name="descr" type="text" class="formfld" id="descr" size="30" value="<?=htmlspecialchars($pconfig['descr']);?>">
292
					<br> <span class="vexpl">Enter a description (name) for the interface here.</span>
293
		  </td>
294
		</tr>
295

    
296
                <tr>
297
                  <td colspan="2" valign="top" height="16"></td>
298
                </tr>
299
                <tr>
300
                  <td colspan="2" valign="top" class="listtopic">General configuration</td>
301
                </tr>
302
                <tr>
303
                  <td valign="middle" class="vncell"><strong>Type</strong></td>
304
                  <td class="vtable"> <select name="type" class="formfld" id="type" onchange="type_change()">
305
                      <?php $opts = split(" ", "Static DHCP");
306
				foreach ($opts as $opt): ?>
307
                      <option <?php if ($opt == $pconfig['type']) echo "selected";?>>
308
                      <?=htmlspecialchars($opt);?>
309
                      </option>
310
                      <?php endforeach; ?>
311
                    </select></td>
312
                </tr>
313
                <tr>
314
                  <td valign="top" class="vncell">MAC address</td>
315
                  <td class="vtable"> <input name="spoofmac" type="text" class="formfld" id="spoofmac" size="30" value="<?=htmlspecialchars($pconfig['spoofmac']);?>">
316
		    <?php
317
			$ip = getenv('REMOTE_ADDR');
318
			$mac = `/usr/sbin/arp -an | grep {$ip} | cut -d" " -f4`;
319
			$mac = str_replace("\n","",$mac);
320
		    ?>
321
		    <a OnClick="document.forms[0].spoofmac.value='<?=$mac?>';" href="#">Copy my MAC address</a>   
322
		    <br>
323
                    This field can be used to modify (&quot;spoof&quot;) the MAC
324
                    address of the WAN interface<br>
325
                    (may be required with some cable connections)<br>
326
                    Enter a MAC address in the following format: xx:xx:xx:xx:xx:xx
327
                    or leave blank</td>
328
                </tr>
329
                <tr>
330
                  <td valign="top" class="vncell">MTU</td>
331
                  <td class="vtable"> <input name="mtu" type="text" class="formfld" id="mtu" size="8" value="<?=htmlspecialchars($pconfig['mtu']);?>">
332
                    <br>
333
                    If you enter a value in this field, then MSS clamping for
334
                    TCP connections to the value entered above minus 40 (TCP/IP
335
                    header size) will be in effect. If you leave this field blank,
336
                    an MTU of 1492 bytes for PPPoE and 1500 bytes for all other
337
                    connection types will be assumed.</td>
338
                </tr>
339
		
340
                <tr>
341
                  <td colspan="2" valign="top" height="16"></td>
342
		</tr>
343
		<tr>
344
                  <td colspan="2" valign="top" class="listtopic">IP configuration</td>
345
		</tr>
346
		<tr>
347
                  <td width="22%" valign="top" class="vncellreq">Bridge with</td>
348
                  <td width="78%" class="vtable">
349
			<select name="bridge" class="formfld" id="bridge" onChange="enable_change(false)">
350
				  	<option <?php if (!$pconfig['bridge']) echo "selected";?> value="">none</option>
351
                      <?php $opts = array('lan' => "LAN", 'wan' => "WAN");
352
					  	for ($i = 1; isset($config['interfaces']['opt' . $i]); $i++) {
353
							if ($i != $index)
354
								$opts['opt' . $i] = "Optional " . $i . " (" .
355
									$config['interfaces']['opt' . $i]['descr'] . ")";
356
						}
357
					foreach ($opts as $opt => $optname): ?>
358
                      <option <?php if ($opt == $pconfig['bridge']) echo "selected";?> value="<?=htmlspecialchars($opt);?>">
359
                      <?=htmlspecialchars($optname);?>
360
                      </option>
361
                      <?php endforeach; ?>
362
                    </select> </td>
363
		</tr>
364
                <tr>
365
                  <td width="22%" valign="top" class="vncellreq">IP address</td>
366
                  <td width="78%" class="vtable">
367
                    <input name="ipaddr" type="text" class="formfld" id="ipaddr" size="20" value="<?=htmlspecialchars($pconfig['ipaddr']);?>" onchange="ipaddr_change()">
368
                    /
369
                	<select name="subnet" class="formfld" id="subnet">
370
					<?php
371
					for ($i = 32; $i > 0; $i--) {
372
						if($i <> 31) {
373
							echo "<option value=\"{$i}\" ";
374
							if ($i == $pconfig['subnet']) echo "selected";
375
							echo ">" . $i . "</option>";
376
						}
377
					}
378
					?>                    </select>
379
				 </td>
380
				</tr>
381
		<tr>
382
                  <td width="22%" valign="top" class="vncell">Gateway</td>
383
                  <td width="78%" class="vtable">
384
			<input name="gateway" value="<?php echo $pconfig['gateway']; ?>">
385
			<br>
386
			If you have multiple WAN connections, enter the next hop gateway (router) IP address here.  Otherwise, leave this option blank.
387
		  </td>
388
		</tr>
389
                <tr>
390
                  <td colspan="2" valign="top" height="16"></td>
391
                </tr>
392
                <tr>
393
                  <td colspan="2" valign="top" class="listtopic">FTP Helper</td>
394
                </tr>		
395
		<tr>
396
			<td width="22%" valign="top" class="vncell">FTP Helper</td>
397
			<td width="78%" class="vtable">
398
				<input name="disableftpproxy" type="checkbox" id="disableftpproxy" value="yes" <?php if ($pconfig['disableftpproxy']) echo "checked"; ?> onclick="enable_change(false)" />
399
				<strong>Disable the userland FTP-Proxy application</strong>
400
				<br />
401
			</td>
402
		</tr>			
403
				<?php /* Wireless interface? */
404
				if (isset($optcfg['wireless']))
405
					wireless_config_print();
406
				?>		
407
                <tr>
408
                  <td colspan="2" valign="top" height="16"></td>
409
                </tr>
410
                <tr>
411
                  <td colspan="2" valign="top" class="listtopic">DHCP client configuration</td>
412
                </tr>
413
                <tr>
414
                  <td valign="top" class="vncell">Hostname</td>
415
                  <td class="vtable"> <input name="dhcphostname" type="text" class="formfld" id="dhcphostname" size="40" value="<?=htmlspecialchars($pconfig['dhcphostname']);?>">
416
                    <br>
417
                    The value in this field is sent as the DHCP client identifier
418
                    and hostname when requesting a DHCP lease. Some ISPs may require
419
                    this (for client identification).</td>
420
                </tr>
421
                <tr>
422
                  <td colspan="2" valign="top" height="16"></td>
423
                </tr>		
424
                <tr>
425
                  <td colspan="2" valign="top" class="vnsepcell">Bandwidth Management (Traffic Shaping)</td>
426
                </tr>
427
                <tr>
428
                  <td valign="top" class="vncell">Interface Bandwidth Speed</td>
429
                  <td class="vtable"> <input name="bandwidth" type="text" class="formfld" id="bandwidth" size="30" value="<?=htmlspecialchars($pconfig['bandwidth']);?>">
430
			<select name="bandwidthtype">
431
				<option value="<?=htmlspecialchars($pconfig['bandwidthtype']);?>"><?=htmlspecialchars($pconfig['bandwidthtype']);?></option>
432
				<option value="b">bit/s</option>
433
				<option value="Kb">Kilobit/s</option>
434
				<option value="Mb">Megabit/s</option>
435
				<option value="Gb">Gigabit/s</option>
436
				<option value=""></option>
437
			</select>
438
			<br> The bandwidth setting will define the speed of the interface for traffic shaping.  Do not enter your "Internet" bandwidth here, only the physical speed!
439
		  </td>
440
                </tr>
441

    
442
		<tr>
443
                  <td width="22%" valign="top">&nbsp;</td>
444
                  <td width="78%">
445
                    <input name="index" type="hidden" value="<?=$index;?>">
446
				  <input name="Submit" type="submit" class="formbtn" value="Save" onclick="enable_change(true)">
447
                  </td>
448
                </tr>
449
                <tr>
450
                  <td width="22%" valign="top">&nbsp;</td>
451
                  <td width="78%"><span class="vexpl"><span class="red"><strong>Note:<br>
452
                    </strong></span>be sure to add <a href="firewall_rules.php">firewall rules</a> to permit traffic
453
                    through the interface. You also need firewall rules for an interface in
454
                    bridged mode as the firewall acts as a filtering bridge.</span></td>
455
                </tr>
456
              </table>
457
</form>
458
<script language="JavaScript">
459
<!--
460
enable_change(false);
461
//-->
462
</script>
463
<?php else: ?>
464
<p><strong>Optional <?=$index;?> has been disabled because there is no OPT<?=$index;?> interface.</strong></p>
465
<?php endif; ?>
466
<?php include("fend.inc"); ?>
467
</body>
468
</html>
(62-62/153)