Project

General

Profile

Download (18.2 KB) Statistics
| Branch: | Tag: | Revision:
1 ef88e1e1 Renato Botelho
<?php
2 5b237745 Scott Ullrich
/*
3 c5d81585 Renato Botelho
 * interfaces_assign.php
4 092e7a96 Stephen Beaver
 *
5 c5d81585 Renato Botelho
 * part of pfSense (https://www.pfsense.org)
6 87489e5c loonylion
 * Copyright (c) 2004-2016 Rubicon Communications, LLC (Netgate)
7 c5d81585 Renato Botelho
 * All rights reserved.
8 191cb31d Stephen Beaver
 *
9 c5d81585 Renato Botelho
 * originally based on m0n0wall (http://m0n0.ch/wall)
10
 * Copyright (c) 2003-2004 Manuel Kasper <mk@neon1.net>.
11
 * Written by Jim McBeath based on existing m0n0wall files
12
 * All rights reserved.
13 092e7a96 Stephen Beaver
 *
14 b12ea3fb Renato Botelho
 * Licensed under the Apache License, Version 2.0 (the "License");
15
 * you may not use this file except in compliance with the License.
16
 * You may obtain a copy of the License at
17 092e7a96 Stephen Beaver
 *
18 b12ea3fb Renato Botelho
 * http://www.apache.org/licenses/LICENSE-2.0
19 092e7a96 Stephen Beaver
 *
20 b12ea3fb Renato Botelho
 * Unless required by applicable law or agreed to in writing, software
21
 * distributed under the License is distributed on an "AS IS" BASIS,
22
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23
 * See the License for the specific language governing permissions and
24
 * limitations under the License.
25 092e7a96 Stephen Beaver
 */
