|
Packit |
db064d |
#!/usr/bin/perl
|
|
Packit |
db064d |
#
|
|
Packit |
db064d |
# Copyright (c) 2006 The Regents of the University of California.
|
|
Packit |
db064d |
# Copyright (c) 2007-2008 Voltaire, Inc. All rights reserved.
|
|
Packit |
db064d |
#
|
|
Packit |
db064d |
# Produced at Lawrence Livermore National Laboratory.
|
|
Packit |
db064d |
# Written by Ira Weiny <weiny2@llnl.gov>.
|
|
Packit |
db064d |
#
|
|
Packit |
db064d |
# This software is available to you under a choice of one of two
|
|
Packit |
db064d |
# licenses. You may choose to be licensed under the terms of the GNU
|
|
Packit |
db064d |
# General Public License (GPL) Version 2, available from the file
|
|
Packit |
db064d |
# COPYING in the main directory of this source tree, or the
|
|
Packit |
db064d |
# OpenIB.org BSD license below:
|
|
Packit |
db064d |
#
|
|
Packit |
db064d |
# Redistribution and use in source and binary forms, with or
|
|
Packit |
db064d |
# without modification, are permitted provided that the following
|
|
Packit |
db064d |
# conditions are met:
|
|
Packit |
db064d |
#
|
|
Packit |
db064d |
# - Redistributions of source code must retain the above
|
|
Packit |
db064d |
# copyright notice, this list of conditions and the following
|
|
Packit |
db064d |
# disclaimer.
|
|
Packit |
db064d |
#
|
|
Packit |
db064d |
# - Redistributions in binary form must reproduce the above
|
|
Packit |
db064d |
# copyright notice, this list of conditions and the following
|
|
Packit |
db064d |
# disclaimer in the documentation and/or other materials
|
|
Packit |
db064d |
# provided with the distribution.
|
|
Packit |
db064d |
#
|
|
Packit |
db064d |
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
Packit |
db064d |
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
Packit |
db064d |
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
Packit |
db064d |
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
Packit |
db064d |
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
Packit |
db064d |
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
Packit |
db064d |
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
Packit |
db064d |
# SOFTWARE.
|
|
Packit |
db064d |
#
|
|
Packit |
db064d |
|
|
Packit |
db064d |
use strict;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
use Getopt::Std;
|
|
Packit |
db064d |
use IBswcountlimits;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
printf (STDERR "*** WARNING ***: this command is deprecated; Please use \"ibrouters\"\n\n");
|
|
Packit |
db064d |
|
|
Packit |
db064d |
# =========================================================================
|
|
Packit |
db064d |
#
|
|
Packit |
db064d |
sub usage_and_exit
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
my $prog = $_[0];
|
|
Packit |
db064d |
print "Usage: $prog [-R -l] [-G <rt_guid> | <node_name>]\n";
|
|
Packit |
db064d |
print " print only the rt specified from the ibnetdiscover output\n";
|
|
Packit |
db064d |
print " -R Recalculate ibnetdiscover information\n";
|
|
Packit |
db064d |
print " -l list rts\n";
|
|
Packit |
db064d |
print " -C <ca_name> use selected channel adaptor name for queries\n";
|
|
Packit |
db064d |
print " -P <ca_port> use selected channel adaptor port for queries\n";
|
|
Packit |
db064d |
print " -G node is specified with GUID\n";
|
|
Packit |
db064d |
exit 2;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
my $argv0 = `basename $0`;
|
|
Packit |
db064d |
my $regenerate_map = undef;
|
|
Packit |
db064d |
my $list_rts = undef;
|
|
Packit |
db064d |
my $ca_name = "";
|
|
Packit |
db064d |
my $ca_port = "";
|
|
Packit |
db064d |
my $name_is_guid = "no";
|
|
Packit |
db064d |
chomp $argv0;
|
|
Packit |
db064d |
if (!getopts("hRlC:P:G")) { usage_and_exit $argv0; }
|
|
Packit |
db064d |
if (defined $Getopt::Std::opt_h) { usage_and_exit $argv0; }
|
|
Packit |
db064d |
if (defined $Getopt::Std::opt_R) { $regenerate_map = $Getopt::Std::opt_R; }
|
|
Packit |
db064d |
if (defined $Getopt::Std::opt_l) { $list_rts = $Getopt::Std::opt_l; }
|
|
Packit |
db064d |
if (defined $Getopt::Std::opt_C) { $ca_name = $Getopt::Std::opt_C; }
|
|
Packit |
db064d |
if (defined $Getopt::Std::opt_P) { $ca_port = $Getopt::Std::opt_P; }
|
|
Packit |
db064d |
if (defined $Getopt::Std::opt_G) { $name_is_guid = "yes"; }
|
|
Packit |
db064d |
|
|
Packit |
db064d |
my $target_rt = $ARGV[0];
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if ($name_is_guid eq "yes") {
|
|
Packit |
db064d |
$target_rt = format_guid($target_rt);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
my $cache_file = get_cache_file($ca_name, $ca_port);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if ($regenerate_map || !(-f "$cache_file")) {
|
|
Packit |
db064d |
generate_ibnetdiscover_topology($ca_name, $ca_port);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if ($list_rts) {
|
|
Packit |
db064d |
system("ibrouters $cache_file");
|
|
Packit |
db064d |
exit 1;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if ($target_rt eq "") {
|
|
Packit |
db064d |
usage_and_exit $argv0;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
# =========================================================================
|
|
Packit |
db064d |
#
|
|
Packit |
db064d |
sub main
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
my $found_rt = 0;
|
|
Packit |
db064d |
open IBNET_TOPO, "<$cache_file" or die "Failed to open ibnet topology\n";
|
|
Packit |
db064d |
my $in_rt = "no";
|
|
Packit |
db064d |
my %ports = undef;
|
|
Packit |
db064d |
while (my $line = <IBNET_TOPO>) {
|
|
Packit |
db064d |
if ($line =~ /^Rt.*\"R-(.*)\"\s+# (.*)/) {
|
|
Packit |
db064d |
my $guid = $1;
|
|
Packit |
db064d |
my $desc = $2;
|
|
Packit |
db064d |
if ($in_rt eq "yes") {
|
|
Packit |
db064d |
$in_rt = "no";
|
|
Packit |
db064d |
foreach my $port (sort { $a <=> $b } (keys %ports)) {
|
|
Packit |
db064d |
print $ports{$port};
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
if ("0x$guid" eq $target_rt || $desc =~ /[\s\"]$target_rt[\s\"]/) {
|
|
Packit |
db064d |
print $line;
|
|
Packit |
db064d |
$in_rt = "yes";
|
|
Packit |
db064d |
$found_rt++;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
if ($line =~ /^Switch.*/ || $line =~ /^Ca.*/) { $in_rt = "no"; }
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if ($line =~ /^\[(\d+)\].*/ && $in_rt eq "yes") {
|
|
Packit |
db064d |
$ports{$1} = $line;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
if ($found_rt == 0) {
|
|
Packit |
db064d |
die "\"$target_rt\" not found\n" .
|
|
Packit |
db064d |
" Try running with the \"-R\" option.\n" .
|
|
Packit |
db064d |
" If still not found the node is probably down.\n";
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
if ($found_rt > 1) {
|
|
Packit |
db064d |
print "\nWARNING: Found $found_rt Router's with the name \"$target_rt\"\n";
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
close IBNET_TOPO;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
main
|
|
Packit |
db064d |
|