bd9247dd13
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@6359 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
136 lines
4.6 KiB
Perl
Executable File
136 lines
4.6 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 "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;
|
|
}
|
|
my $sleepint=int(rand(10)); #Stagger start to avoid overwhelming conserver/xCATd
|
|
$::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat';
|
|
use lib "$::XCATROOT/lib/perl";
|
|
require xCAT::Client;
|
|
my $username = 'USERID';
|
|
my $password = 'PASSW0RD';
|
|
my $node = $ARGV[0];
|
|
my $bmc;
|
|
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];
|
|
}
|
|
}
|
|
my $cmdref={
|
|
command=>"getipmicons",
|
|
arg=>"text",
|
|
noderange=>$ARGV[0]
|
|
};
|
|
xCAT::Client::submit_request($cmdref,\&getans);
|
|
until ($username and $password and $bmc) {
|
|
release_lock(); #Let other clients have a go
|
|
$sleepint=10+int(rand(10));
|
|
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();
|
|
#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 lan -U $username -P $password -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 lanplus -U $username -P $password -H $bmc mc info`;
|
|
$rc = $?;
|
|
}
|
|
@mcinfo=`$ipmitool -I lan -U $username -P $password -H $bmc mc info`;#| grep 'Manufacturer ID : 343' > /dev/null 2>&1";
|
|
}
|
|
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 lan -U $username -P $password -H $bmc mc info`;#| grep 'Manufacturer ID : 343' > /dev/null 2>&1";
|
|
$rc = $?;
|
|
if ($rc) { #repeat workaround for shoddy vendors
|
|
@mcinfo=`$ipmitool -I lanplus -U $username -P $password -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 -U $username -P $password -H $bmc $solcom deactivate"; #Stop any active session
|
|
}
|
|
|
|
exec "$ipmitool -I $iface $inteloption -U $username -P $password -H $bmc $solcom activate";
|
|
|
|
|