Project

General

Profile

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

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

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

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

    
16
	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

    
20
	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

    
32
require("guiconfig.inc");
33

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

    
40
if (!$index)
41
	exit;
42

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

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

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

    
53
$pconfig['enable'] = isset($optcfg['enable']);
54

    
55
$pconfig['blockpriv'] = isset($optcfg['blockpriv']);
56
$pconfig['blockbogons'] = isset($optcfg['blockbogons']);
57
$pconfig['spoofmac'] = $optcfg['spoofmac'];
58
$pconfig['mtu'] = $optcfg['mtu'];
59

    
60
$pconfig['disableftpproxy'] = isset($optcfg['disableftpproxy']);
61

    
62
/* Wireless interface? */
63
if (isset($optcfg['wireless'])) {
64
	require("interfaces_wlan.inc");
65
	wireless_config_init();
66
}
67

    
68
if ($optcfg['ipaddr'] == "dhcp") {
69
	$pconfig['type'] = "DHCP";
70
	$pconfig['dhcphostname'] = $optcfg['dhcphostname'];
71
} else {
72
	$pconfig['type'] = "Static";
73
	$pconfig['ipaddr'] = $optcfg['ipaddr'];
74
	$pconfig['subnet'] = $optcfg['subnet'];
75
	$pconfig['gateway'] = $optcfg['gateway'];
76
	$pconfig['pointtopoint'] = $optcfg['pointtopoint'];
77
}
78

    
79
if ($_POST) {
80

    
81
	unset($input_errors);
82

    
83
	/* filter out spaces from descriptions  */
84
	$POST['descr'] = remove_bad_chars($POST['descr']);
85

    
86
	if($_POST['gateway'] and $pconfig['gateway'] <> $_POST['gateway']) {
87
		/* enumerate slbd gateways and make sure we are not creating a route loop */
88
		if(is_array($config['load_balancer']['lbpool'])) {
89
			foreach($config['load_balancer']['lbpool'] as $lbpool) {
90
				if($lbpool['type'] == "gateway") {
91
				    foreach ((array) $lbpool['servers'] as $server) {
92
			            $svr = split("\|", $server);
93
			            if($svr[1] == $pconfig['gateway'])  {
94
			            		$_POST['gateway']  = $pconfig['gateway'];
95
			            		$input_errors[] = "Cannot change {$svr[1]} gateway.  It is currently referenced by the load balancer pools.";
96
			            		break;
97
			            }
98
					}
99
				}
100
			}
101
			foreach($config['filter']['rule'] as $rule) {
102
				if($rule['gateway'] == $_POST['gateway']) {
103
	            		$input_errors[] = "Cannot change {$_POST['gateway']} gateway.  It is currently referenced by the filter rules via policy based routing.";
104
	            		break;
105
				}
106
			}
107
		}
108
	}
109

    
110
	$pconfig = $_POST;
111

    
112
	/* input validation */
113
	if ($_POST['enable']) {
114

    
115
		/* description unique? */
116
		for ($i = 1; isset($config['interfaces']['opt' . $i]); $i++) {
117
			if ($i != $index) {
118
				if ($config['interfaces']['opt' . $i]['descr'] == $_POST['descr']) {
119
					$input_errors[] = "An interface with the specified description already exists.";
120
				}
121
			}
122
		}
123

    
124
		if ($_POST['bridge']) {
125
			/* double bridging? */
126
			for ($i = 1; isset($config['interfaces']['opt' . $i]); $i++) {
127
				if ($i != $index) {
128
					if ($config['interfaces']['opt' . $i]['bridge'] == $_POST['bridge']) {
129
						//$input_errors[] = "Optional interface {$i} " .
130
						//	"({$config['interfaces']['opt' . $i]['descr']}) is already bridged to " .
131
						//	"the specified interface.";
132
					} else if ($config['interfaces']['opt' . $i]['bridge'] == "opt{$index}") {
133
						//$input_errors[] = "Optional interface {$i} " .
134
						//	"({$config['interfaces']['opt' . $i]['descr']}) is already bridged to " .
135
						//	"this interface.";
136
					}
137
				}
138
			}
139
			if ($config['interfaces'][$_POST['bridge']]['bridge']) {
140
				//$input_errors[] = "The specified interface is already bridged to " .
141
				//	"another interface.";
142
			}
143
			/* captive portal on? */
144
			if (isset($config['captiveportal']['enable'])) {
145
				//$input_errors[] = "Interfaces cannot be bridged while the captive portal is enabled.";
146
			}
147
		} else {
148
			if ($_POST['type'] <> "DHCP") {
149
				$reqdfields = explode(" ", "descr ipaddr subnet");
150
				$reqdfieldsn = explode(",", "Description,IP address,Subnet bit count");
151
				do_input_validation($_POST, $reqdfields, $reqdfieldsn, &$input_errors);
152
				if (($_POST['ipaddr'] && !is_ipaddr($_POST['ipaddr']))) {
153
					$input_errors[] = "A valid IP address must be specified.";
154
				}
155
				if (($_POST['subnet'] && !is_numeric($_POST['subnet']))) {
156
					$input_errors[] = "A valid subnet bit count must be specified.";
157
				}
158
				if($_POST['gateway'] <> "" && !is_ipaddr($_POST['gateway'])) {
159
					$input_errors[] = "A valid gateway must be specified.";
160
				}
161
			}
162
		}
163
	        if ($_POST['mtu'] && (($_POST['mtu'] < 576) || ($_POST['mtu'] > 1500))) {
164
			$input_errors[] = "The MTU must be between 576 and 1500 bytes.";
165
		}		
166
		if (($_POST['spoofmac'] && !is_macaddr($_POST['spoofmac']))) {
167
			$input_errors[] = "A valid MAC address must be specified.";
168
		}		
169
	}
170

    
171
	if($_POST['mtu']) {
172
		if($_POST['mtu'] < 24 or $_POST['mtu'] > 1501)
173
			$input_errors[] = "A valid MTU is required 24-1500.";
174
	}
175
	
176
	/* Wireless interface? */
177
	if (isset($optcfg['wireless'])) {
178
		$wi_input_errors = wireless_config_post();
179
		if ($wi_input_errors) {
180
			$input_errors = array_merge($input_errors, $wi_input_errors);
181
		}
182
	}
183

    
184
	if (!$input_errors) {
185

    
186
		$bridge = discover_bridge($optcfg['if'], filter_translate_type_to_real_interface($optcfg['bridge']));
187
		if($bridge <> "-1") {
188
			destroy_bridge($bridge);
189
		}
190

    
191
		unset($optcfg['dhcphostname']);
192
		unset($optcfg['disableftpproxy']);
193
		
194
		/* per interface pftpx helper */
195
		if($_POST['disableftpproxy'] == "yes") {
196
			$optcfg['disableftpproxy'] = true;
197
			system_start_ftp_helpers();
198
		} else {			
199
			system_start_ftp_helpers();
200
		}		
201

    
202
		$optcfg['descr'] = remove_bad_chars($_POST['descr']);
203
		$optcfg['bridge'] = $_POST['bridge'];
204
		$optcfg['enable'] = $_POST['enable'] ? true : false;
205

    
206
		if ($_POST['type'] == "Static") {
207
			$optcfg['ipaddr'] = $_POST['ipaddr'];
208
			$optcfg['subnet'] = $_POST['subnet'];
209
			$optcfg['gateway'] = $_POST['gateway'];
210
			if (isset($optcfg['ispointtopoint']))
211
				$optcfg['pointtopoint'] = $_POST['pointtopoint'];
212
		} else if ($_POST['type'] == "DHCP") {
213
			$optcfg['ipaddr'] = "dhcp";
214
			$optcfg['dhcphostname'] = $_POST['dhcphostname'];
215
		}
216

    
217
		$optcfg['blockpriv'] = $_POST['blockpriv'] ? true : false;
218
		$optcfg['blockbogons'] = $_POST['blockbogons'] ? true : false;
219
		$optcfg['spoofmac'] = $_POST['spoofmac'];
220
		$optcfg['mtu'] = $_POST['mtu'];
221

    
222
		write_config();
223
		
224
		$savemsg = get_std_save_message($retval);
225
	}
226
}
227

    
228

    
229
$pgtitle = "Interfaces: Optional {$index} (" . htmlspecialchars($optcfg['descr']) . ")";
230
include("head.inc");
231

    
232
?>
233

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

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

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

    
445
<?php
446
if ($_POST) {
447

    
448
	if (!$input_errors) {
449
		
450
		ob_flush();
451
		flush();
452
		sleep(1);		
453
		
454
		interfaces_optional_configure_if($index);
455
		
456
		reset_carp();
457

    
458
		/* load graphing functions */
459
		enable_rrd_graphing();	
460
		
461
		/* sync filter configuration */
462
		filter_configure();
463
	}
464
}
465
?>
(72-72/175)