git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@185 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
		
			
				
	
	
		
			88 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
#!/usr/bin/perl
 | 
						|
 | 
						|
# Display some aggregate information about each group, gathered from the db and its nodes
 | 
						|
 | 
						|
use strict;
 | 
						|
use Getopt::Std;
 | 
						|
 | 
						|
sub usage { print "Usage: grpattr [-h] [-v]\n";  exit (scalar(@_) ? $_[0] : 1); }
 | 
						|
 | 
						|
if (! getopts('hv') ) { usage(); }
 | 
						|
if ($::opt_h) { usage(0); }
 | 
						|
#if (scalar(@ARGV) < 1) { &usage; }
 | 
						|
#$::VERBOSE = $::opt_v;
 | 
						|
 | 
						|
# Get the status of each node and save in a hash
 | 
						|
my @ns = runcmd("nodestat '/.*'");
 | 
						|
my %nodestat;
 | 
						|
foreach my $line (@ns) {
 | 
						|
	my ($node, $stat) = split(/[:\s]+/, $line);
 | 
						|
	$nodestat{$node} = $stat;
 | 
						|
}
 | 
						|
if ($::opt_v) { foreach my $n (keys %nodestat) { print "$n: $nodestat{$n}\n"; } }
 | 
						|
 | 
						|
 | 
						|
# Get the list of nodes/groups and aggregate the status of the group using the status of each node
 | 
						|
#TODO: this must be changed for xcat 2.0
 | 
						|
my @nodelist = runcmd("egrep '^[A-Za-z]' $ENV{XCATROOT}/etc/nodelist.tab");
 | 
						|
verbose("Found ", scalar(@nodelist), " items in nodelist.tab\n");
 | 
						|
my %groups;
 | 
						|
foreach my $line (@nodelist) {
 | 
						|
	my ($node, $groupstr) = split(/\s+/, $line);
 | 
						|
	my @grouplist = split(/[,\s]+/, $groupstr);
 | 
						|
	foreach my $g (@grouplist) {
 | 
						|
		$groups{$g} = minstat($groups{$g}, $nodestat{$node});
 | 
						|
	}
 | 
						|
}
 | 
						|
foreach my $g (keys %groups) { print "$g: $groups{$g}\n"; }
 | 
						|
 | 
						|
exit;
 | 
						|
 | 
						|
# For 2 status strings from nodestat, return the "lowest".
 | 
						|
sub minstat {
 | 
						|
	my %statnum = ( 'unknown' => 0,
 | 
						|
					'noping' => 1,
 | 
						|
					'ping' => 2,
 | 
						|
					'snmp' => 3,
 | 
						|
					'sshd' => 4,
 | 
						|
					'pbs' => 5,
 | 
						|
					'ready ww' => 6
 | 
						|
					);
 | 
						|
	my %statstr = ( 0 => 'unknown',
 | 
						|
					1 => 'noping',
 | 
						|
					2 => 'ping',
 | 
						|
					3 => 'snmp',
 | 
						|
					4 => 'sshd',
 | 
						|
					5 => 'pbs',
 | 
						|
					6 => 'ready ww'
 | 
						|
					);
 | 
						|
	my ($s1, $s2) = @_;
 | 
						|
 | 
						|
	# if either value is empty, just return the other one
 | 
						|
	if (!length($s1)) { return $s2; }
 | 
						|
	if (!length($s2)) { return $s1; }
 | 
						|
 | 
						|
	my $n1 = defined($statnum{$s1}) ? $statnum{$s1} : 0;
 | 
						|
	my $n2 = defined($statnum{$s2}) ? $statnum{$s2} : 0;
 | 
						|
	if ($n1 < $n2) { return $statstr{$n1}; }
 | 
						|
	else { return $statstr{$n2}; }
 | 
						|
}
 | 
						|
 | 
						|
# Assign a numerical order number to each status string
 | 
						|
sub statnum {
 | 
						|
	my $s = shift @_;
 | 
						|
	if ($s eq 'noping') { return 1; }
 | 
						|
	elsif ($s eq 'ping') { return 2; }
 | 
						|
}
 | 
						|
 | 
						|
sub runcmd {
 | 
						|
	my $cmd = shift @_;
 | 
						|
	my @out = `$cmd`;
 | 
						|
	my $rc = $? >> 8;
 | 
						|
	if ($rc) { print join('',@out); return; }
 | 
						|
	chop(@out);
 | 
						|
	return @out;
 | 
						|
}
 | 
						|
 | 
						|
sub verbose { if ($::opt_v) { print @_; } }
 |