2011-10-13 00:29:40 +00:00
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
package xCAT::MellanoxIB ;
BEGIN
{
$ ::XCATROOT = $ ENV { 'XCATROOT' } ? $ ENV { 'XCATROOT' } : '/opt/xcat' ;
}
use lib "$::XCATROOT/lib/perl" ;
use IO::Socket ;
use Data::Dumper ;
use xCAT::NodeRange ;
use xCAT::Utils ;
use Sys::Syslog ;
use Expect ;
use Storable ;
use strict ;
#-------------------------------------------------------------------------------
= head1 xCAT:: MellanoxIB
= head2 Package Description
It handles Mellanox IB switch related function . It used the CLI interface of
Mellanox IB switch
= cut
#--------------------------------------------------------------------------------
#--------------------------------------------------------------------------------
= head3 getConfigure
It queries the info from the given swithes .
Arguments:
noderange - - an array ref to switches .
callback - - pointer for writes response back to the client .
suncommand - - - attribute to query about .
Returns:
0 - - - sucessful
none 0 - - - unsuccessful .
= cut
#--------------------------------------------------------------------------------
sub getConfig {
my $ noderange = shift ;
if ( $ noderange =~ /xCAT::MellanoxIB/ ) {
$ noderange = shift ;
}
my $ callback = shift ;
my $ subreq = shift ;
my $ subcommand = shift ;
#handle sshcfg with expect script
if ( $ subcommand eq "sshcfg" ) {
2011-10-14 15:27:00 +00:00
return querySSHcfg ( $ noderange , $ callback , $ subreq ) ;
2011-10-13 00:29:40 +00:00
}
#get the username and the password
my $ swstab = xCAT::Table - > new ( 'switches' , - create = > 1 ) ;
my $ sws_hash = $ swstab - > getNodesAttribs ( $ noderange , [ 'sshusername' ] ) ;
my $ passtab = xCAT::Table - > new ( 'passwd' ) ;
my $ ent ;
( $ ent ) = $ passtab - > getAttribs ( { key = > "switch" } , qw( username ) ) ;
foreach my $ node ( @$ noderange ) {
my $ cmd ;
my $ username ;
if ( $ sws_hash - > { $ node } - > [ 0 ] ) {
$ username = $ sws_hash - > { $ node } - > [ 0 ] - > { sshusername } ;
}
if ( ! $ username ) {
if ( $ ent ) {
$ username = $ ent - > { username } ;
}
}
if ( ! $ username ) {
$ username = "xcat" ;
}
if ( ( $ subcommand eq "alert" ) || ( $ subcommand eq "snmpcfg" ) || ( $ subcommand eq "community" ) || ( $ subcommand eq "snmpdest" ) ) {
$ cmd = 'show snmp' ;
2011-10-13 18:52:46 +00:00
} elsif ( $ subcommand eq "logdest" ) {
$ cmd = 'show logging' ;
2011-10-13 00:29:40 +00:00
}
else {
my $ rsp = { } ;
$ rsp - > { error } - > [ 0 ] = "Unsupported subcommand: $subcommand" ;
$ callback - > ( $ rsp ) ;
return ;
}
#now goto the switch and get the output
my $ output = xCAT::Utils - > runxcmd ( { command = > [ "xdsh" ] , node = > [ $ node ] , arg = > [ "--devicetype" , "IBSwitch::Mellanox" , "$cmd" ] , env = > [ "DSH_TO_USERID=$username" ] } , $ subreq , - 1 , 1 ) ;
if ( $ output ) {
my $ result = parseOutput ( $ node , $ subcommand , $ output ) ;
my $ rsp = { } ;
my $ i = - 1 ;
foreach my $ o ( @$ result ) {
$ i + + ;
$ rsp - > { data } - > [ $ i ] = $ o ;
}
$ callback - > ( $ rsp ) ;
}
} #end foreach
}
sub parseOutput {
my $ node = shift ;
my $ subcommand = shift ;
my $ input = shift ; #an array pointer
my $ output ;
if ( $ subcommand eq "alert" ) {
2011-10-13 18:52:46 +00:00
my $ done = 0 ;
foreach my $ tmpstr1 ( @$ input ) {
my @ b = split ( "\n" , $ tmpstr1 ) ;
foreach my $ tmpstr ( @ b ) {
if ( $ tmpstr =~ /Traps enabled:/ ) {
if ( $ tmpstr =~ /yes/ ) {
$ output = [ "$node: Switch Alerting enabled" ] ;
} else {
$ output = [ "$node: Switch Alerting disabled" ] ;
}
$ done = 1 ;
last ;
2011-10-13 00:29:40 +00:00
}
}
2011-10-13 18:52:46 +00:00
if ( $ done ) { last ; }
2011-10-13 00:29:40 +00:00
}
if ( $ output ) { return $ output ; }
} elsif ( $ subcommand eq "snmpcfg" ) {
2011-10-13 18:52:46 +00:00
my $ done = 0 ;
foreach my $ tmpstr1 ( @$ input ) {
my @ b = split ( "\n" , $ tmpstr1 ) ;
foreach my $ tmpstr ( @ b ) {
if ( $ tmpstr =~ /SNMP enabled:/ ) {
if ( $ tmpstr =~ /yes/ ) {
$ output = [ "$node: SNMP enabled" ] ;
} else {
$ output = [ "$node: SNMP disabled" ] ;
}
$ done = 1 ;
last ;
2011-10-13 00:29:40 +00:00
}
}
2011-10-13 18:52:46 +00:00
if ( $ done ) { last ; }
2011-10-13 00:29:40 +00:00
}
if ( $ output ) { return $ output ; }
} elsif ( $ subcommand eq "snmpdest" ) {
my $ found = 0 ;
my $ j = 0 ;
2011-10-13 18:52:46 +00:00
my $ done = 0 ;
foreach my $ tmpstr1 ( @$ input ) {
my @ b = split ( "\n" , $ tmpstr1 ) ;
foreach my $ tmpstr ( @ b ) {
if ( ( ! $ found ) && ( $ tmpstr =~ /Trap sinks:/ ) ) {
$ found = 1 ;
$ output - > [ 0 ] = "$node: SNMP Destination:" ;
2011-10-13 00:29:40 +00:00
next ;
2011-10-13 18:52:46 +00:00
}
if ( $ tmpstr =~ /Events for which/ ) {
if ( ! $ found ) {
next ;
} else {
$ done = 1 ;
last ;
}
}
if ( $ found ) {
$ tmpstr =~ s/$node: //g ;
$ output - > [ + + $ j ] = $ tmpstr ;
}
}
if ( $ done ) { last ; }
}
if ( $ output ) { return $ output ; }
} elsif ( $ subcommand eq "community" ) {
my $ done = 0 ;
foreach my $ tmpstr1 ( @$ input ) {
my @ b = split ( "\n" , $ tmpstr1 ) ;
foreach my $ tmpstr ( @ b ) {
if ( $ tmpstr =~ /Read-only community:/ ) {
my @ a = split ( ':' , $ tmpstr ) ;
my $ c_str ;
if ( @ a > 2 ) {
$ c_str = $ a [ 2 ] ;
}
$ output = [ "$node: SNMP Community: $c_str" ] ;
$ done = 1 ;
2011-10-13 00:29:40 +00:00
last ;
}
}
2011-10-13 18:52:46 +00:00
if ( $ done ) { last ; }
2011-10-13 00:29:40 +00:00
}
if ( $ output ) { return $ output ; }
2011-10-13 18:52:46 +00:00
} elsif ( $ subcommand eq "logdest" ) {
foreach my $ tmpstr1 ( @$ input ) {
my @ b = split ( "\n" , $ tmpstr1 ) ;
foreach my $ tmpstr ( @ b ) {
if ( $ tmpstr =~ /Remote syslog receiver:/ ) {
my @ a = split ( ':' , $ tmpstr ) ;
my $ c_str ;
if ( @ a > 2 ) {
for my $ i ( 2 .. $# a ) {
$ c_str . = $ a [ $ i ] . ':' ;
}
chop ( $ c_str ) ;
}
if ( $ output ) {
push ( @$ output , " $c_str" ) ;
} else {
$ output = [ "$node: Logging destination:\n $c_str" ] ;
}
2011-10-13 00:29:40 +00:00
}
}
}
if ( $ output ) { return $ output ; }
}
return $ input #an array pointer
}
#--------------------------------------------------------------------------------
= head3 setConfigure
It configures the the given swithes .
Arguments:
noderange - - an array ref to switches .
callback - - pointer for writes response back to the client .
suncommand - - - attribute to set .
Returns:
0 - - - sucessful
none 0 - - - unsuccessful .
= cut
#--------------------------------------------------------------------------------
sub setConfig {
my $ noderange = shift ;
if ( $ noderange =~ /xCAT::MellanoxIB/ ) {
$ noderange = shift ;
}
my $ callback = shift ;
my $ subreq = shift ;
my $ subcommand = shift ;
my $ argument = shift ;
#handle sshcfg with expect script
if ( $ subcommand eq "sshcfg" ) {
if ( $ argument eq "on" or $ argument =~ /^en/ or $ argument =~ /^enable/ ) {
2011-10-14 15:27:00 +00:00
return setSSHcfg ( $ noderange , $ callback , $ subreq , 1 ) ;
2011-10-13 00:29:40 +00:00
}
elsif ( $ argument eq "off" or $ argument =~ /^dis/ or $ argument =~ /^disable/ ) {
2011-10-14 15:27:00 +00:00
return setSSHcfg ( $ noderange , $ callback , $ subreq , 0 ) ;
2011-10-13 00:29:40 +00:00
} else {
my $ rsp = { } ;
$ rsp - > { error } - > [ 0 ] = "Unsupported argument for sshcfg: $argument" ;
$ callback - > ( $ rsp ) ;
return ;
}
}
#get the username and the password
my $ swstab = xCAT::Table - > new ( 'switches' , - create = > 1 ) ;
my $ sws_hash = $ swstab - > getNodesAttribs ( $ noderange , [ 'sshusername' ] ) ;
my $ passtab = xCAT::Table - > new ( 'passwd' ) ;
my $ ent ;
( $ ent ) = $ passtab - > getAttribs ( { key = > "switch" } , qw( username ) ) ;
foreach my $ node ( @$ noderange ) {
my @ cfgcmds ;
my $ username ;
if ( $ sws_hash - > { $ node } - > [ 0 ] ) {
$ username = $ sws_hash - > { $ node } - > [ 0 ] - > { sshusername } ;
}
if ( ! $ username ) {
if ( $ ent ) {
$ username = $ ent - > { username } ;
}
}
if ( ! $ username ) {
$ username = "xcat" ; #default ssh username
}
if ( $ subcommand eq "alert" ) {
if ( $ argument eq "on" or $ argument =~ /^en/ or $ argument =~ /^enable/ ) {
$ cfgcmds [ 0 ] = "snmp-server enable traps" ;
}
elsif ( $ argument eq "off" or $ argument =~ /^dis/ or $ argument =~ /^disable/ ) {
2011-10-13 18:52:46 +00:00
$ cfgcmds [ 0 ] = "no snmp-server enable traps" ;
2011-10-13 00:29:40 +00:00
} else {
my $ rsp = { } ;
$ rsp - > { error } - > [ 0 ] = "Unsupported argument for $subcommand: $argument" ;
$ callback - > ( $ rsp ) ;
return ;
}
}
elsif ( $ subcommand eq "snmpcfg" ) {
if ( $ argument eq "on" or $ argument =~ /^en/ or $ argument =~ /^enable/ ) {
$ cfgcmds [ 0 ] = "snmp-server enable" ;
}
elsif ( $ argument eq "off" or $ argument =~ /^dis/ or $ argument =~ /^disable/ ) {
$ cfgcmds [ 0 ] = "no snmp-server enable" ;
} else {
my $ rsp = { } ;
$ rsp - > { error } - > [ 0 ] = "Unsupported argument for $subcommand: $argument" ;
$ callback - > ( $ rsp ) ;
return ;
}
}
elsif ( $ subcommand eq "community" ) {
$ cfgcmds [ 0 ] = "snmp-server community $argument" ;
}
elsif ( $ subcommand eq "snmpdest" ) {
2011-10-13 18:52:46 +00:00
my @ a = split ( ' ' , $ argument ) ;
if ( @ a > 1 ) {
if ( $ a [ 1 ] eq 'remove' ) {
$ cfgcmds [ 0 ] = "no snmp-server host $a[0]" ;
} else {
my $ rsp = { } ;
$ rsp - > { error } - > [ 0 ] = "Unsupported action for $subcommand: $a[1]\nThe valide action is: remove." ;
$ callback - > ( $ rsp ) ;
return ;
}
} else {
$ cfgcmds [ 0 ] = "snmp-server host $a[0] traps version 2c public" ;
}
}
elsif ( $ subcommand eq "logdest" ) {
#one can run rspconfig <switch> logdest=<ip> level
# where level can be:
# remove Remove this ip from receiving logging
# none Disable logging
# emerg Emergency: system is unusable
# alert Action must be taken immediately
# crit Critical conditions
# err Error conditions
# warning Warning conditions
# notice Normal but significant condition
# info Informational messages
# debug Debug-level messages
my @ a = split ( ' ' , $ argument ) ;
if ( ( @ a > 1 ) && ( $ a [ 1 ] eq 'remove' ) ) {
$ cfgcmds [ 0 ] = "no logging $a[0]" ;
} else {
if ( @ a > 1 ) {
if ( $ a [ 1 ] eq "none" ||
$ a [ 1 ] eq "emerg" ||
$ a [ 1 ] eq "alert" ||
$ a [ 1 ] eq "crit" ||
$ a [ 1 ] eq "err" ||
$ a [ 1 ] eq "warning" ||
$ a [ 1 ] eq "notice" ||
$ a [ 1 ] eq "info" ||
$ a [ 1 ] eq "debug" ) {
$ cfgcmds [ 0 ] = "logging $a[0] trap $a[1]" ;
} else {
my $ rsp = { } ;
$ rsp - > { error } - > [ 0 ] = "Unsupported loging level for $subcommand: $a[1].\nThe valid levels are: emerg, alert, crit, err, warning, notice, info, debug, none, remove" ;
$ callback - > ( $ rsp ) ;
return ;
}
} else {
$ cfgcmds [ 0 ] = "logging $a[0]" ;
}
}
2011-10-13 00:29:40 +00:00
}
else {
my $ rsp = { } ;
$ rsp - > { error } - > [ 0 ] = "Unsupported subcommand: $subcommand" ;
$ callback - > ( $ rsp ) ;
return ;
}
#now do the real bussiness
my $ cmd = "enable;configure terminal" ;
foreach ( @ cfgcmds ) {
$ cmd . = ";$_" ;
}
my $ output = xCAT::Utils - > runxcmd ( { command = > [ "xdsh" ] , node = > [ $ node ] , arg = > [ "--devicetype" , "IBSwitch::Mellanox" , "$cmd" ] , env = > [ "DSH_TO_USERID=$username" ] } , $ subreq , - 1 , 1 ) ;
#only print out the error
if ( $ ::RUNCMD_RC != 0 ) {
if ( $ output ) {
my $ rsp = { } ;
my $ i = - 1 ;
foreach my $ o ( @$ output ) {
$ i + + ;
$ rsp - > { data } - > [ $ i ] = $ o ;
}
$ callback - > ( $ rsp ) ;
}
}
#now qerry
return getConfig ( $ noderange , $ callback , $ subreq , $ subcommand ) ;
}
}
#--------------------------------------------------------------------------------
= head3 querySSHcfg
It checks if the current host can ssh to the given switches without password .
Arguments:
noderange - - an array ref to switches .
callback - - pointer for writes response back to the client .
Returns:
0 - - - sucessful
none 0 - - - unsuccessful .
= cut
#--------------------------------------------------------------------------------
2011-10-14 15:27:00 +00:00
sub querySSHcfg {
2011-10-13 00:29:40 +00:00
my $ noderange = shift ;
if ( $ noderange =~ /xCAT::MellanoxIB/ ) {
$ noderange = shift ;
}
my $ callback = shift ;
2011-10-14 15:27:00 +00:00
my $ subreq = shift ;
2011-10-13 00:29:40 +00:00
#get the username and the password
my $ swstab = xCAT::Table - > new ( 'switches' , - create = > 1 ) ;
2011-10-14 15:27:00 +00:00
my $ sws_hash = $ swstab - > getNodesAttribs ( $ noderange , [ 'sshusername' ] ) ;
2011-10-13 00:29:40 +00:00
my $ passtab = xCAT::Table - > new ( 'passwd' ) ;
my $ ent ;
2011-10-14 15:27:00 +00:00
( $ ent ) = $ passtab - > getAttribs ( { key = > "switch" } , qw( username ) ) ;
2011-10-13 00:29:40 +00:00
2011-10-14 15:27:00 +00:00
#get the ssh public key from this host
my $ fname = ( ( xCAT::Utils:: isAIX ( ) ) ? "/.ssh/" : "/root/.ssh/" ) . "id_rsa.pub" ;
2011-10-13 00:29:40 +00:00
unless ( open ( FH , "<$fname" ) ) {
$ callback - > ( { error = > [ "Error opening file $fname." ] , errorcode = > [ 1 ] } ) ;
return 1 ;
}
my ( $ sshkey ) = <FH> ;
close ( FH ) ;
2011-10-14 15:27:00 +00:00
chomp ( $ sshkey ) ;
2011-10-13 00:29:40 +00:00
2011-10-14 15:27:00 +00:00
my $ cmd = "enable;show ssh client" ;
2011-10-13 00:29:40 +00:00
foreach my $ node ( @$ noderange ) {
my $ username ;
if ( $ sws_hash - > { $ node } - > [ 0 ] ) {
$ username = $ sws_hash - > { $ node } - > [ 0 ] - > { sshusername } ;
}
if ( ! $ username ) {
if ( $ ent ) {
$ username = $ ent - > { username } ;
}
}
2011-10-14 15:27:00 +00:00
if ( ! $ username ) {
$ username = "xcat" ;
2011-10-13 00:29:40 +00:00
}
2011-10-14 15:27:00 +00:00
2011-10-13 00:29:40 +00:00
2011-10-14 15:27:00 +00:00
#now goto the switch and get the output
my $ output = xCAT::Utils - > runxcmd ( { command = > [ "xdsh" ] , node = > [ $ node ] , arg = > [ "--devicetype" , "IBSwitch::Mellanox" , "$cmd" ] , env = > [ "DSH_TO_USERID=$username" ] } , $ subreq , - 1 , 1 ) ;
if ( $ output ) {
my $ keys = getMatchingKeys ( $ node , $ username , $ output , $ sshkey ) ;
my $ rsp = { } ;
if ( @$ keys > 0 ) {
$ rsp - > { data } - > [ 0 ] = "$node: SSH enabled" ;
} else {
$ rsp - > { data } - > [ 0 ] = "$node: SSH disabled" ;
}
$ callback - > ( $ rsp ) ;
2011-10-13 00:29:40 +00:00
}
2011-10-14 15:27:00 +00:00
} #end foreach node
}
2011-10-13 00:29:40 +00:00
2011-10-14 15:27:00 +00:00
#--------------------------------------------------------------------------------
= head3 getMatchingKeys
It checks if the given outout contians the given ssh key for the given user .
2011-10-13 00:29:40 +00:00
2011-10-14 15:27:00 +00:00
Returns:
An array pointer to the matching keys .
= cut
#--------------------------------------------------------------------------------
sub getMatchingKeys {
my $ node = shift ;
my $ username = shift ;
my $ output = shift ;
my $ sshkey = shift ;
my @ keys = ( ) ;
my $ user_found = 0 ;
my $ start = 0 ;
my $ end = 0 ;
foreach my $ tmpstr1 ( @$ output ) {
my @ b = split ( "\n" , $ tmpstr1 ) ;
foreach my $ o ( @ b ) {
#print "o=$o\n";
$ o =~ s/$node: //g ;
if ( $ o =~ /SSH authorized keys:/ ) {
$ start = 1 ;
next ;
}
if ( $ start ) {
if ( $ o =~ /User $username:/ ) {
$ user_found = 1 ;
next ;
}
if ( $ user_found ) {
if ( $ o =~ /Key (\d+): (.*)$/ ) {
my $ key = $ 1 ;
my $ key_value = $ 2 ;
#print "key=$key\n";
#print "key_value=$key_value\n";
chomp ( $ key_value ) ;
if ( "$sshkey" eq "$key_value" ) {
push ( @ keys , $ key ) ;
}
next ;
} elsif ( $ o =~ /^(\s*)$/ ) {
next ;
}
else {
$ end = 1 ;
}
}
}
2011-10-13 00:29:40 +00:00
}
2011-10-14 15:27:00 +00:00
if ( $ end ) { last ; }
2011-10-13 00:29:40 +00:00
}
2011-10-14 15:27:00 +00:00
return \ @ keys ;
2011-10-13 00:29:40 +00:00
}
2011-10-14 15:27:00 +00:00
2011-10-13 00:29:40 +00:00
#--------------------------------------------------------------------------------
= head3 setSSHcfg
It enables / diables the current host to ssh to the given switches without password .
Arguments:
noderange - - an array ref to switches .
callback - - pointer for writes response back to the client .
Returns:
0 - - - sucessful
none 0 - - - unsuccessful .
= cut
#--------------------------------------------------------------------------------
sub setSSHcfg {
my $ noderange = shift ;
if ( $ noderange =~ /xCAT::MellanoxIB/ ) {
$ noderange = shift ;
}
my $ callback = shift ;
2011-10-14 15:27:00 +00:00
my $ subreq = shift ;
2011-10-13 00:29:40 +00:00
my $ enable = shift ;
my $ mysw ;
my $ enable_cmd = "enable\r" ;
my $ config_cmd = "configure terminal\r" ;
my $ exit_cmd = "exit\r" ;
my $ pwd_prompt = "Password: " ;
my $ sw_prompt = "^.*\] > " ;
my $ enable_prompt = "^.*\] \#" ;
my $ config_prompt = "^.*\\\(config\\\) \#" ;
2011-10-14 15:27:00 +00:00
my $ debug = 0 ;
2011-10-13 00:29:40 +00:00
if ( $ ::VERBOSE )
{
$ debug = 1 ;
}
#get the username and the password
my $ swstab = xCAT::Table - > new ( 'switches' , - create = > 1 ) ;
my $ sws_hash = $ swstab - > getNodesAttribs ( $ noderange , [ 'sshusername' , 'sshpassword' ] ) ;
my $ passtab = xCAT::Table - > new ( 'passwd' ) ;
my $ ent ;
( $ ent ) = $ passtab - > getAttribs ( { key = > "switch" } , qw( username password ) ) ;
2011-10-14 15:27:00 +00:00
#get the ssh public key from this host
my $ fname = ( ( xCAT::Utils:: isAIX ( ) ) ? "/.ssh/" : "/root/.ssh/" ) . "id_rsa.pub" ;
2011-10-13 00:29:40 +00:00
unless ( open ( FH , "<$fname" ) ) {
$ callback - > ( { error = > [ "Error opening file $fname." ] , errorcode = > [ 1 ] } ) ;
return 1 ;
}
my ( $ sshkey ) = <FH> ;
close ( FH ) ;
#remove the userid@host part
#my @tmpa=split(' ', $sshkey);
#if (@tmpa > 2) {
# $sshkey=$tmpa[0] . ' ' . $tmpa[1];
#}
foreach my $ node ( @$ noderange ) {
my $ username ;
my $ passwd ;
if ( $ sws_hash - > { $ node } - > [ 0 ] ) {
#print "got to switches table\n";
$ username = $ sws_hash - > { $ node } - > [ 0 ] - > { sshusername } ;
$ passwd = $ sws_hash - > { $ node } - > [ 0 ] - > { sshpassword } ;
}
if ( ! $ username ) {
#print "got to passwd table\n";
if ( $ ent ) {
$ username = $ ent - > { username } ;
$ passwd = $ ent - > { password } ;
}
}
unless ( $ username ) {
$ callback - > ( { error = > [ "Unable to get the username and the password for node $node. Please fill the switches table or the password table." ] , errorcode = > [ 1 ] } ) ;
next ;
}
2011-10-14 15:27:00 +00:00
#print "username=$username, password=$passwd\n";
if ( $ enable > 0 ) {
$ mysw = new Expect ;
$ mysw - > exp_internal ( $ debug ) ;
#
# log_stdout(0) prevent the program's output from being shown.
# turn on if debugging error
$ mysw - > log_stdout ( $ debug ) ;
my @ cfgcmds = ( ) ;
$ cfgcmds [ 0 ] = "ssh client user $username authorized-key sshv2 \"$sshkey\"\r" ;
my $ login_cmd = "ssh -l $username $node\r" ;
my $ passwd_cmd = "$passwd\r" ;
unless ( $ mysw - > spawn ( $ login_cmd ) )
{
$ mysw - > soft_close ( ) ;
my $ rsp ;
$ rsp - > { data } - > [ 0 ] = "Unable to run $login_cmd." ;
xCAT::MsgUtils - > message ( "I" , $ rsp , $ callback ) ;
next ;
}
my @ result = $ mysw - > expect (
5 ,
[
$ pwd_prompt ,
sub {
$ mysw - > clear_accum ( ) ;
$ mysw - > send ( $ passwd_cmd ) ;
#print "$node: password sent\n";
$ mysw - > exp_continue ( ) ;
}
] ,
[
"-re" , $ sw_prompt ,
sub {
#print "$node: sending command: $enable_cmd\n";
$ mysw - > clear_accum ( ) ;
$ mysw - > send ( $ enable_cmd ) ;
$ mysw - > exp_continue ( ) ;
}
] ,
[
"-re" , $ enable_prompt ,
sub {
#print "$node: sending command: $config_cmd\n";
$ mysw - > clear_accum ( ) ;
$ mysw - > send ( $ config_cmd ) ;
$ mysw - > exp_continue ( ) ;
}
] ,
[
"-re" , $ config_prompt ,
sub {
#print "$node: sending command: $cfgcmds[0]\n";
$ mysw - > clear_accum ( ) ;
$ mysw - > send ( $ cfgcmds [ 0 ] ) ;
sleep 1 ;
$ mysw - > send ( $ exit_cmd ) ;
}
] ,
) ;
2011-10-13 00:29:40 +00:00
2011-10-14 15:27:00 +00:00
if ( defined ( $ result [ 1 ] ) )
{
my $ errmsg = $ result [ 1 ] ;
$ mysw - > soft_close ( ) ;
my $ rsp ;
$ rsp - > { data } - > [ 0 ] = "$node: command error: $result[1]" ;
$ callback - > ( $ rsp ) ;
next ;
}
$ mysw - > soft_close ( ) ;
} else {
#now goto the switch and get the matching keys
my $ output = xCAT::Utils - > runxcmd ( { command = > [ "xdsh" ] , node = > [ $ node ] , arg = > [ "--devicetype" , "IBSwitch::Mellanox" , "enable;show ssh client" ] , env = > [ "DSH_TO_USERID=$username" ] } , $ subreq , - 1 , 1 ) ;
if ( $ output ) {
chomp ( $ sshkey ) ;
my $ keys = getMatchingKeys ( $ node , $ username , $ output , $ sshkey ) ;
if ( @$ keys > 0 ) {
my $ cmd = "enable;configure terminal" ;
foreach my $ key ( @$ keys ) {
$ cmd . = ";no ssh client user admin authorized-key sshv2 $key" ;
}
#now remove the keys
$ output = xCAT::Utils - > runxcmd ( { command = > [ "xdsh" ] , node = > [ $ node ] , arg = > [ "--devicetype" , "IBSwitch::Mellanox" , $ cmd ] , env = > [ "DSH_TO_USERID=$username" ] } , $ subreq , - 1 , 1 ) ;
}
}
2011-10-13 00:29:40 +00:00
}
2011-10-14 15:27:00 +00:00
#now query again
querySSHcfg ( [ $ node ] , $ callback , $ subreq ) ;
2011-10-13 00:29:40 +00:00
}
}
1 ;