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/load_balancer_pool_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/load_balancer_pool_edit.php')
-rw-r--r-- | src/usr/local/www/load_balancer_pool_edit.php | 446 |
1 files changed, 446 insertions, 0 deletions
diff --git a/src/usr/local/www/load_balancer_pool_edit.php b/src/usr/local/www/load_balancer_pool_edit.php new file mode 100644 index 0000000..876abe5 --- /dev/null +++ b/src/usr/local/www/load_balancer_pool_edit.php @@ -0,0 +1,446 @@ +<?php +/* $Id$ */ +/* + load_balancer_pool_edit.php + part of pfSense (https://www.pfsense.org/) + + Copyright (C) 2013-2015 Electric Sheep Fencing, LP + Copyright (C) 2005-2008 Bill Marquette <bill.marquette@gmail.com>. + 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-loadbalancer-pool-edit +##|*NAME=Load Balancer: Pool: Edit page +##|*DESCR=Allow access to the 'Load Balancer: Pool: Edit' page. +##|*MATCH=load_balancer_pool_edit.php* +##|-PRIV + +require("guiconfig.inc"); +require_once("filter.inc"); +require_once("util.inc"); + +$referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/load_balancer_pool.php'); + +if (!is_array($config['load_balancer']['lbpool'])) { + $config['load_balancer']['lbpool'] = array(); +} + +$a_pool = &$config['load_balancer']['lbpool']; + +if (is_numericint($_GET['id'])) + $id = $_GET['id']; +if (isset($_POST['id']) && is_numericint($_POST['id'])) + $id = $_POST['id']; + +if (isset($id) && $a_pool[$id]) { + $pconfig['name'] = $a_pool[$id]['name']; + $pconfig['mode'] = $a_pool[$id]['mode']; + $pconfig['descr'] = $a_pool[$id]['descr']; + $pconfig['port'] = $a_pool[$id]['port']; + $pconfig['retry'] = $a_pool[$id]['retry']; + $pconfig['servers'] = &$a_pool[$id]['servers']; + $pconfig['serversdisabled'] = &$a_pool[$id]['serversdisabled']; + $pconfig['monitor'] = $a_pool[$id]['monitor']; +} + +$changedesc = gettext("Load Balancer: Pool:") . " "; +$changecount = 0; + +if ($_POST) { + $changecount++; + + unset($input_errors); + $pconfig = $_POST; + + /* input validation */ + $reqdfields = explode(" ", "name mode port monitor servers"); + $reqdfieldsn = array(gettext("Name"),gettext("Mode"),gettext("Port"),gettext("Monitor"),gettext("Server List")); + + do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors); + + /* Ensure that our pool names are unique */ + for ($i=0; isset($config['load_balancer']['lbpool'][$i]); $i++) + if (($_POST['name'] == $config['load_balancer']['lbpool'][$i]['name']) && ($i != $id)) + $input_errors[] = gettext("This pool name has already been used. Pool names must be unique."); + + if (preg_match('/[ \/]/', $_POST['name'])) + $input_errors[] = gettext("You cannot use spaces or slashes in the 'name' field."); + + if (strlen($_POST['name']) > 16) + $input_errors[] = gettext("The 'name' field must be 16 characters or less."); + + if (in_array($_POST['name'], $reserved_table_names)) + $input_errors[] = sprintf(gettext("The name '%s' is a reserved word and cannot be used."), $_POST['name']); + + if (is_alias($_POST['name'])) + $input_errors[] = sprintf(gettext("Sorry, an alias is already named %s."), $_POST['name']); + + if (!is_portoralias($_POST['port'])) + $input_errors[] = gettext("The port must be an integer between 1 and 65535, or a port alias."); + + // May as well use is_port as we want a positive integer and such. + if (!empty($_POST['retry']) && !is_port($_POST['retry'])) + $input_errors[] = gettext("The retry value must be an integer between 1 and 65535."); + + if (is_array($_POST['servers'])) { + foreach($pconfig['servers'] as $svrent) { + if (!is_ipaddr($svrent) && !is_subnetv4($svrent)) { + $input_errors[] = sprintf(gettext("%s is not a valid IP address or IPv4 subnet (in \"enabled\" list)."), $svrent); + } + else if (is_subnetv4($svrent) && subnet_size($svrent) > 64) { + $input_errors[] = sprintf(gettext("%s is a subnet containing more than 64 IP addresses (in \"enabled\" list)."), $svrent); + } + } + } + + if (is_array($_POST['serversdisabled'])) { + foreach($pconfig['serversdisabled'] as $svrent) { + if (!is_ipaddr($svrent) && !is_subnetv4($svrent)) { + $input_errors[] = sprintf(gettext("%s is not a valid IP address or IPv4 subnet (in \"disabled\" list)."), $svrent); + } + else if (is_subnetv4($svrent) && subnet_size($svrent) > 64) { + $input_errors[] = sprintf(gettext("%s is a subnet containing more than 64 IP addresses (in \"disabled\" list)."), $svrent); + } + } + } + + $m = array(); + + for ($i=0; isset($config['load_balancer']['monitor_type'][$i]); $i++) + $m[$config['load_balancer']['monitor_type'][$i]['name']] = $config['load_balancer']['monitor_type'][$i]; + + if (!isset($m[$_POST['monitor']])) + $input_errors[] = gettext("Invalid monitor chosen."); + + if (!$input_errors) { + $poolent = array(); + if(isset($id) && $a_pool[$id]) + $poolent = $a_pool[$id]; + + if($poolent['name'] != "") + $changedesc .= sprintf(gettext(" modified '%s' pool:"), $poolent['name']); + + update_if_changed("name", $poolent['name'], $_POST['name']); + update_if_changed("mode", $poolent['mode'], $_POST['mode']); + update_if_changed("description", $poolent['descr'], $_POST['descr']); + update_if_changed("port", $poolent['port'], $_POST['port']); + update_if_changed("retry", $poolent['retry'], $_POST['retry']); + update_if_changed("servers", $poolent['servers'], $_POST['servers']); + update_if_changed("serversdisabled", $poolent['serversdisabled'], $_POST['serversdisabled']); + update_if_changed("monitor", $poolent['monitor'], $_POST['monitor']); + + if (isset($id) && $a_pool[$id]) { + /* modify all virtual servers with this name */ + for ($i = 0; isset($config['load_balancer']['virtual_server'][$i]); $i++) { + if ($config['load_balancer']['virtual_server'][$i]['lbpool'] == $a_pool[$id]['name']) + $config['load_balancer']['virtual_server'][$i]['lbpool'] = $poolent['name']; + } + $a_pool[$id] = $poolent; + } else + $a_pool[] = $poolent; + + if ($changecount > 0) { + /* Mark pool dirty */ + mark_subsystem_dirty('loadbalancer'); + write_config($changedesc); + } + + header("Location: load_balancer_pool.php"); + exit; + } +} + +$pgtitle = array(gettext("Services"), gettext("Load Balancer"),gettext("Pool"),gettext("Edit")); +$shortcut_section = "relayd"; + +include("head.inc"); +?> + +<script type="text/javascript"> +//<![CDATA[ +events.push(function(){ + + // Disables the specified input element + function disableInput(id, disable) { + $('#' + id).prop("disabled", disable); + } + + // Select every option in the specified multiselect + function AllServers(id, selectAll) { + for (i = 0; i < id.length; i++) { + id.eq(i).prop('selected', selectAll); + } + } + + // Move all selected options from one multiselect to another + function moveOptions(From, To) { + var len = From.length; + var option; + + if(len > 1) { + for(i=0; i<len; i++) { + if(From.eq(i).is(':selected')) { + option = From.eq(i).val(); + To.append(new Option(option, option)); + From.eq(i).remove(); + } + } + } + } + + function checkPoolControls() { + + if ($("#mode").val() == "failover") { + disableInput('movetoenabled', $('[name="servers[]"] option').length > 0); + } else { + disableInput('movetoenabled',false); + } + } + + // Move (copy/delete) all but one of the items in the Enabled (server) list to the Disabled list + function enforceFailover() { + if ($('#mode').val() != 'failover') { + return; + } + + var len = $('[name="servers[]"] option').length; + var option; + + if(len > 1) { + for(i=len-1; i>0; i--) { + option = $('[name="servers[]"] option').eq(i).val(); + $('[name="serversdisabled[]"]').append(new Option(option, option)); + $('[name="servers[]"] option').eq(i).remove(); + } + } + } + + // Make buttons plain buttons, not a submit + $("#btnaddtopool").prop('type','button'); + $("#removeenabled").prop('type','button'); + $("#removedisabled").prop('type','button'); + $("#movetodisabled").prop('type','button'); + $("#movetoenabled").prop('type','button'); + + // On click . . + $("#btnaddtopool").click(function() { + $('[name="servers[]"]').append(new Option($('#ipaddr').val(), $('#ipaddr').val())); + enforceFailover(); + checkPoolControls(); + }); + + $('#mode').on('change', function() { + enforceFailover(); + checkPoolControls(); + }); + + $("#removeenabled").click(function() { + $('[name="servers[]"] option:selected').remove(); + }); + + $("#removedisabled").click(function() { + $('[name="serversdisabled[]"] option:selected').remove(); + }); + + $("#movetodisabled").click(function() { + moveOptions($('[name="servers[]"] option'), $('[name="serversdisabled[]"]')); + }); + + $("#movetoenabled").click(function() { + moveOptions($('[name="serversdisabled[]"] option'), $('[name="servers[]"]')); + }); + + // On initial page load + checkPoolControls(); + + // On submit + $('form').submit(function(){ + AllServers($('[name="servers[]"] option'), true); + AllServers($('[name="serversdisabled[]"] option'), true); + }); + +}); +//]]> +</script> + +<?php +if ($input_errors) + print_input_errors($input_errors); + +require('classes/Form.class.php'); + +$form = new Form(new Form_Button( + 'Submit', + gettext("Save") +)); + +$section = new Form_Section('Add/edit Load Balancer - Pool entry'); + +$section->addInput(new Form_Input( + 'name', + 'Name', + 'text', + $pconfig['name'] +)); + +$section->addInput(new Form_Select( + 'mode', + 'Mode', + $pconfig['mode'], + array( + 'loadbalance' => 'Load Balance', + 'failover' => 'Manual Failover' + ) +)); + +$section->addInput(new Form_Input( + 'descr', + 'Description', + 'text', + $pconfig['descr'] +)); + +$section->addInput(new Form_Input( + 'port', + 'Port', + 'text', + $pconfig['port'] +))->setHelp('This is the port your servers are listening on. You may also specify a port alias listed in Firewall -> Aliases here.'); + +$section->addInput(new Form_Input( + 'retry', + 'Retry', + 'number', + $pconfig['retry'], + ['min' => '1', 'max' => '65536'] +))->setHelp('Optionally specify how many times to retry checking a server before declaring it down.'); + +$form->add($section); + +$section = new Form_Section('Add item to the pool'); + +$monitorlist = array(); + +foreach ($config['load_balancer']['monitor_type'] as $monitor) + $monitorlist[$monitor['name']] = $monitor['name']; + +if(count($config['load_balancer']['monitor_type'])) { + $section->addInput(new Form_Select( + 'monitor', + 'Monitor', + $pconfig['monitor'], + $monitorlist + )); +} else { + $section->addInput(new Form_StaticText( + 'Monitor', + 'Please add a monitor IP address on the monitors tab if you wish to use this feature."' + )); +} + +$group = new Form_Group('Server IP Address'); + +$group->add(new Form_IpAddress( + 'ipaddr', + 'IP Address', + $pconfig['ipaddr'] +)); + +$group->add(new Form_Button( + 'btnaddtopool', + 'Add to pool' +))->removeClass('btn-primary')->addClass('btn-default'); + +$section->add($group); + +$form->add($section); + +$section = new Form_Section('Current pool members'); + +$group = new Form_Group('Members'); + +$group->add(new Form_Select( + 'serversdisabled', + null, + $pconfig['serversdisabled'], + is_array($pconfig['serversdisabled']) ? array_combine($pconfig['serversdisabled'], $pconfig['serversdisabled']) : array(), + true +))->setHelp('Disabled'); + +$group->add(new Form_Select( + 'servers', + null, + $pconfig['servers'], + is_array($pconfig['servers']) ? array_combine($pconfig['servers'], $pconfig['servers']) : array(), + true +))->setHelp('Enabled (Default)'); + +$section->add($group); + +$group = new Form_Group(''); + +$group->add(new Form_Button( + 'removedisabled', + 'Remove' +))->removeClass('btn-primary')->addClass('btn-default btn-sm'); + +$group->add(new Form_Button( + 'removeenabled', + 'Remove' +))->removeClass('btn-primary')->addClass('btn-default btn-sm'); + +$section->add($group); + +$group = new Form_Group(''); + +$group->add(new Form_Button( + 'movetoenabled', + 'Move to enabled list >' +))->removeClass('btn-primary')->addClass('btn-default btn-sm'); + +$group->add(new Form_Button( + 'movetodisabled', + '< Move to disabled list' +))->removeClass('btn-primary')->addClass('btn-default btn-sm'); + +$section->add($group); + +if (isset($id) && $a_pool[$id] && $_GET['act'] != 'dup') { + $section->addInput(new Form_Input( + 'id', + null, + 'hidden', + $id + )); +} + +$form->add($section); + +print($form); + +include("foot.inc");
\ No newline at end of file |