26 5b237745 Scott Ullrich
27 6b07c15a Matthew Grooms
##|+PRIV
28
##|*IDENT=page-interfaces-assignnetworkports
29 26b4bef8 k-paulius
##|*NAME=Interfaces: Interface Assignments
30
##|*DESCR=Allow access to the 'Interfaces: Interface Assignments' page.
31 6b07c15a Matthew Grooms
##|*MATCH=interfaces_assign.php*
32
##|-PRIV
33
34 87489e5c loonylion
//$timealla = microtime(true);
35
36 26b4bef8 k-paulius
$pgtitle = array(gettext("Interfaces"), gettext("Interface Assignments"));
37 b32dd0a6 jim-p
$shortcut_section = "interfaces";
38 af1e2031 jim-p
39 c81ef6e2 Phil Davis
require_once("guiconfig.inc");
40
require_once("functions.inc");
41 f6339216 jim-p
require_once("filter.inc");
42 c81ef6e2 Phil Davis
require_once("shaper.inc");
43
require_once("ipsec.inc");
44
require_once("vpn.inc");
45
require_once("captiveportal.inc");
46 1b34f8a7 Ermal
require_once("rrd.inc");
47 87489e5c loonylion
require_once("interfaces_fast.inc");
48 772a7b3d loonylion
49 87489e5c loonylion
global $friendlyifnames;
50 5b237745 Scott Ullrich
51 87489e5c loonylion
/*moved most gettext calls to here, we really don't want to be repeatedly calling gettext() within loops if it can be avoided.*/
52
$gettextArray = array('add'=>gettext('Add'),'addif'=>gettext('Add interface'),'delete'=>gettext('Delete'),'deleteif'=>gettext('Delete interface'),'edit'=>gettext('Edit'),'on'=>gettext('on'));
53 772a7b3d loonylion
54 5b237745 Scott Ullrich
/*
55
	In this file, "port" refers to the physical port name,
56
	while "interface" refers to LAN, WAN, or OPTn.
57
*/
58
59
/* get list without VLAN interfaces */
60
$portlist = get_interface_list();
61
62 179377b0 robjarsen
/*another *_fast function from interfaces_fast.inc. These functions are basically the same as the
63 87489e5c loonylion
ones they're named after, except they (usually) take an array and (always) return an array. This means that they only
64
need to be called once per script run, the returned array contains all the data necessary for repeated use */
65
$friendlyifnames = convert_real_interface_to_friendly_interface_name_fast();
66
67 7c53bc7b Erik Fonnesbeck
/* add wireless clone interfaces */
68
if (is_array($config['wireless']['clone']) && count($config['wireless']['clone'])) {
69
	foreach ($config['wireless']['clone'] as $clone) {
70
		$portlist[$clone['cloneif']] = $clone;
71
		$portlist[$clone['cloneif']]['iswlclone'] = true;
72
	}
73
}
74
75 5b237745 Scott Ullrich
/* add VLAN interfaces */
76
if (is_array($config['vlans']['vlan']) && count($config['vlans']['vlan'])) {
77 87489e5c loonylion
	//$timea = microtime(true);
78 5b237745 Scott Ullrich
	foreach ($config['vlans']['vlan'] as $vlan) {
79 d59557dc Ermal Luçi
		$portlist[$vlan['vlanif']] = $vlan;
80
		$portlist[$vlan['vlanif']]['isvlan'] = true;
81 5b237745 Scott Ullrich
	}
82
}
83
84 38738505 Ermal Luçi
/* add Bridge interfaces */
85 b47c94bd Ermal Luçi
if (is_array($config['bridges']['bridged']) && count($config['bridges']['bridged'])) {
86 ef88e1e1 Renato Botelho
	foreach ($config['bridges']['bridged'] as $bridge) {
87
		$portlist[$bridge['bridgeif']] = $bridge;
88
		$portlist[$bridge['bridgeif']]['isbridge'] = true;
89
	}
90 38738505 Ermal Luçi
}
91
92
/* add GIF interfaces */
93
if (is_array($config['gifs']['gif']) && count($config['gifs']['gif'])) {
94 ef88e1e1 Renato Botelho
	foreach ($config['gifs']['gif'] as $gif) {
95
		$portlist[$gif['gifif']] = $gif;
96
		$portlist[$gif['gifif']]['isgif'] = true;
97
	}
98 38738505 Ermal Luçi
}
99
100
/* add GRE interfaces */
101
if (is_array($config['gres']['gre']) && count($config['gres']['gre'])) {
102 ef88e1e1 Renato Botelho
	foreach ($config['gres']['gre'] as $gre) {
103
		$portlist[$gre['greif']] = $gre;
104
		$portlist[$gre['greif']]['isgre'] = true;
105
	}
106 38738505 Ermal Luçi
}
107
108 dbdd08af Ermal Luçi
/* add LAGG interfaces */
109 87489e5c loonylion
if (is_array($config['laggs']['lagg']) && count($config['laggs']['lagg'])) {
110
	foreach ($config['laggs']['lagg'] as $lagg) {
111
		$portlist[$lagg['laggif']] = $lagg;
112
		$portlist[$lagg['laggif']]['islagg'] = true;
113
		/* LAGG members cannot be assigned */
114
		$lagifs = explode(',', $lagg['members']);
115
		foreach ($lagifs as $lagif) {
116
			if (isset($portlist[$lagif])) {
117
				unset($portlist[$lagif]);
118
			}
119 2af86dda Phil Davis
		}
120 ef88e1e1 Renato Botelho
	}
121 c720925c Ermal Luçi
}
122
123 265188ea Ermal Lu?i
/* add QinQ interfaces */
124
if (is_array($config['qinqs']['qinqentry']) && count($config['qinqs']['qinqentry'])) {
125 ef88e1e1 Renato Botelho
	foreach ($config['qinqs']['qinqentry'] as $qinq) {
126 1322ee22 Chris Rowe
		$portlist["{$qinq['vlanif']}"]['descr'] = "VLAN {$qinq['tag']} on {$qinq['if']}";
127
		$portlist["{$qinq['vlanif']}"]['isqinq'] = true;
128 ef88e1e1 Renato Botelho
		/* QinQ members */
129
		$qinqifs = explode(' ', $qinq['members']);
130
		foreach ($qinqifs as $qinqif) {
131 87489e5c loonylion
			$portlist["{$qinq['vlanif']}_{$qinqif}"]['descr'] = "QinQ {$qinqif} on VLAN {$qinq['tag']} on {$qinq['if']}";
132
			$portlist["{$qinq['vlanif']}_{$qinqif}"]['isqinq'] = true;
133 ef88e1e1 Renato Botelho
		}
134
	}
135 265188ea Ermal Lu?i
}
136 c720925c Ermal Luçi
137 860c4e80 Chris Buechler
/* add PPP interfaces */
138
if (is_array($config['ppps']['ppp']) && count($config['ppps']['ppp'])) {
139 611ae852 Ermal
	foreach ($config['ppps']['ppp'] as $pppid => $ppp) {
140 99c26d44 gnhb
		$portname = $ppp['if'];
141 860c4e80 Chris Buechler
		$portlist[$portname] = $ppp;
142
		$portlist[$portname]['isppp'] = true;
143 3f2ef8d7 gnhb
		$ports_base = basename($ppp['ports']);
144 2af86dda Phil Davis
		if (isset($ppp['descr'])) {
145 99c26d44 gnhb
			$portlist[$portname]['descr'] = strtoupper($ppp['if']). "({$ports_base}) - {$ppp['descr']}";
146 2af86dda Phil Davis
		} else if (isset($ppp['username'])) {
147 99c26d44 gnhb
			$portlist[$portname]['descr'] = strtoupper($ppp['if']). "({$ports_base}) - {$ppp['username']}";
148 2af86dda Phil Davis
		} else {
149 99c26d44 gnhb
			$portlist[$portname]['descr'] = strtoupper($ppp['if']). "({$ports_base})";
150 2af86dda Phil Davis
		}
151 860c4e80 Chris Buechler
	}
152
}
153
154 144fbff2 jim-p
$ovpn_descrs = array();
155
if (is_array($config['openvpn'])) {
156 2af86dda Phil Davis
	if (is_array($config['openvpn']['openvpn-server'])) {
157
		foreach ($config['openvpn']['openvpn-server'] as $s) {
158 bfa7b33e doktornotor
			$portname = "ovpns{$s['vpnid']}";
159
			$portlist[$portname] = $s;
160 144fbff2 jim-p
			$ovpn_descrs[$s['vpnid']] = $s['description'];
161 2af86dda Phil Davis
		}
162
	}
163
	if (is_array($config['openvpn']['openvpn-client'])) {
164
		foreach ($config['openvpn']['openvpn-client'] as $c) {
165 bfa7b33e doktornotor
			$portname = "ovpnc{$c['vpnid']}";
166
			$portlist[$portname] = $c;
167 144fbff2 jim-p
			$ovpn_descrs[$c['vpnid']] = $c['description'];
168 2af86dda Phil Davis
		}
169
	}
170 144fbff2 jim-p
}
171
172 87489e5c loonylion
173
$ifdescrs = interface_assign_description_fast($portlist,$friendlyifnames);
174
175 4401107f Steve Beaver
if (isset($_REQUEST['add']) && isset($_REQUEST['if_add'])) {
176 7c611a3e Renato Botelho
	/* Be sure this port is not being used */
177
	$portused = false;
178
	foreach ($config['interfaces'] as $ifname => $ifdata) {
179 4401107f Steve Beaver
		if ($ifdata['if'] == $_REQUEST['if_add']) {
180 7c611a3e Renato Botelho
			$portused = true;
181
			break;
182
		}
183
	}
184
185
	if ($portused === false) {
186
		/* find next free optional interface number */
187 2af86dda Phil Davis
		if (!$config['interfaces']['lan']) {
188 7c611a3e Renato Botelho
			$newifname = gettext("lan");
189
			$descr = gettext("LAN");
190
		} else {
191 e34c96a3 Steve Beaver
			for ($i = 1; $i <= count($config['interfaces']); $i++) {
192
				if (!$config['interfaces']["opt{$i}"]) {
193
					break;
194
				}
195
			}
196 7c611a3e Renato Botelho
			$newifname = 'opt' . $i;
197
			$descr = "OPT" . $i;
198
		}
199 179377b0 robjarsen
200 7c611a3e Renato Botelho
		$config['interfaces'][$newifname] = array();
201
		$config['interfaces'][$newifname]['descr'] = $descr;
202
		$config['interfaces'][$newifname]['if'] = $_POST['if_add'];
203
		if (preg_match($g['wireless_regex'], $_POST['if_add'])) {
204
			$config['interfaces'][$newifname]['wireless'] = array();
205
			interface_sync_wireless_clones($config['interfaces'][$newifname], false);
206
		}
207
208 179377b0 robjarsen
209 7c611a3e Renato Botelho
		uksort($config['interfaces'], "compare_interface_friendly_names");
210
211
		/* XXX: Do not remove this. */
212
		unlink_if_exists("{$g['tmp_path']}/config.cache");
213
214
		write_config();
215
216 44c42356 Phil Davis
		$action_msg = gettext("Interface has been added.");
217 c8532336 Phil Davis
		$class = "success";
218 7c611a3e Renato Botelho
	}
219
220
} else if (isset($_POST['apply'])) {
221 ca4acbcd Scott Ullrich
	if (file_exists("/var/run/interface_mismatch_reboot_needed")) {
222 eef52225 jim-p
		system_reboot();
223 ca4acbcd Scott Ullrich
		$rebootingnow = true;
224
	} else {
225 d59557dc Ermal Luçi
		write_config();
226
227 44c42356 Phil Davis
		$changes_applied = true;
228
		$retval = 0;
229
		$retval |= filter_configure();
230 d59557dc Ermal Luçi
	}
231
232 7c611a3e Renato Botelho
} else if (isset($_POST['Submit'])) {
233 5b237745 Scott Ullrich
234
	unset($input_errors);
235
236
	/* input validation */
237
238
	/* Build a list of the port names so we can see how the interfaces map */
239
	$portifmap = array();
240 2af86dda Phil Davis
	foreach ($portlist as $portname => $portinfo) {
241 5b237745 Scott Ullrich
		$portifmap[$portname] = array();
242 2af86dda Phil Davis
	}
243 5b237745 Scott Ullrich
244
	/* Go through the list of ports selected by the user,
245 ef88e1e1 Renato Botelho
	build a list of port-to-interface mappings in portifmap */
246 5b237745 Scott Ullrich
	foreach ($_POST as $ifname => $ifport) {
247 2af86dda Phil Davis
		if (($ifname == 'lan') || ($ifname == 'wan') || (substr($ifname, 0, 3) == 'opt')) {
248 5b237745 Scott Ullrich
			$portifmap[$ifport][] = strtoupper($ifname);
249 2af86dda Phil Davis
		}
250 5b237745 Scott Ullrich
	}
251
252
	/* Deliver error message for any port with more than one assignment */
253
	foreach ($portifmap as $portname => $ifnames) {
254
		if (count($ifnames) > 1) {
255 ddc55e12 Erik Fonnesbeck
			$errstr = sprintf(gettext('Port %1$s '.
256
				' was assigned to %2$s' .
257
				' interfaces:'), $portname, count($ifnames));
258 ef88e1e1 Renato Botelho
259 2af86dda Phil Davis
			foreach ($portifmap[$portname] as $ifn) {
260 f0eef2ef Phil Davis
				$errstr .= " " . convert_friendly_interface_to_friendly_descr(strtolower($ifn)) . " (" . $ifn . ")";
261 2af86dda Phil Davis
			}
262 ef88e1e1 Renato Botelho
263 5b237745 Scott Ullrich
			$input_errors[] = $errstr;
264 95540233 Renato Botelho
		} else if (count($ifnames) == 1 && preg_match('/^bridge[0-9]/', $portname) && is_array($config['bridges']['bridged']) && count($config['bridges']['bridged'])) {
265
			foreach ($config['bridges']['bridged'] as $bridge) {
266 2af86dda Phil Davis
				if ($bridge['bridgeif'] != $portname) {
267 95540233 Renato Botelho
					continue;
268 2af86dda Phil Davis
				}
269 95540233 Renato Botelho
270
				$members = explode(",", strtoupper($bridge['members']));
271
				foreach ($members as $member) {
272
					if ($member == $ifnames[0]) {
273 45654aa0 NOYB
						$input_errors[] = sprintf(gettext('Cannot set port %1$s to interface %2$s because this interface is a member of %3$s.'), $portname, $member, $portname);
274 95540233 Renato Botelho
						break;
275
					}
276
				}
277
			}
278 5b237745 Scott Ullrich
		}
279
	}
280
281 66bcba1b Ermal
	if (is_array($config['vlans']['vlan'])) {
282
		foreach ($config['vlans']['vlan'] as $vlan) {
283 2af86dda Phil Davis
			if (does_interface_exist($vlan['if']) == false) {
284 0fc3de67 Phil Davis
				$input_errors[] = sprintf(gettext('Vlan parent interface %1$s does not exist anymore so vlan id %2$s cannot be created please fix the issue before continuing.'), $vlan['if'], $vlan['tag']);
285 2af86dda Phil Davis
			}
286 66bcba1b Ermal
		}
287
	}
288 5b237745 Scott Ullrich
289
	if (!$input_errors) {
290
		/* No errors detected, so update the config */
291
		foreach ($_POST as $ifname => $ifport) {
292 ef88e1e1 Renato Botelho
293
			if (($ifname == 'lan') || ($ifname == 'wan') || (substr($ifname, 0, 3) == 'opt')) {
294
295 5b237745 Scott Ullrich
				if (!is_array($ifport)) {
296 e7bfa231 Ermal Lu?i
					$reloadif = false;
297 44088ce8 Ermal Lu?i
					if (!empty($config['interfaces'][$ifname]['if']) && $config['interfaces'][$ifname]['if'] <> $ifport) {
298
						interface_bring_down($ifname);
299 e7bfa231 Ermal Lu?i
						/* Mark this to be reconfigured in any case. */
300
						$reloadif = true;
301 44088ce8 Ermal Lu?i
					}
302 5b237745 Scott Ullrich
					$config['interfaces'][$ifname]['if'] = $ifport;
303 2af86dda Phil Davis
					if (isset($portlist[$ifport]['isppp'])) {
304 c86e8f76 gnhb
						$config['interfaces'][$ifname]['ipaddr'] = $portlist[$ifport]['type'];
305 2af86dda Phil Davis
					}
306 ef88e1e1 Renato Botelho
307 0b5fc1d1 Ermal
					if (substr($ifport, 0, 3) == 'gre' || substr($ifport, 0, 3) == 'gif') {
308 f3d88511 Renato Botelho
						unset($config['interfaces'][$ifname]['ipaddr']);
309
						unset($config['interfaces'][$ifname]['subnet']);
310
						unset($config['interfaces'][$ifname]['ipaddrv6']);
311
						unset($config['interfaces'][$ifname]['subnetv6']);
312
					}
313
314 5b237745 Scott Ullrich
					/* check for wireless interfaces, set or clear ['wireless'] */
315 94a77286 Scott Ullrich
					if (preg_match($g['wireless_regex'], $ifport)) {
316 2af86dda Phil Davis
						if (!is_array($config['interfaces'][$ifname]['wireless'])) {
317 5b237745 Scott Ullrich
							$config['interfaces'][$ifname]['wireless'] = array();
318 2af86dda Phil Davis
						}
319 5b237745 Scott Ullrich
					} else {
320
						unset($config['interfaces'][$ifname]['wireless']);
321
					}
322 ef88e1e1 Renato Botelho
323 d59557dc Ermal Luçi
					/* make sure there is a descr for all interfaces */
324 2af86dda Phil Davis
					if (!isset($config['interfaces'][$ifname]['descr'])) {
325 d59557dc Ermal Luçi
						$config['interfaces'][$ifname]['descr'] = strtoupper($ifname);
326 2af86dda Phil Davis
					}
327 ef88e1e1 Renato Botelho
328 b13efb03 Erik Fonnesbeck
					if ($reloadif == true) {
329 2af86dda Phil Davis
						if (preg_match($g['wireless_regex'], $ifport)) {
330 b13efb03 Erik Fonnesbeck
							interface_sync_wireless_clones($config['interfaces'][$ifname], false);
331 2af86dda Phil Davis
						}
332 e7bfa231 Ermal Lu?i
						/* Reload all for the interface. */
333
						interface_configure($ifname, true);
334 b13efb03 Erik Fonnesbeck
					}
335 5b237745 Scott Ullrich
				}
336
			}
337
		}
338
		write_config();
339 ef88e1e1 Renato Botelho
340 6e6233d0 sullrich
		enable_rrd_graphing();
341 5b237745 Scott Ullrich
	}
342 7c611a3e Renato Botelho
} else {
343
	unset($delbtn);
344 aa82505e Phil Davis
	if (!empty($_POST['del'])) {
345 41ea4cf3 Sjon Hortensius
		$delbtn = key($_POST['del']);
346 aa82505e Phil Davis
	}
347 5b237745 Scott Ullrich
348 7c611a3e Renato Botelho
	if (isset($delbtn)) {
349
		$id = $delbtn;
350
351 2af86dda Phil Davis
		if (link_interface_to_group($id)) {
352 7c611a3e Renato Botelho
			$input_errors[] = gettext("The interface is part of a group. Please remove it from the group to continue");
353 2af86dda Phil Davis
		} else if (link_interface_to_bridge($id)) {
354 7c611a3e Renato Botelho
			$input_errors[] = gettext("The interface is part of a bridge. Please remove it from the bridge to continue");
355 2af86dda Phil Davis
		} else if (link_interface_to_gre($id)) {
356 7c611a3e Renato Botelho
			$input_errors[] = gettext("The interface is part of a gre tunnel. Please delete the tunnel to continue");
357 2af86dda Phil Davis
		} else if (link_interface_to_gif($id)) {
358 7c611a3e Renato Botelho
			$input_errors[] = gettext("The interface is part of a gif tunnel. Please delete the tunnel to continue");
359 85ea9d46 Steve Beaver
		} else if (interface_has_queue($id)) {
360 9267c6c9 Steve Beaver
			$input_errors[] = gettext("The interface has a traffic shaper queue configured.\nPlease remove all queues on the interface to continue.");
361 2af86dda Phil Davis
		} else {
362 7c611a3e Renato Botelho
			unset($config['interfaces'][$id]['enable']);
363
			$realid = get_real_interface($id);
364
			interface_bring_down($id);   /* down the interface */
365
366
			unset($config['interfaces'][$id]);	/* delete the specified OPTn or LAN*/
367
368
			if (is_array($config['dhcpd']) && is_array($config['dhcpd'][$id])) {
369
				unset($config['dhcpd'][$id]);
370 6756052b NewEraCracker
				services_dhcpd_configure('inet');
371 7c611a3e Renato Botelho
			}
372 c3bc7432 Ermal Luçi
373 ff3f0016 Chris Buechler
			if (is_array($config['dhcpdv6']) && is_array($config['dhcpdv6'][$id])) {
374
				unset($config['dhcpdv6'][$id]);
375 6756052b NewEraCracker
				services_dhcpd_configure('inet6');
376 ff3f0016 Chris Buechler
			}
377
378 7c611a3e Renato Botelho
			if (count($config['filter']['rule']) > 0) {
379
				foreach ($config['filter']['rule'] as $x => $rule) {
380 2af86dda Phil Davis
					if ($rule['interface'] == $id) {
381 7c611a3e Renato Botelho
						unset($config['filter']['rule'][$x]);
382 2af86dda Phil Davis
					}
383 7c611a3e Renato Botelho
				}
384 e27d0494 Ermal
			}
385 7c611a3e Renato Botelho
			if (is_array($config['nat']['rule']) && count($config['nat']['rule']) > 0) {
386
				foreach ($config['nat']['rule'] as $x => $rule) {
387 2af86dda Phil Davis
					if ($rule['interface'] == $id) {
388 7c611a3e Renato Botelho
						unset($config['nat']['rule'][$x]['interface']);
389 2af86dda Phil Davis
					}
390 7c611a3e Renato Botelho
				}
391 e27d0494 Ermal
			}
392 c3bc7432 Ermal Luçi
393 7c611a3e Renato Botelho
			write_config();
394 ef88e1e1 Renato Botelho
395 7c611a3e Renato Botelho
			/* If we are in firewall/routing mode (not single interface)
396
			 * then ensure that we are not running DHCP on the wan which
397
			 * will make a lot of ISP's unhappy.
398
			 */
399 2af86dda Phil Davis
			if ($config['interfaces']['lan'] && $config['dhcpd']['wan']) {
400 7c611a3e Renato Botelho
				unset($config['dhcpd']['wan']);
401
			}
402 7850de1c Ermal Lu?i
403 7c611a3e Renato Botelho
			link_interface_to_vlans($realid, "update");
404 ef88e1e1 Renato Botelho
405 44c42356 Phil Davis
			$action_msg = gettext("Interface has been deleted.");
406 c8532336 Phil Davis
			$class = "success";
407 8a648100 Ermal Luçi
		}
408 bda86e8f Scott Ullrich
	}
409 7c611a3e Renato Botelho
}
410 cec4323f Erik Fonnesbeck
411 7c611a3e Renato Botelho
/* Create a list of unused ports */
412
$unused_portlist = array();
413 87489e5c loonylion
$portArray = array_keys($portlist);
414
415
$ifaceArray = array_column($config['interfaces'],'if');
416
$unused = array_diff($portArray,$ifaceArray);
417
$unused = array_flip($unused);
418
$unused_portlist = array_intersect_key($portlist,$unused);//*/
419
unset($unused,$portArray,$ifaceArray);
420 5b237745 Scott Ullrich
421 7f43ca88 Scott Ullrich
include("head.inc");
422
423 2af86dda Phil Davis
if (file_exists("/var/run/interface_mismatch_reboot_needed")) {
424 ca4acbcd Scott Ullrich
	if ($_POST) {
425 2af86dda Phil Davis
		if ($rebootingnow) {
426 44c42356 Phil Davis
			$action_msg = gettext("The system is now rebooting. Please wait.");
427 c8532336 Phil Davis
			$class = "success";
428 2af86dda Phil Davis
		} else {
429 21c18c3d Phil Davis
			$applymsg = gettext("Reboot is needed. Please apply the settings in order to reboot.");
430 c8532336 Phil Davis
			$class = "warning";
431 2af86dda Phil Davis
		}
432 ca4acbcd Scott Ullrich
	} else {
433 44c42356 Phil Davis
		$action_msg = gettext("Interface mismatch detected. Please resolve the mismatch, save and then click 'Apply Changes'. The firewall will reboot afterwards.");
434 c8532336 Phil Davis
		$class = "warning";
435 ca4acbcd Scott Ullrich
	}
436 41ea4cf3 Sjon Hortensius
}
437 f2cb6a9f Scott Ullrich
438 1b0e073e Renato Botelho
if (file_exists("/tmp/reload_interfaces")) {
439
	echo "<p>\n";
440 45654aa0 NOYB
	print_apply_box(gettext("The interface configuration has been changed.") . "<br />" . gettext("The changes must be applied for them to take effect."));
441 1b0e073e Renato Botelho
	echo "<br /></p>\n";
442 21c18c3d Phil Davis
} elseif ($applymsg) {
443
	print_apply_box($applymsg);
444 44c42356 Phil Davis
} elseif ($action_msg) {
445
	print_info_box($action_msg, $class);
446
} elseif ($changes_applied) {
447
	print_apply_result_box($retval);
448 2af86dda Phil Davis
}
449 1b0e073e Renato Botelho
450
pfSense_handle_custom_code("/usr/local/pkg/interfaces_assign/pre_input_errors");
451 a4af095c Renato Botelho
452 aa82505e Phil Davis
if ($input_errors) {
453 1b0e073e Renato Botelho
	print_input_errors($input_errors);
454 aa82505e Phil Davis
}
455 f2cb6a9f Scott Ullrich
456 41ea4cf3 Sjon Hortensius
$tab_array = array();
457 26b4bef8 k-paulius
$tab_array[] = array(gettext("Interface Assignments"), true, "interfaces_assign.php");
458 50e6c063 Renato Botelho
$tab_array[] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
459
$tab_array[] = array(gettext("Wireless"), false, "interfaces_wireless.php");
460
$tab_array[] = array(gettext("VLANs"), false, "interfaces_vlan.php");
461
$tab_array[] = array(gettext("QinQs"), false, "interfaces_qinq.php");
462
$tab_array[] = array(gettext("PPPs"), false, "interfaces_ppps.php");
463 26b4bef8 k-paulius
$tab_array[] = array(gettext("GREs"), false, "interfaces_gre.php");
464
$tab_array[] = array(gettext("GIFs"), false, "interfaces_gif.php");
465 50e6c063 Renato Botelho
$tab_array[] = array(gettext("Bridges"), false, "interfaces_bridge.php");
466 26b4bef8 k-paulius
$tab_array[] = array(gettext("LAGGs"), false, "interfaces_lagg.php");
467 41ea4cf3 Sjon Hortensius
display_top_tabs($tab_array);
468 87489e5c loonylion
469 179377b0 robjarsen
/*Generate the port select box only once.
470 87489e5c loonylion
Not indenting the HTML to produce smaller code
471
and faster page load times */
472
473
$portselect='';
474
foreach ($portlist as $portname => $portinfo) {
475 179377b0 robjarsen
	$portselect.='<option value="'.$portname.'"';
476 87489e5c loonylion
	$portselect.=">".$ifdescrs[$portname]."</option>\n";
477
}
478
479 1b0e073e Renato Botelho
?>
480 41ea4cf3 Sjon Hortensius
<form action="interfaces_assign.php" method="post">
481 89f64f0f Sander van Leeuwen
	<div class="table-responsive">
