my
$if_name_map
= {
Vl
=>
"Vlan"
,
Lo
=>
"Loopback"
,
Eth
=>
"Ethernet"
,
Po
=>
"Port-channel"
,
};
sub
arpnip {
my
(
$self
,
$hostlabel
,
$ssh
,
$args
) =
@_
;
debug
"$hostlabel $$ arpnip()"
;
my
(
$pty
,
$pid
) =
$ssh
->open2pty;
unless
(
$pty
) {
warn
"unable to run remote command [$hostlabel] "
.
$ssh
->error;
return
();
}
my
$expect
= Expect->init(
$pty
);
$expect
->raw_pty(1);
my
(
$pos
,
$error
,
$match
,
$before
,
$after
);
my
$prompt
=
qr/# +$/
;
my
$timeout
= 60;
(
$pos
,
$error
,
$match
,
$before
,
$after
) =
$expect
->expect(
$timeout
, -re,
$prompt
);
$expect
->
send
(
"show ip vrf | except VRF-Name | no-more \n"
);
(
$pos
,
$error
,
$match
,
$before
,
$after
) =
$expect
->expect(
$timeout
, -re,
$prompt
);
my
@vrfs
=
split
(/\R/,
$before
);
my
$vrf_re
=
qr/^([a-z\-_0-9\.]+)\s+.+$/
i;
my
$iparp_re
=
qr/^((\d{1,3}\.){3}\d{1,3})\s*(([0-9a-f]{2}[:-]){5}[0-9a-f]{2})\s+.+$/
i;
my
@arpentries
;
foreach
my
$vrf_line
(
@vrfs
) {
my
$vrf_name
;
if
(
$vrf_line
&&
$vrf_line
=~ m/
$vrf_re
/) {
$vrf_name
= $1;
}
else
{
next
;
}
my
$vrf_cmd
=
sprintf
(
"show ip arp vrf %s | no-more \n"
,
$vrf_name
) ;
$expect
->
send
(
$vrf_cmd
);
(
$pos
,
$error
,
$match
,
$before
,
$after
) =
$expect
->expect(
$timeout
, -re,
$prompt
);
my
@iparps
=
split
(/\R/,
$before
);
foreach
my
$iparp_line
(
@iparps
) {
if
(
$iparp_line
&&
$iparp_line
=~ m/
$iparp_re
/) {
push
(
@arpentries
, {
ip
=> $1,
mac
=> $3 });
}
}
}
return
@arpentries
;
}
sub
macsuck {
my
(
$self
,
$hostlabel
,
$ssh
,
$args
) =
@_
;
debug
"$hostlabel $$ macsuck()"
;
my
$cmds
=
<<EOF;
show mac address-table | no-more
EOF
my
@data
=
$ssh
->capture({
stdin_data
=>
$cmds
});
chomp
@data
;
if
(
$ssh
->error) {
info
"$hostlabel $$ error in SSH command "
.
$ssh
->error;
return
}
my
$re_mac_line
=
qr/^(\d+)\s+((([0-9a-f]{2}[:-]){5})[0-9a-f]{2})\s+\w+\s+([a-z]+.*)$/
i;
my
$macentries
= {};
foreach
my
$line
(
@data
) {
if
(
$line
&&
$line
=~ m/
$re_mac_line
/) {
my
$port
= $5;
my
$vlan
= $1;
++
$macentries
->{
$vlan
}->{
$port
}->{mac_as_ieee($2)};
}
}
return
$macentries
;
}
1;