Project

General

Profile

Download (16.5 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php 
2
/*
3
	interfaces_assign.php
4
	part of m0n0wall (http://m0n0.ch/wall)
5
	Written by Jim McBeath based on existing m0n0wall files
6
	
7
	Copyright (C) 2003-2005 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
	pfSense_BUILDER_BINARIES:	/bin/rm
33
	pfSense_MODULE:	interfaces
34
*/
35

    
36
##|+PRIV
37
##|*IDENT=page-interfaces-assignnetworkports
38
##|*NAME=Interfaces: Assign network ports page
39
##|*DESCR=Allow access to the 'Interfaces: Assign network ports' page.
40
##|*MATCH=interfaces_assign.php*
41
##|-PRIV
42

    
43
$pgtitle = array("Interfaces", "Assign network ports");
44
$statusurl = "status_interfaces.php";
45

    
46
require("guiconfig.inc");
47
require("functions.inc");
48
require("filter.inc");
49
require("shaper.inc");
50
require("ipsec.inc");
51
require("vpn.inc");
52
require("captiveportal.inc");
53
require("rrd.inc");
54

    
55
/*
56
	In this file, "port" refers to the physical port name,
57
	while "interface" refers to LAN, WAN, or OPTn.
58
*/
59

    
60
/* get list without VLAN interfaces */
61
$portlist = get_interface_list();
62

    
63
/* add wireless clone interfaces */
64
if (is_array($config['wireless']['clone']) && count($config['wireless']['clone'])) {
65
	foreach ($config['wireless']['clone'] as $clone) {
66
		$portlist[$clone['cloneif']] = $clone;
67
		$portlist[$clone['cloneif']]['iswlclone'] = true;
68
	}
69
}
70

    
71
/* add VLAN interfaces */
72
if (is_array($config['vlans']['vlan']) && count($config['vlans']['vlan'])) {
73
	foreach ($config['vlans']['vlan'] as $vlan) {
74
		$portlist[$vlan['vlanif']] = $vlan;
75
		$portlist[$vlan['vlanif']]['isvlan'] = true;
76
	}
77
}
78

    
79
/* add Bridge interfaces */
80
if (is_array($config['bridges']['bridged']) && count($config['bridges']['bridged'])) {
81
        foreach ($config['bridges']['bridged'] as $bridge) {
82
                $portlist[$bridge['bridgeif']] = $bridge;
83
                $portlist[$bridge['bridgeif']]['isbridge'] = true;
84
        }
85
}
86

    
87
/* add GIF interfaces */
88
if (is_array($config['gifs']['gif']) && count($config['gifs']['gif'])) {
89
        foreach ($config['gifs']['gif'] as $gif) {
90
                $portlist[$gif['gifif']] = $gif;
91
                $portlist[$gif['gifif']]['isgif'] = true;
92
        }
93
}
94

    
95
/* add GRE interfaces */
96
if (is_array($config['gres']['gre']) && count($config['gres']['gre'])) {
97
        foreach ($config['gres']['gre'] as $gre) {
98
                $portlist[$gre['greif']] = $gre;
99
                $portlist[$gre['greif']]['isgre'] = true;
100
        }
101
}
102

    
103
/* add LAGG interfaces */
104
if (is_array($config['laggs']['lagg']) && count($config['laggs']['lagg'])) {
105
        foreach ($config['laggs']['lagg'] as $lagg) {
106
                $portlist[$lagg['laggif']] = $lagg;
107
                $portlist[$lagg['laggif']]['islagg'] = true;
108
		/* LAGG members cannot be assigned */
109
		$lagifs = explode(',', $lagg['members']);
110
		foreach ($lagifs as $lagif)
111
			if (isset($portlist[$lagif]))
112
				unset($portlist[$lagif]);
113
        }
114
}
115

    
116
/* add QinQ interfaces */
117
if (is_array($config['qinqs']['qinqentry']) && count($config['qinqs']['qinqentry'])) {
118
        foreach ($config['qinqs']['qinqentry'] as $qinq) {
119
                $portlist["vlan{$qinq['tag']}"]['descr'] = "VLAN {$qinq['tag']}";
120
                $portlist["vlan{$qinq['tag']}"]['isqinq'] = true;
121
                /* QinQ members */
122
                $qinqifs = explode(' ', $qinq['members']);
123
                foreach ($qinqifs as $qinqif) {
124
			$portlist["vlan{$qinq['tag']}_{$qinqif}"]['descr'] = "QinQ {$qinqif}";
125
			$portlist["vlan{$qinq['tag']}_{$qinqif}"]['isqinq'] = true;
126
		}
127
        }
128
}
129

    
130
/* add PPP interfaces */
131
if (is_array($config['ppps']['ppp']) && count($config['ppps']['ppp'])) {
132
	foreach ($config['ppps']['ppp'] as $pppid => $ppp) {
133
		$portname = $ppp['if'];
134
		$portlist[$portname] = $ppp;
135
		$portlist[$portname]['isppp'] = true;
136
		$ports_base = basename($ppp['ports']);
137
		if (isset($ppp['descr']))
138
			$portlist[$portname]['descr'] = strtoupper($ppp['if']). "({$ports_base}) - {$ppp['descr']}";
139
		else if (isset($ppp['username']))
140
			$portlist[$portname]['descr'] = strtoupper($ppp['if']). "({$ports_base}) - {$ppp['username']}";
141
		else
142
			$portlist[$portname]['descr'] = strtoupper($ppp['if']). "({$ports_base})";
143
	}
144
}
145

    
146
if ($_POST['apply']) {
147
	if (file_exists("/var/run/interface_mismatch_reboot_needed"))
148
		system_reboot();
149
	else {
150
		write_config();
151

    
152
		$retval = 0;
153
		$retval = filter_configure();
154
		$savemsg = get_std_save_message($retval);
155

    
156
		if (stristr($retval, "error") <> true)
157
			$savemsg = get_std_save_message($retval);
158
		else
159
			$savemsg = $retval;
160

    
161
		unlink_if_exists("/tmp/reload_interfaces");
162
	}
163

    
164
} else if ($_POST) {
165

    
166
	unset($input_errors);
167

    
168
	/* input validation */
169

    
170
	/* Build a list of the port names so we can see how the interfaces map */
171
	$portifmap = array();
172
	foreach ($portlist as $portname => $portinfo)
173
		$portifmap[$portname] = array();
174

    
175
	/* Go through the list of ports selected by the user,
176
	   build a list of port-to-interface mappings in portifmap */
177
	foreach ($_POST as $ifname => $ifport) {
178
		if (($ifname == 'lan') || ($ifname == 'wan') || (substr($ifname, 0, 3) == 'opt'))
179
			$portifmap[$ifport][] = strtoupper($ifname);
180
	}
181

    
182
	/* Deliver error message for any port with more than one assignment */
183
	foreach ($portifmap as $portname => $ifnames) {
184
		if (count($ifnames) > 1) {
185
			$errstr = "Port " . $portname .
186
				" was assigned to " . count($ifnames) .
187
				" interfaces:";
188
				
189
			foreach ($portifmap[$portname] as $ifn)
190
				$errstr .= " " . $ifn;
191
			
192
			$input_errors[] = $errstr;
193
		}
194
	}
195

    
196

    
197
	if (!$input_errors) {
198
		/* No errors detected, so update the config */
199
		foreach ($_POST as $ifname => $ifport) {
200
		
201
			if (($ifname == 'lan') || ($ifname == 'wan') ||
202
				(substr($ifname, 0, 3) == 'opt')) {
203
				
204
				if (!is_array($ifport)) {
205
					$reloadif = false;
206
					if (!empty($config['interfaces'][$ifname]['if']) && $config['interfaces'][$ifname]['if'] <> $ifport) {
207
						interface_bring_down($ifname);
208
						/* Mark this to be reconfigured in any case. */
209
						$reloadif = true;
210
					}
211
					$config['interfaces'][$ifname]['if'] = $ifport;
212
					if (isset($portlist[$ifport]['isppp']))
213
						$config['interfaces'][$ifname]['ipaddr'] = $portlist[$ifport]['type'];
214
					
215
					/* check for wireless interfaces, set or clear ['wireless'] */
216
					if (preg_match($g['wireless_regex'], $ifport)) {
217
						if (!is_array($config['interfaces'][$ifname]['wireless']))
218
							$config['interfaces'][$ifname]['wireless'] = array();
219
					} else {
220
						unset($config['interfaces'][$ifname]['wireless']);
221
					}
222
					
223
					/* make sure there is a descr for all interfaces */
224
					if (!isset($config['interfaces'][$ifname]['descr']))
225
						$config['interfaces'][$ifname]['descr'] = strtoupper($ifname);
226
						
227
					if ($reloadif == true) {
228
						if (preg_match($g['wireless_regex'], $ifport))
229
							interface_sync_wireless_clones($config['interfaces'][$ifname], false);
230
						/* Reload all for the interface. */
231
						interface_configure($ifname, true);
232
					}
233
				}
234

    
235
				touch("/tmp/reload_interfaces");
236
			}
237
		}
238
	
239
		write_config();
240
		
241
		enable_rrd_graphing();
242
	}
243
}
244

    
245
if ($_GET['act'] == "del") {
246
	$id = $_GET['id'];
247

    
248
	if (link_interface_to_bridge($id))
249
		$input_errors[] = "The interface is part of a bridge. Please remove it from the bridge to continue";
250
	else if (link_interface_to_gre($id))
251
		$input_errors[] = "The interface is part of a gre tunnel. Please delete the tunnel to continue";
252
	else if (link_interface_to_gif($id))
253
		$input_errors[] = "The interface is part of a gif tunnel. Please delete the tunnel to continue";
254
	else {
255
		unset($config['interfaces'][$id]['enable']);
256
		$realid = get_real_interface($id);
257
		interface_bring_down($id);   /* down the interface */
258
		
259
		unset($config['interfaces'][$id]);	/* delete the specified OPTn or LAN*/
260

    
261
		if($id == "lan") {
262
			unset($config['interfaces']['lan']);
263
			if (is_array($config['dhcpd']))
264
				unset($config['dhcpd']['lan']);
265
				unset($config['shaper']);
266
				unset($config['ezshaper']);
267
				unset($config['nat']);
268
				system("rm /var/dhcpd/var/db/*");
269
        			services_dhcpd_configure();
270
		}
271

    
272
		if (count($config['filter']['rule']) > 0) {
273
			foreach ($config['filter']['rule'] as $x => $rule) {
274
				if($rule['interface'] == $id)
275
					unset($config['filter']['rule'][$x]);
276
			}
277
        	}
278
		if (is_array($config['nat']['advancedoutbound']) && count($config['nat']['advancedoutbound']['rule']) > 0) {
279
        	foreach ($config['nat']['advancedoutbound']['rule'] as $x => $rule) {
280
				if($rule['interface'] == $id)
281
					unset($config['nat']['advancedoutbound']['rule'][$x]['interface']);
282
        		}
283
		}
284
		if (is_array($config['nat']['rule']) && count($config['nat']['rule']) > 0) {
285
			foreach ($config['nat']['rule'] as $x => $rule) {
286
				if($rule['interface'] == $id)
287
					unset($config['nat']['rule'][$x]['interface']);
288
			}
289
        }
290

    
291
		write_config();
292
	
293
		/* If we are in firewall/routing mode (not single interface)
294
		 * then ensure that we are not running DHCP on the wan which
295
		 * will make a lot of ISP's unhappy.
296
		 */
297
		if($config['interfaces']['lan']) {
298
			unset($config['dhcpd']['wan']);		
299
		}
300

    
301
		link_interface_to_vlans($realid, "update");
302
	
303
		$savemsg = "Interface has been deleted.";
304
	}
305
}
306

    
307
if ($_GET['act'] == "add") {
308
	/* find next free optional interface number */
309
	if(!$config['interfaces']['lan']) {
310
		$newifname = "lan";
311
		$descr = "LAN";
312
		$config['interfaces'][$newifname] = array();
313
		$config['interfaces'][$newifname]['descr'] = $descr;
314
	} else {
315
		for ($i = 1; $i <= count($config['interfaces']); $i++) {
316
			if (!$config['interfaces']["opt{$i}"])
317
				break;
318
		}
319
		$newifname = 'opt' . $i;
320
		$descr = "OPT{$i}";
321
		$config['interfaces'][$newifname] = array();
322
		$config['interfaces'][$newifname]['descr'] = $descr;
323
	}
324

    
325
	uksort($config['interfaces'], "compare_interface_names");
326

    
327
	/* Find an unused port for this interface */
328
	foreach ($portlist as $portname => $portinfo) {
329
		$portused = false;
330
		foreach ($config['interfaces'] as $ifname => $ifdata) {
331
			if ($ifdata['if'] == $portname) {
332
				$portused = true;
333
				break;
334
			}
335
		}
336
		if (!$portused) {
337
			$config['interfaces'][$newifname]['if'] = $portname;
338
			if (preg_match($g['wireless_regex'], $portname)) {
339
				$config['interfaces'][$newifname]['wireless'] = array();
340
				interface_sync_wireless_clones($config['interfaces'][$newifname], false);
341
			}
342
			break;
343
		}
344
	}
345
	
346
        /* XXX: Do not remove this. */
347
        mwexec("/bin/rm -f /tmp/config.cache");
348

    
349
	write_config();
350

    
351
	$savemsg = "Interface has been added.";
352

    
353
}
354

    
355
function compare_interface_names($a, $b) {
356
	if ($a == $b)
357
		return 0;
358
	else if ($a == 'wan')
359
		return -1;
360
	else if ($b == 'wan')
361
		return 1;
362
	else if ($a == 'lan')
363
		return -1;
364
	else if ($b == 'lan')
365
		return 1;
366

    
367
	return strnatcmp($a, $b);
368
}
369

    
370
include("head.inc");
371

    
372
if(file_exists("/var/run/interface_mismatch_reboot_needed")) 
373
	if ($_POST)
374
		$savemsg = "Reboot is needed. Please apply the settings in order to reboot.";
375
	else
376
		$savemsg = "Interface mismatch detected.  Please resolve the mismatch and click Save.  The firewall will reboot afterwards.";
377

    
378
?>
379

    
380
<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
381
<?php include("fbegin.inc"); ?>
382

    
383
<form action="interfaces_assign.php" method="post" name="iform" id="iform">
384

    
385
<?php if (file_exists("/tmp/reload_interfaces")): ?><p>
386
	<?php print_info_box_np("The interface configuration has been changed.<br>You must apply the changes in order for them to take effect.");?><br>
387
<?php elseif($savemsg): ?>
388
	<?php print_info_box($savemsg); ?>
389
<?php endif; ?>
390

    
391
<?php if ($input_errors) print_input_errors($input_errors); ?>
392

    
393
<table width="100%" border="0" cellpadding="0" cellspacing="0">
394
  <tr><td class="tabnavtbl">
395
<?php
396
	$tab_array = array();
397
	$tab_array[0] = array("Interface assignments", true, "interfaces_assign.php");
398
	$tab_array[1] = array("Interface Groups", false, "interfaces_groups.php");
399
	$tab_array[2] = array("Wireless", false, "interfaces_wireless.php");
400
	$tab_array[3] = array("VLANs", false, "interfaces_vlan.php");
401
	$tab_array[4] = array("QinQs", false, "interfaces_qinq.php");
402
	$tab_array[5] = array("PPPs", false, "interfaces_ppps.php");
403
	$tab_array[7] = array("GRE", false, "interfaces_gre.php");
404
	$tab_array[8] = array("GIF", false, "interfaces_gif.php");
405
	$tab_array[9] = array("Bridges", false, "interfaces_bridge.php");
406
	$tab_array[10] = array("LAGG", false, "interfaces_lagg.php");
407
	display_top_tabs($tab_array);
408
?>  
409
  </td></tr>
410
  <tr> 
411
    <td>
412
	<div id="mainarea">
413
        <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0">
414
       <tr> 
415
	<td class="listhdrr">Interface</td>
416
	<td class="listhdr">Network port</td>
417
	<td class="list">&nbsp;</td>
418
  </tr>
419
  <?php foreach ($config['interfaces'] as $ifname => $iface):
420
  	if ($iface['descr'])
421
		$ifdescr = $iface['descr'];
422
	else
423
		$ifdescr = strtoupper($ifname);
424
	?>
425
  <tr> 
426
	<td class="listlr" valign="middle"><strong><?=$ifdescr;?></strong></td>
427
	  <td valign="middle" class="listr">
428
		<select name="<?=$ifname;?>" id="<?=$ifname;?>">
429
		  <?php foreach ($portlist as $portname => $portinfo): ?>
430
			<option value="<?=$portname;?>"  <?php if ($portname == $iface['if']) echo " selected";?>>
431
				<?php if ($portinfo['isvlan']) {
432
					$descr = "VLAN {$portinfo['tag']} on {$portinfo['if']}";
433
				if ($portinfo['descr'])
434
					$descr .= " (" . $portinfo['descr'] . ")";
435
					echo htmlspecialchars($descr);
436
				} elseif ($portinfo['iswlclone']) {
437
					$descr = $portinfo['cloneif'];
438
					if ($portinfo['descr'])
439
						$descr .= " (" . $portinfo['descr'] . ")";
440
					echo htmlspecialchars($descr);
441
				} elseif ($portinfo['isppp']) {
442
					echo htmlspecialchars($portinfo['descr']);
443
				} elseif ($portinfo['isbridge']) {
444
					$descr = strtoupper($portinfo['bridgeif']);
445
					if ($portinfo['descr'])
446
						$descr .= " (" . $portinfo['descr'] . ")";
447
					echo htmlspecialchars($descr);
448
				} elseif ($portinfo['isgre']) {
449
					$descr = "GRE {$portinfo['remote-addr']}";
450
					if ($portinfo['descr'])
451
						$descr .= " (" . $portinfo['descr'] . ")";
452
					echo htmlspecialchars($descr);
453
				} elseif ($portinfo['isgif']) {
454
					$descr = "GRE {$portinfo['remote-addr']}";
455
					if ($portinfo['descr'])
456
						$descr .= " (" . $portinfo['descr'] . ")";
457
					echo htmlspecialchars($descr);
458
				} elseif ($portinfo['islagg']) {
459
					$descr = strtoupper($portinfo['laggif']);
460
					if ($portinfo['descr'])
461
						$descr .= " (" . $portinfo['descr'] . ")";
462
					echo htmlspecialchars($descr);
463
				} elseif ($portinfo['isqinq']) {
464
					echo htmlspecialchars($portinfo['descr']);
465
				} else
466
					echo htmlspecialchars($portname . " (" . $portinfo['mac'] . ")");
467
			?></option>
468
		<?php endforeach; ?>
469
	</select>
470
	</td>
471
	<td valign="middle" class="list">
472
		  <?php if ($ifname != 'wan'): ?>
473
		  <a href="interfaces_assign.php?act=del&id=<?=$ifname;?>"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" title="delete interface" width="17" height="17" border="0"></a> 
474
		  <?php endif; ?>
475
		</td>
476
  </tr>
477
  <?php endforeach; ?>
478
  <?php if (count($config['interfaces']) < count($portlist)): ?>
479
  <tr>
480
	<td class="list" colspan="2"></td>
481
	<td class="list" nowrap>
482
	<a href="interfaces_assign.php?act=add"><img src="./themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="add interface" width="17" height="17" border="0"></a>
483
	</td>
484
  </tr>
485
  <?php else: ?>
486
  <tr>
487
	<td class="list" colspan="3" height="10"></td>
488
  </tr>
489
  <?php endif; ?>
490
</table>
491
</div>
492
<br/>
493
<input name="Submit" type="submit" class="formbtn" value="Save"><br><br>
494
<p>
495
</p>
496
<ul>
497
  <li><span class="vexpl">change the IP address of your computer</span></li>
498
  <li><span class="vexpl">renew its DHCP lease</span></li>
499
  <li><span class="vexpl">access the webConfigurator with the new IP address</span></li>
500
  <li><span class="vexpl">interfaces that are configured as members of a lagg(4) interface will not be shown.</span></li>
501
</ul></td>
502
	</tr>
503
</table>
504
</form>
505
<?php include("fend.inc"); ?>
506
</body>
507
</html>
(82-82/221)