#!/usr/bin/env perl # IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html use Fcntl qw(:DEFAULT :flock); sub get_lock { unless (flock(LOCKHANDLE,LOCK_EX|LOCK_NB)) { $| = 1; print "Acquiring startup lock..."; flock(LOCKHANDLE,LOCK_EX) or die "Fatal error securing startup lock"; print "done\n"; } truncate(LOCKHANDLE,0); print LOCKHANDLE $$."\n"; } sub release_lock { truncate(LOCKHANDLE,0); flock(LOCKHANDLE,LOCK_UN); } BEGIN { use Time::HiRes qw(sleep); use File::Path; use Fcntl qw(:DEFAULT :flock); $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat'; umask 0077; mkpath("/tmp/xcat/"); unless (sysopen(LOCKHANDLE,"/tmp/xcat/consolelock",O_WRONLY | O_CREAT)) { sleep 15; print "Unable to open lock file"; exit 0; } get_lock(); #my $sleepint=int(rand(10)); #print "Opening console in ".(2+(0.5*$sleepint))." seconds...\n"; #sleep $sleepint; } #BEGIN #{ # use Time::HiRes qw(sleep); # $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat'; # my $sleepint=int(rand(10)); # print "Opening console in ".(0.5*$sleepint)." seconds...\n"; # sleep (0.5*$sleepint); #} my $sleepint; use lib "$::XCATROOT/lib/perl"; $ENV{HOME}='/root/'; require xCAT::Client; require File::Basename; import File::Basename; my $scriptname = $0; my $cmdref={ command=>"getxencons", arg=>"text", noderange=>$ARGV[0] }; use Data::Dumper; my $dsthost; my $dstty; my $speed; sub getans { my $rsp = shift; if ($rsp->{node}) { $dsthost = $rsp->{node}->[0]->{sshhost}->[0]; $dstty = $rsp->{node}->[0]->{psuedotty}->[0]; $speed = $rsp->{node}->[0]->{baudrate}->[0]; } } xCAT::Client::submit_request($cmdref,\&getans); until ($dsthost and $speed and $dstty) { release_lock(); $sleepint=int(rand(30))+60; print "Console not ready, retrying in $sleepint seconds (Ctrl-e,c,o to skip delay)\n"; sleep $sleepint; get_lock(); xCAT::Client::submit_request($cmdref,\&getans); } release_lock(); exec "ssh -t $dsthost screen -U -a -O -e ^]a -d -R -S serial-".$ARGV[0]."-cons -A $dstty $speed"; #my $pathtochild= dirname($scriptname). "/"; #exec $pathtochild."blade.expect $mm $slot $username $password";