1*00b67f09SDavid van Moolenbroek#!/usr/bin/perl -w 2*00b67f09SDavid van Moolenbroek# 3*00b67f09SDavid van Moolenbroek# Copyright (C) 2010, 2012 Internet Systems Consortium, Inc. ("ISC") 4*00b67f09SDavid van Moolenbroek# 5*00b67f09SDavid van Moolenbroek# Permission to use, copy, modify, and/or distribute this software for any 6*00b67f09SDavid van Moolenbroek# purpose with or without fee is hereby granted, provided that the above 7*00b67f09SDavid van Moolenbroek# copyright notice and this permission notice appear in all copies. 8*00b67f09SDavid van Moolenbroek# 9*00b67f09SDavid van Moolenbroek# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 10*00b67f09SDavid van Moolenbroek# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 11*00b67f09SDavid van Moolenbroek# AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 12*00b67f09SDavid van Moolenbroek# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 13*00b67f09SDavid van Moolenbroek# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 14*00b67f09SDavid van Moolenbroek# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 15*00b67f09SDavid van Moolenbroek# PERFORMANCE OF THIS SOFTWARE. 16*00b67f09SDavid van Moolenbroek 17*00b67f09SDavid van Moolenbroek# Id: start.pl,v 1.2 2010/06/17 05:38:05 marka Exp 18*00b67f09SDavid van Moolenbroek 19*00b67f09SDavid van Moolenbroek# Framework for starting test servers. 20*00b67f09SDavid van Moolenbroek# Based on the type of server specified, check for port availability, remove 21*00b67f09SDavid van Moolenbroek# temporary files, start the server, and verify that the server is running. 22*00b67f09SDavid van Moolenbroek# If a server is specified, start it. Otherwise, start all servers for test. 23*00b67f09SDavid van Moolenbroek 24*00b67f09SDavid van Moolenbroekuse strict; 25*00b67f09SDavid van Moolenbroekuse Cwd 'abs_path'; 26*00b67f09SDavid van Moolenbroekuse Getopt::Long; 27*00b67f09SDavid van Moolenbroek 28*00b67f09SDavid van Moolenbroek# Option handling 29*00b67f09SDavid van Moolenbroek# --noclean test [server [options]] 30*00b67f09SDavid van Moolenbroek# 31*00b67f09SDavid van Moolenbroek# --noclean - Do not cleanup files in server directory 32*00b67f09SDavid van Moolenbroek# test - name of the test directory 33*00b67f09SDavid van Moolenbroek# server - name of the server directory 34*00b67f09SDavid van Moolenbroek# options - alternate options for the server 35*00b67f09SDavid van Moolenbroek 36*00b67f09SDavid van Moolenbroekmy $usage = "usage: $0 [--noclean] test-directory [server-directory [server-options]]"; 37*00b67f09SDavid van Moolenbroekmy $noclean; 38*00b67f09SDavid van MoolenbroekGetOptions('noclean' => \$noclean); 39*00b67f09SDavid van Moolenbroekmy $test = $ARGV[0]; 40*00b67f09SDavid van Moolenbroekmy $server = $ARGV[1]; 41*00b67f09SDavid van Moolenbroekmy $options = $ARGV[2]; 42*00b67f09SDavid van Moolenbroek 43*00b67f09SDavid van Moolenbroekif (!$test) { 44*00b67f09SDavid van Moolenbroek print "$usage\n"; 45*00b67f09SDavid van Moolenbroek} 46*00b67f09SDavid van Moolenbroekif (!-d $test) { 47*00b67f09SDavid van Moolenbroek print "No test directory: \"$test\"\n"; 48*00b67f09SDavid van Moolenbroek} 49*00b67f09SDavid van Moolenbroekif ($server && !-d "$test/$server") { 50*00b67f09SDavid van Moolenbroek print "No server directory: \"$test/$server\"\n"; 51*00b67f09SDavid van Moolenbroek} 52*00b67f09SDavid van Moolenbroek 53*00b67f09SDavid van Moolenbroek# Global variables 54*00b67f09SDavid van Moolenbroekmy $topdir = abs_path("$test/.."); 55*00b67f09SDavid van Moolenbroekmy $testdir = abs_path("$test"); 56*00b67f09SDavid van Moolenbroekmy $NAMED = $ENV{'NAMED'}; 57*00b67f09SDavid van Moolenbroekmy $DIG = $ENV{'DIG'}; 58*00b67f09SDavid van Moolenbroekmy $PERL = $ENV{'PERL'}; 59*00b67f09SDavid van Moolenbroek 60*00b67f09SDavid van Moolenbroek# Start the server(s) 61*00b67f09SDavid van Moolenbroek 62*00b67f09SDavid van Moolenbroekif ($server) { 63*00b67f09SDavid van Moolenbroek if ($server =~ /^ns/) { 64*00b67f09SDavid van Moolenbroek &check_ports($server); 65*00b67f09SDavid van Moolenbroek } 66*00b67f09SDavid van Moolenbroek &start_server($server, $options); 67*00b67f09SDavid van Moolenbroek if ($server =~ /^ns/) { 68*00b67f09SDavid van Moolenbroek &verify_server($server); 69*00b67f09SDavid van Moolenbroek } 70*00b67f09SDavid van Moolenbroek} else { 71*00b67f09SDavid van Moolenbroek # Determine which servers need to be started for this test. 72*00b67f09SDavid van Moolenbroek opendir DIR, $testdir; 73*00b67f09SDavid van Moolenbroek my @files = sort readdir DIR; 74*00b67f09SDavid van Moolenbroek closedir DIR; 75*00b67f09SDavid van Moolenbroek 76*00b67f09SDavid van Moolenbroek my @ns = grep /^ns[0-9]*$/, @files; 77*00b67f09SDavid van Moolenbroek 78*00b67f09SDavid van Moolenbroek # Start the servers we found. 79*00b67f09SDavid van Moolenbroek &check_ports(); 80*00b67f09SDavid van Moolenbroek foreach (@ns) { 81*00b67f09SDavid van Moolenbroek &start_server($_); 82*00b67f09SDavid van Moolenbroek } 83*00b67f09SDavid van Moolenbroek foreach (@ns) { 84*00b67f09SDavid van Moolenbroek &verify_server($_); 85*00b67f09SDavid van Moolenbroek } 86*00b67f09SDavid van Moolenbroek} 87*00b67f09SDavid van Moolenbroek 88*00b67f09SDavid van Moolenbroek# Subroutines 89*00b67f09SDavid van Moolenbroek 90*00b67f09SDavid van Moolenbroeksub check_ports { 91*00b67f09SDavid van Moolenbroek my $server = shift; 92*00b67f09SDavid van Moolenbroek my $options = ""; 93*00b67f09SDavid van Moolenbroek 94*00b67f09SDavid van Moolenbroek if ($server && $server =~ /(\d+)$/) { 95*00b67f09SDavid van Moolenbroek $options = "-i $1"; 96*00b67f09SDavid van Moolenbroek } 97*00b67f09SDavid van Moolenbroek 98*00b67f09SDavid van Moolenbroek my $tries = 0; 99*00b67f09SDavid van Moolenbroek while (1) { 100*00b67f09SDavid van Moolenbroek my $return = system("$PERL $topdir/testsock.pl -p 5300 $options"); 101*00b67f09SDavid van Moolenbroek last if ($return == 0); 102*00b67f09SDavid van Moolenbroek if (++$tries > 4) { 103*00b67f09SDavid van Moolenbroek print "$0: could not bind to server addresses, still running?\n"; 104*00b67f09SDavid van Moolenbroek print "I:server sockets not available\n"; 105*00b67f09SDavid van Moolenbroek print "R:FAIL\n"; 106*00b67f09SDavid van Moolenbroek system("$PERL $topdir/stop.pl $testdir"); # Is this the correct behavior? 107*00b67f09SDavid van Moolenbroek exit 1; 108*00b67f09SDavid van Moolenbroek } 109*00b67f09SDavid van Moolenbroek print "I:Couldn't bind to socket (yet)\n"; 110*00b67f09SDavid van Moolenbroek sleep 2; 111*00b67f09SDavid van Moolenbroek } 112*00b67f09SDavid van Moolenbroek} 113*00b67f09SDavid van Moolenbroek 114*00b67f09SDavid van Moolenbroeksub start_server { 115*00b67f09SDavid van Moolenbroek my $server = shift; 116*00b67f09SDavid van Moolenbroek my $options = shift; 117*00b67f09SDavid van Moolenbroek 118*00b67f09SDavid van Moolenbroek my $cleanup_files; 119*00b67f09SDavid van Moolenbroek my $command; 120*00b67f09SDavid van Moolenbroek my $pid_file; 121*00b67f09SDavid van Moolenbroek 122*00b67f09SDavid van Moolenbroek if ($server =~ /^ns/) { 123*00b67f09SDavid van Moolenbroek $cleanup_files = "{*.jnl,*.bk,*.st,named.run}"; 124*00b67f09SDavid van Moolenbroek $command = "sh wrap.sh "; 125*00b67f09SDavid van Moolenbroek $command .= "$NAMED "; 126*00b67f09SDavid van Moolenbroek if ($options) { 127*00b67f09SDavid van Moolenbroek $command .= "$options"; 128*00b67f09SDavid van Moolenbroek } else { 129*00b67f09SDavid van Moolenbroek $command .= "-m record,size,mctx "; 130*00b67f09SDavid van Moolenbroek $command .= "-T clienttest "; 131*00b67f09SDavid van Moolenbroek $command .= "-c named.conf -d 99 -g"; 132*00b67f09SDavid van Moolenbroek } 133*00b67f09SDavid van Moolenbroek $command .= " >named.run 2>&1 &"; 134*00b67f09SDavid van Moolenbroek $pid_file = "named.pid"; 135*00b67f09SDavid van Moolenbroek } else { 136*00b67f09SDavid van Moolenbroek print "I:Unknown server type $server\n"; 137*00b67f09SDavid van Moolenbroek print "R:FAIL\n"; 138*00b67f09SDavid van Moolenbroek system "$PERL $topdir/stop.pl $testdir"; 139*00b67f09SDavid van Moolenbroek exit 1; 140*00b67f09SDavid van Moolenbroek } 141*00b67f09SDavid van Moolenbroek 142*00b67f09SDavid van Moolenbroek# print "I:starting server $server\n"; 143*00b67f09SDavid van Moolenbroek 144*00b67f09SDavid van Moolenbroek chdir "$testdir/$server"; 145*00b67f09SDavid van Moolenbroek 146*00b67f09SDavid van Moolenbroek unless ($noclean) { 147*00b67f09SDavid van Moolenbroek unlink glob $cleanup_files; 148*00b67f09SDavid van Moolenbroek } 149*00b67f09SDavid van Moolenbroek 150*00b67f09SDavid van Moolenbroek system "$command"; 151*00b67f09SDavid van Moolenbroek 152*00b67f09SDavid van Moolenbroek my $tries = 0; 153*00b67f09SDavid van Moolenbroek while (!-f $pid_file) { 154*00b67f09SDavid van Moolenbroek if (++$tries > 14) { 155*00b67f09SDavid van Moolenbroek print "I:Couldn't start server $server\n"; 156*00b67f09SDavid van Moolenbroek print "R:FAIL\n"; 157*00b67f09SDavid van Moolenbroek system "$PERL $topdir/stop.pl $testdir"; 158*00b67f09SDavid van Moolenbroek exit 1; 159*00b67f09SDavid van Moolenbroek } 160*00b67f09SDavid van Moolenbroek sleep 1; 161*00b67f09SDavid van Moolenbroek } 162*00b67f09SDavid van Moolenbroek} 163*00b67f09SDavid van Moolenbroek 164*00b67f09SDavid van Moolenbroeksub verify_server { 165*00b67f09SDavid van Moolenbroek my $server = shift; 166*00b67f09SDavid van Moolenbroek my $n = $server; 167*00b67f09SDavid van Moolenbroek $n =~ s/^ns//; 168*00b67f09SDavid van Moolenbroek 169*00b67f09SDavid van Moolenbroek my $tries = 0; 170*00b67f09SDavid van Moolenbroek while (1) { 171*00b67f09SDavid van Moolenbroek my $return = system("$DIG +tcp +noadd +nosea +nostat +noquest +nocomm +nocmd -p 5300 version.bind. chaos txt \@10.53.0.$n > dig.out"); 172*00b67f09SDavid van Moolenbroek last if ($return == 0); 173*00b67f09SDavid van Moolenbroek print `grep ";" dig.out`; 174*00b67f09SDavid van Moolenbroek if (++$tries >= 30) { 175*00b67f09SDavid van Moolenbroek print "I:no response from $server\n"; 176*00b67f09SDavid van Moolenbroek print "R:FAIL\n"; 177*00b67f09SDavid van Moolenbroek system("$PERL $topdir/stop.pl $testdir"); 178*00b67f09SDavid van Moolenbroek exit 1; 179*00b67f09SDavid van Moolenbroek } 180*00b67f09SDavid van Moolenbroek sleep 2; 181*00b67f09SDavid van Moolenbroek } 182*00b67f09SDavid van Moolenbroek unlink "dig.out"; 183*00b67f09SDavid van Moolenbroek} 184