/usr/local/CPAN/Ocsinventory-Agent/Ocsinventory/Agent/Backend/IpDiscover/IpDiscover.pm
package Ocsinventory::Agent::Backend::IpDiscover::IpDiscover;
use strict;
use warnings;
sub check { can_run ("ipdiscover") }
sub run {
my $params = shift;
my $inventory = $params->{inventory};
my $prologresp = $params->{prologresp};
my $logger = $params->{logger};
# Let's find network interfaces and call ipdiscover on it
my $options = $prologresp->getOptionsInfoByName("IPDISCOVER");
my $ipdisc_lat;
my $network;
if ($options->[0] && exists($options->[0]->{IPDISC_LAT}) && $options->[0]->{IPDISC_LAT}) {
$ipdisc_lat = $options->[0]->{IPDISC_LAT};
}
if ($options->[0] && exists($options->[0]->{content})) {
$network = $options->[0]->{content};
} else {
return;
}
$logger->debug("scanning the $network network");
my $legacymode;
if( `ipdiscover` =~ /binary ver. (\d+)/ ){
if(!($1>3)) {
$legacymode = 1;
$logger->debug("ipdiscover ver.$1: legacymode");
}
}
my $ifname;
foreach (`route -n`) {
if (/^(\d+\.\d+\.\d+\.\d+).*?\s(\S+)$/) {
if ($network eq $1) {
$ifname = $2;
last;
} elsif (!$ifname && $1 eq "0.0.0.0") {
$ifname = $2;
}
}
}
my $cmd = "ipdiscover $ifname ";
$cmd .= $ipdisc_lat if ($ipdisc_lat && !$legacymode);
foreach (`$cmd`) {
if (/<H><I>([\d\.]*)<\/I><M>([\w\:]*)<\/M><N>(\S*)<\/N><\/H>/) {
$inventory->addIpDiscoverEntry({
IPADDRESS => $1,
MACADDR => $2,
NAME => $3
});
}
}
}
1;