#!/usr/bin/env perl # # © Copyright 2009 Hewlett-Packard Development Company, L.P. # EPL license http://www.eclipse.org/legal/epl-v10.html # # Revision history: # August, 2009 blade adapted to generate hpblade # 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"; $ENV{HOME} = '/root/'; 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 $scriptname = $0; my $username = "admin"; 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]; } } my $cmdref = { command => "gethpbladecons", 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 $sleepint = 10 + int(rand(30)); #Stagger sleep to take it easy on AMM/hosting server exec "ssh -t $username" . "@" . "$mm vsp"; my $pathtochild = dirname($scriptname) . "/"; #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.