2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2025-05-29 09:13:08 +00:00

Merge pull request #1244 from cxhong/1036

Use arp command to get switch mac address
This commit is contained in:
Xiaopeng Wang 2016-06-14 22:33:27 +08:00 committed by GitHub
commit c44f9c2964
3 changed files with 40 additions and 22 deletions

View File

@ -4711,5 +4711,4 @@ sub get_nmapversion {
return $nmap_version;
}
1;

View File

@ -1163,6 +1163,7 @@ sub update_tables_with_diskless_image
nodes: a reference to nodes array
display: whether just display the result, if not 'yes', the result will
be written to the mac table.
nopping: will not call pping subroutine if it set as "nopping"
Returns:
Return a hash with node name as key
Globals:
@ -1170,7 +1171,7 @@ sub update_tables_with_diskless_image
Error:
none
Example:
xCAT::Utils->get_mac_by_arp($nodes, $display);
xCAT::Utils->get_mac_by_arp($nodes, $display, $nopping);
Comments:
=cut
@ -1178,26 +1179,28 @@ sub update_tables_with_diskless_image
#-------------------------------------------------------------------------------
sub get_mac_by_arp ()
{
my ($class, $nodes, $display) = @_;
my ($class, $nodes, $display, $nopping) = @_;
my $node;
my $data;
my %ret = ();
my $unreachable_nodes = "";
my $noderange = join (',', @$nodes);
my @output = xCAT::Utils->runcmd("/opt/xcat/bin/pping $noderange", -1);
foreach my $line (@output) {
my ($hostname, $result) = split ':', $line;
my ($token, $status) = split ' ', $result;
chomp($token);
if ($token eq 'ping') {
$node->{$hostname}->{reachable} = 1;
if ( $nopping ne "nopping" ) {
my @output = xCAT::Utils->runcmd("/opt/xcat/bin/pping $noderange", -1);
foreach my $line (@output) {
my ($hostname, $result) = split ':', $line;
my ($token, $status) = split ' ', $result;
chomp($token);
if ($token eq 'ping') {
$node->{$hostname}->{reachable} = 1;
}
}
}
foreach my $n ( @$nodes ) {
if ( $node->{$n}->{reachable} ) {
if ( ( $node->{$n}->{reachable} ) || ( $nopping eq "nopping" ) ){
my $output;
my $IP = xCAT::NetworkUtils::toIP( $n );
if ( xCAT::Utils->isAIX() ) {

View File

@ -13,6 +13,7 @@ use xCAT::Usage;
use xCAT::NodeRange;
use xCAT::NetworkUtils;
use xCAT::Utils;
use xCAT::SvrUtils;
use XML::Simple;
no strict;
use Data::Dumper;
@ -826,13 +827,19 @@ sub snmp_scan {
my $ranges = get_ip_ranges($request);
#use nmap to find if snmp port is enabled
# only open port will be scan
##########################################################
#use nmap to parse the ip range and possible output from the command:
# Nmap scan report for switch-10-5-22-1 (10.5.22.1) 161/udp open snmp
# Nmap scan report for 10.5.23.1 161/udp open snmp
# Nmap scan report for 10.5.24.1 161/udp closed snmp
# Host 10.5.23.1 appears to be up ... good. 161/udp open|filtered snmp
# Host 10.5.24.1 appears to be up ... good. 161/udp closed snmp
##########################################################
my $nmap_version = xCAT::Utils->get_nmapversion();
if (xCAT::Utils->version_cmp($nmap_version,"5.10") < 0) {
$ccmd = "/usr/bin/nmap -P0 -v -sU -p 161 -oA snmp_scan @$ranges | grep up | grep good ";
$ccmd = "/usr/bin/nmap -P0 -v -sU -p 161 -oA snmp_scan @$ranges | grep -E 'appears to be up|^161' | perl -pe 's/\\n/ / if \$. % 2'";
} else {
$ccmd = "/usr/bin/nmap -P0 -v -sU -p 161 -oA snmp_scan @$ranges | grep 'open port 161' ";
$ccmd = "/usr/bin/nmap -P0 -v -sU -p 161 -oA snmp_scan @$ranges | grep -v 'host down' | grep -E 'Nmap scan report|^161' | perl -pe 's/\\n/ / if \$. % 2'";
}
if (exists($globalopt{verbose})) {
send_msg($request, 0, "Process command: $ccmd\n");
@ -855,19 +862,28 @@ sub snmp_scan {
foreach my $line (@lines) {
my @array = split / /, $line;
my $ip;
if (xCAT::Utils->version_cmp($nmap_version,"5.10") < 0) {
$ip = $array[1];
} else {
$ip = $array[5];
if ($line =~ /\b(\d{1,3}(?:\.\d{1,3}){3})\b/)
{
$ip = $1;
}
if (exists($globalopt{verbose})) {
send_msg($request, 0, "Run snmpwalk command to get information for $ip");
}
if ($line =~ /close/) {
send_msg($request, 0, "*** snmp port is disabled for $ip ***");
next;
}
my $vendor = get_snmpvendorinfo($request, $ip);
if ($vendor) {
my $mac = get_snmpmac($request, $ip);
my $display = "";
my $nopping = "nopping";
my $output = xCAT::SvrUtils->get_mac_by_arp([$ip], $display, $nopping);
my ($desc,$mac) = split /: /, $output->{$ip};
if (exists($globalopt{verbose})) {
send_msg($request, 0, "node: $ip, mac: $mac");
}
if (!$mac) {
$mac="nomac_nmap_$counter";
$counter++;