Project

General

Profile

Download (18.6 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
/*
3
 * interfaces_assign.php
4
 *
5
 * part of pfSense (https://www.pfsense.org)
6
 * Copyright (c) 2004-2016 Rubicon Communications, LLC (Netgate)
7
 * All rights reserved.
8
 *
9
 * 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
 *
14
 * 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
 *
18
 * http://www.apache.org/licenses/LICENSE-2.0
19
 *
20
 * 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
 */
26

    
27
##|+PRIV
28
##|*IDENT=page-interfaces-assignnetworkports
29
##|*NAME=Interfaces: Interface Assignments
30
##|*DESCR=Allow access to the 'Interfaces: Interface Assignments' page.
31
##|*MATCH=interfaces_assign.php*
32
##|-PRIV
33

    
34
$pgtitle = array(gettext("Interfaces"), gettext("Interface Assignments"));
35
$shortcut_section = "interfaces";
36

    
37
require_once("guiconfig.inc");
38
require_once("functions.inc");
39
require_once("filter.inc");
40
require_once("shaper.inc");
41
require_once("ipsec.inc");
42
require_once("vpn.inc");
43
require_once("captiveportal.inc");
44
require_once("rrd.inc");
45

    
46
function interface_assign_description($portinfo, $portname) {
47
	global $ovpn_descrs;
48
	if ($portinfo['isvlan']) {
49
		$descr = sprintf(gettext('VLAN %1$s on %2$s'), $portinfo['tag'], $portinfo['if']);
50
		$iface = convert_real_interface_to_friendly_interface_name($portinfo['if']);
51
		if (isset($iface) && strlen($iface) > 0) {
52
			$descr .= " - $iface";
53
		}
54
		if ($portinfo['descr']) {
55
			$descr .= " (" . $portinfo['descr'] . ")";
56
		}
57
	} elseif ($portinfo['iswlclone']) {
58
		$descr = $portinfo['cloneif'];
59
		if ($portinfo['descr']) {
60
			$descr .= " (" . $portinfo['descr'] . ")";
61
		}
62
	} elseif ($portinfo['isppp']) {
63
		$descr = $portinfo['descr'];
64
	} elseif ($portinfo['isbridge']) {
65
		$descr = strtoupper($portinfo['bridgeif']);
66
		if ($portinfo['descr']) {
67
			$descr .= " (" . $portinfo['descr'] . ")";
68
		}
69
	} elseif ($portinfo['isgre']) {
70
		$descr = "GRE {$portinfo['remote-addr']}";
71
		if ($portinfo['descr']) {
72
			$descr .= " (" . $portinfo['descr'] . ")";
73
		}
74
	} elseif ($portinfo['isgif']) {
75
		$descr = "GIF {$portinfo['remote-addr']}";
76
		if ($portinfo['descr']) {
77
			$descr .= " (" . $portinfo['descr'] . ")";
78
		}
79
	} elseif ($portinfo['islagg']) {
80
		$descr = strtoupper($portinfo['laggif']);
81
		if ($portinfo['descr']) {
82
			$descr .= " (" . $portinfo['descr'] . ")";
83
		}
84
	} elseif ($portinfo['isqinq']) {
85
		$descr = $portinfo['descr'];
86
	} elseif (substr($portname, 0, 4) == 'ovpn') {
87
		$descr = $portname . " (" . $ovpn_descrs[substr($portname, 5)] . ")";
88
	} else {
89
		$descr = $portname . " (" . $portinfo['mac'] . ")";
90
	}
91

    
92
	return htmlspecialchars($descr);
93
}
94

    
95
/*
96
	In this file, "port" refers to the physical port name,
97
	while "interface" refers to LAN, WAN, or OPTn.
98
*/
99

    
100
/* get list without VLAN interfaces */
101
$portlist = get_interface_list();
102

    
103
/* add wireless clone interfaces */
104
if (is_array($config['wireless']['clone']) && count($config['wireless']['clone'])) {
105
	foreach ($config['wireless']['clone'] as $clone) {
106
		$portlist[$clone['cloneif']] = $clone;
107
		$portlist[$clone['cloneif']]['iswlclone'] = true;
108
	}
109
}
110

    
111
/* add VLAN interfaces */
112
if (is_array($config['vlans']['vlan']) && count($config['vlans']['vlan'])) {
113
	foreach ($config['vlans']['vlan'] as $vlan) {
114
		$portlist[$vlan['vlanif']] = $vlan;
115
		$portlist[$vlan['vlanif']]['isvlan'] = true;
116
	}
117
}
118

    
119
/* add Bridge interfaces */
120
if (is_array($config['bridges']['bridged']) && count($config['bridges']['bridged'])) {
121
	foreach ($config['bridges']['bridged'] as $bridge) {
122
		$portlist[$bridge['bridgeif']] = $bridge;
123
		$portlist[$bridge['bridgeif']]['isbridge'] = true;
124
	}
125
}
126

    
127
/* add GIF interfaces */
128
if (is_array($config['gifs']['gif']) && count($config['gifs']['gif'])) {
129
	foreach ($config['gifs']['gif'] as $gif) {
130
		$portlist[$gif['gifif']] = $gif;
131
		$portlist[$gif['gifif']]['isgif'] = true;
132
	}
133
}
134

    
135
/* add GRE interfaces */
136
if (is_array($config['gres']['gre']) && count($config['gres']['gre'])) {
137
	foreach ($config['gres']['gre'] as $gre) {
138
		$portlist[$gre['greif']] = $gre;
139
		$portlist[$gre['greif']]['isgre'] = true;
140
	}
141
}
142

    
143
/* add LAGG interfaces */
144
if (is_array($config['laggs']['lagg']) && count($config['laggs']['lagg'])) {
145
	foreach ($config['laggs']['lagg'] as $lagg) {
146
		$portlist[$lagg['laggif']] = $lagg;
147
		$portlist[$lagg['laggif']]['islagg'] = true;
148
		/* LAGG members cannot be assigned */
149
		$lagifs = explode(',', $lagg['members']);
150
		foreach ($lagifs as $lagif) {
151
			if (isset($portlist[$lagif])) {
152
				unset($portlist[$lagif]);
153
			}
154
		}
155
	}
156
}
157

    
158
/* add QinQ interfaces */
159
if (is_array($config['qinqs']['qinqentry']) && count($config['qinqs']['qinqentry'])) {
160
	foreach ($config['qinqs']['qinqentry'] as $qinq) {
161
		$portlist["{$qinq['vlanif']}"]['descr'] = "VLAN {$qinq['tag']} on {$qinq['if']}";
162
		$portlist["{$qinq['vlanif']}"]['isqinq'] = true;
163
		/* QinQ members */
164
		$qinqifs = explode(' ', $qinq['members']);
165
		foreach ($qinqifs as $qinqif) {
166
			$portlist["{$qinq['vlanif']}_{$qinqif}"]['descr'] = "QinQ {$qinqif} on VLAN {$qinq['tag']} on {$qinq['if']}";
167
			$portlist["{$qinq['vlanif']}_{$qinqif}"]['isqinq'] = true;
168
		}
169
	}
170
}
171

    
172
/* add PPP interfaces */
173
if (is_array($config['ppps']['ppp']) && count($config['ppps']['ppp'])) {
174
	foreach ($config['ppps']['ppp'] as $pppid => $ppp) {
175
		$portname = $ppp['if'];
176
		$portlist[$portname] = $ppp;
177
		$portlist[$portname]['isppp'] = true;
178
		$ports_base = basename($ppp['ports']);
179
		if (isset($ppp['descr'])) {
180
			$portlist[$portname]['descr'] = strtoupper($ppp['if']). "({$ports_base}) - {$ppp['descr']}";
181
		} else if (isset($ppp['username'])) {
182
			$portlist[$portname]['descr'] = strtoupper($ppp['if']). "({$ports_base}) - {$ppp['username']}";
183
		} else {
184
			$portlist[$portname]['descr'] = strtoupper($ppp['if']). "({$ports_base})";
185
		}
186
	}
187
}
188

    
189
$ovpn_descrs = array();
190
if (is_array($config['openvpn'])) {
191
	if (is_array($config['openvpn']['openvpn-server'])) {
192
		foreach ($config['openvpn']['openvpn-server'] as $s) {
193
			$portname = "ovpns{$s['vpnid']}";
194
			$portlist[$portname] = $s;
195
			$ovpn_descrs[$s['vpnid']] = $s['description'];
196
		}
197
	}
198
	if (is_array($config['openvpn']['openvpn-client'])) {
199
		foreach ($config['openvpn']['openvpn-client'] as $c) {
200
			$portname = "ovpnc{$c['vpnid']}";
201
			$portlist[$portname] = $c;
202
			$ovpn_descrs[$c['vpnid']] = $c['description'];
203
		}
204
	}
205
}
206

    
207
if (isset($_REQUEST['add']) && isset($_REQUEST['if_add'])) {
208
	/* Be sure this port is not being used */
209
	$portused = false;
210
	foreach ($config['interfaces'] as $ifname => $ifdata) {
211
		if ($ifdata['if'] == $_REQUEST['if_add']) {
212
			$portused = true;
213
			break;
214
		}
215
	}
216

    
217
	if ($portused === false) {
218
		/* find next free optional interface number */
219
		if (!$config['interfaces']['lan']) {
220
			$newifname = gettext("lan");
221
			$descr = gettext("LAN");
222
		} else {
223
			for ($i = 1; $i <= count($config['interfaces']); $i++) {
224
				if (!$config['interfaces']["opt{$i}"]) {
225
					break;
226
				}
227
			}
228
			$newifname = 'opt' . $i;
229
			$descr = "OPT" . $i;
230
		}
231

    
232
		$config['interfaces'][$newifname] = array();
233
		$config['interfaces'][$newifname]['descr'] = $descr;
234
		$config['interfaces'][$newifname]['if'] = $_POST['if_add'];
235
		if (preg_match($g['wireless_regex'], $_POST['if_add'])) {
236
			$config['interfaces'][$newifname]['wireless'] = array();
237
			interface_sync_wireless_clones($config['interfaces'][$newifname], false);
238
		}
239

    
240
		uksort($config['interfaces'], "compare_interface_friendly_names");
241

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

    
245
		write_config();
246

    
247
		$action_msg = gettext("Interface has been added.");
248
		$class = "success";
249
	}
250

    
251
} else if (isset($_POST['apply'])) {
252
	if (file_exists("/var/run/interface_mismatch_reboot_needed")) {
253
		system_reboot();
254
		$rebootingnow = true;
255
	} else {
256
		write_config();
257

    
258
		$changes_applied = true;
259
		$retval = 0;
260
		$retval |= filter_configure();
261
	}
262

    
263
} else if (isset($_POST['Submit'])) {
264

    
265
	unset($input_errors);
266

    
267
	/* input validation */
268

    
269
	/* Build a list of the port names so we can see how the interfaces map */
270
	$portifmap = array();
271
	foreach ($portlist as $portname => $portinfo) {
272
		$portifmap[$portname] = array();
273
	}
274

    
275
	/* Go through the list of ports selected by the user,
276
	build a list of port-to-interface mappings in portifmap */
277
	foreach ($_POST as $ifname => $ifport) {
278
		if (($ifname == 'lan') || ($ifname == 'wan') || (substr($ifname, 0, 3) == 'opt')) {
279
			$portifmap[$ifport][] = strtoupper($ifname);
280
		}
281
	}
282

    
283
	/* Deliver error message for any port with more than one assignment */
284
	foreach ($portifmap as $portname => $ifnames) {
285
		if (count($ifnames) > 1) {
286
			$errstr = sprintf(gettext('Port %1$s '.
287
				' was assigned to %2$s' .
288
				' interfaces:'), $portname, count($ifnames));
289

    
290
			foreach ($portifmap[$portname] as $ifn) {
291
				$errstr .= " " . convert_friendly_interface_to_friendly_descr(strtolower($ifn)) . " (" . $ifn . ")";
292
			}
293

    
294
			$input_errors[] = $errstr;
295
		} else if (count($ifnames) == 1 && preg_match('/^bridge[0-9]/', $portname) && is_array($config['bridges']['bridged']) && count($config['bridges']['bridged'])) {
296
			foreach ($config['bridges']['bridged'] as $bridge) {
297
				if ($bridge['bridgeif'] != $portname) {
298
					continue;
299
				}
300

    
301
				$members = explode(",", strtoupper($bridge['members']));
302
				foreach ($members as $member) {
303
					if ($member == $ifnames[0]) {
304
						$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);
305
						break;
306
					}
307
				}
308
			}
309
		}
310
	}
311

    
312
	if (is_array($config['vlans']['vlan'])) {
313
		foreach ($config['vlans']['vlan'] as $vlan) {
314
			if (does_interface_exist($vlan['if']) == false) {
315
				$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']);
316
			}
317
		}
318
	}
319

    
320
	if (!$input_errors) {
321
		/* No errors detected, so update the config */
322
		foreach ($_POST as $ifname => $ifport) {
323

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

    
326
				if (!is_array($ifport)) {
327
					$reloadif = false;
328
					if (!empty($config['interfaces'][$ifname]['if']) && $config['interfaces'][$ifname]['if'] <> $ifport) {
329
						interface_bring_down($ifname);
330
						/* Mark this to be reconfigured in any case. */
331
						$reloadif = true;
332
					}
333
					$config['interfaces'][$ifname]['if'] = $ifport;
334
					if (isset($portlist[$ifport]['isppp'])) {
335
						$config['interfaces'][$ifname]['ipaddr'] = $portlist[$ifport]['type'];
336
					}
337

    
338
					if (substr($ifport, 0, 3) == 'gre' || substr($ifport, 0, 3) == 'gif') {
339
						unset($config['interfaces'][$ifname]['ipaddr']);
340
						unset($config['interfaces'][$ifname]['subnet']);
341
						unset($config['interfaces'][$ifname]['ipaddrv6']);
342
						unset($config['interfaces'][$ifname]['subnetv6']);
343
					}
344

    
345
					/* check for wireless interfaces, set or clear ['wireless'] */
346
					if (preg_match($g['wireless_regex'], $ifport)) {
347
						if (!is_array($config['interfaces'][$ifname]['wireless'])) {
348
							$config['interfaces'][$ifname]['wireless'] = array();
349
						}
350
					} else {
351
						unset($config['interfaces'][$ifname]['wireless']);
352
					}
353

    
354
					/* make sure there is a descr for all interfaces */
355
					if (!isset($config['interfaces'][$ifname]['descr'])) {
356
						$config['interfaces'][$ifname]['descr'] = strtoupper($ifname);
357
					}
358

    
359
					if ($reloadif == true) {
360
						if (preg_match($g['wireless_regex'], $ifport)) {
361
							interface_sync_wireless_clones($config['interfaces'][$ifname], false);
362
						}
363
						/* Reload all for the interface. */
364
						interface_configure($ifname, true);
365
					}
366
				}
367
			}
368
		}
369

    
370
		write_config();
371

    
372
		enable_rrd_graphing();
373
	}