482
	<table class="table table-striped table-hover">
483 41ea4cf3 Sjon Hortensius
	<thead>
484
		<tr>
485
			<th><?=gettext("Interface")?></th>
486
			<th><?=gettext("Network port")?></th>
487 290566ed NOYB
			<th>&nbsp;</th>
488 41ea4cf3 Sjon Hortensius
		</tr>
489
	</thead>
490
	<tbody>
491 1b0e073e Renato Botelho
<?php
492 87489e5c loonylion
	$i=0;
493 41ea4cf3 Sjon Hortensius
	foreach ($config['interfaces'] as $ifname => $iface):
494 aa82505e Phil Davis
		if ($iface['descr']) {
495 41ea4cf3 Sjon Hortensius
			$ifdescr = $iface['descr'];
496 aa82505e Phil Davis
		} else {
497 41ea4cf3 Sjon Hortensius
			$ifdescr = strtoupper($ifname);
498 aa82505e Phil Davis
		}
499 7c611a3e Renato Botelho
?>
500 41ea4cf3 Sjon Hortensius
		<tr>
501 4401107f Steve Beaver
			<td><a href="/interfaces.php?if=<?=$ifname?>"><?=$ifdescr?></a></td>
502 41ea4cf3 Sjon Hortensius
			<td>
