Project

General

Profile

Download (17.9 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(gettext("Interfaces"),gettext("Assign network ports"));
44
$shortcut_section = "interfaces";
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
$ovpn_descrs = array();
147
if (is_array($config['openvpn'])) {
148
	if (is_array($config['openvpn']['openvpn-server']))
149
		foreach ($config['openvpn']['openvpn-server'] as $s)
150
			$ovpn_descrs[$s['vpnid']] = $s['description'];
151
	if (is_array($config['openvpn']['openvpn-client']))
152
		foreach ($config['openvpn']['openvpn-client'] as $c)
153
			$ovpn_descrs[$c['vpnid']] = $c['description'];
154
}
155

    
156
if ($_POST['apply']) {
157
	if (file_exists("/var/run/interface_mismatch_reboot_needed")) {
158
		system_reboot();
159
		$rebootingnow = true;
160
	} else {
161
		write_config();
162

    
163
		$retval = 0;
164
		$retval = filter_configure();
165
		$savemsg = get_std_save_message($retval);
166

    
167
		if (stristr($retval, "error") <> true)
168
			$savemsg = get_std_save_message($retval);
169
		else
170
			$savemsg = $retval;
171
	}
172

    
173
} else if ($_POST) {
174

    
175
	unset($input_errors);
176

    
177
	/* input validation */
178

    
179
	/* Build a list of the port names so we can see how the interfaces map */
180
	$portifmap = array();
181
	foreach ($portlist as $portname => $portinfo)
182
		$portifmap[$portname] = array();
183

    
184
	/* Go through the list of ports selected by the user,
185
	   build a list of port-to-interface mappings in portifmap */
186
	foreach ($_POST as $ifname => $ifport) {
187
		if (($ifname == 'lan') || ($ifname == 'wan') || (substr($ifname, 0, 3) == 'opt'))
188
			$portifmap[$ifport][] = strtoupper($ifname);
189
	}
190

    
191
	/* Deliver error message for any port with more than one assignment */
192
	foreach ($portifmap as $portname => $ifnames) {
193
		if (count($ifnames) > 1) {
194
			$errstr = sprintf(gettext('Port %1$s '.
195
				' was assigned to %2$s' .
196
				' interfaces:'), $portname, count($ifnames));
197
				
198
			foreach ($portifmap[$portname] as $ifn)
199
				$errstr .= " " . $ifn;
200
			
201
			$input_errors[] = $errstr;
202
		}
203
	}
204

    
205
	if (is_array($config['vlans']['vlan'])) {
206
		foreach ($config['vlans']['vlan'] as $vlan) {
207
			if (does_interface_exist($vlan['if']) == false)
208
				$input_errors[] = "Vlan parent interface {$vlan['if']} does not exist anymore so vlan id {$vlan['tag']} cannot be created please fix the issue before continuing.";
209
		}
210
	}
211

    
212
	if (!$input_errors) {
213
		/* No errors detected, so update the config */
214
		foreach ($_POST as $ifname => $ifport) {
215
		
216
			if (($ifname == 'lan') || ($ifname == 'wan') ||
217
				(substr($ifname, 0, 3) == 'opt')) {
218
				
219
				if (!is_array($ifport)) {
220
					$reloadif = false;
221
					if (!empty($config['interfaces'][$ifname]['if']) && $config['interfaces'][$ifname]['if'] <> $ifport) {
222
						interface_bring_down($ifname);
223
						/* Mark this to be reconfigured in any case. */
224
						$reloadif = true;
225
					}
226
					$config['interfaces'][$ifname]['if'] = $ifport;
227
					if (isset($portlist[$ifport]['isppp']))
228
						$config['interfaces'][$ifname]['ipaddr'] = $portlist[$ifport]['type'];
229
					
230
					/* check for wireless interfaces, set or clear ['wireless'] */
231
					if (preg_match($g['wireless_regex'], $ifport)) {
232
						if (!is_array($config['interfaces'][$ifname]['wireless']))
233
							$config['interfaces'][$ifname]['wireless'] = array();
234
					} else {
235
						unset($config['interfaces'][$ifname]['wireless']);
236
					}
237
					
238
					/* make sure there is a descr for all interfaces */
239
					if (!isset($config['interfaces'][$ifname]['descr']))
240
						$config['interfaces'][$ifname]['descr'] = strtoupper($ifname);
241
						
242
					if ($reloadif == true) {
243
						if (preg_match($g['wireless_regex'], $ifport))
244
							interface_sync_wireless_clones($config['interfaces'][$ifname], false);
245
						/* Reload all for the interface. */
246
						interface_configure($ifname, true);
247
					}
248
				}
249
			}
250
		}
251
	
252
		write_config();
253
		
254
		enable_rrd_graphing();
255
	}
256
}
257

    
258
if ($_GET['act'] == "del") {
259
	$id = $_GET['id'];
260

    
261
	if (link_interface_to_group($id))
262
		$input_errors[] = gettext("The interface is part of a group. Please remove it from the group to continue");
263
	else if (link_interface_to_bridge($id))
264
		$input_errors[] = gettext("The interface is part of a bridge. Please remove it from the bridge to continue");
265
	else if (link_interface_to_gre($id))
266
		$input_errors[] = gettext("The interface is part of a gre tunnel. Please delete the tunnel to continue");
267
	else if (link_interface_to_gif($id))
268
		$input_errors[] = gettext("The interface is part of a gif tunnel. Please delete the tunnel to continue");
269
	else {
270
		unset($config['interfaces'][$id]['enable']);
271
		$realid = get_real_interface($id);
272
		interface_bring_down($id);   /* down the interface */
273
		
274
		unset($config['interfaces'][$id]);	/* delete the specified OPTn or LAN*/
275

    
276
		if (is_array($config['dhcpd']) && is_array($config['dhcpd'][$id])) {
277
			unset($config['dhcpd'][$id]);
278
			services_dhcpd_configure();
279
		}
280

    
281
		if (count($config['filter']['rule']) > 0) {
282
			foreach ($config['filter']['rule'] as $x => $rule) {
283
				if($rule['interface'] == $id)
284
					unset($config['filter']['rule'][$x]);
285
			}
286
        	}
287
		if (is_array($config['nat']['advancedoutbound']) && count($config['nat']['advancedoutbound']['rule']) > 0) {
288
        	foreach ($config['nat']['advancedoutbound']['rule'] as $x => $rule) {
289
				if($rule['interface'] == $id)
290
					unset($config['nat']['advancedoutbound']['rule'][$x]['interface']);
291
        		}
292
		}
293
		if (is_array($config['nat']['rule']) && count($config['nat']['rule']) > 0) {
294
			foreach ($config['nat']['rule'] as $x => $rule) {
295
				if($rule['interface'] == $id)
296
					unset($config['nat']['rule'][$x]['interface']);
297
			}
298
        }
299

    
300
		write_config();
301
	
302
		/* If we are in firewall/routing mode (not single interface)
303
		 * then ensure that we are not running DHCP on the wan which
304
		 * will make a lot of ISP's unhappy.
305
		 */
306
		if($config['interfaces']['lan'] && $config['dhcpd']['wan']) {
307
			unset($config['dhcpd']['wan']);		
308
		}
309

    
310
		link_interface_to_vlans($realid, "update");
311
	
312
		$savemsg = gettext("Interface has been deleted.");
313
	}
314
}
315

    
316
if ($_GET['act'] == "add" && (count($config['interfaces']) < count($portlist))) {
317
	/* find next free optional interface number */
318
	if(!$config['interfaces']['lan']) {
319
		$newifname = gettext("lan");
320
		$descr = gettext("LAN");
321
		$config['interfaces'][$newifname] = array();
322
		$config['interfaces'][$newifname]['descr'] = $descr;
323
	} else {
324
		for ($i = 1; $i <= count($config['interfaces']); $i++) {
325
			if (!$config['interfaces']["opt{$i}"])
326
				break;
327
		}
328
		$newifname = 'opt' . $i;
329
		$descr = "OPT" . $i;
330
		$config['interfaces'][$newifname] = array();
331
		$config['interfaces'][$newifname]['descr'] = $descr;
332
	}
333

    
334
	uksort($config['interfaces'], "compare_interface_friendly_names");
335

    
336
	/* Find an unused port for this interface */
337
	foreach ($portlist as $portname => $portinfo) {
338
		$portused = false;
339
		foreach ($config['interfaces'] as $ifname => $ifdata) {
340
			if ($ifdata['if'] == $portname) {
341
				$portused = true;
342
				break;
343
			}
344
		}
345
		if (!$portused) {
346
			$config['interfaces'][$newifname]['if'] = $portname;
347
			if (preg_match($g['wireless_regex'], $portname)) {
348
				$config['interfaces'][$newifname]['wireless'] = array();
349
				interface_sync_wireless_clones($config['interfaces'][$newifname], false);
350
			}
351
			break;
352
		}
353
	}
354
	
355
        /* XXX: Do not remove this. */
356
        mwexec("/bin/rm -f /tmp/config.cache");
357

    
358
	write_config();
359

    
360
	$savemsg = gettext("Interface has been added.");
361

    
362
} else if ($_GET['act'] == "add")
363
	$input_errors[] = "No more interfaces available to be assigned.";
364

    
365
include("head.inc");
366

    
367
if(file_exists("/var/run/interface_mismatch_reboot_needed")) 
368
	if ($_POST) {
369
		if($rebootingnow) 	
370
			$savemsg = gettext("The system is now rebooting.  Please wait.");
371
		else
372
			$savemsg = gettext("Reboot is needed. Please apply the settings in order to reboot.");
373
	} else {
374
		$savemsg = gettext("Interface mismatch detected.  Please resolve the mismatch and click Save.  The firewall will reboot afterwards.");
375
	}
376
?>
377

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

    
381
<form action="interfaces_assign.php" method="post" name="iform" id="iform">
382

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

    
389
<?php pfSense_handle_custom_code("/usr/local/pkg/interfaces_assign/pre_input_errors"); ?>
390
<?php if ($input_errors) print_input_errors($input_errors); ?>
391

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