2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2025-05-30 01:26:38 +00:00
chenglch 2da3f5140d Move sleep retry from xcat to goconserver
If cons script is waiting, goconserver could not aware of
the status of the console connection. This patch check
the environment when running the script, if it is gocons
and retrying is needed, exit immediately.
2018-02-09 12:11:48 +08:00

82 lines
2.7 KiB
Perl
Executable File

#!/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 "Error trying to secure a 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';
}
my $sleepint = int(rand(10)); #Stagger start to avoid overwhelming conserver/xCATd
use lib "$::XCATROOT/lib/perl";
require xCAT::Client;
require xCAT::Utils;
require File::Basename;
umask 0077;
mkpath("/tmp/xcat/");
unless (sysopen(LOCKHANDLE, "/tmp/xcat/consolelock", O_WRONLY | O_CREAT)) {
xCAT::Utils::console_sleep(15, "Unable to open lock file");
exit 0;
}
get_lock();
my $username = "USERID";
my $passsword = "PASSW0RD";
my $mm;
my $slot;
sub getans {
my $rsp = shift;
if ($rsp->{node}) {
$mm = $rsp->{node}->[0]->{mm}->[0];
$username = $rsp->{node}->[0]->{username}->[0];
$slot = $rsp->{node}->[0]->{slot}->[0];
$slot =~ s/-.*//; #remove range info if multi-wide blade
}
}
my $cmdref = {
command => ["getbladecons"],
arg => ["text"],
noderange => [ $ARGV[0] ]
};
xCAT::Client::submit_request($cmdref, \&getans);
until ($mm and $username and $slot) {
release_lock(); #Let other clients have a go
$sleepint = 10 + int(rand(20)); #Stagger to minimize lock collisions, but no big deal when it does happen
xCAT::Utils::console_sleep($sleepint, "Console not ready, retrying in $sleepint seconds (Hit Ctrl-E,c,o to skip delay)\n");
get_lock();
xCAT::Client::submit_request($cmdref, \&getans);
}
release_lock(); #done with xcatd, can run with near impunity
my $solchkcmd = "ssh -t $username" . "@" . "$mm sol -T blade[$slot]";
my $solstatus = `$solchkcmd`;
while ($solstatus !~ /SOL Session: Ready/ and $solstatus !~ /SOL Session: Active/) {
$sleepint = 60 + int(rand(30)); #Stagger sleep to take it easy on AMM/hosting server
xCAT::Utils::console_sleep($sleepint, "SOL unavailable, retrying in $sleepint seconds (hit Ctrl-E,c,o to skip)\n");
$solstatus = `$solchkcmd`;
}
exec "ssh -t $username" . "@" . "$mm console -o -T blade[$slot]";
#SECURITY: In this case, the authentication is expected to be done using the script user's ssh keys. As such,
#this script does not receive any particularly sensitive data from the xCAT server.