start.pl revision 101e493844757c7d687c3bbc6c21b9be9655ba72
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer#!/usr/bin/perl -w
9a14f870ddc0108402d2daa7a7ff84b6e20f08b4Automatic Updater#
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer# Copyright (C) 2004-2008, 2010, 2011 Internet Systems Consortium, Inc. ("ISC")
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer# Copyright (C) 2001 Internet Software Consortium.
ec5347e2c775f027573ce5648b910361aa926c01Automatic Updater#
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer# Permission to use, copy, modify, and/or distribute this software for any
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer# purpose with or without fee is hereby granted, provided that the above
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer# copyright notice and this permission notice appear in all copies.
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews#
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews# AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer# PERFORMANCE OF THIS SOFTWARE.
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
9a14f870ddc0108402d2daa7a7ff84b6e20f08b4Automatic Updater# $Id: start.pl,v 1.23 2011/05/05 23:10:24 smann Exp $
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer# Framework for starting test servers.
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer# Based on the type of server specified, check for port availability, remove
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer# temporary files, start the server, and verify that the server is running.
9a14f870ddc0108402d2daa7a7ff84b6e20f08b4Automatic Updater# If a server is specified, start it. Otherwise, start all servers for test.
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayeruse strict;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayeruse Cwd 'abs_path';
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayeruse Getopt::Long;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer# Option handling
f42c0dcca86f2009c089e27ba513cb6fc9ee88baEvan Hunt# --noclean test [server [options]]
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer#
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer# --noclean - Do not cleanup files in server directory
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer# test - name of the test directory
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer# server - name of the server directory
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer# options - alternate options for the server
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer# NOTE: options must be specified with '-- "<option list>"',
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer# for instance: start.pl . ns1 -- "-c n.conf -d 43"
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayermy $usage = "usage: $0 [--noclean] [--restart] test-directory [server-directory [server-options]]";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayermy $noclean = '';
f42c0dcca86f2009c089e27ba513cb6fc9ee88baEvan Huntmy $restart = '';
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny MayerGetOptions('noclean' => \$noclean, 'restart' => \$restart);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayermy $test = $ARGV[0];
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayermy $server = $ARGV[1];
29747dfe5e073a299b3681e01f5c55540f8bfed7Mark Andrewsmy $options = $ARGV[2];
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayerif (!$test) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer print "$usage\n";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer}
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayerif (!-d $test) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer print "No test directory: \"$test\"\n";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer}
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayerif ($server && !-d "$test/$server") {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer print "No server directory: \"$test/$server\"\n";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer}
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer# Global variables
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayermy $topdir = abs_path("$test/..");
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayermy $testdir = abs_path("$test");
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayermy $NAMED = $ENV{'NAMED'};
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayermy $LWRESD = $ENV{'LWRESD'};
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayermy $DIG = $ENV{'DIG'};
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayermy $PERL = $ENV{'PERL'};
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
1016f2638f8a34a802ce41043d5369553ac14246Francis Dupont# Start the server(s)
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayerif ($server) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer if ($server =~ /^ns/) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer &check_ports($server);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer }
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer &start_server($server, $options);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer if ($server =~ /^ns/) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer &verify_server($server);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer }
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer} else {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer # Determine which servers need to be started for this test.
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer opendir DIR, $testdir;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer my @files = sort readdir DIR;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer closedir DIR;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer my @ns = grep /^ns[0-9]*$/, @files;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer my @lwresd = grep /^lwresd[0-9]*$/, @files;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer my @ans = grep /^ans[0-9]*$/, @files;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer # Start the servers we found.
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer &check_ports();
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer foreach (@ns, @lwresd, @ans) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer &start_server($_);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer }
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer foreach (@ns) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer &verify_server($_);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer }
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer}
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer# Subroutines
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayersub check_ports {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer my $server = shift;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer my $options = "";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer if ($server && $server =~ /(\d+)$/) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $options = "-i $1";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer }
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer my $tries = 0;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer while (1) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer my $return = system("$PERL $topdir/testsock.pl -p 5300 $options");
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer last if ($return == 0);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer if (++$tries > 4) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer print "$0: could not bind to server addresses, still running?\n";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer print "I:server sockets not available\n";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer print "R:FAIL\n";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer system("$PERL $topdir/stop.pl $testdir"); # Is this the correct behavior?
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer exit 1;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer }
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer print "I:Couldn't bind to socket (yet)\n";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer sleep 2;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer }
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer}
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayersub start_server {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer my $server = shift;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer my $options = shift;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer my $cleanup_files;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer my $command;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer my $pid_file;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
68c2ccc953059f389cefc0f8a5ce0f83be7458c9Danny Mayer if ($server =~ /^ns/) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $cleanup_files = "{*.jnl,*.bk,*.st,named.run}";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $command = "$NAMED ";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer if ($options) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $command .= "$options";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer } else {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $command .= "-m record,size,mctx ";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $command .= "-T clienttest ";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $command .= "-T nosoa "
68c2ccc953059f389cefc0f8a5ce0f83be7458c9Danny Mayer if (-e "$testdir/$server/named.nosoa");
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $command .= "-T noaa "
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer if (-e "$testdir/$server/named.noaa");
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $command .= "-c named.conf -d 99 -g";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer }
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer if ($restart) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $command .= " >>named.run 2>&1 &";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer } else {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $command .= " >named.run 2>&1 &";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer }
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $pid_file = "named.pid";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer } elsif ($server =~ /^lwresd/) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $cleanup_files = "{lwresd.run}";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $command = "$LWRESD ";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer if ($options) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $command .= "$options";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer } else {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $command .= "-m record,size,mctx ";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $command .= "-T clienttest ";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $command .= "-C resolv.conf -d 99 -g ";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $command .= "-i lwresd.pid -P 9210 -p 5300";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer }
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer if ($restart) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $command .= " >>lwresd.run 2>&1 &";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer } else {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $command .= " >lwresd.run 2>&1 &";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer }
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $pid_file = "lwresd.pid";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer } elsif ($server =~ /^ans/) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $cleanup_files = "{ans.run}";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer if (-e "$testdir/$server/ans.pl") {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $command = "$PERL ans.pl";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer } else {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $command = "$PERL $topdir/ans.pl 10.53.0.$'";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer }
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer if ($options) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $command .= "$options";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer } else {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $command .= "";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer }
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer if ($restart) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $command .= " >>ans.run 2>&1 &";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer } else {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $command .= " >ans.run 2>&1 &";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer }
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer $pid_file = "ans.pid";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer } else {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer print "I:Unknown server type $server\n";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer print "R:FAIL\n";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer system "$PERL $topdir/stop.pl $testdir";
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer exit 1;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer }
# print "I:starting server $server\n";
chdir "$testdir/$server";
unless ($noclean) {
unlink glob $cleanup_files;
}
# get the shell to report the pid of the server ($!)
$command .= "echo \$!";
# start the server
my $child = `$command`;
$child =~ s/\s+$//;
# wait up to 14 seconds for the server to start and to write the
# pid file otherwise kill this server and any others that have
# already been started
my $tries = 0;
while (!-s $pid_file) {
if (++$tries > 14) {
print "I:Couldn't start server $server (pid=$child)\n";
print "R:FAIL\n";
system "kill -9 $child" if ("$child" ne "");
system "$PERL $topdir/stop.pl $testdir";
exit 1;
}
sleep 1;
}
}
sub verify_server {
my $server = shift;
my $n = $server;
$n =~ s/^ns//;
my $tries = 0;
while (1) {
my $return = system("$DIG +tcp +noadd +nosea +nostat +noquest +nocomm +nocmd -p 5300 version.bind. chaos txt \@10.53.0.$n > dig.out");
last if ($return == 0);
if (++$tries >= 30) {
print `grep ";" dig.out > /dev/null`;
print "I:no response from $server\n";
print "R:FAIL\n";
system("$PERL $topdir/stop.pl $testdir");
exit 1;
}
sleep 2;
}
unlink "dig.out";
}