Project

General

Profile

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