use arp protocal to get the mac address

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@3770 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
wanghuaz 2009-07-14 12:16:11 +00:00
parent 5687308766
commit fa930de11a

View File

@ -278,6 +278,68 @@ sub process_command {
$children++;
}
}
} elsif ( $request->{command} =~ /^(getmacs)$/ && exists( $request->{opt}->{arp} ) ) {
my $node;
my $data;
my $unreachable_nodes;
my $noderange = join (',', @$nodes);
my @output = xCAT::Utils->runcmd("pping $noderange", -1);
foreach my $line (@output) {
my ($hostname, $result) = split ':', $line;
$node->{$hostname}->{reachable} = 1;
}
foreach ( @$nodes ) {
if ( $node->{$_}->{reachable} ) {
my $output;
my $IP = xCAT::Utils::toIP( $_ );
if ( xCAT::Utils->isAIX() ) {
$output = `/usr/sbin/arp -a`;
} else {
$output = `/sbin/arp -n`;
}
my ($ip, $mac);
my @lines = split /\n/, $output;
foreach my $line ( @lines ) {
if ( xCAT::Utils->isAIX() && $line =~ /\((\S+)\)\s+at\s+(\S+)/ ) {
($ip, $mac) = ($1,$2);
######################################################
# Change mac format to be same as linux. For example:
# '0:d:60:f4:f8:22' to '00:0d:60:f4:f8:22'
######################################################
if ( $mac)
{
my @mac_sections = split /:/, $mac;
for (@mac_sections)
{
$_ = "0$_" if ( length($_) == 1);
}
$mac = join ':', @mac_sections;
}
} elsif ( $line =~ /^(\S+)+\s+\S+\s+(\S+)\s/ ) {
($ip, $mac) = ($1,$2);
} else {
($ip, $mac) = (undef,undef);
}
if ( @$IP[1] !~ $ip ) {
($ip, $mac) = (undef,undef);
} else {
last;
}
}
if ( $ip && $mac ) {
$callback->({data=>["$_:"]});
$callback->({data=>["#IP MAC"]});
$callback->({data=>["$ip $mac\n"]});
$callback->({node=>[{name=>[$_],data=>["\n#IP MAC\n$ip $mac\n"]}]});
}
} else {
$unreachable_nodes = join (",", $_, $unreachable_nodes);
}
}
$callback->({data=>["Unreachable Nodes:"]});
$callback->({data=>["$unreachable_nodes\n"]});
} else {
$SIG{CHLD} = sub { while (waitpid(-1, WNOHANG) > 0) { $children--; } };
my $hw;
@ -607,6 +669,10 @@ sub preprocess_nodes {
return( \%hcpgroup );
}
elsif ( $method =~ /^(getmacs)$/ && exists( $request->{opt}->{arp} ) ) {
return( $noderange );
}
##########################################
# Power control commands are grouped
# by CEC which is the smallest entity