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;
    my $common = $params->{common};
  
    return unless $common->can_run("nmap");
    return unless $common->can_load("Nmap::Parser");
  
    # 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 $common = $params->{common};
    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;
    }
  
    unless ($network =~ /^\d+\.\d+\.\d+\.\d+$/) {
        return;
    }
  
    #Let's go scanning the network and parsing the results
    $logger->debug("Scanning the $network network");
    my $nmaparser = new Nmap::Parser;
    $nmaparser->parsescan("nmap","-sn","-PR","$network/24");
  
    for my $host ($nmaparser->all_hosts("up")){
        my $ip = $host->addr;
        my $mac = $host->mac_addr;
        my $hostname = $host->hostname;
  
        if ($hostname eq 0) {
            $hostname = undef;     #it's better to send nothing instead of a '0'
        }
  
        if ($mac) {
            $logger->debug("Host $ip found using Nmap. Adding informations in XML");
            # Feeding the Inventory XML
            $common->addIpDiscoverEntry({
                IPADDRESS => $ip,
                MACADDR => lc($mac),
                NAME => $hostname,
            });
        }
    }
}

1;