503
				<select name="<?=$ifname?>" id="<?=$ifname?>" class="form-control">
504 179377b0 robjarsen
<?php
505 87489e5c loonylion
/*port select menu generation loop replaced with pre-prepared select menu to reduce page generation time */
506
echo str_replace('value="'.$iface['if'].'">','value="'.$iface['if'].'" selected>',$portselect);
507
?>
508 41ea4cf3 Sjon Hortensius
				</select>
509
			</td>
510
			<td>
511
<?php if ($ifname != 'wan'):?>
512 87489e5c loonylion
				<button type="submit" name="del[<?=$ifname?>]" class="btn btn-danger btn-sm" title="<?=$gettextArray['deleteif']?>">
513 4419e274 Stephen Beaver
					<i class="fa fa-trash icon-embed-btn"></i>
514 87489e5c loonylion
					<?=$gettextArray["delete"]?>
515 4419e274 Stephen Beaver
				</button>
516 41ea4cf3 Sjon Hortensius
<?php endif;?>
517
			</td>
518
		</tr>
519 179377b0 robjarsen
<?php $i++;
520 87489e5c loonylion
endforeach;
521 41ea4cf3 Sjon Hortensius
	if (count($config['interfaces']) < count($portlist)):
522 1b0e073e Renato Botelho
?>
523 41ea4cf3 Sjon Hortensius
		<tr>
