diff options
author | Renato Botelho <renato@netgate.com> | 2015-08-26 15:12:02 -0300 |
---|---|---|
committer | Renato Botelho <renato@netgate.com> | 2015-08-26 15:12:02 -0300 |
commit | 03b19a93f4d8d870507ee96121cee4acd748dd2a (patch) | |
tree | 71a34e9e7e73d13de21cb4ad831799fb10c30df4 /src/usr/local/www/system_gateways_edit.php | |
parent | 7f410a121522c5d0e2660256ae50c1fde1df3645 (diff) | |
parent | 30ce58ac1ea27b758d5112cb5a3b190c9760f010 (diff) | |
download | pfsense-03b19a93f4d8d870507ee96121cee4acd748dd2a.zip pfsense-03b19a93f4d8d870507ee96121cee4acd748dd2a.tar.gz |
Merge branch 'master' into bootstrap
Diffstat (limited to 'src/usr/local/www/system_gateways_edit.php')
-rw-r--r-- | src/usr/local/www/system_gateways_edit.php | 921 |
1 files changed, 921 insertions, 0 deletions
diff --git a/src/usr/local/www/system_gateways_edit.php b/src/usr/local/www/system_gateways_edit.php new file mode 100644 index 0000000..abc0870 --- /dev/null +++ b/src/usr/local/www/system_gateways_edit.php @@ -0,0 +1,921 @@ +<?php +/* $Id$ */ +/* + system_gateways_edit.php + part of pfSense (https://www.pfsense.org) + + Copyright (C) 2010 Seth Mos <seth.mos@dds.nl>. + Copyright (C) 2013-2015 Electric Sheep Fencing, LP + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ +/* + pfSense_MODULE: routing +*/ + +##|+PRIV +##|*IDENT=page-system-gateways-editgateway +##|*NAME=System: Gateways: Edit Gateway page +##|*DESCR=Allow access to the 'System: Gateways: Edit Gateway' page. +##|*MATCH=system_gateways_edit.php* +##|-PRIV + +require("guiconfig.inc"); +require("pkg-utils.inc"); + +if (isset($_POST['referer'])) { + $referer = $_POST['referer']; +} else { + $referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/system_gateways.php'); +} + +$a_gateways = return_gateways_array(true, false, true); +$a_gateways_arr = array(); +foreach ($a_gateways as $gw) { + $a_gateways_arr[] = $gw; +} +$a_gateways = $a_gateways_arr; + +if (!is_array($config['gateways']['gateway_item'])) { + $config['gateways']['gateway_item'] = array(); +} + +$a_gateway_item = &$config['gateways']['gateway_item']; +$apinger_default = return_apinger_defaults(); + +if (is_numericint($_GET['id'])) { + $id = $_GET['id']; +} +if (isset($_POST['id']) && is_numericint($_POST['id'])) { + $id = $_POST['id']; +} + +if (isset($_GET['dup']) && is_numericint($_GET['dup'])) { + $id = $_GET['dup']; +} + +if (isset($id) && $a_gateways[$id]) { + $pconfig = array(); + $pconfig['name'] = $a_gateways[$id]['name']; + $pconfig['weight'] = $a_gateways[$id]['weight']; + $pconfig['interval'] = $a_gateways[$id]['interval']; + $pconfig['avg_delay_samples'] = $a_gateways[$id]['avg_delay_samples']; + $pconfig['avg_delay_samples_calculated'] = isset($a_gateways[$id]['avg_delay_samples_calculated']); + $pconfig['avg_loss_samples'] = $a_gateways[$id]['avg_loss_samples']; + $pconfig['avg_loss_samples_calculated'] = isset($a_gateways[$id]['avg_loss_samples_calculated']); + $pconfig['avg_loss_delay_samples'] = $a_gateways[$id]['avg_loss_delay_samples']; + $pconfig['avg_loss_delay_samples_calculated'] = isset($a_gateways[$id]['avg_loss_delay_samples_calculated']); + $pconfig['interface'] = $a_gateways[$id]['interface']; + $pconfig['friendlyiface'] = $a_gateways[$id]['friendlyiface']; + $pconfig['ipprotocol'] = $a_gateways[$id]['ipprotocol']; + if (isset($a_gateways[$id]['dynamic'])) { + $pconfig['dynamic'] = true; + } + $pconfig['gateway'] = $a_gateways[$id]['gateway']; + $pconfig['defaultgw'] = isset($a_gateways[$id]['defaultgw']); + $pconfig['force_down'] = isset($a_gateways[$id]['force_down']); + $pconfig['latencylow'] = $a_gateways[$id]['latencylow']; + $pconfig['latencyhigh'] = $a_gateways[$id]['latencyhigh']; + $pconfig['losslow'] = $a_gateways[$id]['losslow']; + $pconfig['losshigh'] = $a_gateways[$id]['losshigh']; + $pconfig['down'] = $a_gateways[$id]['down']; + $pconfig['monitor'] = $a_gateways[$id]['monitor']; + $pconfig['monitor_disable'] = isset($a_gateways[$id]['monitor_disable']); + $pconfig['descr'] = $a_gateways[$id]['descr']; + $pconfig['attribute'] = $a_gateways[$id]['attribute']; + $pconfig['disabled'] = isset($a_gateways[$id]['disabled']); +} + +if (isset($_GET['dup']) && is_numericint($_GET['dup'])) { + unset($id); + unset($pconfig['attribute']); +} + +if (isset($id) && $a_gateways[$id]) { + $realid = $a_gateways[$id]['attribute']; +} + +if ($_POST) { + + unset($input_errors); + + /* input validation */ + $reqdfields = explode(" ", "name interface"); + $reqdfieldsn = array(gettext("Name"), gettext("Interface")); + + do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors); + + if (!isset($_POST['name'])) { + $input_errors[] = "A valid gateway name must be specified."; + } + if (!is_validaliasname($_POST['name'])) { + $input_errors[] = gettext("The gateway name must not contain invalid characters."); + } else if (isset($_POST['disabled'])) { + // We have a valid gateway name that the user wants to mark as disabled. + // Check if the gateway name is used in any gateway group. + if (is_array($config['gateways']['gateway_group'])) { + foreach ($config['gateways']['gateway_group'] as $group) { + foreach ($group['item'] as $item) { + $items = explode("|", $item); + if ($items[0] == $_POST['name']) { + $input_errors[] = sprintf(gettext("Gateway '%s' cannot be disabled because it is in use on Gateway Group '%s'"), $_POST['name'], $group['name']); + } + } + } + } + + // Check if the gateway name is used in any enabled Static Route. + if (is_array($config['staticroutes']['route'])) { + foreach ($config['staticroutes']['route'] as $route) { + if ($route['gateway'] == $_POST['name']) { + if (!isset($route['disabled'])) { + // There is a static route that uses this gateway and is enabled (not disabled). + $input_errors[] = sprintf(gettext("Gateway '%s' cannot be disabled because it is in use on Static Route '%s'"), $_POST['name'], $route['network']); + } + } + } + } + } + /* skip system gateways which have been automatically added */ + if (($_POST['gateway'] && (!is_ipaddr($_POST['gateway'])) && ($_POST['attribute'] !== "system")) && ($_POST['gateway'] != "dynamic")) { + $input_errors[] = gettext("A valid gateway IP address must be specified."); + } + + if ($_POST['gateway'] && (is_ipaddr($_POST['gateway'])) && !$_REQUEST['isAjax']) { + if (is_ipaddrv4($_POST['gateway'])) { + $parent_ip = get_interface_ip($_POST['interface']); + $parent_sn = get_interface_subnet($_POST['interface']); + if (empty($parent_ip) || empty($parent_sn)) { + $input_errors[] = gettext("Cannot add IPv4 Gateway Address because no IPv4 address could be found on the interface."); + } else { + $subnets = array(gen_subnet($parent_ip, $parent_sn) . "/" . $parent_sn); + $vips = link_interface_to_vips($_POST['interface']); + if (is_array($vips)) { + foreach ($vips as $vip) { + if (!is_ipaddrv4($vip['subnet'])) { + continue; + } + $subnets[] = gen_subnet($vip['subnet'], $vip['subnet_bits']) . "/" . $vip['subnet_bits']; + } + } + + $found = false; + foreach ($subnets as $subnet) { + if (ip_in_subnet($_POST['gateway'], $subnet)) { + $found = true; + break; + } + } + + if ($found === false) { + $input_errors[] = sprintf(gettext("The gateway address %1\$s does not lie within one of the chosen interface's subnets."), $_POST['gateway']); + } + } + } else if (is_ipaddrv6($_POST['gateway'])) { + /* do not do a subnet match on a link local address, it's valid */ + if (!is_linklocal($_POST['gateway'])) { + $parent_ip = get_interface_ipv6($_POST['interface']); + $parent_sn = get_interface_subnetv6($_POST['interface']); + if (empty($parent_ip) || empty($parent_sn)) { + $input_errors[] = gettext("Cannot add IPv6 Gateway Address because no IPv6 address could be found on the interface."); + } else { + $subnets = array(gen_subnetv6($parent_ip, $parent_sn) . "/" . $parent_sn); + $vips = link_interface_to_vips($_POST['interface']); + if (is_array($vips)) { + foreach ($vips as $vip) { + if (!is_ipaddrv6($vip['subnet'])) { + continue; + } + $subnets[] = gen_subnetv6($vip['subnet'], $vip['subnet_bits']) . "/" . $vip['subnet_bits']; + } + } + + $found = false; + foreach ($subnets as $subnet) { + if (ip_in_subnet($_POST['gateway'], $subnet)) { + $found = true; + break; + } + } + + if ($found === false) { + $input_errors[] = sprintf(gettext("The gateway address %1\$s does not lie within one of the chosen interface's subnets."), $_POST['gateway']); + } + } + } + } + + if (!empty($config['interfaces'][$_POST['interface']]['ipaddr'])) { + if (is_ipaddr($config['interfaces'][$_POST['interface']]['ipaddr']) && (empty($_POST['gateway']) || $_POST['gateway'] == "dynamic")) { + $input_errors[] = gettext("Dynamic gateway values cannot be specified for interfaces with a static IPv4 configuration."); + } + } + if (!empty($config['interfaces'][$_POST['interface']]['ipaddrv6'])) { + if (is_ipaddr($config['interfaces'][$_POST['interface']]['ipaddrv6']) && (empty($_POST['gateway']) || $_POST['gateway'] == "dynamic")) { + $input_errors[] = gettext("Dynamic gateway values cannot be specified for interfaces with a static IPv6 configuration."); + } + } + } + if (($_POST['monitor'] != "") && !is_ipaddr($_POST['monitor']) && $_POST['monitor'] != "dynamic") { + $input_errors[] = gettext("A valid monitor IP address must be specified."); + } + /* only allow correct IPv4 and IPv6 gateway addresses */ + if (($_POST['gateway'] <> "") && is_ipaddr($_POST['gateway']) && $_POST['gateway'] != "dynamic") { + if (is_ipaddrv6($_POST['gateway']) && ($_POST['ipprotocol'] == "inet")) { + $input_errors[] = gettext("The IPv6 gateway address '{$_POST['gateway']}' can not be used as a IPv4 gateway'."); + } + if (is_ipaddrv4($_POST['gateway']) && ($_POST['ipprotocol'] == "inet6")) { + $input_errors[] = gettext("The IPv4 gateway address '{$_POST['gateway']}' can not be used as a IPv6 gateway'."); + } + } + /* only allow correct IPv4 and IPv6 monitor addresses */ + if (($_POST['monitor'] <> "") && is_ipaddr($_POST['monitor']) && $_POST['monitor'] != "dynamic") { + if (is_ipaddrv6($_POST['monitor']) && ($_POST['ipprotocol'] == "inet")) { + $input_errors[] = gettext("The IPv6 monitor address '{$_POST['monitor']}' can not be used on a IPv4 gateway'."); + } + if (is_ipaddrv4($_POST['monitor']) && ($_POST['ipprotocol'] == "inet6")) { + $input_errors[] = gettext("The IPv4 monitor address '{$_POST['monitor']}' can not be used on a IPv6 gateway'."); + } + } + + if (isset($_POST['name'])) { + /* check for overlaps */ + foreach ($a_gateways as $gateway) { + if (isset($id) && ($a_gateways[$id]) && ($a_gateways[$id] === $gateway)) { + if ($gateway['name'] != $_POST['name']) { + $input_errors[] = gettext("Changing name on a gateway is not allowed."); + } + continue; + } + if ($_POST['name'] <> "") { + if (($gateway['name'] <> "") && ($_POST['name'] == $gateway['name']) && ($gateway['attribute'] !== "system")) { + $input_errors[] = sprintf(gettext('The gateway name "%s" already exists.'), $_POST['name']); + break; + } + } + if (is_ipaddr($_POST['gateway'])) { + if (($gateway['gateway'] <> "") && ($_POST['gateway'] == $gateway['gateway']) && ($gateway['attribute'] !== "system")) { + $input_errors[] = sprintf(gettext('The gateway IP address "%s" already exists.'), $_POST['gateway']); + break; + } + } + if (is_ipaddr($_POST['monitor'])) { + if (($gateway['monitor'] <> "") && ($_POST['monitor'] == $gateway['monitor']) && ($gateway['attribute'] !== "system")) { + $input_errors[] = sprintf(gettext('The monitor IP address "%s" is already in use. You must choose a different monitor IP.'), $_POST['monitor']); + break; + } + } + } + } + + /* input validation of apinger advanced parameters */ + if ($_POST['latencylow']) { + if (!is_numeric($_POST['latencylow'])) { + $input_errors[] = gettext("The low latency threshold needs to be a numeric value."); + } else { + if ($_POST['latencylow'] < 1) { + $input_errors[] = gettext("The low latency threshold needs to be positive."); + } + } + } + + if ($_POST['latencyhigh']) { + if (!is_numeric($_POST['latencyhigh'])) { + $input_errors[] = gettext("The high latency threshold needs to be a numeric value."); + } else { + if ($_POST['latencyhigh'] < 1) { + $input_errors[] = gettext("The high latency threshold needs to be positive."); + } + } + } + + if ($_POST['losslow']) { + if (!is_numeric($_POST['losslow'])) { + $input_errors[] = gettext("The low Packet Loss threshold needs to be a numeric value."); + } else { + if ($_POST['losslow'] < 1) { + $input_errors[] = gettext("The low Packet Loss threshold needs to be positive."); + } + if ($_POST['losslow'] >= 100) { + $input_errors[] = gettext("The low Packet Loss threshold needs to be less than 100."); + } + } + } + + if ($_POST['losshigh']) { + if (!is_numeric($_POST['losshigh'])) { + $input_errors[] = gettext("The high Packet Loss threshold needs to be a numeric value."); + } else { + if ($_POST['losshigh'] < 1) { + $input_errors[] = gettext("The high Packet Loss threshold needs to be positive."); + } + if ($_POST['losshigh'] > 100) { + $input_errors[] = gettext("The high Packet Loss threshold needs to be 100 or less."); + } + } + } + + if (($_POST['latencylow']) && ($_POST['latencyhigh'])) { + if ((is_numeric($_POST['latencylow'])) && (is_numeric($_POST['latencyhigh']))) { + if (($_POST['latencylow'] > $_POST['latencyhigh'])) { + $input_errors[] = gettext("The high latency threshold needs to be higher than the low latency threshold"); + } + } + } else { + if ($_POST['latencylow']) { + if (is_numeric($_POST['latencylow'])) { + if ($_POST['latencylow'] > $apinger_default['latencyhigh']) { + $input_errors[] = gettext(sprintf("The low latency threshold needs to be less than the default high latency threshold (%d)", $apinger_default['latencyhigh'])); + } + } + } + if ($_POST['latencyhigh']) { + if (is_numeric($_POST['latencyhigh'])) { + if ($_POST['latencyhigh'] < $apinger_default['latencylow']) { + $input_errors[] = gettext(sprintf("The high latency threshold needs to be higher than the default low latency threshold (%d)", $apinger_default['latencylow'])); + } + } + } + } + + if (($_POST['losslow']) && ($_POST['losshigh'])) { + if ((is_numeric($_POST['losslow'])) && (is_numeric($_POST['losshigh']))) { + if ($_POST['losslow'] > $_POST['losshigh']) { + $input_errors[] = gettext("The high Packet Loss threshold needs to be higher than the low Packet Loss threshold"); + } + } + } else { + if ($_POST['losslow']) { + if (is_numeric($_POST['losslow'])) { + if ($_POST['losslow'] > $apinger_default['losshigh']) { + $input_errors[] = gettext(sprintf("The low Packet Loss threshold needs to be less than the default high Packet Loss threshold (%d)", $apinger_default['losshigh'])); + } + } + } + if ($_POST['losshigh']) { + if (is_numeric($_POST['losshigh'])) { + if ($_POST['losshigh'] < $apinger_default['losslow']) { + $input_errors[] = gettext(sprintf("The high Packet Loss threshold needs to be higher than the default low Packet Loss threshold (%d)", $apinger_default['losslow'])); + } + } + } + } + + if ($_POST['interval']) { + if (!is_numeric($_POST['interval'])) { + $input_errors[] = gettext("The probe interval needs to be a numeric value."); + } else { + if ($_POST['interval'] < 1) { + $input_errors[] = gettext("The probe interval needs to be positive."); + } + } + } + + if ($_POST['down']) { + if (!is_numeric($_POST['down'])) { + $input_errors[] = gettext("The down time setting needs to be a numeric value."); + } else { + if ($_POST['down'] < 1) { + $input_errors[] = gettext("The down time setting needs to be positive."); + } + } + } + + if (($_POST['interval']) && ($_POST['down'])) { + if ((is_numeric($_POST['interval'])) && (is_numeric($_POST['down']))) { + if ($_POST['interval'] > $_POST['down']) { + $input_errors[] = gettext("The probe interval needs to be less than the down time setting."); + } + } + } else { + if ($_POST['interval']) { + if (is_numeric($_POST['interval'])) { + if ($_POST['interval'] > $apinger_default['down']) { + $input_errors[] = gettext(sprintf("The probe interval needs to be less than the default down time setting (%d)", $apinger_default['down'])); + } + } + } + if ($_POST['down']) { + if (is_numeric($_POST['down'])) { + if ($_POST['down'] < $apinger_default['interval']) { + $input_errors[] = gettext(sprintf("The down time setting needs to be higher than the default probe interval (%d)", $apinger_default['interval'])); + } + } + } + } + + if ($_POST['avg_delay_samples']) { + if (!is_numeric($_POST['avg_delay_samples'])) { + $input_errors[] = gettext("The average delay replies qty needs to be a numeric value."); + } else { + if ($_POST['avg_delay_samples'] < 1) { + $input_errors[] = gettext("The average delay replies qty needs to be positive."); + } + } + } + + if ($_POST['avg_loss_samples']) { + if (!is_numeric($_POST['avg_loss_samples'])) { + $input_errors[] = gettext("The average packet loss probes qty needs to be a numeric value."); + } else { + if ($_POST['avg_loss_samples'] < 1) { + $input_errors[] = gettext("The average packet loss probes qty needs to be positive."); + } + } + } + + if ($_POST['avg_loss_delay_samples']) { + if (!is_numeric($_POST['avg_loss_delay_samples'])) { + $input_errors[] = gettext("The lost probe delay needs to be a numeric value."); + } else { + if ($_POST['avg_loss_delay_samples'] < 1) { + $input_errors[] = gettext("The lost probe delay needs to be positive."); + } + } + } + + if (!$input_errors) { + $reloadif = ""; + $gateway = array(); + + if (empty($_POST['interface'])) { + $gateway['interface'] = $pconfig['friendlyiface']; + } else { + $gateway['interface'] = $_POST['interface']; + } + if (is_ipaddr($_POST['gateway'])) { + $gateway['gateway'] = $_POST['gateway']; + } else { + $gateway['gateway'] = "dynamic"; + } + $gateway['name'] = $_POST['name']; + $gateway['weight'] = $_POST['weight']; + $gateway['ipprotocol'] = $_POST['ipprotocol']; + $gateway['interval'] = $_POST['interval']; + + $gateway['avg_delay_samples'] = $_POST['avg_delay_samples']; + if ($_POST['avg_delay_samples_calculated'] == "yes" || $_POST['avg_delay_samples_calculated'] == "on") { + $gateway['avg_delay_samples_calculated'] = true; + } + + $gateway['avg_loss_samples'] = $_POST['avg_loss_samples']; + if ($_POST['avg_loss_samples_calculated'] == "yes" || $_POST['avg_loss_samples_calculated'] == "on") { + $gateway['avg_loss_samples_calculated'] = true; + } + + $gateway['avg_loss_delay_samples'] = $_POST['avg_loss_delay_samples']; + if ($_POST['avg_loss_delay_samples_calculated'] == "yes" || $_POST['avg_loss_delay_samples_calculated'] == "on") { + $gateway['avg_loss_delay_samples_calculated'] = true; + } + + $gateway['descr'] = $_POST['descr']; + if ($_POST['monitor_disable'] == "yes") { + $gateway['monitor_disable'] = true; + } + if ($_POST['force_down'] == "yes") { + $gateway['force_down'] = true; + } + if (is_ipaddr($_POST['monitor'])) { + $gateway['monitor'] = $_POST['monitor']; + } + + /* NOTE: If monitor ip is changed need to cleanup the old static route */ + if ($_POST['monitor'] != "dynamic" && !empty($a_gateway_item[$realid]) && is_ipaddr($a_gateway_item[$realid]['monitor']) && + $_POST['monitor'] != $a_gateway_item[$realid]['monitor'] && $gateway['gateway'] != $a_gateway_item[$realid]['monitor']) { + if (is_ipaddrv4($a_gateway_item[$realid]['monitor'])) { + mwexec("/sbin/route delete " . escapeshellarg($a_gateway_item[$realid]['monitor'])); + } else { + mwexec("/sbin/route delete -inet6 " . escapeshellarg($a_gateway_item[$realid]['monitor'])); + } + } + + if ($_POST['defaultgw'] == "yes" || $_POST['defaultgw'] == "on") { + $i = 0; + /* remove the default gateway bits for all gateways with the same address family */ + foreach ($a_gateway_item as $gw) { + if ($gateway['ipprotocol'] == $gw['ipprotocol']) { + unset($config['gateways']['gateway_item'][$i]['defaultgw']); + if ($gw['interface'] != $_POST['interface'] && $gw['defaultgw']) { + $reloadif = $gw['interface']; + } + } + $i++; + } + $gateway['defaultgw'] = true; + } + + if ($_POST['latencylow']) { + $gateway['latencylow'] = $_POST['latencylow']; + } + if ($_POST['latencyhigh']) { + $gateway['latencyhigh'] = $_POST['latencyhigh']; + } + if ($_POST['losslow']) { + $gateway['losslow'] = $_POST['losslow']; + } + if ($_POST['losshigh']) { + $gateway['losshigh'] = $_POST['losshigh']; + } + if ($_POST['down']) { + $gateway['down'] = $_POST['down']; + } + + if (isset($_POST['disabled'])) { + $gateway['disabled'] = true; + } else { + unset($gateway['disabled']); + } + + /* when saving the manual gateway we use the attribute which has the corresponding id */ + if (isset($realid) && $a_gateway_item[$realid]) { + $a_gateway_item[$realid] = $gateway; + } else { + $a_gateway_item[] = $gateway; + } + + mark_subsystem_dirty('staticroutes'); + + write_config(); + + if ($_REQUEST['isAjax']) { + echo $_POST['name']; + exit; + } else if (!empty($reloadif)) { + send_event("interface reconfigure {$reloadif}"); + } + + header("Location: system_gateways.php"); + exit; + } else { + if ($_REQUEST['isAjax']) { + header("HTTP/1.0 500 Internal Server Error"); + header("Content-type: text/plain"); + foreach ($input_errors as $error) { + echo("$error\n"); + } + exit; + } + + $pconfig = $_POST; + if (empty($_POST['friendlyiface'])) { + $pconfig['friendlyiface'] = $_POST['interface']; + } + } +} + + +$pgtitle = array(gettext("System"), gettext("Gateways"), gettext("Edit gateway")); +$shortcut_section = "gateways"; + +include("head.inc"); + +if ($input_errors) + print_input_errors($input_errors); + +?> +<script> +var systemGatewaysEditRecalculate = function(){ + var interval = $('#interval')[0].value; + + $('input[name$=_calculated]').each(function (idx, c){ + c = $(c); + i = $(c.parents('.form-group').find('input[type=number]')[0]); + + c.prop('disabled', interval==0); + + if (interval==0) + c.prop('checked', false); + + if (!c.prop('checked')) + return i.prop('readonly', false); + + switch (i.attr('name')) + { + case 'avg_delay_samples': + // How many replies should be used to compute average delay + // for controlling "delay" alarms. + // Calculate a reasonable value based on gateway probe interval and RRD 1 minute average graph step size (60). + i.attr('value', Math.round(60 * (1/6) / Math.pow(interval, 0.333))); + break; + + case 'avg_loss_samples': + // How many probes should be used to compute average loss. + // Calculate a reasonable value based on gateway probe interval and RRD 1 minute average graph step size (60). + i.attr('value', Math.round(60 / interval)); + break; + + case 'avg_loss_delay_samples': + // The delay (in samples) after which loss is computed + // without this delays larger than interval would be treated as loss. + // Calculate a reasonable value based on gateway probe interval and RRD 1 minute average graph step size (60). + i.attr('value', Math.round(60 * (1/3) / interval)); + break; + } + + i.prop('readonly', true); + }); +}; + +events.push(function(){ + $('#interval').on('change', systemGatewaysEditRecalculate); + $('input[name$=_calculated]').on('change', systemGatewaysEditRecalculate); + + systemGatewaysEditRecalculate(); +}); +</script> +<?php + +require('classes/Form.class.php'); +$form = new Form; + +/* If this is a system gateway we need this var */ +if(($pconfig['attribute'] == "system") || is_numeric($pconfig['attribute'])) { + $form->addGlobal(new Form_Input( + 'attribute', + null, + 'hidden', + $pconfig['attribute'] + )); +} + +if (isset($id) && $a_gateways[$id]) { + $form->addGlobal(new Form_Input( + 'id', + null, + 'hidden', + $id + )); +} + +$form->addGlobal(new Form_Input( + 'friendlyiface', + null, + 'hidden', + $pconfig['friendlyiface'] +)); + +$section = new Form_Section('Edit gateway'); + +$section->addInput(new Form_Checkbox( + 'disabled', + 'Disabled', + 'Disable this gateway', + $pconfig['disabled'] +))->setHelp('Set this option to disable this gateway without removing it from the '. + 'list.'); + +$section->addInput(new Form_Select( + 'interface', + 'Interface', + $pconfig['friendlyiface'], + get_configured_interface_with_descr(false, true) +))->setHelp('Choose which interface this gateway applies to.'); + +$section->addInput(new Form_Select( + 'ipprotocol', + 'Address Family', + $pconfig['ipprotocol'], + array( + "inet" => "IPv4", + "inet6" => "IPv6" + ) +))->setHelp('Choose the Internet Protocol this gateway uses.'); + +$section->addInput(new Form_Input( + 'name', + 'Name', + 'text', + $pconfig['name'] +))->setHelp('Gateway name'); + +$section->addInput(new Form_Input( + 'gateway', + 'Gateway', + 'text', + ($pconfig['dynamic'] ? 'dynamic' : $pconfig['gateway']) +))->setHelp('Gateway IP address'); + +$section->addInput(new Form_Checkbox( + 'defaultgw', + 'Default Gateway', + 'This will select the above gateway as the default gateway', + $pconfig['defaultgw'] +)); + +$section->addInput(new Form_Checkbox( + 'monitor_disable', + 'Gateway Monitoring', + 'Disable Gateway Monitoring', + $pconfig['monitor_disable'] +))->toggles('.toggle-monitor-ip')->setHelp('This will consider this gateway as always being up'); + +$group = new Form_Group('Monitor IP'); +$group->addClass('toggle-monitor-ip', 'collapse'); + +if (!$pconfig['monitor_disable']) + $group->addClass('in'); + +$group->add(new Form_Input( + 'monitor', + null, + 'text', + ($pconfig['gateway'] == $pconfig['monitor'] ? '' : $pconfig['monitor']) +))->setHelp('Enter an alternative address here to be '. + 'used to monitor the link. This is used for the quality RRD graphs as well as the '. + 'load balancer entries. Use this if the gateway does not respond to ICMP echo '. + 'requests (pings).'); +$section->add($group); + +$section->addInput(new Form_Checkbox( + 'force_down', + 'Force state', + 'Mark Gateway as Down', + $pconfig['force_down'] +))->setHelp('This will force this gateway to be considered Down'); + +$section->addInput(new Form_Input( + 'descr', + 'Description', + 'text', + $pconfig['descr'] +))->setHelp('You may enter a description here for your reference (not parsed).'); + +$form->add($section); +$section = new Form_Section('Advanced'); + +$section->addInput(new Form_Select( + 'weight', + 'Weight', + $pconfig['weight'], + array_combine(range(1, 5), range(1, 5)) +))->setHelp('Weight for this gateway when used in a Gateway Group.'); + +$group = new Form_Group('Latency thresholds'); +$group->add(new Form_Input( + 'latencylow', + 'From', + 'number', + $pconfig['latencylow'], + ['placeholder' => $apinger_default['latencylow']] +)); +$group->add(new Form_Input( + 'latencyhigh', + 'To', + 'number', + $pconfig['latencyhigh'], + ['placeholder' => $apinger_default['latencyhigh']] +)); +$group->setHelp('Low and high thresholds for latency in milliseconds. + Default is %d/%d.', [$apinger_default['latencylow'], $apinger_default['latencyhigh']]); + +$section->add($group); + +$group = new Form_Group('Packet Loss thresholds'); +$group->add(new Form_Input( + 'losslow', + 'From', + 'number', + $pconfig['losslow'], + ['placeholder' => $apinger_default['losslow']] +)); +$group->add(new Form_Input( + 'losshigh', + 'To', + 'number', + $pconfig['losshigh'], + ['placeholder' => $apinger_default['losshigh']] +)); +$group->setHelp('Low and high thresholds for packet loss in milliseconds. + Default is %d/%d.', [$apinger_default['losslow'], $apinger_default['losshigh']]); +$section->add($group); + +$section->addInput(new Form_Input( + 'interval', + 'Probe Interval', + 'number', + $pconfig['interval'], + [ + 'placeholder' => $apinger_default['interval'], + 'max' => 86400 + ] +))->setHelp('How often an ICMP probe will be sent in seconds. Default is %d.'. + 'NOTE: The quality graph is averaged over seconds, not intervals, so as '. + 'the probe interval is increased the accuracy of the quality graph is '. + 'decreased.', [$apinger_default['interval']]); + +$section->addInput(new Form_Input( + 'down', + 'Down', + 'number', + $pconfig['down'], + ['placeholder' => $apinger_default['down']] +))->setHelp('The number of seconds of failed probes before the alarm '. + 'will fire. Default is %d.', [$apinger_default['down']]); + +$group = new Form_Group('Avg. Delay Replies Qty'); +$group->add(new Form_Input( + 'avg_delay_samples', + null, + 'number', + $pconfig['avg_delay_samples'], + [ + 'placeholder' => $apinger_default['avg_delay_samples'], + 'max' => 100 + ] +)); +$group->add(new Form_Checkbox( + 'avg_delay_samples_calculated', + null, + 'Use calculated value.', + $pconfig['avg_delay_samples_calculated'] +)); +$group->setHelp('How many replies should be used to compute average delay for '. + 'controlling "delay" alarms? Default is %d.', + [$apinger_default['avg_delay_samples']]); +$section->add($group); + +$group = new Form_Group('Avg. Packet Loss Probes'); +$group->add(new Form_Input( + 'avg_loss_samples', + null, + 'number', + $pconfig['avg_loss_samples'], + [ + 'placeholder' => $apinger_default['avg_loss_samples'], + 'max' => 1000 + ] +)); +$group->add(new Form_Checkbox( + 'avg_loss_samples_calculated', + null, + 'Use calculated value.', + $pconfig['avg_loss_samples_calculated'] +)); +$group->setHelp('How many probes should be useds to compute average packet loss? '. + 'Default is %d.', + [$apinger_default['avg_loss_samples']]); +$section->add($group); + +$group = new Form_Group('Lost Probe Delay'); +$group->add(new Form_Input( + 'avg_loss_delay_samples', + null, + 'number', + $pconfig['avg_loss_delay_samples'], + [ + 'placeholder' => $apinger_default['avg_loss_delay_samples'], + 'max' => 200 + ] +)); +$group->add(new Form_Checkbox( + 'avg_loss_delay_samples_calculated', + null, + 'Use calculated value.', + $pconfig['avg_loss_samples_calculated'] +)); +$group->setHelp('The delay (in qty of probe samples) after which loss is '. + 'computed. Without this, delays longer than the probe interval would be '. + 'treated as packet loss. Default is %d.', + [$apinger_default['avg_loss_delay_samples']]); +$section->add($group); + +$section->addInput(new Form_StaticText( + 'Additional information', + '<span class="help-block">'. + gettext('The probe interval must be less than the down time, otherwise the '. + 'gateway will seem to go down then come up again at the next probe.'). + '<br/><br/>'. + gettext('The down time defines the length of time before the gateway is marked '. + 'as down, but the accuracy is controlled by the probe interval. For example, '. + 'if your down time is 40 seconds but on a 30 second probe interval, only one '. + 'probe would have to fail before the gateway is marked down at the 40 second '. + 'mark. By default, the gateway is considered down after 10 seconds, and the '. + 'probe interval is 1 second, so 10 probes would have to fail before the gateway '. + 'is marked down.'). + '</span>' +)); + +$form->add($section); + +print $form; +include("foot.inc");
\ No newline at end of file |