/usr/local/CPAN/Ocsinventory-Agent/Ocsinventory/Agent/Backend/IpDiscover/Nmap.pm
package Ocsinventory::Agent::Backend::IpDiscover::Nmap;
use vars qw($runMeIfTheseChecksFailed);
$runMeIfTheseChecksFailed = ["Ocsinventory::Agent::Backend::IpDiscover::IpDiscover"];
use strict;
use warnings;
sub check {
my $params = shift;
return unless can_run("nmap");
# Do we have nmap 3.90 (or >)
foreach (`nmap -v 2>&1`) {
if (/^Starting Nmap (\d+)\.(\d+)/) {
my $release = $1;
my $minor = $2;
if ($release > 3 || ($release > 3 && $minor >= 90)) {
return 1;
}
}
}
0;
}
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 $network;
if ($options->[0] && exists($options->[0]->{content})) {
$network = $options->[0]->{content};
} else {
return;
}
$logger->debug("scanning the $network network");
my $ip;
my $cmd = "nmap -sP -PR $network/24";
foreach (`$cmd`) {
print;
if (/^Host (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/) {
$ip = $1;
} elsif (/MAC Address: (\w{2}:\w{2}:\w{2}:\w{2}:\w{2}:\w{2})/) {
$inventory->addIpDiscoverEntry({
IPADDRESS => $ip,
MACADDR => lc($1),
});
}
}
}
1;