Commit 9e4138c4 authored by Ad Schellevis's avatar Ad Schellevis

(legacy) refactor interfaces_lagg_edit.php

parent 7779d193
<?php
/*
Copyright (C) 2014-2015 Deciso B.V.
Copyright (C) 2014-2016 Deciso B.V.
Copyright (C) 2008 Ermal Luçi
All rights reserved.
......@@ -35,94 +35,115 @@ require_once("openvpn.inc");
require_once("unbound.inc");
require_once("services.inc");
$referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/interfaces_lagg.php');
if (!isset($config['laggs']['lagg'])) {
$config['laggs']['lagg'] = array();
}
$a_laggs = &$config['laggs']['lagg'];
$portlist = get_interface_list();
/**
* list available interfaces for lagg
* @param null $selected_id selected item index
* @return array
*/
function available_interfaces($selected_id=null)
{
global $config;
// configured interfaces
$configured_interfaces = array();
foreach (get_configured_interface_list(false, true) as $intf) {
$configured_interfaces[] = get_real_interface($intf);
}
// lagg members from other lagg interfaces
$lagg_member_interfaces = array();
foreach ($config['laggs']['lagg'] as $lagg_idx => $lagg) {
if ($lagg_idx == $selected_id) {
continue;
}
foreach (explode(",", $lagg['members']) as $lagg_member) {
$lagg_member_interfaces[] = get_real_interface($lagg_member);
}
}
$realifchecklist = array();
/* add LAGG interfaces */
if (is_array($config['laggs']['lagg']) && count($config['laggs']['lagg'])) {
foreach ($config['laggs']['lagg'] as $lagg) {
unset($portlist[$lagg['laggif']]);
$laggiflist = explode(",", $lagg['members']);
foreach ($laggiflist as $tmpif)
$realifchecklist[get_real_interface($tmpif)] = $tmpif;
$interfaces = array();
foreach (get_interface_list() as $intf => $intf_info) {
if (strpos($intf, '_vlan')) {
// skip vlans
continue;
} elseif (in_array($intf, $lagg_member_interfaces)) {
// skip members of other lagg interfaces
continue;
} elseif (in_array($intf, $configured_interfaces)) {
// skip configured interfaces
continue;
}
$interfaces[$intf] = $intf_info;
}
}
$checklist = get_configured_interface_list(false, true);
foreach ($checklist as $tmpif)
$realifchecklist[get_real_interface($tmpif)] = $tmpif;
return $interfaces;
}
$laggprotos = array("none", "lacp", "failover", "fec", "loadbalance", "roundrobin");
if (is_numericint($_GET['id']))
$id = $_GET['id'];
if (isset($_POST['id']) && is_numericint($_POST['id']))
$id = $_POST['id'];
if (isset($id) && $a_laggs[$id]) {
$pconfig['laggif'] = $a_laggs[$id]['laggif'];
$pconfig['members'] = $a_laggs[$id]['members'];
$laggiflist = explode(",", $a_laggs[$id]['members']);
foreach ($laggiflist as $tmpif)
unset($realifchecklist[get_real_interface($tmpif)]);
$pconfig['proto'] = $a_laggs[$id]['proto'];
$pconfig['descr'] = $a_laggs[$id]['descr'];
if (!isset($config['laggs']['lagg'])) {
$config['laggs']['lagg'] = array();
}
$a_laggs = &$config['laggs']['lagg'];
if ($_POST) {
unset($input_errors);
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
// read form data
if (!empty($a_laggs[$_GET['id']])) {
$id = $_GET['id'];
}
$pconfig = array();
$pconfig['laggif'] = isset($a_laggs[$id]['laggif']) ? $a_laggs[$id]['laggif'] : null;
$pconfig['members'] = isset($a_laggs[$id]['members']) ? explode(",", $a_laggs[$id]['members']) : array();
$pconfig['proto'] = isset($a_laggs[$id]['proto']) ? $a_laggs[$id]['proto'] : null;
$pconfig['descr'] = isset($a_laggs[$id]['descr']) ? $a_laggs[$id]['descr'] : null;
} elseif ($_SERVER['REQUEST_METHOD'] === 'POST') {
// validate and save form data
if (!empty($a_laggs[$_POST['id']])) {
$id = $_POST['id'];
}
$input_errors = array();
$pconfig = $_POST;
/* input validation */
$reqdfields = explode(" ", "members proto");
$reqdfieldsn = array(gettext("Member interfaces"), gettext("Lagg protocol"));
do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
do_input_validation($pconfig, $reqdfields, $reqdfieldsn, $input_errors);
if (is_array($_POST['members'])) {
foreach ($_POST['members'] as $member) {
if (!does_interface_exist($member))
foreach ($pconfig['members'] as $member) {
if (!does_interface_exist($member)) {
$input_errors[] = gettext("Interface supplied as member is invalid");
}
} else if (!does_interface_exist($_POST['members']))
$input_errors[] = gettext("Interface supplied as member is invalid");
}
if (!in_array($_POST['proto'], $laggprotos))
if (!in_array($pconfig['proto'], $laggprotos)) {
$input_errors[] = gettext("Protocol supplied is invalid");
}
if (!$input_errors) {
if (count($input_errors) == 0) {
$lagg = array();
$lagg['members'] = implode(',', $_POST['members']);
$lagg['descr'] = $_POST['descr'];
$lagg['laggif'] = $_POST['laggif'];
$lagg['proto'] = $_POST['proto'];
if (isset($id) && $a_laggs[$id])
$lagg['members'] = implode(',', $pconfig['members']);
$lagg['descr'] = $pconfig['descr'];
$lagg['laggif'] = $pconfig['laggif'];
$lagg['proto'] = $pconfig['proto'];
if (isset($id)) {
$lagg['laggif'] = $a_laggs[$id]['laggif'];
}
$lagg['laggif'] = interface_lagg_configure($lagg);
if ($lagg['laggif'] == "" || !stristr($lagg['laggif'], "lagg"))
if ($lagg['laggif'] == "" || !stristr($lagg['laggif'], "lagg")) {
$input_errors[] = gettext("Error occurred creating interface, please retry.");
else {
if (isset($id) && $a_laggs[$id])
} else {
if (isset($id)) {
$a_laggs[$id] = $lagg;
else
} else {
$a_laggs[] = $lagg;
}
write_config();
$confif = convert_real_interface_to_friendly_interface_name($lagg['laggif']);
if ($confif <> "")
if ($confif <> "") {
interface_configure($confif);
}
header("Location: interfaces_lagg.php");
exit;
}
......@@ -130,78 +151,74 @@ if ($_POST) {
}
include("head.inc");
legacy_html_escape_form_data($pconfig);
?>
<body>
<?php include("fbegin.inc"); ?>
<section class="page-content-main">
<section class="page-content-main">
<div class="container-fluid">
<div class="row">
<?php if (isset($input_errors) && count($input_errors) > 0) print_input_errors($input_errors); ?>
<div id="inputerrors"></div>
<section class="col-xs-12">
<div class="content-box">
<header class="content-box-head container-fluid">
<h3><?=gettext("LAGG configuration");?></h3>
</header>
<div class="content-box-main">
<form action="interfaces_lagg_edit.php" method="post" name="iform" id="iform">
<table class="table table-striped table-sort">
<div class="table-responsive">
<form method="post" name="iform" id="iform">
<table class="table table-striped">
<thead>
<tr>
<td width="22%" valign="top" class="vncellreq"><?=gettext("Parent interface"); ?></td>
<td width="78%" class="vtable">
<select name="members[]" multiple="multiple" size="4" class="selectpicker">
<?php
foreach ($portlist as $ifn => $ifinfo) {
if (array_key_exists($ifn, $realifchecklist))
continue;
echo "<option value=\"{$ifn}\"";
if (stristr($pconfig['members'], $ifn))
echo " selected=\"selected\"";
echo ">". $ifn ."(".$ifinfo['mac'] .")</option>";
}
?>
<td width="22%"><strong><?=gettext("LAGG configuration");?></strong></td>
<td width="78%" align="right">
<small><?=gettext("full help"); ?> </small>
<i class="fa fa-toggle-off text-danger" style="cursor: pointer;" id="show_all_help_page" type="button"></i></a>
&nbsp;
</td>
</tr>
</thead>
<tbody>
<tr>
<td><a id="help_for_members" href="#" class="showhelp"><i class="fa fa-info-circle"></i></a> <?=gettext("Parent interface"); ?></td>
<td>
<select name="members[]" multiple="multiple" class="selectpicker">
<?php
foreach (available_interfaces(isset($id) ? $id : null) as $ifn => $ifinfo):?>
<option value="<?=$ifn;?>" <?=in_array($ifn, $pconfig['members']) ? "selected=\"selected\"" : "";?>>
<?=$ifn;?> (<?=$ifinfo['mac']?>)
</option>
<?php
endforeach;?>
</select>
<br />
<span class="vexpl"><?=gettext("Choose the members that will be used for the link aggregation"); ?>.</span></td>
<div class="hidden" for="help_for_members">
<?=gettext("Choose the members that will be used for the link aggregation"); ?>
</div>
</td>
</tr>
<tr>
<td valign="top" class="vncellreq"><?=gettext("Lag proto"); ?></td>
<td class="vtable">
<td><a id="help_for_proto" href="#" class="showhelp"><i class="fa fa-info-circle"></i></a> <?=gettext("Lag proto"); ?></td>
<td>
<select name="proto" class="selectpicker" id="proto">
<?php
foreach ($laggprotos as $proto) {
echo "<option value=\"{$proto}\"";
if ($proto == $pconfig['proto'])
echo " selected=\"selected\"";
echo ">".strtoupper($proto)."</option>";
}
?>
<?php
foreach ($laggprotos as $proto):?>
<option value="<?=$proto;?>" <?=$proto == $pconfig['proto'] ? "selected=\"selected\"": "";?>>
<?=strtoupper($proto);?>
</option>
<?php
endforeach;?>
</select>
<br />
<ul class="vexpl">
<li>
<b><?=gettext("failover"); ?></b><br />
<div class="hidden" for="help_for_proto">
<ul>
<li><b><?=gettext("failover"); ?></b></li>
<?=gettext("Sends and receives traffic only through the master port. If " .
"the master port becomes unavailable, the next active port is " .
"used. The first interface added is the master port; any " .
"interfaces added after that are used as failover devices."); ?>
</li><li>
<b><?=gettext("fec"); ?></b><br /> <?=gettext("Supports Cisco EtherChannel. This is a static setup and " .
<li><b><?=gettext("fec"); ?></b><br /></li>
<?=gettext("Supports Cisco EtherChannel. This is a static setup and " .
"does not negotiate aggregation with the peer or exchange " .
"frames to monitor the link."); ?>
</li><li>
<b><?=gettext("lacp"); ?></b><br /> <?=gettext("Supports the IEEE 802.3ad Link Aggregation Control Protocol " .
<li>
<b><?=gettext("lacp"); ?></b></li>
<?=gettext("Supports the IEEE 802.3ad Link Aggregation Control Protocol " .
"(LACP) and the Marker Protocol. LACP will negotiate a set " .
"of aggregable links with the peer in to one or more Link " .
"Aggregated Groups. Each LAG is composed of ports of the " .
......@@ -211,43 +228,48 @@ include("head.inc");
"contains all ports. In the event of changes in physical " .
"connectivity, Link Aggregation will quickly converge to a " .
"new configuration."); ?>
</li><li>
<b><?=gettext("loadbalance"); ?></b><br /> <?=gettext("Balances outgoing traffic across the active ports based on " .
<li><b><?=gettext("loadbalance"); ?></b></li>
<?=gettext("Balances outgoing traffic across the active ports based on " .
"hashed protocol header information and accepts incoming " .
"traffic from any active port. This is a static setup and " .
"does not negotiate aggregation with the peer or exchange " .
"frames to monitor the link. The hash includes the Ethernet " .
"source and destination address, and, if available, the VLAN " .
"tag, and the IP source and destination address") ?>.
</li><li>
<b><?=gettext("roundrobin"); ?></b><br /> <?=gettext("Distributes outgoing traffic using a round-robin scheduler " .
<li><b><?=gettext("roundrobin"); ?></b></li>
<?=gettext("Distributes outgoing traffic using a round-robin scheduler " .
"through all active ports and accepts incoming traffic from " .
"any active port"); ?>.
</li><li>
<b><?=gettext("none"); ?></b><br /> <?=gettext("This protocol is intended to do nothing: it disables any " .
<li><b><?=gettext("none"); ?></b></li>
<?=gettext("This protocol is intended to do nothing: it disables any " .
"traffic without disabling the lagg interface itself"); ?>.
</li>
</ul>
</div>
</td>
</tr>
<tr>
<td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
<td width="78%" class="vtable">
<input name="descr" type="text" class="form-control unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
<br /> <span class="vexpl"><?=gettext("You may enter a description here " .
"for your reference (not parsed)"); ?>.</span></td>
<td><a id="help_for_descr" href="#" class="showhelp"><i class="fa fa-info-circle"></i></a> <?=gettext("Description"); ?></td>
<td>
<input name="descr" type="text" value="<?=$pconfig['descr'];?>" />
<div class="hidden" for="help_for_descr">
<?=gettext("You may enter a description here " .
"for your reference (not parsed)."); ?>
</div>
</td>
</tr>
<tr>
<td width="22%" valign="top">&nbsp;</td>
<td width="78%">
<input type="hidden" name="laggif" value="<?=htmlspecialchars($pconfig['laggif']); ?>" />
<input type="hidden" name="laggif" value="<?=$pconfig['laggif']; ?>" />
<input name="Submit" type="submit" class="btn btn-primary" value="<?=gettext("Save"); ?>" />
<input type="button" class="btn btn-default" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
<?php if (isset($id) && $a_laggs[$id]): ?>
<input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
<input type="button" class="btn btn-default" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/interfaces_lagg.php');?>'" />
<?php if (isset($id)): ?>
<input name="id" type="hidden" value="<?=$id;?>" />
<?php endif; ?>
</td>
</tr>
</tbody>
</table>
</form>
</div>
......@@ -255,6 +277,5 @@ include("head.inc");
</section>
</div>
</div>
</section>
</section>
<?php include("foot.inc"); ?>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment