Nous paramétrons les switchs (H3C) pour envoyer les trappes à notre serveur de supervision :

snmp-agent target-host trap address udp-domain 10.2.0.40 params securityname PRIVCOMMUNITY

Nos paramétrons le démon snmptrapd comme suit (fichier /etc/snmp/snmptrapd.conf) :

disableAuthorization yes
authCommunity log,execute PRIVCOMMUNITY
traphandle IF-MIB::linkUp /usr/local/bin/snmp-link-up-handler

Voici le contenu de la commande snmp-link-up-handler :

#!/usr/bin/perl -w

while (<>)
{
  chomp;
  if (/SNMP-COMMUNITY-MIB::snmpTrapAddress.0/)
  {
    $ip=$_;
    $ip=~ s/.* //;
  }

  if (/IF-MIB::ifIndex/)
  {
    $port=$_;
    $port=~ s/.* //;
  }

}

system "/usr/local/bin/getmacbyswitchport $ip $port";

Quant à la commande getmacbyswitchport, elle interroge le switch d'ip ip pour avoir la liste des adresses mac connectées au port port, et envoie le contenu dans une base de données.

#!/bin/bash

database=/var/lib/h3cinventory/inventory.sqlite

date=`date`
macadresses=`/usr/local/bin/h3cquery.exp $1 | grep -i "1/0/$2\s" | awk '!x[$1]++ {print $1}'`
for f in $macadresses
do 
  echo "delete from inventory where macadress='$f';" 
  echo "insert into inventory values ('$f','$1',$2,'$date');"
done | sqlite $database

la commande h3cquery.exp est un script expect qui se connecte en ssh au switch passé en argument et fait un "dis mac-address".

la base de données à comme structure l'unique table définie comme suit :

create table inventory (macadress text,switch text, port integer, lastseen text);