diff --git a/xCAT-probe/subcmds/switch-macmap b/xCAT-probe/subcmds/switch-macmap new file mode 100755 index 000000000..45eedbb2a --- /dev/null +++ b/xCAT-probe/subcmds/switch-macmap @@ -0,0 +1,124 @@ +#! /usr/bin/perl +# IBM(c) 2016 EPL license http://www.eclipse.org/legal/epl-v10.html +BEGIN { $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : -d '/opt/xcat' ? '/opt/xcat' : '/usr'; } + +use lib "$::XCATROOT/probe/lib/perl"; +use Cwd 'abs_path'; +use Cwd; +use File::Basename; +use File::Path; +use probe_utils; +use Getopt::Long qw(:config no_ignore_case); + +my $proname = basename("$0"); +my $currdir = dirname(abs_path($0)); +my $output = "stdout"; + +$::USAGE = "Usage: + $proname -h + $proname -t + $proname [-c] [-V] + +Description: + To retrieve MAC address mapping for the specified switch, or all the switches defined in switches table in xCAT db. + +Options: + -t: Check whether this script is OK to run. + -c: To check whether the switch is OK to retrieve MAC address mapping. + -V: Output verbose information when accessing switch +"; + +my $help; +my $test; +my $check; +my @nodes = (); +my $verbose = ''; +if (!GetOptions("help|h" => \$help, + "t" => \$test, + "c" => \$check, + "V" => \$verbose)) { + probe_utils->send_msg("$output", "f", "Option not support"); + probe_utils->send_msg("$output", "d", $::USAGE); + exit 1; +} +foreach (@ARGV) { + if (/^-\w*/) { + probe_utils->send_msg("$output", "f", "Option $_ not support"); + exit 1; + } else { + push @nodes, $_; + } +} +if ($help) { + probe_utils->send_msg("$output", "d", $::USAGE); + exit 0; +} +if ($test) { + if (! -d "$currdir/bin") { + mkpath("$currdir/bin/"); + } + if (! -e "$currdir/bin/switchprobe") { + link("$::XCATROOT/bin/xcatclient", "$currdir/bin/switchprobe"); + } + `$currdir/bin/switchprobe -h`; + if ($?) { + probe_utils->send_msg("$output", "f", "No switchprobe tool is available at $currdir/bin/"); + exit 1; + } else { + probe_utils->send_msg("$output", "o", "To retrieve MAC address mapping for the specified switch, or all the switches defined in switches table in xCAT db."); + exit 0; + } +} +if ($verbose) { + $verbose = "-V"; +} +my $noderange = join(',',@nodes); +my $normal_file = "/tmp/result_normal"; +my $error_file = "/tmp/result_error"; +if (-f $normal_file) { + unlink($normal_file); +} +if (-f $error_file) { + unlink($error_file); +} +if ($check) { + `$currdir/bin/switchprobe $noderange -c $verbose >$normal_file 2>$error_file`; +} +else { + `$currdir/bin/switchprobe $noderange $verbose >$normal_file 2>$error_file`; +} +if (-f $error_file) { + `cat $error_file >> $normal_file`; +} +my $fd; +open($fd, "<", "$normal_file"); +my %fails = (); +foreach (<$fd>) { + chomp($_); + if (/^(\S*):\s*(.*)/) { + my $switch = $1; + my $info = $2; + if (/PASS/) { + probe_utils->send_msg("$output", "o", "$switch"); + } elsif (/Error:/) { + $info =~ s/Error://; + $fails{$switch} = $info; + } else { + probe_utils->send_msg("$output", "d", "$_"); + } + } + else { + probe_utils->send_msg("$output", "d", $_); + } +} +close ($fd); +if (-f $normal_file) { + unlink($normal_file); +} +if (-f $error_file) { + unlink($error_file); +} +foreach (keys %fails) { + probe_utils->send_msg("$output", "f", "$_ - $fails{$_}"); +} +exit 0;