Projet

Général

Profil

Télécharger (18,4 ko) Statistiques
| Branche: | Tag: | Révision:

univnautes / usr / local / www / interfaces_assign.php @ e4034dcb

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_once("filter.inc");
49
require("shaper.inc");
50
require("ipsec.inc");
51
require("vpn.inc");
52
require("captiveportal.inc");
53
require_once("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 = filter_configure();
164
		$savemsg = get_std_save_message($retval);
165

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

    
172
} else if ($_POST) {
173

    
174
	unset($input_errors);
175

    
176
	/* input validation */
177

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

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

    
190
	/* Deliver error message for any port with more than one assignment */
191
	foreach ($portifmap as $portname => $ifnames) {
192
		if (count($ifnames) > 1) {
193
			$errstr = sprintf(gettext('Port %1$s '.
194
				' was assigned to %2$s' .
195
				' interfaces:'), $portname, count($ifnames));
196

    
197
			foreach ($portifmap[$portname] as $ifn)
198
				$errstr .= " " . $ifn;
199

    
200
			$input_errors[] = $errstr;
201
		} else if (count($ifnames) == 1 && preg_match('/^bridge[0-9]/', $portname) && is_array($config['bridges']['bridged']) && count($config['bridges']['bridged'])) {
202
			foreach ($config['bridges']['bridged'] as $bridge) {
203
				if ($bridge['bridgeif'] != $portname)
204
					continue;
205

    
206
				$members = explode(",", strtoupper($bridge['members']));
207
				foreach ($members as $member) {
208
					if ($member == $ifnames[0]) {
209
						$input_errors[] = sprintf(gettext("You cannot set port %s to interface %s because this interface is a member of %s."), $portname, $member, $portname);
210
						break;
211
					}
212
				}
213
			}
214
		}
215
	}
216

    
217
	if (is_array($config['vlans']['vlan'])) {
218
		foreach ($config['vlans']['vlan'] as $vlan) {
219
			if (does_interface_exist($vlan['if']) == false)
220
				$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.";
221
		}
222
	}
223

    
224
	if (!$input_errors) {
225
		/* No errors detected, so update the config */
226
		foreach ($_POST as $ifname => $ifport) {
227

    
228
			if (($ifname == 'lan') || ($ifname == 'wan') || (substr($ifname, 0, 3) == 'opt')) {
229

    
230
				if (!is_array($ifport)) {
231
					$reloadif = false;
232
					if (!empty($config['interfaces'][$ifname]['if']) && $config['interfaces'][$ifname]['if'] <> $ifport) {
233
						interface_bring_down($ifname);
234
						/* Mark this to be reconfigured in any case. */
235
						$reloadif = true;
236
					}
237
					$config['interfaces'][$ifname]['if'] = $ifport;
238
					if (isset($portlist[$ifport]['isppp']))
239
						$config['interfaces'][$ifname]['ipaddr'] = $portlist[$ifport]['type'];
240

    
241
					if (substr($ifport, 0, 3) == 'gre' || substr($ifport, 0, 3) == 'gif') {
242
						unset($config['interfaces'][$ifname]['ipaddr']);
243
						unset($config['interfaces'][$ifname]['subnet']);
244
						unset($config['interfaces'][$ifname]['ipaddrv6']);
245
						unset($config['interfaces'][$ifname]['subnetv6']);
246
					}
247

    
248
					/* check for wireless interfaces, set or clear ['wireless'] */
249
					if (preg_match($g['wireless_regex'], $ifport)) {
250
						if (!is_array($config['interfaces'][$ifname]['wireless']))
251
							$config['interfaces'][$ifname]['wireless'] = array();
252
					} else {
253
						unset($config['interfaces'][$ifname]['wireless']);
254
					}
255

    
256
					/* make sure there is a descr for all interfaces */
257
					if (!isset($config['interfaces'][$ifname]['descr']))
258
						$config['interfaces'][$ifname]['descr'] = strtoupper($ifname);
259

    
260
					if ($reloadif == true) {
261
						if (preg_match($g['wireless_regex'], $ifport))
262
							interface_sync_wireless_clones($config['interfaces'][$ifname], false);
263
						/* Reload all for the interface. */
264
						interface_configure($ifname, true);
265
					}
266
				}
267
			}
268
		}
269

    
270
		write_config();
271

    
272
		enable_rrd_graphing();
273
	}
274
}
275

    
276
if ($_GET['act'] == "del") {
277
	$id = $_GET['id'];
278

    
279
	if (link_interface_to_group($id))
280
		$input_errors[] = gettext("The interface is part of a group. Please remove it from the group to continue");
281
	else if (link_interface_to_bridge($id))
282
		$input_errors[] = gettext("The interface is part of a bridge. Please remove it from the bridge to continue");
283
	else if (link_interface_to_gre($id))
284
		$input_errors[] = gettext("The interface is part of a gre tunnel. Please delete the tunnel to continue");
285
	else if (link_interface_to_gif($id))
286
		$input_errors[] = gettext("The interface is part of a gif tunnel. Please delete the tunnel to continue");
287
	else {
288
		unset($config['interfaces'][$id]['enable']);
289
		$realid = get_real_interface($id);
290
		interface_bring_down($id);   /* down the interface */
291

    
292
		unset($config['interfaces'][$id]);	/* delete the specified OPTn or LAN*/
293

    
294
		if (is_array($config['dhcpd']) && is_array($config['dhcpd'][$id])) {
295
			unset($config['dhcpd'][$id]);
296
			services_dhcpd_configure();
297
		}
298

    
299
		if (count($config['filter']['rule']) > 0) {
300
			foreach ($config['filter']['rule'] as $x => $rule) {
301
				if($rule['interface'] == $id)
302
					unset($config['filter']['rule'][$x]);
303
			}
304
		}
305
		if (is_array($config['nat']['rule']) && count($config['nat']['rule']) > 0) {
306
			foreach ($config['nat']['rule'] as $x => $rule) {
307
				if($rule['interface'] == $id)
308
					unset($config['nat']['rule'][$x]['interface']);
309
			}
310
		}
311

    
312
		write_config();
313

    
314
		/* If we are in firewall/routing mode (not single interface)
315
		 * then ensure that we are not running DHCP on the wan which
316
		 * will make a lot of ISP's unhappy.
317
		 */
318
		if($config['interfaces']['lan'] && $config['dhcpd']['wan']) {
319
			unset($config['dhcpd']['wan']);
320
		}
321

    
322
		link_interface_to_vlans($realid, "update");
323

    
324
		$savemsg = gettext("Interface has been deleted.");
325
	}
326
}
327

    
328
if ($_GET['act'] == "add" && (count($config['interfaces']) < count($portlist))) {
329
	/* find next free optional interface number */
330
	if(!$config['interfaces']['lan']) {
331
		$newifname = gettext("lan");
332
		$descr = gettext("LAN");
333
		$config['interfaces'][$newifname] = array();
334
		$config['interfaces'][$newifname]['descr'] = $descr;
335
	} else {
336
		for ($i = 1; $i <= count($config['interfaces']); $i++) {
337
			if (!$config['interfaces']["opt{$i}"])
338
				break;
339
		}
340
		$newifname = 'opt' . $i;
341
		$descr = "OPT" . $i;
342
		$config['interfaces'][$newifname] = array();
343
		$config['interfaces'][$newifname]['descr'] = $descr;
344
	}
345

    
346
	uksort($config['interfaces'], "compare_interface_friendly_names");
347

    
348
	/* Find an unused port for this interface */
349
	foreach ($portlist as $portname => $portinfo) {
350
		$portused = false;
351
		foreach ($config['interfaces'] as $ifname => $ifdata) {
352
			if ($ifdata['if'] == $portname) {
353
				$portused = true;
354
				break;
355
			}
356
		}
357
		if (!$portused) {
358
			$config['interfaces'][$newifname]['if'] = $portname;
359
			if (preg_match($g['wireless_regex'], $portname)) {
360
				$config['interfaces'][$newifname]['wireless'] = array();
361
				interface_sync_wireless_clones($config['interfaces'][$newifname], false);
362
			}
363
			break;
364
		}
365
	}
366

    
367
	/* XXX: Do not remove this. */
368
	unlink_if_exists("{$g['tmp_path']}/config.cache");
369

    
370
	write_config();
371

    
372
	$savemsg = gettext("Interface has been added.");
373

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

    
377
include("head.inc");
378

    
379
if(file_exists("/var/run/interface_mismatch_reboot_needed"))
380
	if ($_POST) {
381
		if($rebootingnow)
382
			$savemsg = gettext("The system is now rebooting.  Please wait.");
383
		else
384
			$savemsg = gettext("Reboot is needed. Please apply the settings in order to reboot.");
385
	} else {
386
		$savemsg = gettext("Interface mismatch detected.  Please resolve the mismatch and click 'Apply changes'.  The firewall will reboot afterwards.");
387
	}
388
?>
389

    
390
<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
391
<?php include("fbegin.inc"); ?>
392

    
393
<form action="interfaces_assign.php" method="post" name="iform" id="iform">
394

    
395
<?php
396
if (file_exists("/tmp/reload_interfaces")) {
397
	echo "<p>\n";
398
	print_info_box_np(gettext("The interface configuration has been changed.<br />You must apply the changes in order for them to take effect."));
399
	echo "<br /></p>\n";
400
} elseif($savemsg)
401
	print_info_box($savemsg);
402

    
403
pfSense_handle_custom_code("/usr/local/pkg/interfaces_assign/pre_input_errors");
404
if ($input_errors)
405
	print_input_errors($input_errors);
406
?>
407

    
408
<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="interfaces assign">
409
	<tr><td class="tabnavtbl">
410
<?php
411
	$tab_array = array();
412
	$tab_array[0] = array(gettext("Interface assignments"), true, "interfaces_assign.php");
413
	$tab_array[1] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
414
	$tab_array[2] = array(gettext("Wireless"), false, "interfaces_wireless.php");
415
	$tab_array[3] = array(gettext("VLANs"), false, "interfaces_vlan.php");
416
	$tab_array[4] = array(gettext("QinQs"), false, "interfaces_qinq.php");
417
	$tab_array[5] = array(gettext("PPPs"), false, "interfaces_ppps.php");
418
	$tab_array[7] = array(gettext("GRE"), false, "interfaces_gre.php");
419
	$tab_array[8] = array(gettext("GIF"), false, "interfaces_gif.php");
420
	$tab_array[9] = array(gettext("Bridges"), false, "interfaces_bridge.php");
421
	$tab_array[10] = array(gettext("LAGG"), false, "interfaces_lagg.php");
422
	display_top_tabs($tab_array);
423
?>
424
	</td></tr>
425
	<tr><td>
426
		<div id="mainarea">
427
			<table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
428
				<tr>
429
					<td class="listhdrr"><?=gettext("Interface"); ?></td>
430
					<td class="listhdr"><?=gettext("Network port"); ?></td>
431
					<td class="list">&nbsp;</td>
432
				</tr>
433
<?php
434
			foreach ($config['interfaces'] as $ifname => $iface):
435
				if ($iface['descr'])
436
					$ifdescr = $iface['descr'];
437
				else
438
					$ifdescr = strtoupper($ifname);
439
?>
440
				<tr>
441
					<td class="listlr" valign="middle"><strong><u><span onclick="location.href='/interfaces.php?if=<?=$ifname;?>'" style="cursor: pointer;"><?=$ifdescr;?></span></u></strong></td>
442
					<td valign="middle" class="listr">
443
						<select onchange="javascript:jQuery('#savediv').show();" name="<?=$ifname;?>" id="<?=$ifname;?>">
444
<?php
445
						foreach ($portlist as $portname => $portinfo):
446
?>
447
							<option  value="<?=$portname;?>"  <?php if ($portname == $iface['if']) echo " selected=\"selected\"";?>>
448
<?php
449
							if ($portinfo['isvlan']) {
450
								$descr = sprintf(gettext('VLAN %1$s on %2$s'),$portinfo['tag'],$portinfo['if']);
451
								if ($portinfo['descr'])
452
									$descr .= " (" . $portinfo['descr'] . ")";
453
								echo htmlspecialchars($descr);
454
							} elseif ($portinfo['iswlclone']) {
455
								$descr = $portinfo['cloneif'];
456
								if ($portinfo['descr'])
457
									$descr .= " (" . $portinfo['descr'] . ")";
458
								echo htmlspecialchars($descr);
459
							} elseif ($portinfo['isppp']) {
460
								echo htmlspecialchars($portinfo['descr']);
461
							} elseif ($portinfo['isbridge']) {
462
								$descr = strtoupper($portinfo['bridgeif']);
463
								if ($portinfo['descr'])
464
									$descr .= " (" . $portinfo['descr'] . ")";
465
								echo htmlspecialchars($descr);
466
							} elseif ($portinfo['isgre']) {
467
								$descr = "GRE {$portinfo['remote-addr']}";
468
								if ($portinfo['descr'])
469
									$descr .= " (" . $portinfo['descr'] . ")";
470
								echo htmlspecialchars($descr);
471
							} elseif ($portinfo['isgif']) {
472
								$descr = "GIF {$portinfo['remote-addr']}";
473
								if ($portinfo['descr'])
474
									$descr .= " (" . $portinfo['descr'] . ")";
475
								echo htmlspecialchars($descr);
476
							} elseif ($portinfo['islagg']) {
477
								$descr = strtoupper($portinfo['laggif']);
478
								if ($portinfo['descr'])
479
									$descr .= " (" . $portinfo['descr'] . ")";
480
								echo htmlspecialchars($descr);
481
							} elseif ($portinfo['isqinq']) {
482
								echo htmlspecialchars($portinfo['descr']);
483
							} elseif (substr($portname, 0, 4) == 'ovpn') {
484
								echo htmlspecialchars($portname . " (" . $ovpn_descrs[substr($portname, 5)] . ")");
485
							} else
486
								echo htmlspecialchars($portname . " (" . $portinfo['mac'] . ")");
487
?>
488
							</option>
489
<?php
490
						endforeach;
491
?>
492
						</select>
493
					</td>
494
					<td valign="middle" class="list">
495
<?php
496
					if ($ifname != 'wan'):
497
?>
498
						<a href="interfaces_assign.php?act=del&amp;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" alt="delete" /></a>
499
<?php
500
					endif;
501
?>
502
					</td>
503
				</tr>
504
<?php
505
			endforeach;
506
			if (count($config['interfaces']) < count($portlist)):
507
?>
508
				<tr>
509
					<td class="list" colspan="2"></td>
510
					<td class="list nowrap">
511
						<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" alt="add" /></a>
512
					</td>
513
				</tr>
514
<?php
515
			else:
516
?>
517
				<tr>
518
					<td class="list" colspan="3" height="10"></td>
519
				</tr>
520
<?php
521
			endif;
522
?>
523
			</table>
524
		</div>
525
		<br />
526
		<div id='savediv' <?php if (empty($_GET['act'])) echo "style='display:none;'"; ?>>
527
			<input name="Submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" /><br /><br />
528
		</div>
529
		<ul>
530
			<li><span class="vexpl"><?=gettext("Interfaces that are configured as members of a lagg(4) interface will not be shown."); ?></span></li>
531
		</ul>
532
	</td></tr>
533
</table>
534
</form>
535
<?php include("fend.inc"); ?>
536
</body>
537
</html>
(95-95/255)