summaryrefslogtreecommitdiffstats
path: root/etc/inc/gwlb.inc
diff options
context:
space:
mode:
authorBill Marquette <billm@pfsense.org>2008-06-16 02:58:57 +0000
committerBill Marquette <billm@pfsense.org>2008-06-16 02:58:57 +0000
commit17623ab556ab149f01e10aa587a35816302ee91d (patch)
tree5a6bb1221b068f0375f284e4d179576b6fa45350 /etc/inc/gwlb.inc
parent0551a3a89ffff608bfd7fffdd940eb4826357ae5 (diff)
downloadpfsense-17623ab556ab149f01e10aa587a35816302ee91d.zip
pfsense-17623ab556ab149f01e10aa587a35816302ee91d.tar.gz
Bring in relayd to perform server load balancing
Move gateway load balancing code into gwlb.inc - still uses slbd TODO: vs and pool status screens are currently broken...and wouldn't work with the gateway pools anyway, ultimately, the gateway pools need to move.
Diffstat (limited to 'etc/inc/gwlb.inc')
-rw-r--r--etc/inc/gwlb.inc117
1 files changed, 117 insertions, 0 deletions
diff --git a/etc/inc/gwlb.inc b/etc/inc/gwlb.inc
new file mode 100644
index 0000000..b0d4bd7
--- /dev/null
+++ b/etc/inc/gwlb.inc
@@ -0,0 +1,117 @@
+<?php
+/* $Id$ */
+/*
+ Copyright (C) 2008 Bill Marquette
+ 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.
+
+ */
+
+/* include all configuration functions */
+require_once("functions.inc");
+require_once("pkg-utils.inc");
+require_once("notices.inc");
+
+function slbd_configure() {
+ global $config, $g;
+
+ $a_vs = &$config['load_balancer']['virtual_server'];
+ $a_pool = &$config['load_balancer']['lbpool'];
+
+ $should_start=0;
+
+ $fd = fopen("{$g['varetc_path']}/slbd.conf", "w");
+
+ /* Gateway Pools */
+ if(is_array($a_pool)) {
+ foreach ($a_pool as $vspool) {
+ if ($vspool['type'] != "gateway")
+ continue;
+
+ if ($vspool['desc'] == "")
+ $slbdconf .= "{$vspool['name']}:\\\n";
+ else
+ $slbdconf .= "{$vspool['name']}|{$vspool['desc']}:\\\n";
+
+ /* pool name */
+ $slbdconf .= "\t:poolname={$vspool['name']}:\\\n";
+ /* remove pool status files so we don't end up with a mismatch */
+ if(file_exists("{$g['tmp_path']}/{$vspool['name']}.pool"))
+ unlink("{$g['tmp_path']}/{$vspool['name']}.pool");
+ /* virtual IP */
+ $slbdconf .= "\t:vip=127.0.0.1:\\\n";
+ $slbdconf .= "\t:vip-port=666:\\\n";
+ /* fallback IP */
+ $slbdconf .= "\t:sitedown=127.0.0.1:\\\n";
+ /* fallback port */
+ $slbdconf .= "\t:sitedown-port=666:\\\n";
+
+ $svrcnt = 0;
+ $svrtxt = "";
+ if($vspool['servers'])
+ foreach ($vspool['servers'] as $lbsvr) {
+ $lbsvr_split=split("\|", $lbsvr);
+ $svrtxt .= "\t:{$svrcnt}={$lbsvr_split[1]}:\\\n";
+ $svrcnt++;
+
+ /* Add static routes to the monitor IPs */
+ $int = convert_friendly_interface_to_real_interface_name($lbsvr_split[0]);
+ $gateway = get_interface_gateway($int);
+ $int_ip = find_interface_ip($int);
+ if($int_ip == "0.0.0.0") {
+ /* DHCP Corner case. If DHCP is down, we delete the route then
+ * there is a chance the monitor ip gateway will go out the link
+ * that is up.
+ */
+ mwexec("/sbin/route delete -host {$lbsvr_split[1]} 1>/dev/null 2>&1");
+ mwexec("/sbin/route add -host {$lbsvr_split[1]} 127.0.0.1 1> /dev/null 2>&1");
+ } else {
+ mwexec("/sbin/route delete -host {$lbsvr_split[1]} 1>/dev/null 2>&1");
+ mwexec("/sbin/route add -host {$lbsvr_split[1]} {$gateway} 1> /dev/null 2>&1");
+ }
+ }
+ $slbdconf .= "\t:service-port=666:\\\n";
+ $slbdconf .= "\t:method=round-robin:\\\n";
+ $slbdconf .= "\t:services={$svrcnt}:\\\n";
+ $slbdconf .= $svrtxt;
+
+ $slbdconf .= "\t:ping:\n";
+
+ $should_start=1;
+ }
+ }
+
+ if($should_start == 1) {
+ fwrite($fd, $slbdconf);
+ fclose($fd);
+ mwexec("/usr/bin/killall -9 slbd");
+ sleep(2);
+ /* startup slbd pointing it's config at /var/etc/slbd.conf with a polling interval of 5 seconds */
+ mwexec("/usr/local/sbin/slbd -c{$g['varetc_path']}/slbd.conf -r5000");
+ } else {
+ mwexec("/usr/bin/killall -9 slbd");
+ fclose($fd);
+ }
+}
+
+?> \ No newline at end of file
OpenPOWER on IntegriCloud