From e1c6b3d67490c079b785ba2330a3366a2f4ecc89 Mon Sep 17 00:00:00 2001 From: Seth Mos Date: Thu, 28 May 2009 09:42:42 +0200 Subject: [PATCH] Backport apinger from 2.0 to 1.2 This removes the gateway support from the slbd load balancer. It will now create a apinger configuration instead. Change syslog configuration so apinger logs to the slbd.log Correct status page so that it shows the gateway status. *** The current thresholds might need fine tuning or later adjustments *** The dashboard package needs to have it's widget aligned with these changes. --- etc/inc/filter.inc | 39 ++--- etc/inc/system.inc | 9 +- etc/inc/vslb.inc | 220 +++++++++++++++++++++-------- usr/local/www/status_slbd_pool.php | 44 +++--- 4 files changed, 198 insertions(+), 114 deletions(-) diff --git a/etc/inc/filter.inc b/etc/inc/filter.inc index 7020c10969..f647e586b9 100644 --- a/etc/inc/filter.inc +++ b/etc/inc/filter.inc @@ -1580,37 +1580,26 @@ function generate_user_filter_rule($rule, $ngcounter) { continue; } } - /* if /tmp/$lbname.pool exists then read in our gateway hints from slbd */ - if(file_exists("{$g['tmp_path']}/{$lb['name']}.pool")) { - $lbs_tmp = split("\n", file_get_contents("{$g['tmp_path']}/{$lb['name']}.pool")); - $lbs = array(); - /* process the entire file to prevent empty lines */ - foreach($lbs_tmp as $lb_tmp) { - if(is_ipaddr($lb_tmp)) { - $lbs[] = $lb_tmp; - } - } - $lbs_count = count($lbs); - if($g['debug']) - log_error("We found $lbs_count valid entries in status file {$g['tmp_path']}/{$lb['name']}.pool"); - if(count($lbs) == 0) { - if($g['debug']) - log_error("There are no servers found in the status file, using XML config settings!"); - foreach ($lb['servers'] as $lbsvr) { - $lbsvr_split = split("\|", $lbsvr); - $lbs[] = $lbsvr_split[1]; - } + /* check monitor IP status */ + $apinger_status = return_apinger_status(); + foreach ($lb['servers'] as $lbsvr) { + $lbsvr_split = split("\|", $lbsvr); + if(preg_match("/down/i", $apinger_status[$lbsvr_split[1]]['status'])) { + echo "{$apinger_status[$lbsvr_split[1]]['status']}\n"; + continue; + } else { + $lbs[] = $lbsvr_split[1]; } - } else { - if($g['debug']) - log_error("There is no server status file, using XML config settings!"); - $lbs = array(); - foreach ($lb['servers'] as $lbsvr) { + } + if(count($lbs) == 0) { + log_error("There are no servers found in the status file, using XML config settings!"); + foreach ($lb['servers'] as $lbsvr) { $lbsvr_split = split("\|", $lbsvr); $lbs[] = $lbsvr_split[1]; } } + /* If we want failover we only return the first (top) server from the list * and work our way down from there. This way we order the failover order. */ diff --git a/etc/inc/system.inc b/etc/inc/system.inc index 9f7a2af9fd..c493ccde9f 100644 --- a/etc/inc/system.inc +++ b/etc/inc/system.inc @@ -339,6 +339,13 @@ EOD; $syslogconf .= << \ No newline at end of file +?> diff --git a/etc/inc/vslb.inc b/etc/inc/vslb.inc index ad050fd866..f1f6882abd 100644 --- a/etc/inc/vslb.inc +++ b/etc/inc/vslb.inc @@ -43,7 +43,6 @@ function slbd_configure() { $fd = fopen("{$g['varetc_path']}/slbd.conf", "w"); - /* Virtual server pools */ if(is_array($a_vs)) { foreach ($a_vs as $vsent) { @@ -94,75 +93,174 @@ function slbd_configure() { } /* Gateway Pools */ + $a_settings['latencylow'] = "10"; + $a_settings['latencyhigh'] = "20"; + $a_settings['losslow'] = "100"; + $a_settings['losshigh'] = "500"; + + /* kill apinger process */ + if(is_process_running("apinger")) + mwexec("/usr/bin/killall apinger", true); + + $fda = fopen("{$g['varetc_path']}/apinger.conf", "w"); + $apingerconfig = <<&1", true); - mwexec("/sbin/route add -host {$lbsvr_split[1]} 127.0.0.1 2>&1", true); - } else { - mwexec("/sbin/route delete -host {$lbsvr_split[1]} 2>&1", true); - mwexec("/sbin/route add -host {$lbsvr_split[1]} {$gateway} 2>&1", true); + if(is_array($vspool['servers'])) { + foreach ($vspool['servers'] as $lbsvr) { + $lbsvr_split=split("\|", $lbsvr); + $a_addresses[] = "$lbsvr_split[1]"; + } + } + } + $a_addresses = array_unique($a_addresses); + + /* add static routes for each gateway with their monitor IP */ + if(!empty($a_addresses)) { + foreach($a_addresses as $address) { + $apingerconfig .= "target \"{$address}\" {\n"; + $apingerconfig .= " description \"{$address}\"\n"; + $apingerconfig .= " rrd file \"{$g['vardb_path']}/rrd/{$address}-quality.rrd\"\n"; + $apingerconfig .= "}\n"; + $apingerconfig .= "\n"; + } + fwrite($fda, $apingerconfig); + fclose($fda); + } + + foreach ($a_pool as $vspool) { + if ($vspool['type'] != "gateway") { + continue; + } + + if(is_array($vspool['servers'])) { + foreach ($vspool['servers'] as $lbsvr) { + $lbsvr_split=split("\|", $lbsvr); + + /* 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]} 2>&1", true); + mwexec("/sbin/route add -host {$lbsvr_split[1]} 127.0.0.1 2>&1", true); + } else { + mwexec("/sbin/route delete -host {$lbsvr_split[1]} 2>&1", true); + mwexec("/sbin/route add -host {$lbsvr_split[1]} {$gateway} 2>&1", true); + } } } - $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", true); - 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", true); - fclose($fd); + + if($should_start == 1) { + fwrite($fd, $slbdconf); + fclose($fd); + mwexec("/usr/bin/killall -9 slbd", true); + 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", true); + fclose($fd); + } + + if(!is_process_running("apinger") && (!empty($a_addresses))) { + if (is_dir("{$g['tmp_path']}")) + chmod("{$g['tmp_path']}", 01777); + if (is_dir("{$g['vardb_path']}/rrd")) + chown("{$g['vardb_path']}/rrd", "nobody"); + /* start a new apinger process */ + mwexec_bg("/usr/local/sbin/apinger -c {$g['varetc_path']}/apinger.conf"); } + } -?> \ No newline at end of file +/* return the status of the apinger targets as a array */ +function return_apinger_status() { + global $config; + global $g; + + $apingerstatus = array(); + if(is_readable("{$g['tmp_path']}/apinger.status")) + $apingerstatus = file("{$g['tmp_path']}/apinger.status"); + + $status = array(); + foreach($apingerstatus as $line) { + $fields = explode(":", $line); + switch($fields[0]) { + case "Target": + $target = trim($fields[1]); + $status[$target] = array(); + $status[$target]['monitor'] = $target; + break; + case "Description": + $status[$target]['name'] = trim($fields[1]); + break; + case "Last reply received": + $status[$target]['lastcheck'] = trim($fields[1]) .":". trim($fields[2]) .":". +trim($fields[3]); + break; + case "Average delay": + $status[$target]['delay'] = trim($fields[1]); + break; + case "Average packet loss": + $status[$target]['loss'] = trim($fields[1]); + break; + case "Active alarms": + $status[$target]['status'] = trim($fields[1]); + break; + } + } + return($status); +} + +?> diff --git a/usr/local/www/status_slbd_pool.php b/usr/local/www/status_slbd_pool.php index 51fb4243d1..fcf9231d9b 100755 --- a/usr/local/www/status_slbd_pool.php +++ b/usr/local/www/status_slbd_pool.php @@ -38,6 +38,8 @@ $a_pool = &$config['load_balancer']['lbpool']; $slbd_logfile = "{$g['varlog_path']}/slbd.log"; +$apinger_status = return_apinger_status(); + $nentries = $config['syslog']['nentries']; if (!$nentries) $nentries = 50; @@ -99,40 +101,28 @@ include("head.inc"); "; - } + PRINT ""; + } } else { PRINT ""; }
$online "; - if($lastchange <> "") { - PRINT "Last change $lastchange"; - } else { - PRINT "No changes found in logfile"; - } - PRINT "
$online "; + PRINT "Delay: {$apinger_status[$monitorip]['delay']}, "; + PRINT "Loss: {$apinger_status[$monitorip]['loss']}"; + PRINT "
{$vipent['monitor']}