Hi,

Just posting this patch in case it's useful for someone. Not sure if it
makes sense to include it (see below why). It basically adds this option
to ldirectord:

===================
fallbackcommand = "path to script"

If this directive is defined, the supplied script is executed whenever
all real servers for a virtual sreve are down or when the first real
server comes up again. In the first case, it is called with "start" as
its first argument, in the latter with "stop".
===================

The current ldirectord does a fallback on startup and then only stops
the fallback once the first real server is checked and up. Because this
new option is tied to the existing code, the fallback script is also 
started and stopped once at the startup of ldirectord, which might be
annoying for some users. That's why I'm not sure if there is general
interest in including it like this. I didn't dig deeper into the
ldirectord code to prevent this startup behavior from happening because
we actually want this behavior.

Julius

diff -r ae210ba284e4 ldirectord/ldirectord.in
--- a/ldirectord/ldirectord.in  Mon Sep 01 14:20:57 2008 +0200
+++ b/ldirectord/ldirectord.in  Wed Sep 03 17:09:03 2008 +0200
@@ -181,6 +181,15 @@ the server onto which a webservice is re
 the server onto which a webservice is redirected if all real
 servers are down. Typically this would be 127.0.0.1 with
 an emergency page.
+
+If defined in a virtual server section then the global value is overridden.
+
+B<fallbackcommand = ">I<path to script>B<">
+
+If this directive is defined, the supplied script is executed whenever all
+real servers for a virtual service are down or when the first real server
+comes up again. In the first case, it is called with "start" as its first
+argument, in the latter with "stop".
 
 If defined in a virtual server section then the global value is overridden.
 
@@ -618,6 +627,7 @@ use vars qw(
            $CONFIG
            $DEBUG
            $FALLBACK
+           $FALLBACKCOMMAND
            $SUPERVISED
            $IPVSADM
            $checksum
@@ -1303,6 +1313,9 @@ sub read_config
                                        $vsrv{fallback} =
                                                parse_fallback($line, $1,
                                                               \%vsrv);
+                               } elsif ($rcmd =~ 
/^fallbackcommand\s*=\s*(.*)/) {
+                                        $1 =~ /(.+)/ or &config_error($line, 
"invalid fallback command");
+                                        $vsrv{fallbackcommand} = $1;
                                 } elsif ($rcmd =~ /^quiescent\s*=\s*(.*)/) {
                                         ($1 eq "yes" || $1 eq "no")
                                                 or &config_error($line, 
"quiescent must be 'yes' or 'no'");
@@ -1381,6 +1394,9 @@ sub read_config
                         &_ld_read_config_fallback_resolve($line, "tcp", $tcp);
                        &_ld_read_config_fallback_resolve($line, "udp", $udp);
                        $FALLBACK = { "tcp" => $tcp, "udp" => $udp };
+               } elsif ($linedata =~ /^fallbackcommand\s*=\s*(.*)/) {
+                       $1 =~ /(.+)/ or &config_error($line, "invalid fallback 
command");
+                       $FALLBACKCOMMAND = $1;
                } elsif ($linedata  =~ /^autoreload\s*=\s*(.*)/) {
                        ($1 eq "yes" || $1 eq "no")
                            or &config_error($line, 
@@ -3652,14 +3668,16 @@ sub fallback_on
 
        my $fallback=&fallback_find($v);
 
-       if (! defined($fallback) or (! _status_up($v, $fallback, "fallback") 
-                       and ! defined($force))) {
-               return;
-       }
-
-       &_restore_service($v, $fallback->{server} . ":" . $fallback->{port},
-                       get_forward_flag($fallback->{forward}), 
-                               "1", "fallback");
+       if (defined($fallback) and (_status_up($v, $fallback, "fallback")
+                       or defined($force))) {
+               &_restore_service($v, $fallback->{server} . ":" . 
$fallback->{port},
+                                 get_forward_flag($fallback->{forward}), 
+                                 "1", "fallback");
+       }
+
+       if (!defined ($v->{real_status})) {
+               &do_fallback_command($v, "start");
+       }
 }
 
 
@@ -3675,14 +3693,16 @@ sub fallback_off
 
        my $fallback=&fallback_find($v);
 
-       if (! defined($fallback) or (! _status_down($v, $fallback, "fallback") 
-                       and ! defined($force))) {
-               return;
-       }
-
-       &_remove_service($v, $fallback->{server} . ":" .  $fallback->{port},
-                       get_forward_flag($fallback->{forward}),
-                               "fallback");
+       if (defined($fallback) and (_status_down($v, $fallback, "fallback")
+                       or defined($force))) {
+               &_remove_service($v, $fallback->{server} . ":" .  
$fallback->{port},
+                                get_forward_flag($fallback->{forward}),
+                                "fallback");
+       }
+
+       if (defined ($v->{real_status})) {
+               &do_fallback_command($v, "stop");
+       }
 }
 
 
@@ -3716,6 +3736,27 @@ sub fallback_find
        return \%anon_fallback;
 }
 
+
+# fallback_command
+# Execute the fallback command with the given status if it wasn't executed
+# with this status already for the supplied virtual service.
+
+sub do_fallback_command()
+{
+       my ($v, $status) = (@_);
+
+       if (defined $v->{fallbackcommand_status} and 
$v->{fallbackcommand_status} eq $status) {
+               return;
+       }
+
+       $v->{fallbackcommand_status} = $status;
+
+       if (defined($v->{fallbackcommand})) {
+               &system_wrapper($v->{fallbackcommand} . " " . $status);
+       } elsif (defined($FALLBACKCOMMAND)) {
+               &system_wrapper($FALLBACKCOMMAND . " " . $status);
+       }
+}
 
 # Used during stop, start and reload to remove stale real servers from LVS
 sub purge_untracked_service

_______________________________________________________
Linux-HA-Dev: [email protected]
http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
Home Page: http://linux-ha.org/

Reply via email to