OCS Inventory NG Forums

OCS Inventory NG, an OpenSource computer inventory and package deployement system for Windows and Unix

You are not logged in.

#1 2011-05-23 12:07:03

mick
Member
Registered: 2011-05-16
Posts: 15

Fontionnement ipdiscover & ipdiscover-util.pl

Bonjour,

Après avoir fait des recherches sur le forum et la doc, mon problème reste toujours sans réponses ....

Voici mon soucis : lors de l’utilisation de Ipdiscover je rencontre des petits problèmes, j'ai 2 machines élus sur mon réseau (réseau en /29) (un Linux et un Windows) elles remonte bien l’ensemble des postes non inventoriés.

Par contre je rencontre un soucis lorsque je veux utiliser la fonction analyse, tout les postes remontent avec le TYPE LINUX (que ce soit les imprimantes, les switch et les pc sous windows).

Si je lance en ligne de commande le script ipdiscover-util.pl avec les option suivante :

# perl ipdiscover-util.pl -cache -net=adresse_reseau -a -xml

J'obtiens le même résultat ...

Si je fait un scan sur une adresse ip particulière :

# perl ipdiscover-util.pl -ip=ip/mask -net=adresse_reseau -a -xml -cache

J'obtiens pour un pc <TYPE>Computer</TYPE>

Sur une imprimante ou un switch le champ type n'apparait plus ....

Est ce quelqu'un à déjà rencontré ce pb ?? Est ce normal ?? Quel est la solution à apporter ???

Remarque : je commence à configurer snmp qui semble bien fonctionner mais j'aimerai bien corriger ce problème quand même ...

Merci d'avance pour votre aide

Offline

#2 2011-05-24 14:03:28

mick
Member
Registered: 2011-05-16
Posts: 15

Re: Fontionnement ipdiscover & ipdiscover-util.pl

Re Bonjour,

Je viens apporter des précisions sur mon problème, avec ipdiscover.
Déjà je travail sous la dernière version stable du serveur OCS 2.0, j'y est appliqué les différents patchs de correction qui sont sorties. Je l'ai installé à partir des source sur une Debian 6.0.

Au niveaux de Ipdiscover une fois que mes machines sont remontés, je souhaite faire une analyse dessus pour savoir lesquels son des postes Windows et lesquels sont des Linux.
Quand je clique sur analysé tout remonte en linux.

J'ai donc décidé de faire des tests directement avec le script perl : ipdiscover-util.pl
j'ai d'abord tester la commande nmap du script  : nmap -R -v @ips -p 135,80,22,23 -oG $path/$filter.gnmap -P0 > /dev/null
et j'ai récupéré les fichiers *.gnmap de dans il y a bien des machines qui répondent aux conditions de postes windows et d'autre aux conditions de périphérique réseau ...
mais à la sortie final tout remonte comme linux ...
Est ce que d'autres personnes utilisent cette fonctionnalité, est que ce la fonctionne chez certain ??? sinon comment résoudre ce problème.
Merci d'avance ...

Offline

#3 2011-05-25 10:14:51

mick
Member
Registered: 2011-05-16
Posts: 15

Re: Fontionnement ipdiscover & ipdiscover-util.pl

ReRe Bonjour,

Bon j'ai enfin trouvé la solution à mon problème, il m'a été nécessaire de modifier le script :  ipdiscover-util.pl, le problème venait du traitement du fichier : $path/$filter.gnmap.
En effet avec avec la version nmap utilisé sur mon serveur (Nmap 5.00 scan), j'obtiens des résultats de cette forme :


# Nmap 5.00 scan initiated Wed May 25 10:15:38 2011 as: nmap -R -v -p 135,80,22,23 -oG  XXX.XXX.XXX.XXX
# Ports scanned: TCP(4;22-23,80,135) UDP(0;) SCTP(0;) PROTOCOLS(0;)
Host: XXX.XXX.XXX.XXX (machine.domaine.org)  Status: Up
Host: XXX.XXX.XXX.XXX (machine.domaine.org)  Ports: 22/open/tcp//ssh///, 23/filtered/tcp//telnet///, 80/filtered/tcp//http///, 135/filtered/tcp//msrpc///
# Nmap done at Wed May 25 10:15:39 2011 -- 1 IP address (1 host up) scanned in 0.39 seconds

du coup lors de l'analyse de ce fichier le script se contentait de lire la première ligne contenant l'IP :

Host: XXX.XXX.XXX.XXX (machine.domaine.org)  Status: Up

et non la ligne ou les ports sont renseignés ....

Voici la partie du script que j'ai modifié :


   #Analyse