374
} else {
375
	unset($delbtn);
376
	if (!empty($_POST['del'])) {
377
		$delbtn = key($_POST['del']);
378
	}
379

    
380
	if (isset($delbtn)) {
381
		$id = $delbtn;
382

    
383
		if (link_interface_to_group($id)) {
384
			$input_errors[] = gettext("The interface is part of a group. Please remove it from the group to continue");
385
		} else if (link_interface_to_bridge($id)) {
386
			$input_errors[] = gettext("The interface is part of a bridge. Please remove it from the bridge to continue");
387
		} else if (link_interface_to_gre($id)) {
388
			$input_errors[] = gettext("The interface is part of a gre tunnel. Please delete the tunnel to continue");
389
		} else if (link_interface_to_gif($id)) {
390
			$input_errors[] = gettext("The interface is part of a gif tunnel. Please delete the tunnel to continue");
391
		} else if (interface_has_queue($id)) {
392
			$input_errors[] = gettext("The interface has a traffic shaper queue configured.\nPlease remove all queues on the interface to continue.");
393
		} else {
394
			unset($config['interfaces'][$id]['enable']);
395
			$realid = get_real_interface($id);
396
			interface_bring_down($id);   /* down the interface */
397

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

    
400
			if (is_array($config['dhcpd']) && is_array($config['dhcpd'][$id])) {
401
				unset($config['dhcpd'][$id]);
402
				services_dhcpd_configure('inet');
403
			}
404

    
405
			if (is_array($config['dhcpdv6']) && is_array($config['dhcpdv6'][$id])) {
406
				unset($config['dhcpdv6'][$id]);
407
				services_dhcpd_configure('inet6');
408
			}
409

    
410
			if (count($config['filter']['rule']) > 0) {
411
				foreach ($config['filter']['rule'] as $x => $rule) {
412
					if ($rule['interface'] == $id) {
413
						unset($config['filter']['rule'][$x]);
414
					}
415
				}
416
			}
417
			if (is_array($config['nat']['rule']) && count($config['nat']['rule']) > 0) {
418
				foreach ($config['nat']['rule'] as $x => $rule) {
419
					if ($rule['interface'] == $id) {
420
						unset($config['nat']['rule'][$x]['interface']);
421
					}
422
				}
423
			}
424

    
425
			write_config();
426

    
427
			/* If we are in firewall/routing mode (not single interface)
428
			 * then ensure that we are not running DHCP on the wan which
429
			 * will make a lot of ISP's unhappy.
430
			 */
431
			if ($config['interfaces']['lan'] && $config['dhcpd']['wan']) {
432
				unset($config['dhcpd']['wan']);
433
			}
434

    
435
			link_interface_to_vlans($realid, "update");
436

    
437
			$action_msg = gettext("Interface has been deleted.");
438
			$class = "success";
439
		}
440
	}
441
}
442

    
443
/* Create a list of unused ports */
444
$unused_portlist = array();
445
foreach ($portlist as $portname => $portinfo) {
446
	$portused = false;
447
	foreach ($config['interfaces'] as $ifname => $ifdata) {
448
		if ($ifdata['if'] == $portname) {
449
			$portused = true;
450
			break;
451
		}
452
	}
453
	if ($portused === false) {
454
		$unused_portlist[$portname] = $portinfo;
455
	}
456
}
457

    
458
include("head.inc");
459

    
460
if (file_exists("/var/run/interface_mismatch_reboot_needed")) {
461
	if ($_POST) {
462
		if ($rebootingnow) {
463
			$action_msg = gettext("The system is now rebooting. Please wait.");
464
			$class = "success";
465
		} else {
466
			$applymsg = gettext("Reboot is needed. Please apply the settings in order to reboot.");
467
			$class = "warning";
468
		}
469
	} else {
470
		$action_msg = gettext("Interface mismatch detected. Please resolve the mismatch, save and then click 'Apply Changes'. The firewall will reboot afterwards.");
471
		$class = "warning";
472
	}
473
}
474

    
475
if (file_exists("/tmp/reload_interfaces")) {
476
	echo "<p>\n";
477
	print_apply_box(gettext("The interface configuration has been changed.") . "<br />" . gettext("The changes must be applied for them to take effect."));
478
	echo "<br /></p>\n";
479
} elseif ($applymsg) {
480
	print_apply_box($applymsg);
481
} elseif ($action_msg) {
482
	print_info_box($action_msg, $class);
483
} elseif ($changes_applied) {
484
	print_apply_result_box($retval);
485
}
486

    
487
pfSense_handle_custom_code("/usr/local/pkg/interfaces_assign/pre_input_errors");
488

    
489
if ($input_errors) {
490
	print_input_errors($input_errors);
491
}
492

    
493
$tab_array = array();
494
$tab_array[] = array(gettext("Interface Assignments"), true, "interfaces_assign.php");
495
$tab_array[] = array(gettext("Interface Groups"), false, "interfaces_groups.php");
496
$tab_array[] = array(gettext("Wireless"), false, "interfaces_wireless.php");
497
$tab_array[] = array(gettext("VLANs"), false, "interfaces_vlan.php");
498
$tab_array[] = array(gettext("QinQs"), false, "interfaces_qinq.php");
499
$tab_array[] = array(gettext("PPPs"), false, "interfaces_ppps.php");
500
$tab_array[] = array(gettext("GREs"), false, "interfaces_gre.php");
501
$tab_array[] = array(gettext("GIFs"), false, "interfaces_gif.php");
502
$tab_array[] = array(gettext("Bridges"), false, "interfaces_bridge.php");
503
$tab_array[] = array(gettext("LAGGs"), false, "interfaces_lagg.php");
504
display_top_tabs($tab_array);
505
?>
506
<form action="interfaces_assign.php" method="post">
507
	<div class="table-responsive">
