Commit 6d12f568 authored by Ad Schellevis's avatar Ad Schellevis Committed by Franco Fichtner

(legacy) refactor load_balancer_virtual_server_edit.php

(cherry picked from commit 8fcb67b4)
parent ed8c1201
<?php
/*
Copyright (C) 2014-2015 Deciso B.V.
Copyright (C) 2014-2016 Deciso B.V.
Copyright (C) 2005-2008 Bill Marquette <bill.marquette@gmail.com>.
All rights reserved.
......@@ -32,85 +32,84 @@ require_once("services.inc");
require_once("vslb.inc");
require_once("interfaces.inc");
$referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/load_balancer_virtual_server.php');
if (!is_array($config['load_balancer']['virtual_server'])) {
if (empty($config['load_balancer']) || !is_array($config['load_balancer'])) {
$config['load_balancer'] = array();
}
if (empty($config['load_balancer']['virtual_server']) || !is_array($config['load_balancer']['virtual_server'])) {
$config['load_balancer']['virtual_server'] = array();
}
$a_vs = &$config['load_balancer']['virtual_server'];
if (is_numericint($_GET['id']))
$copy_fields=array('name', 'descr', 'poolname', 'port', 'sitedown', 'ipaddr', 'mode', 'relay_protocol');
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
if (isset($_GET['id']) && !empty($a_vs[$_GET['id']])) {
$id = $_GET['id'];
if (isset($_POST['id']) && is_numericint($_POST['id']))
}
$pconfig = array();
// copy fields
foreach ($copy_fields as $fieldname) {
if (isset($id) && isset($a_vs[$id][$fieldname])) {
$pconfig[$fieldname] = $a_vs[$id][$fieldname];
} else {
$pconfig[$fieldname] = null;
}
}
} elseif ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_POST['id']) && !empty($a_vs[$_POST['id']])) {
$id = $_POST['id'];
if (isset($id) && $a_vs[$id]) {
$pconfig = $a_vs[$id];
} else {
// Sane defaults
$pconfig['mode'] = 'redirect';
}
if ($_POST) {
unset($input_errors);
}
$pconfig = $_POST;
$input_errors = array();
/* input validation */
switch($pconfig['mode']) {
case "redirect": {
case "redirect":
$reqdfields = explode(" ", "ipaddr name mode");
$reqdfieldsn = array(gettext("IP Address"),gettext("Name"),gettext("Mode"));
break;
}
case "relay": {
case "relay":
$reqdfields = explode(" ", "ipaddr name mode relay_protocol");
$reqdfieldsn = array(gettext("IP Address"),gettext("Name"),gettext("Relay Protocol"));
break;
}
}
do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors);
do_input_validation($pconfig, $reqdfields, $reqdfieldsn, $input_errors);
for ($i=0; isset($config['load_balancer']['virtual_server'][$i]); $i++)
if (($_POST['name'] == $config['load_balancer']['virtual_server'][$i]['name']) && ($i != $id))
for ($i=0; isset($config['load_balancer']['virtual_server'][$i]); $i++) {
if (($pconfig['name'] == $config['load_balancer']['virtual_server'][$i]['name']) && ($i != $id)) {
$input_errors[] = gettext("This virtual server name has already been used. Virtual server names must be unique.");
}
}
if (preg_match('/[ \/]/', $_POST['name']))
if (preg_match('/[ \/]/', $pconfig['name'])) {
$input_errors[] = gettext("You cannot use spaces or slashes in the 'name' field.");
}
if ($_POST['port'] != "" && !is_portoralias($_POST['port']))
if ($pconfig['port'] != "" && !is_portoralias($pconfig['port'])) {
$input_errors[] = gettext("The port must be an integer between 1 and 65535, a port alias, or left blank.");
}
if (!is_ipaddroralias($_POST['ipaddr']) && !is_subnetv4($_POST['ipaddr']))
if (!is_ipaddroralias($pconfig['ipaddr']) && !is_subnetv4($pconfig['ipaddr'])) {
$input_errors[] = sprintf(gettext("%s is not a valid IP address, IPv4 subnet, or alias."), $_POST['ipaddr']);
else if (is_subnetv4($_POST['ipaddr']) && subnet_size($_POST['ipaddr']) > 64)
$input_errors[] = sprintf(gettext("%s is a subnet containing more than 64 IP addresses."), $_POST['ipaddr']);
} elseif (is_subnetv4($pconfig['ipaddr']) && subnet_size($pconfig['ipaddr']) > 64) {
$input_errors[] = sprintf(gettext("%s is a subnet containing more than 64 IP addresses."), $pconfig['ipaddr']);
}
if ((strtolower($_POST['relay_protocol']) == "dns") && !empty($_POST['sitedown']))
if ((strtolower($pconfig['relay_protocol']) == "dns") && !empty($pconfig['sitedown'])) {
$input_errors[] = gettext("You cannot select a Fall Back Pool when using the DNS relay protocol.");
}
if (!$input_errors) {
if (count($input_errors) == 0) {
$vsent = array();
if (isset($id) && $a_vs[$id]) {
$vsent = $a_vs[$id];
foreach ($copy_fields as $fieldname) {
$vsent[$fieldname] = $pconfig[$fieldname];
}
$vsent['name'] = $_POST['name'];
$vsent['descr'] = $_POST['descr'];
$vsent['poolname'] = $_POST['poolname'];
$vsent['port'] = $_POST['port'];
$vsent['sitedown'] = $_POST['sitedown'];
$vsent['ipaddr'] = $_POST['ipaddr'];
$vsent['mode'] = $_POST['mode'];
$vsent['relay_protocol'] = $_POST['relay_protocol'];
if($_POST['sitedown'] == "")
if ($vsent['sitedown'] == "") {
unset($vsent['sitedown']);
if (isset($id) && $a_vs[$id]) {
if ($a_vs[$id]['name'] != $_POST['name']) {
}
if (isset($id)) {
if ($a_vs[$id]['name'] != $pconfig['name']) {
/* Because the VS name changed, mark the old name for cleanup. */
cleanup_lb_mark_anchor($a_vs[$id]['name']);
}
......@@ -123,173 +122,195 @@ if ($_POST) {
write_config();
header("Location: load_balancer_virtual_server.php");
exit;
}
}
$service_hook = 'relayd';
legacy_html_escape_form_data($pconfig);
include("head.inc");
?>
<body>
<?php include("fbegin.inc"); ?>
<script type="text/javascript">
$( document ).ready(function() {
// collect all known aliases per type
var all_aliases = {};
$("#aliases > option").each(function(){
if (all_aliases[$(this).data('type')] == undefined) {
all_aliases[$(this).data('type')] = [];
}
all_aliases[$(this).data('type')].push($(this).val())
});
$("#ipadd").typeahead({ source: all_aliases['host'] });
$("#port").typeahead({ source: all_aliases['port'] });
<script type="text/javascript" src="/javascript/autosuggest.js"></script>
<script type="text/javascript" src="/javascript/suggestions.js"></script>
});
</script>
<!-- push all available (nestable) aliases in a hidden select box -->
<select class="hidden" id="aliases">
<?php
if (!empty($config['aliases']['alias'])):
foreach ($config['aliases']['alias'] as $alias):
if ($alias['type'] == 'host' || $alias['type'] == 'port'):?>
<option data-type="<?=$alias['type'];?>" value="<?=htmlspecialchars($alias['name']);?>">
<?=htmlspecialchars($alias['name']);?>
</option>
<?php
endif;
endforeach;
endif;
?>
</select>
<?php include("fbegin.inc"); ?>
<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); ?>
<section class="col-xs-12">
<div class="content-box">
<form action="load_balancer_virtual_server_edit.php" method="post" name="iform" id="iform">
<form method="post" name="iform" id="iform">
<div class="table-responsive">
<table class="table table-striped table-sort">
<table class="table table-striped">
<tr>
<td colspan="3" valign="top" class="listtopic"><?=gettext("Edit Load Balancer - Virtual Server entry"); ?></td>
<td width="22%">
<strong><?=gettext("Add/edit - Virtual Server entry"); ?></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>
</td>
</tr>
<tr align="left">
<td width="22%" valign="top" class="vncellreq"><?=gettext("Name"); ?></td>
<td width="78%" class="vtable" colspan="2">
<input name="name" type="text" <?php if(isset($pconfig['name'])) echo "value=\"" . htmlspecialchars($pconfig['name']) . "\"";?> size="32" maxlength="32" />
<tr>
<td><i class="fa fa-info-circle text-muted"></i> <?=gettext("Name"); ?></td>
<td>
<input name="name" type="text" value="<?=$pconfig['name'];?>"/>
</td>
</tr>
<tr align="left">
<td width="22%" valign="top" class="vncell"><?=gettext("Description"); ?></td>
<td width="78%" class="vtable" colspan="2">
<input name="descr" type="text" <?php if(isset($pconfig['descr'])) echo "value=\"" . htmlspecialchars($pconfig['descr']) . "\"";?> size="64" />
<tr>
<td><i class="fa fa-info-circle text-muted"></i> <?=gettext("Description"); ?></td>
<td>
<input name="descr" type="text" value="<?=$pconfig['descr'];?>"/>
</td>
</tr>
<tr align="left">
<td width="22%" valign="top" class="vncellreq"><?=gettext("IP Address"); ?></td>
<td width="78%" class="vtable" colspan="2">
<input class="formfldalias" id="ipaddr" name="ipaddr" type="text" <?php if(isset($pconfig['ipaddr'])) echo "value=\"" . htmlspecialchars($pconfig['ipaddr']) . "\"";?> size="39" maxlength="39" />
<br /><?=gettext("This is normally the WAN IP address that you would like the server to listen on. All connections to this IP and port will be forwarded to the pool cluster."); ?>
<tr>
<td><a id="help_for_ipaddr" href="#" class="showhelp"><i class="fa fa-info-circle"></i></a> <?=gettext("IP Address"); ?></td>
<td>
<input type="text" id="ipadd" name="ipaddr" value="<?=$pconfig['ipaddr'];?>" />
<div class="hidden" for="help_for_ipaddr">
<?=gettext("This is normally the WAN IP address that you would like the server to listen on. All connections to this IP and port will be forwarded to the pool cluster."); ?>
<br /><?=gettext("You may also specify a host alias listed in Firewall -&gt; Aliases here."); ?>
<script type="text/javascript">
//<![CDATA[
var host_aliases = <?= json_encode(get_alias_list(array("host", "network", "url", "urltable"))) ?>;
var oTextbox1 = new AutoSuggestControl(document.getElementById("ipaddr"), new StateSuggestions(host_aliases));
//]]>
</script>
</div>
</td>
</tr>
<tr align="left">
<td width="22%" valign="top" class="vncell"><?=gettext("Port"); ?></td>
<td width="78%" class="vtable" colspan="2">
<input class="formfldalias" name="port" id="port" type="text" <?php if(isset($pconfig['port'])) echo "value=\"" . htmlspecialchars($pconfig['port']) . "\"";?> size="16" maxlength="16" />
<br /><?=gettext("This is the port that the clients will connect to. All connections to this port will be forwarded to the pool cluster."); ?>
<tr>
<td><a id="help_for_port" href="#" class="showhelp"><i class="fa fa-info-circle"></i></a> <?=gettext("Port"); ?></td>
<td>
<input type="text" name="port" id="port" value="<?=$pconfig['port'];?>" />
<div class="hidden" for="help_for_port">
<?=gettext("This is the port that the clients will connect to. All connections to this port will be forwarded to the pool cluster."); ?>
<br /><?=gettext("If left blank, listening ports from the pool will be used."); ?>
<br /><?=gettext("You may also specify a port alias listed in Firewall -&gt; Aliases here."); ?>
<script type="text/javascript">
//<![CDATA[
var port_aliases = <?= json_encode(get_alias_list(array("port", "url_ports", "urltable_ports"))) ?>;
var oTextbox2 = new AutoSuggestControl(document.getElementById("port"), new StateSuggestions(port_aliases));
//]]>
</script>
</div>
</td>
</tr>
<tr align="left">
<td width="22%" valign="top" class="vncellreq"><?=gettext("Virtual Server Pool"); ?></td>
<td width="78%" class="vtable" colspan="2">
<?php if(count($config['load_balancer']['lbpool']) == 0): ?>
<tr>
<td><i class="fa fa-info-circle text-muted"></i> <?=gettext("Virtual Server Pool"); ?></td>
<td>
<?php
if(count($config['load_balancer']['lbpool']) == 0): ?>
<b><?=gettext("NOTE:"); ?></b> <?=gettext("Please add a pool on the Pools tab to use this feature."); ?>
<?php else: ?>
<?php
else: ?>
<select id="poolname" name="poolname">
<?php
for ($i = 0; isset($config['load_balancer']['lbpool'][$i]); $i++) {
$selected = "";
if ( $config['load_balancer']['lbpool'][$i]['name'] == $pconfig['poolname'] )
$selected = " selected=\"selected\"";
echo "<option value=\"" . htmlspecialchars($config['load_balancer']['lbpool'][$i]['name']) . "\"{$selected}>{$config['load_balancer']['lbpool'][$i]['name']}</option>";
}
?>
<?php
foreach($config['load_balancer']['lbpool'] as $pool):?>
<option value="<?=htmlspecialchars($pool['name']);?>" <?=$pool['name'] == $pconfig['poolname'] ? " selected=\"selected\"" : "";?>>
<?=htmlspecialchars($pool['name']);?>
</option>
<?php
endforeach;?>
</select>
<?php endif; ?>
<?php
endif; ?>
</td>
</tr>
<tr align="left">
<td width="22%" valign="top" class="vncellreq"><?=gettext("Fall Back Pool"); ?></td>
<td width="78%" class="vtable" colspan="2">
<?php if(count($config['load_balancer']['lbpool']) == 0): ?>
<tr>
<td><a id="help_for_sitedown" href="#" class="showhelp"><i class="fa fa-info-circle"></i></a> <?=gettext("Fall Back Pool"); ?></td>
<td>
<?php
if(empty($config['load_balancer']['lbpool']) || count($config['load_balancer']['lbpool']) == 0): ?>
<b><?=gettext("NOTE:"); ?></b> <?=gettext("Please add a pool on the Pools tab to use this feature."); ?>
<?php else: ?>
<?php
else: ?>
<select id="sitedown" name="sitedown">
<option value=""<?=htmlspecialchars($pconfig['sitedown']) == '' ? ' selected' : ''?>><?=gettext("none"); ?></option>
<?php
for ($i = 0; isset($config['load_balancer']['lbpool'][$i]); $i++) {
$selected = "";
if ( $config['load_balancer']['lbpool'][$i]['name'] == $pconfig['sitedown'] )
$selected = " selected=\"selected\"";
echo "<option value=\"" . htmlspecialchars($config['load_balancer']['lbpool'][$i]['name']) . "\"{$selected}>{$config['load_balancer']['lbpool'][$i]['name']}</option>";
}
?>
<option value=""<?=empty($pconfig['sitedown']) ? "selected=\"selected\"" : ''?>>
<?=gettext("none"); ?>
</option>
<?php
foreach($config['load_balancer']['lbpool'] as $pool):?>
<option value="<?=htmlspecialchars($pool['name']);?>" <?=$pool['name'] == $pconfig['sitedown'] ? " selected=\"selected\"" : "";?>>
<?=htmlspecialchars($pool['name']);?>
</option>
<?php
endforeach;?>
</select>
<br /><?=gettext("The server pool to which clients will be redirected if *ALL* servers in the Virtual Server Pool are offline."); ?>
<?php
endif; ?>
<div class="hidden" for="help_for_sitedown">
<?=gettext("The server pool to which clients will be redirected if *ALL* servers in the Virtual Server Pool are offline."); ?>
<br /><?=gettext("This option is NOT compatible with the DNS relay protocol."); ?>
<?php endif; ?>
</div>
</td>
</tr>
<tr style="display:none;"><td><input type="hidden" name="mode" value="redirect_mode" /></td></tr>
<!--
<tr align="left">
<td width="22%" valign="top" class="vncellreq">Mode</td>
<td width="78%" class="vtable" colspan="2">
<input id="redirect_mode" type="radio" name="mode" value="redirect"<?=htmlspecialchars($pconfig['mode']) == 'redirect' ? ' checked="checked"': ''?> /> Redirect
<input id="relay_mode" type="radio" name="mode" value="relay"<?=htmlspecialchars($pconfig['mode']) == 'relay' ? ' checked="checked"': ''?> /> Relay
<br />
<tr>
<td><i class="fa fa-info-circle text-muted"></i> <?=gettext("Mode");?></td>
<td>
<input type="radio" name="mode" value="redirect"<?=$pconfig['mode'] != 'relay' ? ' checked="checked"': ''?> /> <?=gettext("Redirect");?>
<input type="radio" name="mode" value="relay"<?=$pconfig['mode'] == 'relay' ? ' checked="checked"': ''?> /> <?=gettext("Relay");?>
</td>
</tr>
-->
<tr id="relay" align="left">
<td width="22%" valign="top" class="vncellreq"><?=gettext("Relay Protocol"); ?></td>
<td width="78%" class="vtable" colspan="2">
<select id="relay_protocol" name="relay_protocol">
<?php
$lb_def_protos = array("tcp", "dns");
foreach ($lb_def_protos as $lb_proto) {
$selected = "";
if ( $pconfig['relay_protocol'] == $lb_proto )
$selected = " selected=\"selected\"";
echo "<option value=\"{$lb_proto}\"{$selected}>{$lb_proto}</option>";
}
?>
<tr>
<td><i class="fa fa-info-circle text-muted"></i> <?=gettext("Relay Protocol"); ?></td>
<td>
<select name="relay_protocol">
<option value="tcp" <?=$pconfig['relay_protocol'] == "tcp" ? " selected=\"selected\"" : "";?>>
<?=gettext("TCP");?>
</option>
<option value="dns" <?=$pconfig['relay_protocol'] == "dns" ? " selected=\"selected\"" : "";?>>
<?=gettext("DNS");?>
</option>
</select>
<br />
</td>
</tr>
<tr align="left">
<td width="22%" valign="top">&nbsp;</td>
<td align="left" valign="bottom" width="78%">
<input name="Submit" type="submit" class="btn btn-primary" value="<?=gettext("Submit"); ?>" />
<input type="button" class="btn btn-default" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=$referer;?>'" />
<?php if (isset($id) && $a_vs[$id] && $_GET['act'] != 'dup'): ?>
<input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
<tr>
<td>&nbsp;</td>
<td>
<input name="Save" type="submit" class="btn btn-primary" value="<?=gettext("Submit"); ?>" />
<input type="button" class="btn btn-default" value="<?=gettext("Cancel");?>" onclick="window.location.href='<?=(isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '/load_balancer_virtual_server.php');?>'" />
<?php if (isset($id) && (empty($_GET['act'] ) || $_GET['act'] != 'dup')): ?>
<input name="id" type="hidden" value="<?=$id;?>" />
<?php endif; ?>
</td>
</tr>
<tfoot>
<tr>
<td colspan="2">
<span class="text-danger"><strong><?=gettext("Note:"); ?></strong></span>
<?=gettext("Don't forget to add a firewall rule for the virtual server/pool after you're finished setting it up."); ?>
</td>
</tr>
</tfoot>
</table>
</div>
<span class="red"><strong><?=gettext("Note:"); ?></strong></span> <?=gettext("Don't forget to add a firewall rule for the virtual server/pool after you're finished setting it up."); ?>
</form>
</div>
</section>
</div>
</div>
</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