mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-10-31 03:12:30 +00:00 
			
		
		
		
	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.
		
			
				
	
	
		
			83 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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.
 | |
| 
 |