Heray-Was-Here
Server : Apache
System : Linux vps103298.mylogin.co 4.18.0-513.11.1.el8_9.x86_64 #1 SMP Wed Jan 17 02:00:40 EST 2024 x86_64
User : calvet ( 273824)
PHP Version : 7.4.33
Disable Function : NONE
Directory :  /proc/thread-self/root/usr/share/perl5/vendor_perl/Ocsinventory/Agent/Backend/IpDiscover/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //proc/thread-self/root/usr/share/perl5/vendor_perl/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;
    my $common = $params->{common};
    my $prologresp = $params->{prologresp};
    my $logger = $params->{logger};
    
    return unless $common->can_run("nmap");
    return unless $common->can_load("Nmap::Parser");
  
    my $scan_type = $prologresp->getOptionsInfoByName("IPDISCOVER");
    # scan type check 
    if ($scan_type->[0] && exists($scan_type->[0]->{SCAN_TYPE_IPDISCOVER}) && $scan_type->[0]->{SCAN_TYPE_IPDISCOVER} eq "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)) {
                    $logger->debug("Will be using NMAP for IpDiscover scan based on SCAN_TYPE_IPDISCOVER config option");
                    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;

Hry