logo       

Re: execute a command after getting/loosing a IP-Address?: msg#00013

apache.mod-wackamole.general

Subject: Re: execute a command after getting/loosing a IP-Address?

On Nov 27, 2003, at 10:13 AM, Ryan Caudy wrote:
So, we don't provide any solutions to this problem within Wackamole. However, I'm sure someone else has had to deal with it, and might answer you with something they've already developed. (This is a big holiday in the US, which means a lot of people on the list probably won't be responding for a few days).

The solution you proposed is probably the quickest and dirtiest way to get what you want. If you wanted something more powerful, using the same mechanism to run a pair of shell-scripts "Acquire-script" and "Release-script" would give this to you. However, I'd be a little worried about doing so in a general situation, because of the privileges with which Wackamole is run.

I wouldn't recommend adding anything too complicated directly to Wackamole, because of timing concerns. You might consider a long-running daemon to handle this failover, that communicates (something along the lines of "Acquire/Release address") with Wackamole via named pipes or another Unix IPC mechanism.

Actually, wackamole in CVS has embedded an embedded perl interpreter in it. So you can do crazy stuff like that. It is mostly untested and undocumented, but I have used it. It also has the ability to dlopen shared objects and run code in those -- if you'd rather write in C.

Perl works something like this in your wackamole.conf:

PerlUseLib .
PerlUse example
RunDynamic example::hup_named on up

In the local directory (.) example.pm looks like:
-- begin --
package example;

use strict;
use Data::Dumper;

sub hup_named {
my $pid;
open(A,"</var/run/named.pid") && chomp($pid = <A>);
close(A);
kill 1, $pid if($pid);
}

1;
-- end --

The following will dlopen funcs.so and run the function returned by dlsym("shoutout"):

RunDynamic funcs:shoutout on up

A simple funcs.c is:
-- begin --
#include "config.h"

void killhup(struct interface p,
struct interface *e,
struct interface r) {
fprintf(stderr, "I am here with IP %s\n", inet_ntoa(p.ipaddr));
}
-- end --

All this being development work -- YMMV.

// Theo Schlossnagle
// Principal Engineer -- http://www.omniti.com/~jesus/
// Postal Engine -- http://www.postalengine.com/
// Ecelerity: fastest MTA on earth


<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

News | FAQ | advertise