Added support for "rscan" command
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@148 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
		@@ -18,6 +18,7 @@ use IO::Handle;
 | 
			
		||||
sub handled_commands {
 | 
			
		||||
  return {
 | 
			
		||||
    findme => 'blade',
 | 
			
		||||
    rscan => 'nodehm:mgt',
 | 
			
		||||
    rpower => 'nodehm:power,mgt',
 | 
			
		||||
    rvitals => 'nodehm:vitals,mgt',
 | 
			
		||||
    rinv => 'nodehm:inv,mgt',
 | 
			
		||||
@@ -33,6 +34,7 @@ my %usage = (
 | 
			
		||||
    "reventlog" => "Usage: reventlog <noderange> [all|clear|<number of entries to retrieve>]",
 | 
			
		||||
    "rinv" => "Usage: rinv <noderange> [all|model|serial|vpd|mprom|deviceid|uuid]",
 | 
			
		||||
    "rbootseq" => "Usage: rbootseq <noderange> [hd0|hd1|hd2|hd3|net|iscsi|usbflash|floppy|none],...",
 | 
			
		||||
    "rscan" => "Usage: rscan <noderange> [-w][-x|-z]"
 | 
			
		||||
);
 | 
			
		||||
my %macmap; #Store responses from rinv for discovery
 | 
			
		||||
my $mmprimoid = '1.3.6.1.4.1.2.3.51.2.22.5.1.1.4';#mmPrimary
 | 
			
		||||
@@ -62,6 +64,12 @@ my $blower1stateoid = '.1.3.6.1.4.1.2.3.51.2.2.3.10';#blower1State
 | 
			
		||||
my $blower2stateoid = '.1.3.6.1.4.1.2.3.51.2.2.3.11';#blower2State
 | 
			
		||||
my $blower2speedoid = '.1.3.6.1.4.1.2.3.51.2.2.3.2';#blower2speed
 | 
			
		||||
 | 
			
		||||
my $mmoname = '1.3.6.1.4.1.2.3.51.2.22.4.3';#chassisName
 | 
			
		||||
my $mmotype = '1.3.6.1.4.1.2.3.51.2.2.21.1.1.1';#bladeCenterVpdMachineType
 | 
			
		||||
my $mmomodel = '1.3.6.1.4.1.2.3.51.2.2.21.1.1.2';#bladeCenterVpdMachineModel
 | 
			
		||||
my $mmoserial = '1.3.6.1.4.1.2.3.51.2.2.21.1.1.3';#bladeCenterSerialNumber
 | 
			
		||||
my $bladeoname = '1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.6';#bladeName
 | 
			
		||||
 | 
			
		||||
my @macoids = (
 | 
			
		||||
  '1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.2', #bladeMACAddress1Vpd
 | 
			
		||||
  '1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.3', #bladeMACAddress2Vpd
 | 
			
		||||
@@ -132,6 +140,14 @@ my %bootnumbers = (
 | 
			
		||||
  'usb' => 11
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
my @rscan_header = (
 | 
			
		||||
  ["type",          "%-8s" ],
 | 
			
		||||
  ["name",          "" ],
 | 
			
		||||
  ["id",            "%-8s" ],
 | 
			
		||||
  ["type-model",    "%-12s" ],
 | 
			
		||||
  ["serial-number", "%-15s" ],
 | 
			
		||||
  ["address",       "%s\n" ]);
 | 
			
		||||
 | 
			
		||||
my $session;
 | 
			
		||||
my $slot;
 | 
			
		||||
my $didchassis = 0;
 | 
			
		||||
@@ -351,9 +367,9 @@ sub vitals {
 | 
			
		||||
   my @vitems;
 | 
			
		||||
   foreach (@_) {
 | 
			
		||||
     if ($_ eq 'all') {
 | 
			
		||||
	push @vitems,qw(temp,wattage,voltage,fan,summary);
 | 
			
		||||
 push @vitems,qw(temp,wattage,voltage,fan,summary);
 | 
			
		||||
     } else {
 | 
			
		||||
	push @vitems,split( /,/,$_);
 | 
			
		||||
 push @vitems,split( /,/,$_);
 | 
			
		||||
     }
 | 
			
		||||
   }
 | 
			
		||||
   my $tmp;
 | 
			
		||||
@@ -390,22 +406,22 @@ sub vitals {
 | 
			
		||||
     push @output,"Fan Pack 4:  $tmp";
 | 
			
		||||
   }
 | 
			
		||||
   if (grep /volt/,@vitems) {
 | 
			
		||||
	for my $idx (15..40) {
 | 
			
		||||
	   $tmp=$session->get([".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.$idx.$slot"]);
 | 
			
		||||
 for my $idx (15..40) {
 | 
			
		||||
    $tmp=$session->get([".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.$idx.$slot"]);
 | 
			
		||||
           unless ($tmp =~ /Not Readable/) {
 | 
			
		||||
             $tmp =~ s/ = /:/;
 | 
			
		||||
             push @output,"$tmp";
 | 
			
		||||
           }
 | 
			
		||||
	}
 | 
			
		||||
 }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
   if (grep /temp/,@vitems) {
 | 
			
		||||
      $tmp=$session->get(["1.3.6.1.4.1.2.3.51.2.2.1.5.1.0"]);
 | 
			
		||||
      push (@output,"Ambient: $tmp");
 | 
			
		||||
      for my $idx (6..20) {
 | 
			
		||||
	if ($idx eq 11) {
 | 
			
		||||
		next;
 | 
			
		||||
	}
 | 
			
		||||
 if ($idx eq 11) {
 | 
			
		||||
  next;
 | 
			
		||||
 }
 | 
			
		||||
        $tmp=$session->get([".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.$idx.$slot"]);
 | 
			
		||||
        unless ($tmp =~ /Not Readable/) {
 | 
			
		||||
          $tmp =~ s/ = /:/;
 | 
			
		||||
@@ -420,8 +436,175 @@ sub vitals {
 | 
			
		||||
   }
 | 
			
		||||
   return(0,@output);
 | 
			
		||||
}
 | 
			
		||||
	
 | 
			
		||||
 
 | 
			
		||||
sub rscan {
 | 
			
		||||
 | 
			
		||||
    my $subcommand = shift;
 | 
			
		||||
    my @values;
 | 
			
		||||
    my $result;
 | 
			
		||||
    my %opt;
 | 
			
		||||
 | 
			
		||||
    @ARGV = $subcommand;
 | 
			
		||||
    use Getopt::Long;
 | 
			
		||||
    $Getopt::Long::ignorecase = 0;
 | 
			
		||||
    Getopt::Long::Configure( "bundling" );
 | 
			
		||||
 | 
			
		||||
    if ( !GetOptions( \%opt, qw(h|help V|Verbose v|version w x z) )){
 | 
			
		||||
        return( usage() );
 | 
			
		||||
    }
 | 
			
		||||
    if ( exists($opt{x}) and exists($opt{z}) ) {
 | 
			
		||||
        return (1,"-x and -z are mutually exclusive" );
 | 
			
		||||
    } 
 | 
			
		||||
    my $mmname = $session->get([$mmoname,0]);
 | 
			
		||||
    if ($session->{ErrorStr}) {
 | 
			
		||||
        return (1,$session->{ErrorStr});
 | 
			
		||||
    }
 | 
			
		||||
    my $mmtype = $session->get([$mmotype,0]);
 | 
			
		||||
    if ($session->{ErrorStr}) {
 | 
			
		||||
        return (1,$session->{ErrorStr});
 | 
			
		||||
    }
 | 
			
		||||
    my $mmmodel = $session->get([$mmomodel,0]);
 | 
			
		||||
    if ($session->{ErrorStr}) {
 | 
			
		||||
        return (1,$session->{ErrorStr});
 | 
			
		||||
    }
 | 
			
		||||
    my $mmserial = $session->get([$mmoserial,0]);
 | 
			
		||||
    if ($session->{ErrorStr}) {
 | 
			
		||||
        return (1,$session->{ErrorStr});
 | 
			
		||||
    }
 | 
			
		||||
    push @values, join( ",", "mm", $mmname, 0, "$mmtype-$mmmodel", $mmserial, $mpa);
 | 
			
		||||
    my $max = length( $mmname );
 | 
			
		||||
 | 
			
		||||
    foreach (1..14) {
 | 
			
		||||
        my $tmp = $session->get([$bladexistsoid.".$_"]);
 | 
			
		||||
        if ( $tmp eq 1 ) {
 | 
			
		||||
            my $model = $session->get([$blademtmoid,$_]);
 | 
			
		||||
            if ($session->{ErrorStr}) {
 | 
			
		||||
                return (1,$session->{ErrorStr});
 | 
			
		||||
            }
 | 
			
		||||
            $model =~ s/Not available/null/;
 | 
			
		||||
 | 
			
		||||
            my $serial = $session->get([$bladeserialoid,$_]);
 | 
			
		||||
            if ($session->{ErrorStr}) {
 | 
			
		||||
                return (1,$session->{ErrorStr});
 | 
			
		||||
            }
 | 
			
		||||
            $serial =~ s/Not available/null/;
 | 
			
		||||
 | 
			
		||||
            my $name = $session->get([$bladeoname,$_]);
 | 
			
		||||
            if ($session->{ErrorStr}) {
 | 
			
		||||
                return (1,$session->{ErrorStr});
 | 
			
		||||
            }
 | 
			
		||||
            push @values, join( ",", "blade", $name, $_, $model, $serial, "");
 | 
			
		||||
            my $length  = length( $name );
 | 
			
		||||
            $max = ($length > $max) ? $length : $max;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    my $format = sprintf "%%-%ds", ($max + 2 );
 | 
			
		||||
    $rscan_header[1][1] = $format;
 | 
			
		||||
 | 
			
		||||
    if ( exists( $opt{x} )) {
 | 
			
		||||
       $result = rscan_xml( \@values ); 
 | 
			
		||||
    } 
 | 
			
		||||
    elsif ( exists( $opt{z} )) {
 | 
			
		||||
       $result = rscan_schema( \@values ); 
 | 
			
		||||
    } 
 | 
			
		||||
    else {
 | 
			
		||||
        foreach ( @rscan_header ) {
 | 
			
		||||
            $result .= sprintf @$_[1], @$_[0];
 | 
			
		||||
        }
 | 
			
		||||
        foreach ( @values ) {
 | 
			
		||||
            my @data = split /,/;
 | 
			
		||||
            my $i = 0;
 | 
			
		||||
 | 
			
		||||
            foreach ( @rscan_header ) {
 | 
			
		||||
                $result .= sprintf @$_[1], $data[$i++];
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if ( !exists( $opt{w} )) {
 | 
			
		||||
        return(0,$result);
 | 
			
		||||
    }
 | 
			
		||||
    my @tabs = qw(mp nodehm nodelist);
 | 
			
		||||
    my %db   = ();
 | 
			
		||||
 | 
			
		||||
    foreach ( @tabs ) {
 | 
			
		||||
        $db{$_} = xCAT::Table->new( $_, -create=>1, -autocommit=>0 );
 | 
			
		||||
        if ( !$db{$_} ) {
 | 
			
		||||
            return( 1,"Error opening '$_'" );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    foreach ( @values ) {
 | 
			
		||||
        my @data = split /,/;
 | 
			
		||||
        my $name = $data[1];
 | 
			
		||||
  
 | 
			
		||||
        my ($k1,$u1);
 | 
			
		||||
        $k1->{node} = $name;
 | 
			
		||||
        $u1->{mpa}  = $mpa;
 | 
			
		||||
        $u1->{id}   = $data[2];
 | 
			
		||||
        $db{mp}->setAttribs( $k1, $u1 );
 | 
			
		||||
        $db{mp}{commit} = 1;
 | 
			
		||||
 | 
			
		||||
        my ($k2,$u2);
 | 
			
		||||
        $k2->{node} = $name;
 | 
			
		||||
        $u2->{mgt}  = "blade";
 | 
			
		||||
        $db{nodehm}->setAttribs( $k2, $u2 );
 | 
			
		||||
        $db{nodehm}{commit} = 1;
 | 
			
		||||
 | 
			
		||||
        my ($k3,$u3);
 | 
			
		||||
        $k3->{node}   = $name;
 | 
			
		||||
        $u3->{groups} = "blade,all";
 | 
			
		||||
        $db{nodelist}->setAttribs( $k3, $u3 );
 | 
			
		||||
        $db{nodelist}{commit} = 1;
 | 
			
		||||
    }
 | 
			
		||||
    foreach ( @tabs ) {
 | 
			
		||||
        if ( exists( $db{$_}{commit} )) {
 | 
			
		||||
           $db{$_}->commit;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return (0,$result);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub rscan_xml {
 | 
			
		||||
 | 
			
		||||
    my $values = shift;
 | 
			
		||||
    my $xml;
 | 
			
		||||
 | 
			
		||||
    foreach ( @$values ) {
 | 
			
		||||
      my @data = split /,/;
 | 
			
		||||
      my $i = 0;
 | 
			
		||||
 | 
			
		||||
      my $href = {
 | 
			
		||||
          Node => { }
 | 
			
		||||
      };
 | 
			
		||||
      foreach ( @rscan_header ) {
 | 
			
		||||
        $href->{Node}->{@$_[0]} = $data[$i++];
 | 
			
		||||
      }
 | 
			
		||||
      $xml.= XMLout($href,
 | 
			
		||||
                     NoAttr   => 1,
 | 
			
		||||
                     KeyAttr  => [],
 | 
			
		||||
                     RootName => undef );
 | 
			
		||||
    }
 | 
			
		||||
    return( $xml );
 | 
			
		||||
}
 | 
			
		||||
sub rscan_schema {
 | 
			
		||||
 | 
			
		||||
    my $values = shift;
 | 
			
		||||
    my $result;
 | 
			
		||||
 | 
			
		||||
    foreach ( @$values ) {
 | 
			
		||||
      my @data = split /,/;
 | 
			
		||||
      my $i = 0;
 | 
			
		||||
      $result .= "$data[1]:\n\tobjtype=node\n";
 | 
			
		||||
 | 
			
		||||
      foreach ( @rscan_header ) {
 | 
			
		||||
        if ( @$_[0] eq "name" ) {
 | 
			
		||||
          next;
 | 
			
		||||
        }
 | 
			
		||||
        $result .= "\t@$_[0]=$data[$i++]\n";
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return( $result );
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
sub inv {
 | 
			
		||||
  my @invitems;
 | 
			
		||||
  my $data;
 | 
			
		||||
@@ -597,7 +780,7 @@ sub bladecmd {
 | 
			
		||||
  my @args = @_;
 | 
			
		||||
  my $error;
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
 
 | 
			
		||||
  if ($slot > 0) {
 | 
			
		||||
    my $tmp = $session->get([$bladexistsoid.".$slot"]);
 | 
			
		||||
    if ($session->{ErrorStr}) { return (1,$session->{ErrorStr}); }
 | 
			
		||||
@@ -617,6 +800,8 @@ sub bladecmd {
 | 
			
		||||
    return inv(@args);
 | 
			
		||||
  } elsif ($command eq "reventlog") {
 | 
			
		||||
    return eventlog(@args);
 | 
			
		||||
  } elsif ($command eq "rscan") {
 | 
			
		||||
    return rscan(@args);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  return (1,"$command not a supported command by blade method");
 | 
			
		||||
@@ -630,6 +815,7 @@ sub process_request {
 | 
			
		||||
  my $noderange = $request->{node};
 | 
			
		||||
  my $command = $request->{command}->[0];
 | 
			
		||||
  my @exargs;
 | 
			
		||||
 | 
			
		||||
  unless ($noderange or $command eq "findme") {
 | 
			
		||||
      if ($usage{$command}) {
 | 
			
		||||
          $callback->({data=>$usage{$command}});
 | 
			
		||||
@@ -826,10 +1012,15 @@ sub dompa {
 | 
			
		||||
          $output{node}->[0]->{data}->[0]->{desc}->[0]=$desc;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      $text =~ s/^\s+//;
 | 
			
		||||
      $text =~ s/\s+$//;
 | 
			
		||||
      $output{node}->[0]->{name}->[0]=$node;
 | 
			
		||||
      $output{node}->[0]->{data}->[0]->{contents}->[0]=$text;
 | 
			
		||||
      if ( $command eq "rscan" ) { 
 | 
			
		||||
        $output{data} = [$_];
 | 
			
		||||
      }
 | 
			
		||||
      else {
 | 
			
		||||
        $text =~ s/^\s+//;
 | 
			
		||||
        $text =~ s/\s+$//;
 | 
			
		||||
        $output{node}->[0]->{name}->[0]=$node;
 | 
			
		||||
        $output{node}->[0]->{data}->[0]->{contents}->[0]=$text;
 | 
			
		||||
      }
 | 
			
		||||
      print $out freeze([\%output]);
 | 
			
		||||
      print $out "\nENDOFFREEZE6sK4ci\n";
 | 
			
		||||
    }
 | 
			
		||||
@@ -840,3 +1031,4 @@ sub dompa {
 | 
			
		||||
    
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user