diff --git a/xCAT-server/lib/xcat/plugins/switchdiscover.pm b/xCAT-server/lib/xcat/plugins/switchdiscover.pm index cc91d76f4..e92612345 100644 --- a/xCAT-server/lib/xcat/plugins/switchdiscover.pm +++ b/xCAT-server/lib/xcat/plugins/switchdiscover.pm @@ -163,7 +163,7 @@ sub parse_args { ############################################# # Check for node range ############################################# - if ( scalar(@ARGV) eq 1 ) { + if ( scalar(@ARGV) == 1 ) { my @nodes = xCAT::NodeRange::noderange( @ARGV ); if (nodesmissed) { return (usage( "The following nodes are not defined in xCAT DB:\n " . join(',', nodesmissed))); @@ -456,7 +456,7 @@ sub process_request { if (exists($result->{$key}->{vendor})) { $vendor = $result->{$key}->{vendor}; } - if ($key != /nomac/) { + if ($key !~ /nomac/) { $mac = $key; } my $msg = sprintf $format, $ip, $name, $vendor, $key; @@ -472,11 +472,6 @@ sub process_request { } if (exists($globalopt{setup})) { - #discovered switches need to write to xcatdb before we can set them up - # It will be removed once we found predefine switch. - if (!exists($globalopt{w})) { - xCATdB($result, \%request, $sub_req); - } switchsetup($result, \%request, $sub_req); } @@ -1376,6 +1371,8 @@ sub switchsetup { my $static_ip; my $discover_switch; my @rmnodes; + my @BNTswitches; + my @MLNXswitches; #print Dumper($outhash); my $macmap = xCAT::MacMap->new(); @@ -1392,14 +1389,9 @@ sub switchsetup { # issue makehosts so we can use xdsh my $dswitch = get_hostname($outhash->{$mac}->{name}, $ip); - #add discovered switch to /etc/hosts - $output = xCAT::Utils->runxcmd({command => ["makehosts"], - node =>[$dswitch]}, $sub_req, 0, 1); - my $node = $macmap->find_mac($mac,0); if (!$node) { - send_msg($request, 0, "NO predefined switch matched this switch $dswitch with mac address $mac"); - $ret = xCAT::Utils->runxcmd({ command => ['chdef'], arg => ['-t','node','-o',$dswitch,"ip=$ip",'status=no predefined switch'] }, $sub_req, 0, 1); + send_msg($request, 0, "NO predefined switch matched this switch $dswitch with ip address $ip and mac address $mac"); next; } @@ -1416,209 +1408,35 @@ sub switchsetup { # BNT switches if ( $stype =~ /BNT/ ) { - $ret = config_BNT($dswitch, $node, $static_ip, $request, $sub_req); - if ($ret == 1) { - xCAT::Utils->runxcmd({ command => ['chdef'], arg => ['-t','node','-o',$node,"ip=$static_ip","otherinterfaces=dhcp:$ip",'status=config failed'] }, $sub_req, 0, 1); - } + push (@BNTswitches, $node); + xCAT::Utils->runxcmd({ command => ['chdef'], arg => ['-t','node','-o',$node,"ip=$static_ip","otherinterfaces=$ip",'status=Matched',"mac=$mac",'switchtype=BNT','username=root','password=admin'] }, $sub_req, 0, 1); } # Mellanox switches elsif ( $stype =~ /Mellanox/ ) { - #set static ip address the mgmt0, we don't have EthSwitch yet, will use IBSwitch for now - #NOTE: this expect routine will timeout after set up address - $ret = config_Mellanox($dswitch, $node, $static_ip, $request, $sub_req); - if ($ret == 1) { - xCAT::Utils->runxcmd({ command => ['chdef'], arg => ['-t','node','-o',$node,"ip=$static_ip","otherinterfaces=dhcp:$ip",'status=config failed'] }, $sub_req, 0, 1); - } + push (@MLNXswitches, $node); + xCAT::Utils->runxcmd({ command => ['chdef'], arg => ['-t','node','-o',$node,"ip=$static_ip","otherinterfaces=$ip",'status=Matched',"mac=$mac",'switchtype=Mellanox','username=admin'] }, $sub_req, 0, 1); } else { - send_msg($request, 0, "the switch $dswitch type $stype is not support\n"); - $ret = xCAT::Utils->runxcmd({ command => ['chdef'], arg => ['-t','node','-o',$node,"ip=$static_ip","switchtype=$stype","otherinterfaces=dhcp:$ip",'status=switch type is not supported yet'] }, $sub_req, 0, 1); + xCAT::Utils->runxcmd({ command => ['chdef'], arg => ['-t','node','-o',$node,"ip=$static_ip","switchtype=$stype","otherinterfaces=$ip",'status=not supported',"mac=$mac"] }, $sub_req, 0, 1); } - - # save for update mac address and remove node definition - $discovered_switch->{$node}->{mac}=$mac; - push (@rmnodes, $dswitch); } - - #after switch ip address is setup to static ip - #remove discover switch definition - $output = xCAT::Utils->runxcmd({command => ["makehosts"], - node => \@rmnodes, - arg => ['-d'] }, $sub_req, 0, 1); - my $remove_nodes = join(",", @rmnodes); - my $ccmd = "rmdef $remove_nodes"; - $output = xCAT::Utils->runcmd($ccmd, 0); - #send_msg($request, 0, Dumper($output)); - #update mac address - my $mactab = xCAT::Table->new('mac'); - if ($mactab) { - $mactab->setNodesAttribs($discovered_switch); + if (@BNTswitches) { + my $bntsw = join(",",@BNTswitches); + send_msg($request, 0, "call to config BNT switches $bntsw\n"); + my $out = `/opt/xcat/share/xcat/tools/configBNT --range $bntsw --all`; + send_msg($request, 0, "output = $out\n"); + } + if (@MLNXswitches) { + my $mlnxsw = join(",",@MLNXswitches); + send_msg($request, 0, "call to config Mellanox switches $mlnxsw\n"); + my $out = `/opt/xcat/share/xcat/tools/configMellanox --range $mlnxsw --all`; + send_msg($request, 0, "output = $out\n"); } return; } -#-------------------------------------------------------------------------------- -=head3 config_BNT - config BNT switches - ---setup static ip address - ---setup hostname - ---set default user/password - Arguments: - dswitch: discovered switch - node: predefine switch - ip: static ip address - Returns: - result: -=cut -#-------------------------------------------------------------------------------- - -sub config_BNT { - my $dswitch=shift; - my $node = shift; - my $static_ip = shift; - my $request = shift; - my $sub_req = shift; - my $dshcmd; - my $ret; - - #xdsh switch-192-168-5-152 --devicetype EthSwitch::BNT - # "enable;configure terminal;show interface ip;interface ip 1;ip address 192.168.5.22" - $dshcmd="enable;configure terminal;show interface ip;interface ip 1;ip address $static_ip;exit;exit"; - $output = xCAT::Utils->runxcmd({command => ["xdsh"], - node =>[$dswitch], - arg => ["--devicetype", "EthSwitch::BNT", "$dshcmd"] }, $sub_req, 0, 1); - #send_msg($request, 0, Dumper($output)); - - #add default attribute for BNT switch - my $ret = xCAT::Utils->runxcmd({ command => ['chdef'], arg => ['-t','node','-o',$node,"ip=$static_ip",'username=root','password=admin','protocol=telnet','switchtype=BNT','otherinterfaces=','status='] }, $sub_req, 0, 1); - #send_msg($request, 0, Dumper($ret)); - - #set up hostname - $dshcmd="enable;configure terminal;hostname $node;write memory"; - $output = xCAT::Utils->runxcmd({command => ["xdsh"], - node =>[$node], - arg => ["--devicetype", "EthSwitch::BNT", "$dshcmd"] }, $sub_req, 0, 1); - if ($::RUNCMD_RC != 0) - { - send_msg($request, 0, "Failed to change hostname on $node"); - return 1; - } - - return 0; -} - -#-------------------------------------------------------------------------------- -=head3 config_Mellanox - config Mellanox switches - ---setup static ip address - ---setup hostname - ---set default user/password - Arguments: - dswitch: discovered switch - node: predefine switch - ip: static ip address - Returns: - result: -=cut -#-------------------------------------------------------------------------------- - -sub config_Mellanox { - my $dswitch=shift; - my $node = shift; - my $static_ip = shift; - my $request = shift; - my $sub_req = shift; - my $dshcmd; - my $mask; - - # get netmask from network table - my $nettab = xCAT::Table->new("networks"); - if ($nettab) { - my @nets = $nettab->getAllAttribs('net','mask'); - foreach my $net (@nets) { - if (xCAT::NetworkUtils::isInSameSubnet( $net->{'net'}, $ip, $net->{'mask'}, 0)) { - $mask=$net->{'mask'}; - } - } - } - - #set static ip address the mgmt0, we don't have EthSwitch yet, will use IBSwitch for now - #NOTE: this expect routine will timeout after set up address - - my $myexp = new Expect; - my $timeout = 10; - my $login_cmd = "ssh -ladmin $dswitch\r"; - my $first_prompt = "^.*>"; - my $config_prompt="^.*#"; - my $cfg_ip="no interface mgmt0 dhcp\r"; - my $cfg_ip1="interface mgmt0 ip address $static_ip $mask\r"; - - unless ($myexp->spawn($login_cmd)) - { - $myexp->soft_close(); - send_msg($request, 0, "Unable to run $login_cmd\n"); - next; - } - - my @result = $myexp->expect( - $timeout, - [ - "-re", $first_prompt, - sub { - $myexp->clear_accum(); - $myexp->send("enable\r"); - $myexp->clear_accum(); - $myexp->send("configure terminal\r"); - $myexp->clear_accum(); - $myexp->exp_continue(); - } - ], - [ - "-re", $config_prompt, - sub { - $myexp->clear_accum(); - $myexp->send($cfg_ip); - $myexp->send($cfg_ip1); - $myexp->clear_accum(); - $myexp->send("configuration write\r"); - $myexp->send("exit\r"); - $myexp->send("exit\r"); - } - ], - ); - if (defined($result[1])) - { - my $errmsg = $result[1]; - $myexp->soft_close(); - send_msg($request,0,"Failed expect command $errmsg\n"); - } - - $myexp->soft_close(); - - #add default attribute for Mellanox switch - $output = xCAT::Utils->runxcmd({ command => ['chdef'], arg => ['-t','node','-o',$node,"ip=$static_ip",'username=admin','switchtype=Mellanox','otherinterfaces=','status='] }, $sub_req, 0, 1); - #send_msg($request, 0, Dumper($output)); - - - #set up hostname - $dshcmd="enable;configure terminal;hostname $node;configuration write"; - $output = xCAT::Utils->runxcmd({command => ["xdsh"], - node =>[$node], - arg => ["-l", "admin", "--devicetype", "IBSwitch::Mellanox", "$dshcmd"] }, $sub_req, 0, 1); - if ($::RUNCMD_RC != 0) - { - send_msg($request, 0, "Failed to change hostname on $node"); - return 1; - } - - return 0; -} - - - - 1; diff --git a/xCAT-server/share/xcat/tools/configBNT b/xCAT-server/share/xcat/tools/configBNT index 89e380103..c17271c52 100755 --- a/xCAT-server/share/xcat/tools/configBNT +++ b/xCAT-server/share/xcat/tools/configBNT @@ -4,9 +4,25 @@ # Configure Ethnet BNT switches #--------------------------------------------------------- +BEGIN +{ + $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat'; + $::XCATDIR = $ENV{'XCATDIR'} ? $ENV{'XCATDIR'} : '/etc/xcat'; +} +use lib "$::XCATROOT/lib/perl"; + + use strict; +use Socket; use Getopt::Long; use Expect; +use xCAT::Usage; +use xCAT::NodeRange; +use xCAT::NetworkUtils; +use xCAT::Utils; +use xCAT::Table; +use xCAT::MsgUtils; + my $args = join ' ', @ARGV; $::command = "$0 $args"; @@ -14,6 +30,10 @@ $::command = "$0 $args"; Getopt::Long::Configure("bundling"); $Getopt::Long::ignorecase = 0; +#global variables +my @nodes; +my @filternodes; + #--------------------------------------------------------- #Main @@ -22,13 +42,16 @@ $Getopt::Long::ignorecase = 0; if ( !GetOptions( 'h|help' => \$::HELP, - 'r|range=s' => \$::SWITCH, - 'p|port=s' => \$::PORT, - 'v|vlan=s' => \$::VLAN, - 'u|user=s' => \$::USER, - 'w|password=s' => \$::PASSWORD, - 'g|group=s' => \$::GROUP, + 'range=s' => \$::SWITCH, + 'port=s' => \$::PORT, + 'vlan=s' => \$::VLAN, + 'user=s' => \$::USER, + 'password=s' => \$::PASSWORD, + 'group=s' => \$::GROUP, 'snmp' => \$::SNMP, + 'ip' => \$::IP, + 'name' => \$::NAME, + 'all' => \$::ALL, ) ) { @@ -43,54 +66,146 @@ if ($::HELP) exit(0); } -my $switch; -if ($::SWITCH) -{ - $switch = $::SWITCH; +if ($::SWITCH) { + my @filternodes = xCAT::NodeRange::noderange( $::SWITCH ); + if (nodesmissed) { + my $nodenotdefined = join(',', nodesmissed); + xCAT::MsgUtils->message("I","The following nodes are not defined in xCAT DB: $nodenotdefined"); + } + foreach (@filternodes) { + push @nodes, $_; + } + unless (@nodes) { + xCAT::MsgUtils->message("E","No Valid Switch to process"); + exit(1); + } } else { + xCAT::MsgUtils->message("E","Invalid flag, please provide switches with --range"); &usage; exit(1); } +my $switches = join(",",@nodes); my $cmd; - my $vlan; my $port; -if ($::VLAN) -{ - if ($::PORT) { - $port = $::PORT; - } else { - print "Need port number to set up VLAN\n"; - &usage; - exit(1); - } - $vlan = $::VLAN; - print "Tagging VLAN=$vlan for $switch port $port\n"; - #create vlan - #tagged vlan - $cmd = `xdsh $switch --devicetype EthSwitch::BNT "enable;configure terminal;vlan $vlan;exit;interface port $port;switchport mode trunk;switchport trunk allowed vlan $vlan;write memory;exit;exit"`; +my $sub_req; +my $switch; +my $rc; + +if ($::ALL) { + config_ip(); + config_hostname(); + config_snmp(); } +if ($::IP) +{ + config_ip(); +} + +if ($::NAME) +{ + config_hostname(); +} +if ($::SNMP) +{ + config_snmp(); +} +if ($::VLAN) +{ + config_vlan(); +} + +sub config_ip { + + my $nodetab = xCAT::Table->new('hosts'); + my $nodehash = $nodetab->getNodesAttribs(\@nodes,['otherinterfaces']); + foreach my $switch (@nodes) { + print "change $switch to static ip address\n"; + my $dip= $nodehash->{$switch}->[0]->{otherinterfaces}; + + #get hostname + my $dswitch = xCAT::NetworkUtils->gethostname($dip); + + #if not defined, need to create one for xdsh to use + if (!$dswitch) { + my $ip_str = $dip; + $ip_str =~ s/\./\-/g; + $dswitch = "switch-$ip_str"; + #is there other way we can check if this node is defined in the xCATdb + $cmd = "lsdef $dswitch"; + $rc= xCAT::Utils->runcmd($cmd, 0); + if ($::RUNCMD_RC != 0) { + $cmd = "mkdef -t node -o $dswitch groups=switch ip=$dip switchtype=BNT username=root password=admin protocol=telnet nodetype=switch"; + $rc= xCAT::Utils->runcmd($cmd, 0); + } + } + #check if it is in the /etc/hosts + my $output = `grep $dswitch /etc/hosts`; + if ( !$output ) { + $cmd = "makehosts $dswitch"; + $rc= xCAT::Utils->runcmd($cmd, 0); + } + # verify if xdsh works + $cmd = "xdsh $dswitch --devicetype EthSwitch::BNT 'enable;configure terminal;exit' "; + $rc= xCAT::Utils->runcmd($cmd, 0); + if ($::RUNCMD_RC != 0) { + xCAT::MsgUtils->message("E","Couldn't communicate with $dswitch, $dip"); + next; + } + #change to static ip address + my $static_ip = xCAT::NetworkUtils->getipaddr($switch); + if (!$static_ip){ + xCAT::MsgUtils->message("E","static ip is not defined for $switch"); + next; + } + $cmd="xdsh $dswitch -t 10 --devicetype EthSwitch::BNT 'enable;configure terminal;show interface ip;interface ip 1;ip address $static_ip;exit;exit' "; + $rc= xCAT::Utils->runcmd($cmd, 0); + print "finish setup static ip address for $switch\n"; + + #update switch status + $cmd = "chdef $switch status=ip_configed otherinterface="; + $rc= xCAT::Utils->runcmd($cmd, 0); + + #remove discover switch from xCATdb and /etc/hosts + $cmd = "makehosts -d $dswitch"; + $rc= xCAT::Utils->runcmd($cmd, 0); + $cmd = "rmdef $dswitch"; + $rc= xCAT::Utils->runcmd($cmd, 0); + } +} + +sub config_hostname { + my $switchtab = xCAT::Table->new('switches'); + my $switchhash = $switchtab->getNodesAttribs(\@nodes,['sshusername','sshpassword']); + foreach my $switch (@nodes) { + my $user= $switchhash->{$switch}->[0]->{sshusername}; + my $pwd= $switchhash->{$switch}->[0]->{sshpassword}; + if ((!$user)||(!$pwd)) { + print "switch ssh username or password is not define, add default one\n"; + $cmd = "chdef $switch username=root password=admin"; + $rc= xCAT::Utils->runcmd($cmd, 0); + } + $cmd="xdsh $switch --devicetype EthSwitch::BNT 'enable;configure terminal;hostname $switch;write memory' "; + $rc= xCAT::Utils->runcmd($cmd, 0); + if ($::RUNCMD_RC != 0) { + xCAT::MsgUtils->message("E","Failed to setup hostname for $switch"); + next; + } + #update switch status + $cmd = "chdef $switch status=hostname_configed" ; + $rc= xCAT::Utils->runcmd($cmd, 0); + } +} + + #setup secure SNMP v3 -if ($::SNMP){ - 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 = "$switch>"; - my $enable_prompt="$switch#"; - my $config_prompt="^.*\\\(config\\\)\#"; - - $mysw = new Expect; - my $timeout = 20; - my $login_cmd = "telnet $switch\r"; - my $passwd = "admin\r"; +sub config_snmp { my $snmp_user; my $snmp_passwd; my $snmp_group; + if ($::USER) { $snmp_user = $::USER; } else { @@ -107,99 +222,132 @@ if ($::SNMP){ } else { $snmp_group = "xcatgroup\r"; } - print "Setup SNMP server for user=$snmp_user, password=$snmp_passwd, group=$snmp_group\n"; - #create a SNMP user - my $cfg_user1="snmp-server user 5 name $snmp_user\r"; - my $cfg_user2="snmp-server user 5 authentication-protocol sha authentication-password\r"; - #create a SNMP group - my $cfg_group1="snmp-server group 5 group-name $snmp_group\r"; - my $cfg_group2="snmp-server group 5 user-name $snmp_user\r"; - my $cfg_group3="snmp-server group 5 security usm\r"; - #Add access permission - my $cfg_access1="snmp-server access 5 name $snmp_group\r"; - my $cfg_access2="snmp-server access 5 level authNoPriv\r"; - my $cfg_access3="snmp-server access 5 security usm\r"; - my $cfg_access4="snmp-server access 5 read-view iso\r"; - $mysw->slave->stty(qw(sane -echo)); + foreach my $switch (@nodes) { + my $mysw; + my $enable_cmd="enable\r"; + my $config_cmd="configure terminal\r"; + my $exit_cmd="exit\r"; - unless ($mysw->spawn($login_cmd)) - { + my $pwd_prompt = "password: "; + my $sw_prompt = "$switch>"; + my $enable_prompt="$switch#"; + my $config_prompt="^.*\\\(config\\\)\#"; + + $mysw = new Expect; + my $timeout = 20; + my $login_cmd = "telnet $switch\r"; + my $passwd = "admin\r"; + + print "Setup SNMP server for $switch\n"; + #create a SNMP user + my $cfg_user1="snmp-server user 5 name $snmp_user\r"; + my $cfg_user2="snmp-server user 5 authentication-protocol sha authentication-password\r"; + #create a SNMP group + my $cfg_group1="snmp-server group 5 group-name $snmp_group\r"; + my $cfg_group2="snmp-server group 5 user-name $snmp_user\r"; + my $cfg_group3="snmp-server group 5 security usm\r"; + #Add access permission + my $cfg_access1="snmp-server access 5 name $snmp_group\r"; + my $cfg_access2="snmp-server access 5 level authNoPriv\r"; + my $cfg_access3="snmp-server access 5 security usm\r"; + my $cfg_access4="snmp-server access 5 read-view iso\r"; + + $mysw->slave->stty(qw(sane -echo)); + + unless ($mysw->spawn($login_cmd)) + { + $mysw->soft_close(); + print "Unable to run $login_cmd\n"; + next; + } + my @result = $mysw->expect( + $timeout, + [ + $pwd_prompt, + sub { + $mysw->clear_accum(); + $mysw->send("$passwd\r"); + $mysw->clear_accum(); + $mysw->exp_continue(); + } + ], + [ + "-re", $sw_prompt, + sub { + $mysw->clear_accum(); + $mysw->send($enable_cmd); + $mysw->exp_continue(); + } + ], + [ + "-re", $enable_prompt, + sub { + $mysw->clear_accum(); + $mysw->send($config_cmd); + $mysw->exp_continue(); + } + ], + [ + "-re", $config_prompt, + sub { + $mysw->clear_accum(); + $mysw->send($cfg_user1); + $mysw->send($cfg_user2); + $mysw->send($passwd); + $mysw->send($snmp_passwd); + $mysw->send($snmp_passwd); + sleep 1; + $mysw->clear_accum(); + # create snmp group + $mysw->send($cfg_group1); + $mysw->send($cfg_group2); + $mysw->send($cfg_group3); + $mysw->clear_accum(); + $mysw->send($cfg_access1); + $mysw->send($cfg_access2); + $mysw->send($cfg_access3); + $mysw->send($cfg_access4); + $mysw->clear_accum(); + $mysw->send("write memory\r"); + $mysw->send($exit_cmd); + $mysw->send($exit_cmd); + } + ], + ); + ########################################## + # Expect error - report and quit + ########################################## + if (defined($result[1])) + { + my $errmsg = $result[1]; + $mysw->soft_close(); + print "Failed expect command $errmsg\n"; + exit(1); + } $mysw->soft_close(); - print "Unable to run $login_cmd\n"; - next; + + #update switch status + $cmd = "chdef $switch status=switch_configed" ; + $rc= xCAT::Utils->runcmd($cmd, 0); } - my @result = $mysw->expect( - $timeout, - [ - $pwd_prompt, - sub { - $mysw->clear_accum(); - $mysw->send("$passwd\r"); - $mysw->clear_accum(); - $mysw->exp_continue(); - } - ], - [ - "-re", $sw_prompt, - sub { - #print "$switch: sending enable command: $enable_cmd\n"; - $mysw->clear_accum(); - $mysw->send($enable_cmd); - $mysw->exp_continue(); - } - ], - [ - "-re", $enable_prompt, - sub { - #print "$switch: sending config command: $config_cmd\n"; - $mysw->clear_accum(); - $mysw->send($config_cmd); - $mysw->exp_continue(); - } - ], - [ - "-re", $config_prompt, - sub { - $mysw->clear_accum(); - $mysw->send($cfg_user1); - $mysw->send($cfg_user2); - $mysw->send($passwd); - $mysw->send($snmp_passwd); - $mysw->send($snmp_passwd); - sleep 1; - $mysw->clear_accum(); - # create snmp group - $mysw->send($cfg_group1); - $mysw->send($cfg_group2); - $mysw->send($cfg_group3); - $mysw->clear_accum(); - $mysw->send($cfg_access1); - $mysw->send($cfg_access2); - $mysw->send($cfg_access3); - $mysw->send($cfg_access4); - $mysw->clear_accum(); - $mysw->send("write memory\r"); - $mysw->send($exit_cmd); - $mysw->send($exit_cmd); - } - ], - ); - ########################################## - # Expect error - report and quit - ########################################## - if (defined($result[1])) - { - my $errmsg = $result[1]; - $mysw->soft_close(); - print "Failed expect command $errmsg\n"; +} + +sub config_vlan { + if ($::PORT) { + $port = $::PORT; + } else { + &usage; exit(1); } - $mysw->soft_close(); + $vlan = $::VLAN; + print "Tagging VLAN=$vlan for $switches port $port\n"; + #create vlan, tagged vlan + $cmd = `xdsh $switches --devicetype EthSwitch::BNT "enable;configure terminal;vlan $vlan;exit;interface port $port;switchport mode trunk;switchport trunk allowed vlan $vlan;write memory;exit;exit"`; - } + #--------------------------------------------------------- =head3 usage @@ -213,8 +361,11 @@ sub usage { print "Usage: configBNT [-?│-h│--help] - configBNT [--range switchnames] [-p|--port port] [-v|--vlan vlan] - configBNT [--range switchnames] [--snmp] [-u|--user snmp_user] [-w|--password snmp_password] [-g|--group snmp_group] + configBNT [--range switchnames] [--all] + configBNT [--range switchnames] [--ip] + configBNT [--range switchnames] [--name ] + configBNT [--range switchnames] [--snmp] [--user snmp_user] [--password snmp_password] [--group snmp_group] + configBNT [--range switchnames] [--port port] [--vlan vlan] \n"; } diff --git a/xCAT-server/share/xcat/tools/configMellanox b/xCAT-server/share/xcat/tools/configMellanox index 647a3c2d6..ebf8db8f5 100755 --- a/xCAT-server/share/xcat/tools/configMellanox +++ b/xCAT-server/share/xcat/tools/configMellanox @@ -4,9 +4,24 @@ # Configure Ethnet Mellonax switches #--------------------------------------------------------- +BEGIN +{ + $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat'; + $::XCATDIR = $ENV{'XCATDIR'} ? $ENV{'XCATDIR'} : '/etc/xcat'; +} +use lib "$::XCATROOT/lib/perl"; + + use strict; use Getopt::Long; use Expect; +use xCAT::Usage; +use xCAT::NodeRange; +use xCAT::NetworkUtils; +use xCAT::Utils; +use xCAT::Table; +use xCAT::MsgUtils; + my $args = join ' ', @ARGV; $::command = "$0 $args"; @@ -14,6 +29,10 @@ $::command = "$0 $args"; Getopt::Long::Configure("bundling"); $Getopt::Long::ignorecase = 0; +#global variables +my @nodes; +my @filternodes; + #--------------------------------------------------------- #Main @@ -21,10 +40,12 @@ $Getopt::Long::ignorecase = 0; # parse the options if ( !GetOptions( - 'h|help' => \$::HELP, - 'r|range=s' => \$::SWITCH, - 'u|user=s' => \$::USER, - 'i|ip=s' => \$::IP, + 'h|help' => \$::HELP, + 'range=s' => \$::SWITCH, + 'config' => \$::CONFIG, + 'ip' => \$::IP, + 'name' => \$::NAME, + 'all' => \$::ALL, ) ) { @@ -39,61 +60,177 @@ if ($::HELP) exit(0); } -my $switch; if ($::SWITCH) { - $switch = $::SWITCH; + my @filternodes = xCAT::NodeRange::noderange( $::SWITCH ); + if (nodesmissed) { + my $nodenotdefined = join(',', nodesmissed); + xCAT::MsgUtils->message("I","The following nodes are not defined in xCAT DB: $nodenotdefined"); + } + foreach (@filternodes) { + push @nodes, $_; + } + unless (@nodes) { + xCAT::MsgUtils->message("E","No Valid Switch to process"); + exit(1); + } } else { + xCAT::MsgUtils->message("E","Invalid flag, please provide switches with --range"); &usage; exit(1); } +my $switches = join(",",@nodes); my $user; - -if ($::USER) -{ - $user = $::USER; -} else { - &usage; - exit(1); -} - -my $ip; -if ($::IP) -{ - $ip = $::IP; -} else { - &usage; - exit(1); -} - - my $cmd; +my $switch; +my $rc; +my $master; -#default root/password and protcol for Mellonax switch -$cmd = `chtab switch=$switch switches.sshusername=$user`; -print $cmd; +if ($::ALL) { + config_ip(); + config_hostname(); + run_rspconfig(); +} +if ($::IP) { + config_ip(); +} -#call rspconfig command to setup switch -#enable ssh -$cmd=`rspconfig $switch sshcfg=enable`; -print $cmd; +if ($::NAME) { + config_hostname(); +} -#enable snmp function on the switch -$cmd=`rspconfig $switch snmpcfg=enable`; -print $cmd; -#enable the snmp trap -$cmd=`rspconfig $switch alert=enable`; -print $cmd; +if ($::CONFIG) +{ + run_rspconfig(); +} -#Logging destination: -$cmd=`rspconfig $switch logdest=$ip`; -print $cmd; -#config ntp -$cmd = `xdsh $switch -l $user --devicetype IBSwitch::Mellanox "enable;configure terminal;ntp enable;ntpdate $ip; ntp server $ip;configuration write;show ntp" `; -print $cmd; +sub config_ip { + # get host table for otherinterfaces + my $nodetab = xCAT::Table->new('hosts'); + my $nodehash = $nodetab->getNodesAttribs(\@nodes,['otherinterfaces']); + # get netmask from network table + my $nettab = xCAT::Table->new("networks"); + my @nets; + if ($nettab) { + @nets = $nettab->getAllAttribs('net','mask'); + } + foreach my $switch (@nodes) { + print "change $switch to static ip address\n"; + my $dip= $nodehash->{$switch}->[0]->{otherinterfaces}; + + #get hostname + my $dswitch = xCAT::NetworkUtils->gethostname($dip); + + #if not defined, need to create one for xdsh to use + if (!$dswitch) { + my $ip_str = $dip; + $ip_str =~ s/\./\-/g; + $dswitch = "switch-$ip_str"; + #is there other way we can check if this node is defined in the xCATdb + $cmd = "lsdef $dswitch"; + $rc= xCAT::Utils->runcmd($cmd, 0); + if ($::RUNCMD_RC != 0) { + $cmd = "mkdef -t node -o $dswitch groups=switch ip=$dip switchtype=Mellanox username=admin nodetype=switch"; + $rc= xCAT::Utils->runcmd($cmd, 0); + } + } + #check if it is in the /etc/hosts + my $output = `grep $dswitch /etc/hosts`; + if ( !$output ) { + $cmd = "makehosts $dswitch"; + $rc= xCAT::Utils->runcmd($cmd, 0); + } + # verify if xdsh works + $cmd = "xdsh $dswitch -l admin --devicetype IBSwitch::Mellanox 'enable;configure terminal;exit' "; + $rc= xCAT::Utils->runcmd($cmd, 0); + if ($::RUNCMD_RC != 0) { + xCAT::MsgUtils->message("E","Couldn't communicate with $dswitch, $dip"); + next; + } + #change to static ip address + my $static_ip = xCAT::NetworkUtils->getipaddr($switch); + if (!$static_ip){ + xCAT::MsgUtils->message("E","static ip is not defined for $switch"); + next; + } + #get netmask + my $mask; + foreach my $net (@nets) { + if (xCAT::NetworkUtils::isInSameSubnet( $net->{'net'}, $static_ip, $net->{'mask'}, 0)) { + $mask=$net->{'mask'}; + } + } + + $cmd="xdsh $dswitch -t 10 -l admin --devicetype IBSwitch::Mellanox 'enable;configure terminal;no interface mgmt0 dhcp;interface mgmt0 ip address $static_ip $mask;configuration write;exit;exit' "; + $rc= xCAT::Utils->runcmd($cmd, 0); + + #update switch status + $cmd = "chdef $switch status=ip_configed otherinterface="; + $rc= xCAT::Utils->runcmd($cmd, 0); + + #remove discover switch from xCATdb and /etc/hosts + $cmd = "makehosts -d $dswitch"; + $rc= xCAT::Utils->runcmd($cmd, 0); + $cmd = "rmdef $dswitch"; + $rc= xCAT::Utils->runcmd($cmd, 0); + } +} + +sub config_hostname { + my $switchtab = xCAT::Table->new('switches'); + my $switchhash = $switchtab->getNodesAttribs(\@nodes,['sshusername']); + foreach my $switch (@nodes) { + my $user= $switchhash->{$switch}->[0]->{sshusername}; + if (!$user) { + print "switch ssh username is not defined, add default one\n"; + $cmd = "chdef $switch username=admin"; + $rc= xCAT::Utils->runcmd($cmd, 0); + $user="admin"; + } + $cmd="xdsh $switch -l $user --devicetype IBSwitch::Mellanox 'enable;configure terminal;hostname $switch;configuration write' "; + $rc= xCAT::Utils->runcmd($cmd, 0); + if ($::RUNCMD_RC != 0) { + xCAT::MsgUtils->message("E","Failed to setup hostname for $switch"); + next; + } + #update switch status + $cmd = "chdef $switch status=hostname_configed" ; + $rc= xCAT::Utils->runcmd($cmd, 0); + } +} + +sub run_rspconfig { + my $switchtab = xCAT::Table->new('switches'); + my $switchhash = $switchtab->getNodesAttribs(\@nodes,['sshusername']); + $master = `hostname -i`; + print "master=$master\n"; + foreach my $switch (@nodes) { + my $user= $switchhash->{$switch}->[0]->{sshusername}; + #call rspconfig command to setup switch + #enable ssh + $cmd=`rspconfig $switch sshcfg=enable`; + + #enable snmp function on the switch + $cmd=`rspconfig $switch snmpcfg=enable`; + + #enable the snmp trap + $cmd=`rspconfig $switch alert=enable`; + + #Logging destination: + $cmd=`rspconfig $switch logdest=$master`; + + #config ntp + $cmd = `xdsh $switch -l $user --devicetype IBSwitch::Mellanox "enable;configure terminal;ntp enable;ntpdate $master; ntp server $master;configuration write;show ntp" `; + + #update switch status + $cmd = "chdef $switch status=switch_configed" ; + $rc= xCAT::Utils->runcmd($cmd, 0); + } + +} #--------------------------------------------------------- @@ -108,7 +245,10 @@ sub usage { print "Usage: configMellonax [-?│-h│--help] - configMellonax [--range switchnames] [-u|--user sshusername] [-i|--ip xcatMN_ip_address] + configMellonax [--range switchnames] [--all] + configMellonax [--range switchnames] [--ip] + configMellonax [--range switchnames] [--name] + configMellonax [--range switchnames] [--config] \n"; }