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