2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2025-05-31 10:06:39 +00:00
chenglch 606ac46dd0 Use sleep subroutine instead of exec(sleep)
exec function call will take over all the process, lead to no chance to
continue the work within the script, this patch use sleep function call from
perl library instead.

Close-issue: #1801
2016-11-03 16:08:10 +08:00

163 lines
4.9 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);
use Time::HiRes qw(sleep);
use File::Path;
BEGIN {
$::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : -d '/opt/xcat' ? '/opt/xcat' : '/usr';
}
my $sleepint = int(rand(10)); #Stagger start to avoid overwhelming conserver/xCATd
my ($lockfd, $bmc);
my $username = 'USERID';
my $password = 'PASSW0RD';
my $node = $ARGV[0];
use constant CONSOLE_LOCK_FILE => "/tmp/xcat/consolelock";
use constant CONSOLE_LOCK_DIR => "/tmp/xcat";
sub acquire_lock {
umask 0077;
mkpath(CONSOLE_LOCK_DIR);
print "Acquiring startup lock...";
unless (sysopen($lockfd, CONSOLE_LOCK_FILE, O_WRONLY | O_CREAT)) {
print "Unable to open file ".CONSOLE_LOCK_FILE."\n";
sleep(15);
exit 1;
}
unless (flock($lockfd, LOCK_EX)) {
print "Unable to lock file ".CONSOLE_LOCK_FILE."\n";
close($lockfd);
sleep(15);
exit 1;
}
print "done\n";
unless (syswrite($lockfd, $$, length($$))) {
print "Unable to write file ".CONSOLE_LOCK_FILE."\n";
close($lockfd);
sleep(15);
exit 1;
}
}
sub release_lock {
flock($lockfd, LOCK_UN);
close($lockfd);
}
use lib "$::XCATROOT/lib/perl";
require xCAT::Client;
sub getans {
my $rsp = shift;
if ($rsp->{node}) {
$bmc = $rsp->{node}->[0]->{bmcaddr}->[0];
$username = $rsp->{node}->[0]->{bmcuser}->[0];
$password = $rsp->{node}->[0]->{bmcpass}->[0];
if (exists $rsp->{node}->[0]->{error}) {
my $error = $rsp->{node}->[0]->{error}->[0];
print "$error\n";
}
}
}
my $cmdref = {
command => ["getipmicons"],
arg => ["text"],
noderange => [ $ARGV[0] ]
};
acquire_lock();
# avoid of congestion
sleep(0.1);
release_lock();
xCAT::Client::submit_request($cmdref, \&getans);
until (($username or $password) and $bmc) {
#Let other clients have a go
$sleepint = 10 + int(rand(20));
print "Console not ready, retrying in $sleepint seconds (Ctrl-e,c,o to skip delay) \n";
sleep ($sleepint);
acquire_lock();
sleep(0.1);
release_lock();
xCAT::Client::submit_request($cmdref, \&getans);
}
my ($user, $pass);
if ($username) {
$user = "-U '$username'";
} else {
$user = '';
}
if ($password) {
$pass = "-P '$password'";
} else {
$pass = '';
}
#require xCAT::Table;
#require xCAT::Utils;
#my $dba;
#my $ipmitab = xCAT::Table->new('ipmi');
#unless ($ipmitab) { die "Unable to open IPMI table"; }
#my $passtab = xCAT::Table->new('passwd');
#if ($passtab) {
# ($dba) = $passtab->getAttribs({key=>'ipmi'},qw(username password));
# if ($dba) {
# if ($dba->{username}) { $username = $dba->{username}; }
# if ($dba->{password}) { $password = $dba->{password}; }
# }
#}
#$dba = $ipmitab->getNodeAttribs($ARGV[0],[qw(bmc username password)]);
#if ($dba) {
# if ($dba->{bmc}) { $bmc = $dba->{bmc}; }
# if ($dba->{username}) { $username = $dba->{username}; }
# if ($dba->{password}) { $password = $dba->{password}; }
#}
#xCAT::Utils::close_all_dbhs;
#my $isintel = system "ipmitool -I lanplus -U $username -P $password -H $bmc chassis status > /dev/null 2>&1";
my $isintel = 0;
my $sleepint;
my $rc;
my $ipmitool = "ipmitool";
if (-x "$XCATROOT/bin/ipmitool-xcat") {
$ipmitool = "$XCATROOT/bin/ipmitool-xcat";
}
my @mcinfo = `$ipmitool -I lanplus $user $pass -H $bmc mc info`; #| grep 'Manufacturer ID : 343' > /dev/null 2>&1";
$rc = $?;
if ($rc) { #some shoddy vendors ignore the IPMI 2.0 requirement to support IPMI 1.5 formats for BMC capability determination, attempt IPMI 2.0 even without the ability to confirm IPMI 2.0 support. Though SOL was not baked in prior IPMI 2.0, this script supports pre-2.0 'ISOL' on older devices, hence why we are checking for 1.5/2.0 before proceeding normally
@mcinfo = `$ipmitool -I lan $user $pass -H $bmc mc info`;
$rc = $?;
}
while ($rc != 0) {
$sleepint = 10 + int(rand(20));
print "Failure to reach IPMI device, retrying in $sleepint seconds (Hit Ctrl-E,c,o to skip)\n";
sleep ($sleepint);
@mcinfo = `$ipmitool -I lanplus $user $pass -H $bmc mc info`; #| grep 'Manufacturer ID : 343' > /dev/null 2>&1";
$rc = $?;
if ($rc) { #repeat workaround for shoddy vendors
@mcinfo = `$ipmitool -I lan $user $pass -H $bmc mc info`;
$rc = $?;
}
}
my $solcom = "sol";
my $iface = "lanplus";
if (grep /IPMI Version : 1.5/, @mcinfo) {
$solcom = "isol";
$iface = "lan";
} elsif (grep /Manufacturer ID : 343/, @mcinfo) {
$isintel = 1;
}
my $inteloption = "";
if ($isintel) {
$inteloption = " -o intelplus";
}
if ($iface eq "lanplus") {
system "$ipmitool -I lanplus $inteloption $user $pass -H $bmc $solcom deactivate"; #Stop any active session
}
exec "$ipmitool -I $iface $inteloption $user $pass -H $bmc $solcom activate";