--- /usr/sbin/ldirectord.orig 2004-10-14 12:18:13.000000000 -0700 +++ /usr/sbin/ldirectord 2005-01-11 16:35:36.751157200 -0800 @@ -666,6 +666,7 @@ $vsrv{receive} = ""; $vsrv{login} = ""; $vsrv{passwd} = "ldirectord\@$ENV{HOSTNAME}"; + $vsrv{database} = "mysql"; $vsrv{checktimeout} = 0; $vsrv{connecttimeout} = 0; $vsrv{negotiatetimeout} = 0; @@ -723,6 +724,9 @@ } elsif ($rcmd =~ /^passwd\s*=\s*\"(.*)\"/) { $1 =~ /(.+)/ or &config_error($line, "invalid password"); $vsrv{passwd} = $1; + } elsif ($rcmd =~ /^database\s*=\s*\"(.*)\"/) { + $1 =~ /(.+)/ or &config_error($line, "invalid database"); + $vsrv{database} = $1; } elsif ($rcmd =~ /^load\s*=\s*\"(.*)\"/) { $1 =~ /(\w+)/ or &config_error($line, "invalid string for load testing"); $vsrv{load} = $1; @@ -946,6 +950,9 @@ elsif ($vsrv->{port} eq "53") { $vsrv->{service} = "dns"; } + elsif ($vsrv->{port} eq "3306") { + $vsrv->{service} = "mysql"; + } else { $vsrv->{service} = "none"; } @@ -1519,6 +1526,8 @@ $$r{num_connects} = 0 if (check_nntp($v, $r)); } elsif ($$v{service} eq "dns") { $$r{num_connects} = 0 if (check_dns($v, $r)); + } elsif ($$v{service} eq "mysql") { + $$r{num_connects} = 0 if (check_mysql($v, $r)); } else { $$r{num_connects} = 0 if (check_none($v, $r)); } @@ -1843,6 +1852,57 @@ } +sub check_mysql +{ + require DBI; + my ($v, $r) = @_; + my $port=(defined $$v{checkport}?$$v{checkport}:$$r{port}); + my ($dbh, $sth, $query, $rows, $result); # Local variables + $query = $$r{request}; + $query =~ s#^/##; + unless ($$v{login} && $$v{passwd} && $query) { + service_set($v, $r, "down"); + &ld_log("Error: Must specify a login, passwd, and request string for mysql. Not adding $$r{server}.\n"); + return 1; + } + $result=2; # Set result flag. Only ok if ends up at zero. + &ld_debug(2, "Checking mysql server=$$r{server} port=$port\n"); + $dbh = DBI->connect("dbi:mysql:database=$$v{database};host=$$r{server};port=$port", $$v{login}, $$v{passwd}); + unless ($dbh) { + &ld_debug(4, "Failed to bind to $$r{server} with $dbh->err"); + service_set($v, $r, "down"); + return 1; + } + $result--; + $sth = $dbh->prepare($query); + $rows = $sth->execute; + ld_debug(4, "Database search returned $rows rows"); + if ($rows gt 0) { + # If it returns with a number, it is ok. + # Disallows query of an empty table. + $result--; + } + # If user defined a receive string (number of rows returned), only do + # the check if the previous fetchall_arrayref succeeded. + #if (defined $$r{receive} && $result eq 0) { + # # Receive string specifies an exact number of rows + # if ($rows ne $$r{receive}) { + # ld_debug(2,"Service down, receive=$$r{receive}"); + # $result=1; + # } + #} + if ($result == 1) { + # Should never get here + service_set($v, $r, "down"); + return 1; + } + service_set($v, $r, "up"); + $sth->finish; + $dbh->disconnect; + return 0; +} + + sub check_connect { my ($v, $r) = @_;