xref: /openbmc/linux/tools/testing/ktest/ktest.pl (revision 5c42fc5b975869e73bb8b6c279dd2da81eab5607)
12545eb61SSteven Rostedt#!/usr/bin/perl -w
22545eb61SSteven Rostedt
32545eb61SSteven Rostedtuse strict;
42545eb61SSteven Rostedtuse IPC::Open2;
52545eb61SSteven Rostedtuse Fcntl qw(F_GETFL F_SETFL O_NONBLOCK);
62545eb61SSteven Rostedtuse FileHandle;
72545eb61SSteven Rostedt
82545eb61SSteven Rostedt$#ARGV >= 0 || die "usage: autotest.pl config-file\n";
92545eb61SSteven Rostedt
102545eb61SSteven Rostedt$| = 1;
112545eb61SSteven Rostedt
122545eb61SSteven Rostedtmy %opt;
132545eb61SSteven Rostedt
142545eb61SSteven Rostedt#default opts
152545eb61SSteven Rostedt$opt{"NUM_BUILDS"}		= 5;
162545eb61SSteven Rostedt$opt{"DEFAULT_BUILD_TYPE"}	= "randconfig";
172545eb61SSteven Rostedt$opt{"MAKE_CMD"}		= "make";
182545eb61SSteven Rostedt$opt{"TIMEOUT"}			= 50;
192545eb61SSteven Rostedt$opt{"TMP_DIR"}			= "/tmp/autotest";
202545eb61SSteven Rostedt$opt{"SLEEP_TIME"}		= 60;	# sleep time between tests
21*5c42fc5bSSteven Rostedt$opt{"BUILD_NOCLEAN"}		= 0;
22*5c42fc5bSSteven Rostedt$opt{"POWEROFF_ON_ERROR"}	= 0;
23*5c42fc5bSSteven Rostedt$opt{"POWEROFF_ON_SUCCESS"}	= 0;
242545eb61SSteven Rostedt
252545eb61SSteven Rostedtmy $version;
262545eb61SSteven Rostedtmy $install_mods;
272545eb61SSteven Rostedtmy $grub_number;
282545eb61SSteven Rostedtmy $target;
292545eb61SSteven Rostedtmy $make;
30*5c42fc5bSSteven Rostedtmy $noclean;
312545eb61SSteven Rostedt
322545eb61SSteven Rostedtsub read_config {
332545eb61SSteven Rostedt    my ($config) = @_;
342545eb61SSteven Rostedt
352545eb61SSteven Rostedt    open(IN, $config) || die "can't read file $config";
362545eb61SSteven Rostedt
372545eb61SSteven Rostedt    while (<IN>) {
382545eb61SSteven Rostedt
392545eb61SSteven Rostedt	# ignore blank lines and comments
402545eb61SSteven Rostedt	next if (/^\s*$/ || /\s*\#/);
412545eb61SSteven Rostedt
422545eb61SSteven Rostedt	if (/^\s*(\S+)\s*=\s*(.*?)\s*$/) {
432545eb61SSteven Rostedt	    my $lvalue = $1;
442545eb61SSteven Rostedt	    my $rvalue = $2;
452545eb61SSteven Rostedt
462545eb61SSteven Rostedt	    $opt{$lvalue} = $rvalue;
472545eb61SSteven Rostedt	}
482545eb61SSteven Rostedt    }
492545eb61SSteven Rostedt
502545eb61SSteven Rostedt    close(IN);
512545eb61SSteven Rostedt}
522545eb61SSteven Rostedt
532545eb61SSteven Rostedtsub doprint {
542545eb61SSteven Rostedt    print @_;
552545eb61SSteven Rostedt
562545eb61SSteven Rostedt    if (defined($opt{"LOG_FILE"})) {
572545eb61SSteven Rostedt	open(OUT, ">> $opt{LOG_FILE}") or die "Can't write to $opt{LOG_FILE}";
582545eb61SSteven Rostedt	print OUT @_;
592545eb61SSteven Rostedt	close(OUT);
602545eb61SSteven Rostedt    }
612545eb61SSteven Rostedt}
622545eb61SSteven Rostedt
63*5c42fc5bSSteven Rostedtsub dodie {
64*5c42fc5bSSteven Rostedt    doprint "CRITICAL FAILURE... ", @_;
65*5c42fc5bSSteven Rostedt
66*5c42fc5bSSteven Rostedt    if ($opt{"POWEROFF_ON_ERROR"} && defined($opt{"POWER_OFF"})) {
67*5c42fc5bSSteven Rostedt	doprint "POWERING OFF\n";
68*5c42fc5bSSteven Rostedt	`$opt{"POWER_OFF"}`;
69*5c42fc5bSSteven Rostedt    }
70*5c42fc5bSSteven Rostedt    die @_;
71*5c42fc5bSSteven Rostedt}
72*5c42fc5bSSteven Rostedt
732545eb61SSteven Rostedtsub run_command {
742545eb61SSteven Rostedt    my ($command) = @_;
752545eb61SSteven Rostedt    my $redirect = "";
762545eb61SSteven Rostedt
772545eb61SSteven Rostedt    if (defined($opt{"LOG_FILE"})) {
782545eb61SSteven Rostedt	$redirect = " >> $opt{LOG_FILE} 2>&1";
792545eb61SSteven Rostedt    }
802545eb61SSteven Rostedt
812545eb61SSteven Rostedt    doprint "$command ... ";
822545eb61SSteven Rostedt    `$command $redirect`;
832545eb61SSteven Rostedt
842545eb61SSteven Rostedt    my $failed = $?;
852545eb61SSteven Rostedt
862545eb61SSteven Rostedt    if ($failed) {
872545eb61SSteven Rostedt	doprint "FAILED!\n";
882545eb61SSteven Rostedt    } else {
892545eb61SSteven Rostedt	doprint "SUCCESS\n";
902545eb61SSteven Rostedt    }
912545eb61SSteven Rostedt
922545eb61SSteven Rostedt    return $failed;
932545eb61SSteven Rostedt}
942545eb61SSteven Rostedt
952545eb61SSteven Rostedtmy $timeout = $opt{"TIMEOUT"};
962545eb61SSteven Rostedt
972545eb61SSteven Rostedtsub wait_for_input
982545eb61SSteven Rostedt{
992545eb61SSteven Rostedt    my ($fp, $time) = @_;
1002545eb61SSteven Rostedt    my $rin;
1012545eb61SSteven Rostedt    my $ready;
1022545eb61SSteven Rostedt    my $line;
1032545eb61SSteven Rostedt    my $ch;
1042545eb61SSteven Rostedt
1052545eb61SSteven Rostedt    if (!defined($time)) {
1062545eb61SSteven Rostedt	$time = $timeout;
1072545eb61SSteven Rostedt    }
1082545eb61SSteven Rostedt
1092545eb61SSteven Rostedt    $rin = '';
1102545eb61SSteven Rostedt    vec($rin, fileno($fp), 1) = 1;
1112545eb61SSteven Rostedt    $ready = select($rin, undef, undef, $time);
1122545eb61SSteven Rostedt
1132545eb61SSteven Rostedt    $line = "";
1142545eb61SSteven Rostedt
1152545eb61SSteven Rostedt    # try to read one char at a time
1162545eb61SSteven Rostedt    while (sysread $fp, $ch, 1) {
1172545eb61SSteven Rostedt	$line .= $ch;
1182545eb61SSteven Rostedt	last if ($ch eq "\n");
1192545eb61SSteven Rostedt    }
1202545eb61SSteven Rostedt
1212545eb61SSteven Rostedt    if (!length($line)) {
1222545eb61SSteven Rostedt	return undef;
1232545eb61SSteven Rostedt    }
1242545eb61SSteven Rostedt
1252545eb61SSteven Rostedt    return $line;
1262545eb61SSteven Rostedt}
1272545eb61SSteven Rostedt
1282545eb61SSteven Rostedtsub reboot {
1292545eb61SSteven Rostedt    run_command "ssh $target '(echo \"savedefault --default=$grub_number --once\" | grub --batch; reboot)'";
1302545eb61SSteven Rostedt}
1312545eb61SSteven Rostedt
1322545eb61SSteven Rostedtsub monitor {
1332545eb61SSteven Rostedt    my $flags;
1342545eb61SSteven Rostedt    my $booted = 0;
1352545eb61SSteven Rostedt    my $bug = 0;
1362545eb61SSteven Rostedt    my $pid;
1372545eb61SSteven Rostedt    my $doopen2 = 0;
138*5c42fc5bSSteven Rostedt    my $skip_call_trace = 0;
1392545eb61SSteven Rostedt
1402545eb61SSteven Rostedt    if ($doopen2) {
1412545eb61SSteven Rostedt	$pid = open2(\*IN, \*OUT, $opt{CONSOLE});
1422545eb61SSteven Rostedt	if ($pid < 0) {
143*5c42fc5bSSteven Rostedt	    dodie "Failed to connect to the console";
1442545eb61SSteven Rostedt	}
1452545eb61SSteven Rostedt    } else {
1462545eb61SSteven Rostedt	$pid = open(IN, "$opt{CONSOLE} |");
1472545eb61SSteven Rostedt    }
1482545eb61SSteven Rostedt
1492545eb61SSteven Rostedt    $flags = fcntl(IN, F_GETFL, 0) or
150*5c42fc5bSSteven Rostedt	dodie "Can't get flags for the socket: $!\n";
1512545eb61SSteven Rostedt
1522545eb61SSteven Rostedt    $flags = fcntl(IN, F_SETFL, $flags | O_NONBLOCK) or
153*5c42fc5bSSteven Rostedt	dodie "Can't set flags for the socket: $!\n";
1542545eb61SSteven Rostedt
1552545eb61SSteven Rostedt    my $line;
1562545eb61SSteven Rostedt    my $full_line = "";
1572545eb61SSteven Rostedt
1582545eb61SSteven Rostedt    doprint "Wait for monitor to settle down.\n";
1592545eb61SSteven Rostedt    # read the monitor and wait for the system to calm down
1602545eb61SSteven Rostedt    do {
1612545eb61SSteven Rostedt	$line = wait_for_input(\*IN, 5);
1622545eb61SSteven Rostedt    } while (defined($line));
1632545eb61SSteven Rostedt
1642545eb61SSteven Rostedt    reboot;
1652545eb61SSteven Rostedt
1662545eb61SSteven Rostedt    for (;;) {
1672545eb61SSteven Rostedt
1682545eb61SSteven Rostedt	$line = wait_for_input(\*IN);
1692545eb61SSteven Rostedt
1702545eb61SSteven Rostedt	last if (!defined($line));
1712545eb61SSteven Rostedt
1722545eb61SSteven Rostedt	doprint $line;
1732545eb61SSteven Rostedt
1742545eb61SSteven Rostedt	# we are not guaranteed to get a full line
1752545eb61SSteven Rostedt	$full_line .= $line;
1762545eb61SSteven Rostedt
1772545eb61SSteven Rostedt	if ($full_line =~ /login:/) {
1782545eb61SSteven Rostedt	    $booted = 1;
1792545eb61SSteven Rostedt	}
1802545eb61SSteven Rostedt
181*5c42fc5bSSteven Rostedt	if ($full_line =~ /\[ backtrace testing \]/) {
182*5c42fc5bSSteven Rostedt	    $skip_call_trace = 1;
183*5c42fc5bSSteven Rostedt	}
184*5c42fc5bSSteven Rostedt
1852545eb61SSteven Rostedt	if ($full_line =~ /call trace:/i) {
186*5c42fc5bSSteven Rostedt	    $bug = 1 if (!$skip_call_trace);
187*5c42fc5bSSteven Rostedt	}
188*5c42fc5bSSteven Rostedt
189*5c42fc5bSSteven Rostedt	if ($full_line =~ /\[ end of backtrace testing \]/) {
190*5c42fc5bSSteven Rostedt	    $skip_call_trace = 0;
191*5c42fc5bSSteven Rostedt	}
192*5c42fc5bSSteven Rostedt
193*5c42fc5bSSteven Rostedt	if ($full_line =~ /Kernel panic -/) {
1942545eb61SSteven Rostedt	    $bug = 1;
1952545eb61SSteven Rostedt	}
1962545eb61SSteven Rostedt
1972545eb61SSteven Rostedt	if ($line =~ /\n/) {
1982545eb61SSteven Rostedt	    $full_line = "";
1992545eb61SSteven Rostedt	}
2002545eb61SSteven Rostedt    }
2012545eb61SSteven Rostedt
2022545eb61SSteven Rostedt    doprint "kill child process $pid\n";
2032545eb61SSteven Rostedt    kill 2, $pid;
2042545eb61SSteven Rostedt
2052545eb61SSteven Rostedt    print "closing!\n";
2062545eb61SSteven Rostedt    close(IN);
2072545eb61SSteven Rostedt
2082545eb61SSteven Rostedt    if (!$booted) {
209*5c42fc5bSSteven Rostedt	dodie "failed - never got a boot prompt.\n";
2102545eb61SSteven Rostedt    }
2112545eb61SSteven Rostedt
2122545eb61SSteven Rostedt    if ($bug) {
213*5c42fc5bSSteven Rostedt	dodie "failed - got a bug report\n";
2142545eb61SSteven Rostedt    }
2152545eb61SSteven Rostedt}
2162545eb61SSteven Rostedt
2172545eb61SSteven Rostedtsub install {
2182545eb61SSteven Rostedt
2192545eb61SSteven Rostedt    if (run_command "scp $opt{OUTPUT_DIR}/$opt{BUILD_TARGET} $target:$opt{TARGET_IMAGE}") {
220*5c42fc5bSSteven Rostedt	dodie "failed to copy image";
2212545eb61SSteven Rostedt    }
2222545eb61SSteven Rostedt
2232545eb61SSteven Rostedt    if ($install_mods) {
2242545eb61SSteven Rostedt	my $modlib = "/lib/modules/$version";
225*5c42fc5bSSteven Rostedt	my $modtar = "autotest-mods.tar.bz2";
2262545eb61SSteven Rostedt
2272545eb61SSteven Rostedt	if (run_command "ssh $target rm -rf $modlib") {
228*5c42fc5bSSteven Rostedt	    dodie "failed to remove old mods: $modlib";
2292545eb61SSteven Rostedt	}
2302545eb61SSteven Rostedt
231*5c42fc5bSSteven Rostedt	# would be nice if scp -r did not follow symbolic links
232*5c42fc5bSSteven Rostedt	if (run_command "cd $opt{TMP_DIR}; tar -cjf $modtar lib/modules/$version") {
233*5c42fc5bSSteven Rostedt	    dodie "making tarball";
2342545eb61SSteven Rostedt	}
235*5c42fc5bSSteven Rostedt
236*5c42fc5bSSteven Rostedt	if (run_command "scp $opt{TMP_DIR}/$modtar $target:/tmp") {
237*5c42fc5bSSteven Rostedt	    dodie "failed to copy modules";
238*5c42fc5bSSteven Rostedt	}
239*5c42fc5bSSteven Rostedt
240*5c42fc5bSSteven Rostedt	unlink "$opt{TMP_DIR}/$modtar";
241*5c42fc5bSSteven Rostedt
242*5c42fc5bSSteven Rostedt	if (run_command "ssh $target '(cd / && tar xf /tmp/$modtar)'") {
243*5c42fc5bSSteven Rostedt	    dodie "failed to tar modules";
244*5c42fc5bSSteven Rostedt	}
245*5c42fc5bSSteven Rostedt
246*5c42fc5bSSteven Rostedt	run_command "ssh $target rm -f /tmp/$modtar";
2472545eb61SSteven Rostedt    }
2482545eb61SSteven Rostedt
2492545eb61SSteven Rostedt}
2502545eb61SSteven Rostedt
2512545eb61SSteven Rostedtsub build {
2522545eb61SSteven Rostedt    my ($type) = @_;
253*5c42fc5bSSteven Rostedt    my $defconfig = "";
254*5c42fc5bSSteven Rostedt    my $append = "";
2552545eb61SSteven Rostedt
256*5c42fc5bSSteven Rostedt    # old config can ask questions
257*5c42fc5bSSteven Rostedt    if ($type eq "oldconfig") {
258*5c42fc5bSSteven Rostedt	$append = "yes ''|";
259*5c42fc5bSSteven Rostedt	if (run_command "mv $opt{OUTPUT_DIR}/.config $opt{OUTPUT_DIR}/config_temp") {
260*5c42fc5bSSteven Rostedt	    dodie "moving .config";
261*5c42fc5bSSteven Rostedt	}
262*5c42fc5bSSteven Rostedt
263*5c42fc5bSSteven Rostedt	if (!$noclean && run_command "$make mrproper") {
264*5c42fc5bSSteven Rostedt	    dodie "make mrproper";
265*5c42fc5bSSteven Rostedt	}
266*5c42fc5bSSteven Rostedt
267*5c42fc5bSSteven Rostedt	if (run_command "mv $opt{OUTPUT_DIR}/config_temp $opt{OUTPUT_DIR}/.config") {
268*5c42fc5bSSteven Rostedt	    dodie "moving config_temp";
269*5c42fc5bSSteven Rostedt	}
270*5c42fc5bSSteven Rostedt
271*5c42fc5bSSteven Rostedt    } elsif (!$noclean) {
2722545eb61SSteven Rostedt	unlink "$opt{OUTPUT_DIR}/.config";
273*5c42fc5bSSteven Rostedt	if (run_command "$make mrproper") {
274*5c42fc5bSSteven Rostedt	    dodie "make mrproper";
275*5c42fc5bSSteven Rostedt	}
276*5c42fc5bSSteven Rostedt    }
2772545eb61SSteven Rostedt
2782545eb61SSteven Rostedt    # add something to distinguish this build
279*5c42fc5bSSteven Rostedt    open(OUT, "> $opt{OUTPUT_DIR}/localversion") or dodie("Can't make localversion file");
2802545eb61SSteven Rostedt    print OUT "$opt{LOCALVERSION}\n";
2812545eb61SSteven Rostedt    close(OUT);
2822545eb61SSteven Rostedt
283*5c42fc5bSSteven Rostedt    if (defined($opt{"MIN_CONFIG"})) {
284*5c42fc5bSSteven Rostedt	$defconfig = "KCONFIG_ALLCONFIG=$opt{MIN_CONFIG}";
2852545eb61SSteven Rostedt    }
2862545eb61SSteven Rostedt
287*5c42fc5bSSteven Rostedt    if (run_command "$defconfig $append $make $type") {
288*5c42fc5bSSteven Rostedt	dodie "failed make config";
2892545eb61SSteven Rostedt    }
2902545eb61SSteven Rostedt
2912545eb61SSteven Rostedt    if (run_command "$make $opt{BUILD_OPTIONS}") {
292*5c42fc5bSSteven Rostedt	dodie "failed build";
2932545eb61SSteven Rostedt    }
2942545eb61SSteven Rostedt}
2952545eb61SSteven Rostedt
2962545eb61SSteven Rostedtread_config $ARGV[0];
2972545eb61SSteven Rostedt
2982545eb61SSteven Rostedt# mandatory configs
2992545eb61SSteven Rostedtdie "MACHINE not defined\n"		if (!defined($opt{"MACHINE"}));
3002545eb61SSteven Rostedtdie "SSH_USER not defined\n"		if (!defined($opt{"SSH_USER"}));
3012545eb61SSteven Rostedtdie "BUILD_DIR not defined\n"		if (!defined($opt{"BUILD_DIR"}));
3022545eb61SSteven Rostedtdie "OUTPUT_DIR not defined\n"		if (!defined($opt{"OUTPUT_DIR"}));
3032545eb61SSteven Rostedtdie "BUILD_TARGET not defined\n"	if (!defined($opt{"BUILD_TARGET"}));
3042545eb61SSteven Rostedtdie "POWER_CYCLE not defined\n"		if (!defined($opt{"POWER_CYCLE"}));
3052545eb61SSteven Rostedtdie "CONSOLE not defined\n"		if (!defined($opt{"CONSOLE"}));
3062545eb61SSteven Rostedtdie "LOCALVERSION not defined\n"	if (!defined($opt{"LOCALVERSION"}));
3072545eb61SSteven Rostedtdie "GRUB_MENU not defined\n"		if (!defined($opt{"GRUB_MENU"}));
3082545eb61SSteven Rostedt
3092545eb61SSteven Rostedtchdir $opt{"BUILD_DIR"} || die "can't change directory to $opt{BUILD_DIR}";
3102545eb61SSteven Rostedt
3112545eb61SSteven Rostedt$target = "$opt{SSH_USER}\@$opt{MACHINE}";
3122545eb61SSteven Rostedt
3132545eb61SSteven Rostedtdoprint "\n\nSTARTING AUTOMATED TESTS\n";
3142545eb61SSteven Rostedt
3152545eb61SSteven Rostedtdoprint "Find grub menu ... ";
3162545eb61SSteven Rostedt$grub_number = -1;
3172545eb61SSteven Rostedtopen(IN, "ssh $target cat /boot/grub/menu.lst |")
3182545eb61SSteven Rostedt    or die "unable to get menu.lst";
3192545eb61SSteven Rostedtwhile (<IN>) {
3202545eb61SSteven Rostedt    if (/^\s*title\s+$opt{GRUB_MENU}\s*$/) {
3212545eb61SSteven Rostedt	$grub_number++;
3222545eb61SSteven Rostedt	last;
3232545eb61SSteven Rostedt    } elsif (/^\s*title\s/) {
3242545eb61SSteven Rostedt	$grub_number++;
3252545eb61SSteven Rostedt    }
3262545eb61SSteven Rostedt}
3272545eb61SSteven Rostedtclose(IN);
3282545eb61SSteven Rostedtdie "Could not find '$opt{GRUB_MENU}' in /boot/grub/menu on $opt{MACHINE}"
3292545eb61SSteven Rostedt    if ($grub_number < 0);
3302545eb61SSteven Rostedtdoprint "$grub_number\n";
3312545eb61SSteven Rostedt
3322545eb61SSteven Rostedt$make = "$opt{MAKE_CMD} O=$opt{OUTPUT_DIR}";
3332545eb61SSteven Rostedt
3342545eb61SSteven Rostedt# First we need to do is the builds
3352545eb61SSteven Rostedtfor (my $i = 1; $i <= $opt{"NUM_BUILDS"}; $i++) {
3362545eb61SSteven Rostedt    my $type = "BUILD_TYPE[$i]";
3372545eb61SSteven Rostedt
338*5c42fc5bSSteven Rostedt    if (defined($opt{"BUILD_NOCLEAN[$i]"}) &&
339*5c42fc5bSSteven Rostedt	$opt{"BUILD_NOCLEAN[$i]"} != 0) {
340*5c42fc5bSSteven Rostedt	$noclean = 1;
341*5c42fc5bSSteven Rostedt    } else {
342*5c42fc5bSSteven Rostedt	$noclean = $opt{"BUILD_NOCLEAN"};
343*5c42fc5bSSteven Rostedt    }
344*5c42fc5bSSteven Rostedt
3452545eb61SSteven Rostedt    if (!defined($opt{$type})) {
3462545eb61SSteven Rostedt	$opt{$type} = $opt{"DEFAULT_BUILD_TYPE"};
3472545eb61SSteven Rostedt    }
3482545eb61SSteven Rostedt
3492545eb61SSteven Rostedt    doprint "\n\n";
3502545eb61SSteven Rostedt    doprint "RUNNING TEST $i of $opt{NUM_BUILDS} with option $opt{$type}\n\n";
3512545eb61SSteven Rostedt
3522545eb61SSteven Rostedt    if ($opt{$type} ne "nobuild") {
353*5c42fc5bSSteven Rostedt	build $opt{$type};
3542545eb61SSteven Rostedt    }
3552545eb61SSteven Rostedt
3562545eb61SSteven Rostedt    # get the release name
3572545eb61SSteven Rostedt    doprint "$make kernelrelease ... ";
3582545eb61SSteven Rostedt    $version = `$make kernelrelease | tail -1`;
3592545eb61SSteven Rostedt    chomp($version);
3602545eb61SSteven Rostedt    doprint "$version\n";
3612545eb61SSteven Rostedt
3622545eb61SSteven Rostedt    # should we process modules?
3632545eb61SSteven Rostedt    $install_mods = 0;
364*5c42fc5bSSteven Rostedt    open(IN, "$opt{OUTPUT_DIR}/.config") or dodie("Can't read config file");
3652545eb61SSteven Rostedt    while (<IN>) {
3662545eb61SSteven Rostedt	if (/CONFIG_MODULES(=y)?/) {
3672545eb61SSteven Rostedt	    $install_mods = 1 if (defined($1));
3682545eb61SSteven Rostedt	    last;
3692545eb61SSteven Rostedt	}
3702545eb61SSteven Rostedt    }
3712545eb61SSteven Rostedt    close(IN);
3722545eb61SSteven Rostedt
3732545eb61SSteven Rostedt    if ($install_mods) {
3742545eb61SSteven Rostedt	if (run_command "$make INSTALL_MOD_PATH=$opt{TMP_DIR} modules_install") {
375*5c42fc5bSSteven Rostedt	    dodie "Failed to install modules";
3762545eb61SSteven Rostedt	}
3772545eb61SSteven Rostedt    } else {
3782545eb61SSteven Rostedt	doprint "No modules needed\n";
3792545eb61SSteven Rostedt    }
3802545eb61SSteven Rostedt
3812545eb61SSteven Rostedt    install;
3822545eb61SSteven Rostedt
3832545eb61SSteven Rostedt    monitor;
3842545eb61SSteven Rostedt
3852545eb61SSteven Rostedt    doprint "\n\n*******************************************\n";
3862545eb61SSteven Rostedt    doprint     "*******************************************\n";
3872545eb61SSteven Rostedt    doprint     "**            SUCCESS!!!!                **\n";
3882545eb61SSteven Rostedt    doprint     "*******************************************\n";
3892545eb61SSteven Rostedt    doprint     "*******************************************\n";
3902545eb61SSteven Rostedt
3912545eb61SSteven Rostedt    # try to reboot normally
3922545eb61SSteven Rostedt
3932545eb61SSteven Rostedt    if (run_command "ssh $target reboot") {
3942545eb61SSteven Rostedt	# nope? power cycle it.
3952545eb61SSteven Rostedt	run_command "$opt{POWER_CYCLE}";
3962545eb61SSteven Rostedt    }
3972545eb61SSteven Rostedt
3982545eb61SSteven Rostedt    sleep "$opt{SLEEP_TIME}";
3992545eb61SSteven Rostedt}
4002545eb61SSteven Rostedt
401*5c42fc5bSSteven Rostedtif ($opt{"POWEROFF_ON_SUCCESS"}) {
402*5c42fc5bSSteven Rostedt    if (run_command "ssh $target halt" && defined($opt{"POWER_OFF"})) {
403*5c42fc5bSSteven Rostedt	# nope? the zap it!
404*5c42fc5bSSteven Rostedt	run_command "$opt{POWER_OFF}";
405*5c42fc5bSSteven Rostedt    }
406*5c42fc5bSSteven Rostedt}
4072545eb61SSteven Rostedtexit 0;
408