2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2025-05-24 20:52:08 +00:00
xcat-core/xCAT-probe/subcmds/switch_macmap
cxhong cc158f7755 Create switchprobe link during xCAT-probe installation (#5272)
* Create switchprobe link during xCAT-probe installation

* remove debug message

* Modify upgrade path

* make symbolic link
2018-06-07 10:04:54 +08:00

133 lines
3.5 KiB
Perl
Executable File

#! /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 <noderange> [-c] [-V]
Description:
To retrieve MAC address mapping for the specified switch, or all the switches defined in switches table in xCAT db.
Currently, this command does not support hierarchy.
Options:
-c: Check if the switch is OK to retrieve MAC address mapping.
-V: Output verbose information when accessing the 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 supported");
probe_utils->send_msg("$output", "d", $::USAGE);
exit 1;
}
foreach (@ARGV) {
if (/^-\w*/) {
probe_utils->send_msg("$output", "f", "Option $_ not supported");
exit 1;
} else {
push @nodes, $_;
}
}
if ($help) {
probe_utils->send_msg("$output", "d", $::USAGE);
exit 0;
}
if ($test) {
`$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. Currently, this command does not support hierarchy.");
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 = ();
my @error_nodes = ();
# There is 2 kinds of error message:
# 1. Error: The nodetype is not 'switch' for nodes: switch1
# Error: No switch configuration info find for switch-10-5-23-1
# 2. switch-10-5-23-1: Error: Timeout
foreach (<$fd>) {
chomp($_);
if (/Error:/) {
if (/^(\S*):\s*Error:\s*(.*)/) {
push @fails, "$1 - $2";
} elsif (/^Error:\s*The nodetype is not 'switch' for nodes: (.+)/) {
push @error_nodes, "$1";
} elsif (/^Error:\s*(.*)/) {
push @fails, $1;
} else {
push @fails, $_;
}
}
elsif (/^(\S*):\s*PASS/) {
probe_utils->send_msg("$output", "o", "$1");
}
else {
probe_utils->send_msg("$output", "d", $_);
}
}
close($fd);
my $rc = 0;
if (-f $normal_file) {
unlink($normal_file);
}
if (-f $error_file) {
unlink($error_file);
}
if (@error_nodes) {
my $error_node = join(",", @error_nodes);
probe_utils->send_msg("$output", "d", "[$error_node] : Error, switch-macmap can only be run against xCAT objects that have 'nodetype=switch'");
$rc = 1;
}
foreach (@fails) {
probe_utils->send_msg("$output", "f", "$_");
$rc = 1;
}
exit $rc;