567   system("nmap -R -v @ips -p 135,80,22,23 -oG $path/$filter.gnmap -P0 > /dev/null");
568   #
569   my @gnmap;
570   if($net){
571     @gnmap = <NMAP>;
572     close NMAP;
573     unlink "$path/$filter.gnmap";
574     #
575     ###########
576     #
577     my $ref;
578     my ($h, $w, $j, $r, $f, $l);
579     REF:
580     for $ref (@hosts){
581       $h = $$ref[1];
582          for(@gnmap){
583     


         --> if(/Host: $h\b){   
       ++> if(/Host: $h\b.+Ports:/){


584              if(/135\/o/){
585                $PCW[$w] = $ref;
586                $w++;
587                next REF;
588              }elsif( (/22\/c.+23\/c.+80\/o.+135\/c/) or (/22\/c.+23\/o.+80\/c.+135\/c/) or (/22\/c.+23\/o.+80\/o.+135\/c/) or (/22\/o.+23\/o/) ){
589                $PR[$r] = $ref;
590                $r++;
591                next REF;


           # Modification car me semble plus clair ... et plus juste ...

592       -->  }elsif(/(22\/f.+23\/f.+80\/f.+135\/c|22\/c.+23\/c.+80\/c.+135\/c)/){
593       ++>}elsif( (/22\/f.+23\/f.+80\/f.+135\/c/) or (/22\/c.+23\/c.+80\/c.+135\/c/) ){


594                $PH[$j] = $ref;
595                $j++;
596                next REF;
597              }elsif( (/\d\d\/f/) and ( (/\d\d\/o/) or (/\d\d\/c/) ) ){
598                $PF[$f] = $ref;
599                $f++;
600                next REF;
601              }else{
602                $PCL[$l] = $ref;
603                $l++;
604                next REF;
605              }
606            }
607          }
608      }

Voilà, en espérant que cela puisse servir à d'autres ...

Last edited by mick (2011-05-25 11:54:57)

Offline

#4 2011-05-25 11:02:59

frankb
OCS Team
From: France (Angers)
Registered: 2009-01-12
Posts: 3,644
Website

Re: Fontionnement ipdiscover & ipdiscover-util.pl

Merci pour la modification.

Offline

#5 2011-05-27 07:33:39

snake57
Member
Registered: 2011-03-15
Posts: 27

Re: Fontionnement ipdiscover & ipdiscover-util.pl

Bonjour,
J'ai le même soucis mais je n'arrive pas à modifier le code maquerais il une accolade ou autre ?

Last edited by snake57 (2011-05-31 14:31:55)

Offline

#6 2011-06-04 21:10:01

old-lenny
Member
Registered: 2011-06-04
Posts: 1

Re: Fontionnement ipdiscover & ipdiscover-util.pl

Bonjour,
Je viens de tomber sur ce post et j'ai le même soucis par contre impossible de faire passer la modif chez moi
quelqu'un l'aurais-il déja tésté ?
serais-il possible de me donner plus de précision peut-étre que je fais mal la modif ?
ou dans le pire des cas si quelqu'un posséde le fichier déja modifié pourrais il me le faire parvenir je lui passerais mon adresse mail perso afin que ceci soit plus simple
cordialement old-lenny

Offline

#7 2011-06-07 09:10:27

mick
Member
Registered: 2011-05-16
Posts: 15

Re: Fontionnement ipdiscover & ipdiscover-util.pl

Bonjour,

De mon coté la modification fonctionne très bien, tous les postes sur le réseau son récupéré et identifié. Pour vous aider à trouver la solution à votre problème je vais vous expliquer la démarche que j'ai suivie et l'état des lieux avant que je procède à ma modification :

Pour rappel : ocs 2.0.1 (j'ai récupéré l'archive sur le site ocs, et appliqués les différents patch (qui n'était pas encore appliqués)  disponible ici :
http://bazaar.launchpad.net/~ocsinvento … vision/725

pour appliqué les patchs j'ai utilisé cette méthode :
http://dev.petitchevalroux.net/linux/co … x.327.html

Ocs est installé sur une debian 6.0
Nmap version : 5.0 

Lors de l'installation de ocs, j'ai bien installé toutes les dépendances y compris : XML::Entities PERL

Avant de faire toutes modifications, lorsque je lançais une analyse via l'interface web, sur les machines remontées avec ipdiscover j'obtenais bien la liste de toutes mes machines mais avec le Type Linux.

Voici les étapes que j'ai suivie après pour résoudre les problèmes :

Vérification que la commande Nmap fonction bien : j'ai donc tester la commande nmap du script sur une ip donnée :
# nmap -R -v une_adresse_ip_testée -p 135,80,22,23 -oG ./test.gnmap -P0 > /dev/null

Voici le type de sortie que j'obtiens pour une adresse IP :

# Nmap 5.00 scan initiated Tue Jun  7 09:23:43 2011 as: nmap -R -v -p 135,80,22,23 -oG ./test.gnamp -P0 une_adresse_ip_testée
# Ports scanned: TCP(4;22-23,80,135) UDP(0;) SCTP(0;) PROTOCOLS(0;)
Host: une_adresse_ip_testée (machine.domaine.fr) Status: Up
Host: une_adresse_ip_testée (machine.domaine.fr) Ports: 22/filtered/tcp//ssh///, 23/filtered/tcp//telnet///, 80/open/tcp//http///, 135/filtered/tcp//msrpc///
# Nmap done at Tue Jun  7 09:23:45 2011 -- 1 IP address (1 host up) scanned in 1.59 seconds

lors que je lance mon script je constate que cette machine qui apparait sur mon interface en LINUX devrait apparaitre en FILTERED du coup j'en déduis qu'il y à soucis sur l’interprétation dans le script de la sortie de nmap.

Pour en être sur je commente dans le script la ligne

573 unlink "$path/$filter.gnmap";

qui ce charge de supprimer le fichier .gnmap qui se trouve pour moi dans /var/lib/ocsinventory-reports/ (dedans j'ai les répertoires :  download, ipd et snmp)

quand je lance une analyse (via l'interface web) le fichier est bien créé et j'obtiens le même résultat que précédemment, avec toutes mes ip scannés et pour chaque ip j'ai 2 lignes voir plus haut.

du coup quand j'analyse le script PERL je constate qu'il lit la première ligne contenant mon adresse ip à savoir : 

Host: une_adresse_ip_testée (machine.domaine.fr) Status: Up

et qu'il cherche :

condition 1 : 135 suivie de o  ce n'est ce n'est pas le cas
condition 2 : (22 suivie de c et 23 suivie de c et 80suivie de o et 135 suivie de c ) ou (/22 suivie de c et 23 suivie de o et 80 suivie de c et 135 suivie de c) or (22 suivie de c et 23 suivie de o et 80 suivie de o et 135 suivie de c) or ( 22 suivie de o et 23 suivie de o) -> ce n'est pas le cas
condition 3 : etc ...

condition final sinon LINUX ce qui explique que tous les postes sortent en LINUX

Du coup j'ai modifier pour que l'analyse se face sur la 2eme ligne qui comporte mon adresse ip :
(/Host: $h\b.+Ports:/)
je cherche la ligne  qui contient Host: IP et ensuite  Ports:/

la deuxième modification ne semble pas obligatoire, mais pour moi l'écriture paraissait  plus clair (remarque je ne suis pas un expert en PERL , je ne connaissais pas avant d'essayer  de modifier ce script ...)

et pour finir voici une copie du script qui fonctionne sur mon serveur ...

Bonne journée




#!/usr/bin/perl
###############################################################################
##OCSINVENTORY-NG
##Copyleft Pascal DANEK 2005
##Web : http://www.ocsinventory-ng.org
##
##This code is open source and may be copied and modified as long as the source
##code is always made freely available.
##Please refer to the General Public Licence http://www.gnu.org/ or Licence.txt
################################################################################
#
#
use DBI;
use XML::Simple;
use Net::IP qw(:PROC);
use strict;
use Fcntl qw/:flock/;
#Command line options :
#-analyse : nmap analyse and files for grep, human readable and xml generation
#-net : Treat machine for the specified subnet
#
#
################
#OPTIONS READING
################
#
my $option;
#Specify a subnet
my $net;
#Subnet name
my $filter;
#Analyse and class the computers
my $analyse;
#Net for a given ip
my $iptarget;
my $masktarget;
#If auto flag, running for all the subnet.csv subnet and generate files
my $auto;
#Search for  problems with computer election
my $ipd;
my $list;
my $xml;
my $cache;
my $path;
#Default values for database connection
#
my $dbhost = 'localhost';
my $dbuser = 'ocsweb';
my $dbpwd = '0sc!w3b';
my $db = 'ocsweb';
my $dbp = '3306';
my $dbsocket = '';

#
my %xml;
my $ipdiscover;

#Cleanup the directory
&_cleanup();

for $option (@ARGV){
  if($option=~/-a$/){
    $analyse = 1;
  }elsif($option=~/-auto$/){
    $auto = 1;
  }elsif($option=~/-cache$/){
    $cache = 1;
    $analyse = 1;
    $xml = 1;
  }elsif($option=~/-path=(\S*)$/){
    $path = $1;
  }elsif($option=~/-ipdiscover=(\d+)$/){
    $ipdiscover = 1;
    $ipd = $1;
  }elsif($option=~/-xml$/){
    $xml = 1;
  }elsif($option=~/-h=(\S+)/){
    $dbhost = $1;
  }elsif($option=~/-d=(\S+)/){
    $db = $1;
  }elsif($option=~/-u=(\S+)/){
    $dbuser = $1;
  }elsif($option=~/-p=(\S+)/){
    $dbpwd = $1;
  }elsif($option=~/-P=(\S+)/){
    $dbp = $1;
  }elsif($option=~/-list$/){
      $list = 1;
  }elsif($option=~/-s=(\S+)/){
    $dbsocket = $1;
  }elsif($option=~/-net=(\S+)/){
    die "Invalid subnet. Abort...\n" unless $1=~/^(\d{1,3}(?:\.\d{1,3}){3})$/;
    $net = 1;
    $filter = $1;
  }elsif($option=~/-ip=(\S+)/){
    die "Invalid address => [IP/MASK]. Abort...\n" unless $1=~/^(\d{1,3}(?:\.\d{1,3}){3})\/(.+)$/;
    $iptarget = $1;
    $masktarget = $2;
  }else{
    print <<EOF;
Usage :
-ip=X.X.X.X/X.X.X.X (ex: 10.1.1.1/255.255.240.0 or 10.1.1.1/20)-> Looks for the ip in a subnet
-net=X.X.X.X -> Specify a network
-a -> Launch the analyze
-ipdiscover=X -> Show all the subnet with up to XX ipdiscover
-xml -> xml output
-list=show all the networks present in the database with "connected"/"discovered" computers
#DATABASE OPTION
-p=xxxx password (default ocs)
-P=xxxx port (default 3306)
-d=xxxx database name (default ocsweb)
-u=xxxx user (default ocs)
-h=xxxx host (default localhost)
-s=xxxx socket (default from default mysql configuration)

EOF
    die "Invalid options. Abort..\n";
  }
}
if($analyse and !$net){
  die "Wich subnet do you want to analyse ?\n";
}
if($cache or $auto){
  unless(-d "$path/ipd"){
      mkdir("$path/ipd")
        or die $!;
  }
}
#Date of the day
my $date = localtime();


#######################
#Database connection...
########
#
my $request;
my $row;
my $dbparams = {};

$dbparams->{'mysql_socket'} = $dbsocket if $dbsocket;

my $dbh = DBI->connect("DBI:mysql:database=$db;host=$dbhost;port=$dbp", $dbuser, $dbpwd, $dbparams)
or die $!;

#############################
#We get the subnet/name pairs
####
#
my @subnet;
$request = $dbh->prepare("SELECT * FROM subnet");
$request->execute;
while($row = $request->fetchrow_hashref){
  push @subnet, [ $row->{'NETID'}, $row->{'NAME'}, $row->{'ID'}, $row->{'MASK'} ];
}

###########
#PROCESSING
###########
#
if($auto){
  print "\n\n########################\n";
  print "Starting scan of subnets\n";
  print "########################\n";
  my %subnet;
  for(@subnet){
     my $name = $_->[1];
     my $netn  = $_->[0];
     $name=~s/ /_/g;
     $name=~s/\//\\\//g;
     $subnet{$name} = $netn;
     print "Retrieving $name (".$subnet{$name}.")\n";
  }
  my $i;
  print "\n\n##################\n";
  print "PROCESSING SUBNETS \n";
  print "##################\n\n";
  for(keys(%subnet)){
    print "Processing $_ (".$subnet{$_}."). ".(keys(%subnet)-$i)." networks left.\n";
    open OUT, ">$path/ipd/".$subnet{$_}.".ipd" or die $!;
    unless(flock(OUT, LOCK_EX|LOCK_NB)){
      if($xml){
        print "<ERROR><MESSAGE>345</MESSAGE></ERROR>";
    exit(0);
      }else{
        die "An other analyse is in progress\n";
      }
    }
    system("./ipdiscover-util.pl -net=".$subnet{$_}.($xml?' -xml':'')." -a > $path/ipd/'".$subnet{$_}.".ipd'");
    $i++;
  }
  system ("rm -f ipdiscover-analyze.*");
  print "Done.\n";
  exit(0);
}

#Host subnet
my $network;
#Subnet mask in binary format
my $binmask;



if($ipdiscover){
  my @networks;
  #get the subnets
  my $result;
  die "Invalid value\n" if $ipd<0;
  $request = $dbh->prepare('select distinct(ipsubnet) from networks left outer join devices on tvalue=ipsubnet where tvalue is null');
  $request->execute;
  while($row = $request->fetchrow_hashref){
    push @networks, [ $row->{'ipsubnet'}, '0' ];
  }
  $request->finish;
  #If positive value, it includes other subnet
  if($ipd){
    $request = $dbh->prepare('select count(*) nb,tvalue,name from devices group by tvalue having nb<='.$ipd.' and name="ipdiscover"');
    $request->execute;
    while($row = $request->fetchrow_hashref){
      push @networks, [ $row->{'tvalue'}, $row->{'nb'} ];
    }
    $request->finish;
  }
  print <<EOF unless($xml);
############################
#IP DISCOVER IP/SUBNET REPORTS
#$date
#Subnets with max $ipd
#  ipdiscover computers
############################


EOF
#
  my $output;
  my ($i,$j);
  for $network (@networks){
    my $ip = $network->[0];
    my $nbipd = $network->[1];
    next unless $ip =~ /^\d{1,3}(?:\.\d{1,3}){3}$/;
    my $req = $dbh->prepare('select h.deviceid, h.id, h.name, h.quality,h.fidelity,h.lastcome,h.lastdate,osname, n.ipmask, n.ipaddress from hardware h,networks n where n.hardware_id=h.id and n.ipsubnet='.$dbh->quote($ip).' order by lastdate');
    $req->execute;
    #Get the subnet label
    unless($xml){
      print "#######\n";
      my ($nname, $nuid) = &_getnetname($ip, '');
      print "SUBNET = ".$ip."-> $nbipd ipdiscover, ".($req->rows?$req->rows:0)." host(s) connected \n[ $nname ($nuid) ]\n";
      print "#\n\n";
      printf("     %-25s %-9s %-9s %-25s %-15s %-15s %s\n", "<Name>","<Quality>","<Fidelity>","<LastInventory>","<IP>","<Netmask>","<OS>");
      print "-----------------------------------------------------------------------------------------------------------------------\n";
      while($result = $req->fetchrow_hashref){
        my $r = $dbh->prepare('select * from devices where hardware_id='.$dbh->quote($result->{'id'}).' and tvalue='.$dbh->quote($ip).' and name="ipdiscover"');
    $r->execute;
    printf("#-> %-25s %-9s %-9s %-25s %-15s %15s %s %s\n",$result->{'name'},$result->{'quality'},$result->{'fidelity'},$result->{'lastdate'},$result->{'ipaddress'}, $result->{'ipmask'},$result->{'osname'} ,$r->rows?'*':'');
    $r->finish;
      }
      print "\n\n\n\n";
    }else{
      $xml{'SUBNET'}[$i]{'IP'} = [ $ip ];
      $xml{'SUBNET'}[$i]{'IPDISCOVER'} = [ $nbipd ];
      $xml{'SUBNET'}[$i]{'HOSTS'} = [ $req->rows?$req->rows:0 ];
      $j = 0;
      while($result = $req->fetchrow_hashref){
        $xml{'SUBNET'}[$i]{'HOST'}[$j]{'NAME'} = [ $result->{'name'} ];
    $xml{'SUBNET'}[$i]{'HOST'}[$j]{'QUALITY'} = [ $result->{'quality'} ];
    $xml{'SUBNET'}[$i]{'HOST'}[$j]{'FIDELITY'} = [ $result->{'fidelity'} ];
    $xml{'SUBNET'}[$i]{'HOST'}[$j]{'LASTDATE'} = [ $result->{'lastdate'} ];
    $xml{'SUBNET'}[$i]{'HOST'}[$j]{'OSNAME'} = [ $result->{'osname'} ];
    $xml{'SUBNET'}[$i]{'HOST'}[$j]{'IPMASK'} = [ $result->{'ipmask'} ];
    $j++;
      }
      $i++;
    }
  }
if($xml){
  $output=XML::Simple::XMLout( \%xml, RootName => 'NET', SuppressEmpty => undef);
  print $output;
}
exit(0);
}

#############
##IP resolving
##############
##
if($iptarget){
  my $netname;
  #If necessary, ascii conversion of a binary format
  $masktarget = _bintoascii($masktarget) if($masktarget=~/^\d\d$/);
  die "Invalid netmask. Abort.\n" unless $masktarget=~/^\d{1,3}(\.\d{1,3}){3}$/;
  $network = _network($iptarget, $masktarget);
  my $uid;
  ($netname, $uid)= &_getnetname($network, '-');
  my @nmb =  `nmblookup -A $iptarget`;
  #DNS name
  my $dnsname = &_getdns($iptarget);
  #Netbios name
  my $nmbname;
  my $inv;
  my $type;
 
  for(@nmb){
    $nmbname = $1,last if /\s+(\S+).*<00>/;
  }
  $request = $dbh->prepare('SELECT * FROM networks WHERE IPADDRESS='.$dbh->quote($iptarget));
  $request->execute;
  if($request->rows){
      $inv = 1;
    $type = 'Computer';
  }else{
      $request = $dbh->prepare('SELECT IP,TYPE FROM netmap, network_devices WHERE MAC=MACADDR AND IP='.$dbh->quote($iptarget));
      $request->execute;
    if(my $row = $request->fetchrow_hashref){
        $inv = 1, $type = $row->{'TYPE'};
    }
  }
 
  $request = $dbh->prepare('SELECT MAC FROM netmap WHERE IP='.$dbh->quote($iptarget));
  $request->execute;
  my $exist = 1 if $request->rows;
 
unless($xml){
    print <<EOF;


#########################
#IPDISCOVER Ver 1.0b
#IP DISCOVER REPORT
#$date
##########################


EOF

    print "\n--> ".($netname).". ($uid) ($network)\n";
    print <<EOF;

Netbios name : $nmbname
DNS name     : $dnsname
EOF

    printf("Inventoried  : %s\n",$inv?'Yes':'No');
    printf("Discovered   : %s\n",$exist?'Yes':'No');
    print "Type   : $type\n" if $inv;
    print "\nDone.\n\n";
    exit(0);
  }else{
    my $output;
    $xml{'IP'} = [ $iptarget ];
    $xml{'NETNAME'} = [ $netname ];
    $xml{'NETNUM'} = [ $network ];
    $xml{'NETBIOS'} = [ $nmbname ];
    $xml{'DNS'} = [ $dnsname ];
    $xml{'INVENTORIED'} = [ $inv?'yes':'no' ];
    $xml{'DISCOVERED'} = [ $exist?'yes':'no' ];
    $xml{'TYPE'} = [ $type ] if $inv;
   
    $output=XML::Simple::XMLout( \%xml, RootName => 'IP', SuppressEmpty => undef);
    print $output;
    exit(0);
  }
}


#
#Searching non-inventoried mac addresses
#
my %network;
my @hosts;
my $null;
#   

$request = $dbh->prepare('SELECT IP,MASK,MAC,DATE FROM netmap LEFT JOIN networks ON MACADDR=MAC where MACADDR IS NULL'); 
$request->execute;

#Determine the subnets
#
#
my %network_ipd;
#
while($row = $request->fetchrow_hashref){
  my $ip;
  my $netmask;
  #
  if($row->{'MASK'}){
    $ip = $row->{'IP'};
    $netmask = $row->{'MASK'};
    $network = _network($ip, $netmask);
    $binmask = _binmask($netmask);
    if($net){
      next unless $network eq $filter;
    }
    #Hosts count per subnet
    if($list and !$analyse and !$net){
      $network_ipd{$network}++;
    }else{
      $network{$network}++;
      push @hosts, [ $row->{'MAC'}, $ip , $row->{'DATE'}];
    }
  }else{
    $null++;
  }
}

my $total = 0;
#We want ALL subnets in the database, even those that are not discovered
if($list and !$analyse and !$net){
  $request = $dbh->prepare('SELECT IPADDRESS,IPMASK FROM networks');
  $request->execute;
  while($row = $request->fetchrow_hashref){
      my $ip;
      my $netmask;
      #
      if($row->{'IPMASK'}=~/^\d{1,3}(\.\d{1,3}){3}$/ and $row->{'IPADDRESS'}=~/^\d{1,3}(\.\d{1,3}){3}$/){
        $ip = $row->{'IPADDRESS'};
        $netmask = $row->{'IPMASK'};
        $network = _network($ip, $netmask);
        $network{$network}++;
      }
      #Hosts count per subnet
  }
  #We show the part of non-inventoried computers
  my $netnum;
  for $netnum (keys(%network)){
    $total+=$network{$netnum};
    for(keys(%network_ipd)){
      $network{$netnum}.= "/".$network_ipd{$_} if($_ eq $netnum);
    }
  }
}

########
#RESULTS
########
#
print <<EOF unless $xml;


#########################
IPDISCOVER Ver 1.0b
IP DISCOVER REPORT
$date
#########################



EOF
unless($xml){
  printf("%-35s %-5s %-20s %-4s\n", "<Name>","<UID>","<Subnet>","<Nb>");
  print "-------------------------------------------------------------------\n";
}
#net UID
my $dep;
#net name
my $lib;
#
my $line;
my $netn;
#
my $i;
my $output;
for $netn (keys(%network)){
  ($lib, $dep) = &_getnetname($netn,'-'); 
  if($xml and !$analyse){
    $xml{'NETWORK'}[$i]{'LABEL'} = [ $lib ];
    $xml{'NETWORK'}[$i]{'UID'} = [ $dep ];
    $xml{'NETWORK'}[$i]{'NETNAME'} = [ $netn ];
    $xml{'NETWORK'}[$i]{'NETNUMBER'} = [ $network{$netn} ];
    $i++;
  }elsif(!$xml){
    printf("%-35s %-5s %-20s %-4s\n",$lib,$dep,$netn,$network{$netn});
    $total += $network{$netn} unless $list;
  }
}
if($xml and !$net){
  $output=XML::Simple::XMLout( \%xml, RootName => 'IPDISCOVER', SuppressEmpty => undef);
  print $output;
}

if($net){
  #
  my($n, $i);
  #Host names
  my @names;
  #
  unless($xml){
    print "\n---------------------------------------------\n";
    print "Unknown host(s) on $filter \n";
    print "---------------------------------------------\n\n";
  }
  my $output;
  for $n (@hosts){
    #Trying a DNS resolution
    push @$n, &_getdns($$n[1]);
    unless($analyse){
      if($xml){
        $xml{'HOST'}[$i]{'IP'} = [ $$n[1] ];
        $xml{'HOST'}[$i]{'MAC'} = [ $$n[0] ];
    $xml{'HOST'}[$i]{'DATE'} = [ $$n[2] ];
        $xml{'HOST'}[$i]{'NAME'} = [ $$n[3] ];
        $i++;
      }else{
        printf("=> %-20s %-20s %-20s %s\n",$$n[1],$$n[0],$$n[2],$$n[3]);
      }
    }
   }
   
  if(!$analyse and $xml){
    $output=XML::Simple::XMLout( \%xml, RootName => 'NET', SuppressEmpty => undef);
    print $output;
  }
}

########
#ANALYZE
########
#
#
#
#windows computers
my @PCW;
#Linux computers
my @PCL;
#net peripherals
my @PR;
#Phantom computers
my @PH;
#At least one port filtered with one port open or closed
my @PF;
if($analyse){
  #directory creation for analyses file
  if($cache){
    open CACHE, ">$path/ipd/$filter.ipd" or die $!;
    unless(flock(CACHE, LOCK_EX|LOCK_NB)){
      if($xml){
        print "<ERROR><MESSAGE>345</MESSAGE></ERROR>";
    exit(0);
      }else{
        die "An other analyse is in progress\n";
      }
    }
  }
 
  unless(@hosts){
    print "No unknown hosts of this network. Stop.\n\n" unless $xml;
    exit(0);
  }
  #If it's a global analyze, we don't display the results but just generate the files
  #Using nmap :
  # -> Connection on ports 135(msrpc), 80(web), 22(ssh), 23(telnet)
  # -> files ipdiscover-analyze.* generated (3 formats : .nmap(human), .gnmap(pour grep), .xml(xml)
  # -> No 'host up' detection
  #
  my @ips;
  push @ips, $$_[1] for(@hosts);
  #Check that there is no analyses of this network pending
  open NMAP, "+>$path/$filter.gnmap";
  unless(flock(NMAP, LOCK_EX|LOCK_NB)){
      if($xml){
        print "<ERROR><MESSAGE>345</MESSAGE></ERROR>";
    exit(0);
      }else{
        die "An other analyse is in progress\n";
      }
    }
  #Analyse
  system("nmap -R -v @ips -p 135,80,22,23 -oG $path/$filter.gnmap -P0 > /dev/null");
  #
  my @gnmap;
  if($net){
    @gnmap = <NMAP>;
    close NMAP;
    unlink "$path/$filter.gnmap";
    #
    ###########
    #
    my $ref;
    my ($h, $w, $j, $r, $f, $l);
    REF:
    for $ref (@hosts){
      $h = $$ref[1];
         for(@gnmap){
       if(/Host: $h\b.+Ports:/){
         if(/135\/o/){
               $PCW[$w] = $ref;
           $w++;
               next REF;
             }elsif( (/22\/c.+23\/c.+80\/o.+135\/c/) or (/22\/c.+23\/o.+80\/c.+135\/c/) or (/22\/c.+23\/o.+80\/o.+135\/c/) or (/22\/o.+23\/o/) ){
               $PR[$r] = $ref;
           $r++;
                 next REF;
             # }elsif( (/22\/f.+23\/f.+80\/f.+135\/c/) or (/22\/c.+23\/c.+80\/c.+135\/c/) ){
         }elsif(/(22\/f.+23\/f.+80\/f.+135\/c|22\/c.+23\/c.+80\/c.+135\/c)/){
               $PH[$j] = $ref;
           $j++;
               next REF;
           }elsif( (/\d\d\/f/) and ( (/\d\d\/o/) or (/\d\d\/c/) ) ){
             $PF[$f] = $ref;
           $f++;
             next REF;
             }else{
               $PCL[$l] = $ref;
           $l++;
               next REF;
             }
       }
         }
     }
   #Display results
   print "<NETANALYSE>\n" if $xml;
   print CACHE "<NETANALYSE>\n" if $xml;
   &_print(\@PCW, 'WINDOWS COMPUTERS');
   &_print(\@PCL, 'LINUX COMPUTERS');
   &_print(\@PR, 'NETWORK DEVICES');
   &_print(\@PF, 'FILTERED HOSTS');
   &_print(\@PH, 'PHANTOM HOSTS');
   print "</NETANALYSE>\n" if $xml;   
   print CACHE "</NETANALYSE>\n" if $xml;
  }
}

##################
#DISLAY SUBROUTINE
##################
#
sub _print{
   my $ref = shift;
   my $lib = shift;
   if(@$ref){
     my $nb;
     unless($xml){
       print "#" for(0..(length($lib)+3));
       print "\n";
       print "# ".$lib." #";
       print "\n";
       print "#" for(0..(length($lib)+3));
       print "\n";
       print "#----------------------------------------------------------------------------\n";
       printf("#%-20s %-20s %-25s %s\n", "IP address",  "MAC address", "DNS/Netbios", "Date");
       print "#----------------------------------------------------------------------------\n#\n";
     }
         
     $nb = 0;
     my $output;
     %xml = undef;
     for(@$ref){
    $$_[3] = &_smbname($$_[1]) if $$_[3] eq "-";
    if($xml){
      $xml{'IP'} = [ $$_[1] ];
          $xml{'MAC'} = [ $$_[0] ];
          $xml{'NAME'} = [ $$_[3] ];
      $xml{'DATE'} = [ $$_[2] ];
      $xml{'TYPE'} = ['WINDOWS'] if $lib =~/windows/i;
      $xml{'TYPE'} = ['LINUX'] if $lib =~/linux/i;
      $xml{'TYPE'} = ['FILTERED'] if $lib =~/filtered/i;
      $xml{'TYPE'} = ['NETWORK'] if $lib =~/network/i;
      $xml{'TYPE'} = ['PHANTOM'] if $lib =~/phantom/i;
      $output=XML::Simple::XMLout( \%xml, RootName => 'HOST', SuppressEmpty => undef);
          print $output;
      print CACHE $output if $cache;
    }else{
      printf("#-> %-15s %-20s %-20s %s\n",$$_[1],$$_[0],$$_[3],$$_[2]);
      $nb++;
    }
     }
   unless($xml){
     print "#\n#==========> $nb host(s)\n#\n\n\n";
   }
  }
}
#
#########################################
#ROUTINE DE RECUPERATION DES NOMS NETBIOS
#########################################
#
sub _smbname{
  my $flag = 0;
  my $name;
  my $ip = shift;
  #If no dns name, we try  a netbios resolution
  my @smb = `nmblookup -A $ip`;
  #On cherche un enregistrment <00> pour l'ip passee en argument
  for(@smb){
    $name = "-";
    /Looking\D+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/ unless $flag;
    if(/<00>/){
      /^\s+(\S+)/;
      $name = $1;
      return $name;
    }
  }
  return "-";
}

##############
#CLEAN *.gnmap
##############

sub _cleanup{
  my($name, @files);
  opendir DIR, $path;
  while($name = readdir DIR){
    push @files, $name if $name=~/\.gnmap$/i;
  }
  closedir DIR;
  for(@files){
    open FILE, $_ or next;
    unlink "$path/$_" if(flock(FILE, LOCK_EX|LOCK_NB));
  }
}

print "|\n|\n---------------------------------------------\n|" unless $xml;
if($list){
  print "\n|--> TOTAL = $total valid (ips/netmask) in the database\n" unless $xml;
  exit(0);
}

unless($xml){
  print "\n|--> TOTAL = $total unknown hosts\n";
  print "\n|--> WARNING: $null discovered computers without netmask on all discovered machine\n\n" if $null;
}
#Try to get dns name
sub _getdns{
  my $ip = shift;
  my $name;
  chomp(my @names = `host $ip 2>/dev/null`);
  for(@names){
   return $1 if /.+pointer (.+)/i;
   return $1 if /Name:\s*(\S+)/i;
  }
  return("-");
}

#Retrieve the name of the subnet if available
sub _getnetname{
  my $network = shift;
  my $r = shift;
  for(@subnet){
      if($_->[0] eq $network){
      return ($_->[1], $_->[2]);
      last;
    }
  }
  return($r, $r);

}

#To retrieve the net ip   
sub _network{
  my $ip = shift;
  my $netmask = shift;
  my $binip = &ip_iptobin($ip, 4);
  my $binmask = &ip_iptobin($netmask, 4);
  my $subnet = $binip & $binmask;
  return(&ip_bintoip($subnet, 4)) or die(Error());
}

sub _bintoascii{
  my $binmask = shift;
  my $binstring = "1" x $binmask;
  $binstring .= "0" for(1..(32 - $binmask));
 
  return(&ip_bintoip($binstring, 4)) or die(Error());
}

sub _binmask{
  my $ip = shift;
  return(&ip_iptobin($ip, 4)) or die(Error());
}

Offline

#8 2011-06-07 09:18:40

mick
Member
Registered: 2011-05-16
Posts: 15

Re: Fontionnement ipdiscover & ipdiscover-util.pl

Petite remarque : pour la ligne 592 après test n'ayant pas observé de différence j'ai laissé l'ancienne ligne ...

Offline

#9 2011-06-08 08:51:32

snake57
Member
Registered: 2011-03-15
Posts: 27

Re: Fontionnement ipdiscover & ipdiscover-util.pl

Alors tout d'abord merci pour cette réponse rapide et détaillé !
J'ai effectué toutes vos manipulations comme indiqué lors de l'utilisation de la commande :
perl /usr/share/ocsinventory-reports/ocsreports/ipdiscover-util.pl -net=172.17.0.0 -a -xml -h=localhost -u=root -p=motdepasse -d=ocsweb
les types affichés sont maintenant différent de LINUX il y a des WINDOWS, NETWORK...
Sa parais donc bon du côté du script.
Seulement sur mon interface web la colonne identifiés reste désésperement à 0.
J'ai aussi essayé de cliquer sur le bouton analyse dans l'interface web mais rien ne s'affiche à l'écran à part vider le cache.
Auriez vous une idée de ce qui ne va pas ?
PS : je suis en 2.0 RC3 peut être que le problème viens de la mais je ne pense pas.
De plus le fchier .gnmap dans /var/lib/ocsinventory-reports/ n'est jamais créé chez moi hmm

Last edited by snake57 (2011-06-08 09:26:28)

Offline

#10 2011-06-08 11:36:31

mick
Member
Registered: 2011-05-16
Posts: 15

Re: Fontionnement ipdiscover & ipdiscover-util.pl

Bonjour,

J'ai également eu ce problème, la solution pour moi à été de modifier les droits (enfin de propriétaire)  sur le répertoire parent de ipd ( /var/lib/ocsinventory-reports/ dans mon cas), en effet le fichier .gnamp est créé dans ce répertoire puis il est utilisé pour créer le fichier adresse_reseau.ipd qui contient les infos qui s'affiche dans l'interface web après analyse, (remarque le faite de vider le cache supprimer ce fichier et relance le script ipdiscover) ...

Voici les droits sur (www-data étant l'utilisateur qui lance le service apache)  :
ocsinventory-reports -> drwxrwxr-x 5 root     www-data 4096  7 juin  15:56 ocsinventory-reports
ipd -> drwxr-xr-x  2 www-data www-data 4096  7 juin  15:56 ipd

Cordialement

Last edited by mick (2011-06-08 11:40:43)

Offline

#11 2011-06-08 13:11:11

snake57
Member
Registered: 2011-03-15
Posts: 27

Re: Fontionnement ipdiscover & ipdiscover-util.pl

Je viens de tester et ça... MARCHE ! smile
Le bouton analyse remonte le type de chaque postes par contre est-il normal que la colonne identifiés reste à 0 ?
Faut-il obligatoirement identifiés les matériels manuellement ?
Quoi qu'il en soit merci pour cette aide sans laquelle je ni serais jamais arrivé !

Offline

#12 2011-08-03 16:17:25

albebert
Member
Registered: 2011-08-03
Posts: 1

Re: Fontionnement ipdiscover & ipdiscover-util.pl

Bonjour tout le monde j'ai le même soucis que snake54 et mick

analyse ne m'affiche rien le script fonctionne, quand je lance une analyse j'ai bien du perl qui tourne mais ça ne me ressort RIEN sad

j'ai fait un chmod -R 777 * sur /var/lib/ocsinventory-reports

mais ça ne change rien sad

une idée ?

merci smile

Offline

#13 2011-08-30 16:20:28

frankb
OCS Team
From: France (Angers)
Registered: 2009-01-12
Posts: 3,644
Website

Re: Fontionnement ipdiscover & ipdiscover-util.pl

As-tu positionné le bon propriétaire et groupe sur les répertoires /var/lib/ocsinventory-ocsreports/ipd, à savoir le user apache (propriétaire et groupe), comme le signale mick dans son post?

Offline

Board footer

Powered by FluxBB

Serveur dédié, hébergement web, infogérance et nom  de domaine - NFrance Conseil