508
	<table class="table table-striped table-hover">
509
	<thead>
510
		<tr>
511
			<th><?=gettext("Interface")?></th>
512
			<th><?=gettext("Network port")?></th>
513
			<th>&nbsp;</th>
514
		</tr>
515
	</thead>
516
	<tbody>
517
<?php
518
	foreach ($config['interfaces'] as $ifname => $iface):
519
		if ($iface['descr']) {
520
			$ifdescr = $iface['descr'];
521
		} else {
522
			$ifdescr = strtoupper($ifname);
523
		}
524
?>
525
		<tr>
526
			<td><a href="/interfaces.php?if=<?=$ifname?>"><?=$ifdescr?></a></td>
527
			<td>
528
				<select name="<?=$ifname?>" id="<?=$ifname?>" class="form-control">
529
<?php foreach ($portlist as $portname => $portinfo):?>
530
					<option value="<?=$portname?>" <?=($portname == $iface['if']) ? ' selected': ''?>>
531
						<?=interface_assign_description($portinfo, $portname)?>
532
					</option>
533
<?php endforeach;?>
534
				</select>
535
			</td>
536
			<td>
537
<?php if ($ifname != 'wan'):?>
538
				<button type="submit" name="del[<?=$ifname?>]" class="btn btn-danger btn-sm" title="<?=gettext("Delete interface")?>">