524
			<th>
525
				<?=gettext("Available network ports:")?>
526
			</th>
527
			<td>
528
				<select name="if_add" id="if_add" class="form-control">
529 87489e5c loonylion
<?php
530
/* HTML not indented to save on transmission/render time */
531
foreach ($unused_portlist as $portname => $portinfo):?>
532
<option value="<?=$portname?>" <?=($portname == $iface['if']) ? ' selected': ''?>><?=$ifdescrs[$portname]?></option>
533
<?php endforeach;
534
?>
535 41ea4cf3 Sjon Hortensius
				</select>
536
			</td>
537
			<td>
538 4419e274 Stephen Beaver
				<button type="submit" name="add" title="<?=gettext("Add selected interface")?>" value="add interface" class="btn btn-success btn-sm" >
539
					<i class="fa fa-plus icon-embed-btn"></i>
540 87489e5c loonylion
					<?=$gettextArray["add"]?>
541 4419e274 Stephen Beaver
				</button>
542 41ea4cf3 Sjon Hortensius
			</td>
543
		</tr>
544
<?php endif;?>
545
		</tbody>
546
	</table>
547 89f64f0f Sander van Leeuwen
	</div>
548 41ea4cf3 Sjon Hortensius
549 27d6a45b jim-p
	<button name="Submit" type="submit" class="btn btn-primary" value="<?=gettext('Save')?>"><i class="fa fa-save icon-embed-btn"></i><?=gettext('Save')?></button>
550 5b237745 Scott Ullrich
</form>
551 4419e274 Stephen Beaver
<br />
552 7c945f74 k-paulius
553
<?php
554 481db4fe jim-p
print_info_box(gettext("Interfaces that are configured as members of a lagg(4) interface will not be shown.") .
555
    '<br/><br/>' .
556
    gettext("Wireless interfaces must be created on the Wireless tab before they can be assigned."), 'info', false);
557 7c945f74 k-paulius
?>
558 89f64f0f Sander van Leeuwen
559 bfa7b33e doktornotor
<?php include("foot.inc")?>