Hi,
This is a first time to post to this ML.
I found a bug in ldirectord and attach a patch to fix this
problem to this E-mail.
The bug is that if a port is omitted in a "fallback" in a
virtual section, the entry is never seen in the virtual server
table even if all real servers are down.
virtual=10.10.100.1:daytime
real=10.10.100.2:daytime gate
fallback=127.0.0.1
A debug message says like this.
DEBUG2: Running system(/sbin/ipvsadm -a -t 10.10.100.1:13 -r 127.0.0.1: -g
-w 1)
Running system(/sbin/ipvsadm -a -t 10.10.100.1:13 -r 127.0.0.1: -g -w 1)
illegal real server address[:port] specified
DEBUG2: system(/sbin/ipvsadm -a -t 10.10.100.1:13 -r 127.0.0.1: -g -w 1)
failed:
system(/sbin/ipvsadm -a -t 10.10.100.1:13 -r 127.0.0.1: -g -w 1) failed:
The problem in the source code is that when a port of "fallback"
is omitted, the port is derived from a port specified in a
"virtual" service (from a behavior of the parse_fallback
function), but the port is used before it is defined.
I tested ldirectord on Ubuntu 10.04 with perl 5.10.1.
with best regards,
--
Sohgo Takeuchi
diff -r df0d9559130c ldirectord/ldirectord.in
--- a/ldirectord/ldirectord.in Mon Jul 26 21:40:53 2010 +1000
+++ b/ldirectord/ldirectord.in Tue Jul 27 21:07:17 2010 +0900
@@ -1281,12 +1281,15 @@
my $fwm = undef;
my $virtual_id;
my $virtual_line = $line;
+ my $virtual_port;
my $fallback_line;
my @rsrv_todo;
if ($vattr =~ /^(\d+\.\d+\.\d+\.\d+):([0-9A-Za-z]+)/) {
$virtual_id = $ip_port = "$1:$2";
+ $virtual_port = $2;
} elsif ($vattr =~
/^([0-9A-Za-z._+-]+):([0-9A-Za-z]+)/) {
$virtual_id = $ip_port = "$1:$2";
+ $virtual_port = $2;
} elsif ($vattr =~ /^(\d+)/){
$virtual_id = $fwm = $1;
} elsif ($vattr =~ /^\[([0-9A-Fa-f:]+)\]:(\d+)/) {
@@ -1296,6 +1299,7 @@
&config_error($line,"invalid ipv6
address for virtual server");
}
$virtual_id = $ip_port = "[$v6addr]:$v6port";
+ $virtual_port = $v6port;
} else {
&config_error($line,
"invalid address for virtual server");
@@ -1308,6 +1312,7 @@
if ($ip_port =~ /:53$/) {
$vsrv{protocol} = "udp";
}
+ $vsrv{port} = $virtual_port;
} else {
$vsrv{fwm} = $fwm;
$vsrv{checktype} = "negotiate";
|