539
					<i class="fa fa-trash icon-embed-btn"></i>
540
					<?=gettext("Delete")?>
541
				</button>
542
<?php endif;?>
543
			</td>
544
		</tr>
545
<?php endforeach;
546
	if (count($config['interfaces']) < count($portlist)):
547
?>
548
		<tr>
549
			<th>
550
				<?=gettext("Available network ports:")?>
551
			</th>
552
			<td>
553
				<select name="if_add" id="if_add" class="form-control">
554
<?php foreach ($unused_portlist as $portname => $portinfo):?>
555
					<option value="<?=$portname?>" <?=($portname == $iface['if']) ? ' selected': ''?>>
556
						<?=interface_assign_description($portinfo, $portname)?>
557
					</option>
558
<?php endforeach;?>
559
				</select>
560
			</td>
561
			<td>
562
				<button type="submit" name="add" title="<?=gettext("Add selected interface")?>" value="add interface" class="btn btn-success btn-sm" >
563
					<i class="fa fa-plus icon-embed-btn"></i>
564
					<?=gettext("Add")?>
565
				</button>
566
			</td>
567
		</tr>
568
<?php endif;?>
569
		</tbody>
570
	</table>
571
	</div>
572

    
573
	<button name="Submit" type="submit" class="btn btn-primary" value="<?=gettext('Save')?>"><i class="fa fa-save icon-embed-btn"></i><?=gettext('Save')?></button>
574
</form>
575
<br />
576

    
577
<?php
578
print_info_box(gettext("Interfaces that are configured as members of a lagg(4) interface will not be shown.") .
579
    '<br/><br/>' .
580
    gettext("Wireless interfaces must be created on the Wireless tab before they can be assigned."), 'info', false);
581
?>
582

    
583
<?php include("foot.inc")?>
(66-66/223)