diff options
author | Bill Marquette <billm@pfsense.org> | 2008-06-16 02:58:57 +0000 |
---|---|---|
committer | Bill Marquette <billm@pfsense.org> | 2008-06-16 02:58:57 +0000 |
commit | 17623ab556ab149f01e10aa587a35816302ee91d (patch) | |
tree | 5a6bb1221b068f0375f284e4d179576b6fa45350 /etc/inc/gwlb.inc | |
parent | 0551a3a89ffff608bfd7fffdd940eb4826357ae5 (diff) | |
download | pfsense-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.inc | 117 |
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 |