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

(legacy) refactor interfaces_lagg_edit.php

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