xref: /minix3/external/bsd/bind/dist/bin/tests/virtual-time/start.pl (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
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