SNMP sous PHP/Windows

SNMP sous PHP/Windows - PHP - Programmation

Marsh Posté le 22-05-2006 à 12:47:20    

Hi !!! Je n'ai pas réellement l'habitude de demander de l'aide mais j'avoue ne pas pouvoir m'en sortir seul cette fois-ci...
Le réseau sur lequel je travail comporte des switch 3com, modele 4400...etc.
Et je travail depuis 3 mois sur un logiciel de gestion de parc.
Je souhaiterait pouvoir connaitre le port sur lequel est branché une machine.
Pour le moment j utilise une session telnet en php via une socket mais ce procédé n est pas tre efficace.
 
Je souhaiterait donc :
 
Via une connection SNMP, pouvoir obtenir la table des address mac sur les switch afin d obtenir le port.
Mes recherches m'ont indiquées qu'une fonctions faisait cela : show-mac-address.
Cependant, je ne connait rien au SNMP, et j avoue etre dans le flou total.
Je suis donc sous windows, g installé le service snmp... Mais que faire désormais ?? Comment utilisé les commandes ? Par quel procédé ? (Invite de commande ? ...)

Reply

Marsh Posté le 22-05-2006 à 12:47:20   

Reply

Marsh Posté le 22-05-2006 à 14:31:06    

http://fr2.php.net/manual/fr/ref.snmp.php je pense que là tu auras de quoi faire.

Reply

Marsh Posté le 22-05-2006 à 15:42:27    

Je me suis déja documenté sur ce genre de site, tous les sites proposant la meme solution et les meme explications copier collées.
 
Toutefois, aprés avoir configurer ma liaison snmp et lancé ce programme :
 
<?
echo '<font size="1" color="#1A237A">' . date("l dS of F Y h:i:s A" ) . '</font>';
//172.21.97.236->adresse du switch 3com
$a = snmpwalkoid("172.21.97.236", "public", "" );
?>
 
Je m appercoi que rien ne se passe, ma page php tourne sans fin.
 
J ai pourtant cocher toutes les extentions possible sous php my admin, défini mon client snmp sous la gestion du poste de travail windows, enlevé les ; devant les lignes correspondantes sous php.ini sous mon repertoire apache, redémarer le serveur...
 
 

Reply

Marsh Posté le 22-05-2006 à 16:09:38    

PS : Le programme fonctionne en local mais tourne sans fin lors d'une connection à un switch.

Reply

Marsh Posté le 22-05-2006 à 16:20:56    

doudouche a écrit :

PS : Le programme fonctionne en local mais tourne sans fin lors d'une connection à un switch.


Il faut avouer que ce domaine, à mon humble avis, est peut utilisé. Je dirais que tu es un pionner dans ce domaine  :sol:. Je ne pense pas qu'en activant toute les extensions que cela va fonctionner, pire tu risques de créer des conflits. Je pense plus qu'il y a un petit problème coté switch. Quand je dis problème c'est qu'il a pas les bonnes information pour ce que tu demandes de faire. Peux-tu nous donner du code.

Reply

Marsh Posté le 29-05-2006 à 13:26:03    

Alors pour ceux  que cela interesse, le  programme fonctionne , le probleme  venazit du fait que la MIB des switch est relativement conséquente et nécéssite un temps immense  afin d etre entierement lue, il faut donc préciser  une OID au sein de la fonction snmpwalkOID afin de limiter la recherche et donc le temps de traitement.
PAr ailleur, cette méthoide permet de connaitre quel @MAC est  connectée sur  le port d'un switch, mais également (sur un pc distant) de connaite toutes les caractéristiues de celui-ci : logiciels, matériel etc etc.
Je recommande donc vivement cette solution lors de la création d'un logiciel de gestion de parc.

Reply

Marsh Posté le 29-05-2006 à 13:32:32    

Cool merci pour l'information. ;)

Reply

Marsh Posté le 28-06-2006 à 13:57:25    

Justement j'essaye de récuperer les @mac et @ip des stations connectés aux ports d'un cisco, mais je ne trouve pas dans la mib l'OID correspondant.
 
Aurais-tu une idée ?

Reply

Marsh Posté le 15-04-2008 à 15:02:04    

Salut tout le monde, je sais que ca fait déja un moment mais je voudrais avoir des infos sur ce topic. Doudouche peut tu me montrer le code avec lequel tu a réussi a faire tourner le programme.  
 
merci
 
mon mail elmarokinhodu76[at]hotm4il point com ( a remettre en ordre ;-) )

Reply

Marsh Posté le 23-04-2008 à 10:22:25    

c'est bon moi j'ai réussi ... a partir d'un adresse mac ou d'une adresse IP je determine sur quel port est connecté la machine, si il y a plusieurs adresse sur le meme port j'indique qu'il s'agit d'un port d'interconexion.

Reply

Marsh Posté le 23-04-2008 à 10:22:25   

Reply

Marsh Posté le 17-01-2009 à 09:04:06    

elmarokinho pourrais tu m'envoyer ton programme qui a partir d'un adresse mac ou d'une adresse IP tu determine sur quel port est connecté la machine.
 
Avec des explications si possible
 
j'ai trouvé ce programme
 
<?php
 
 class Commutateur{
  // Constantes MIB Snmp
  private $OID_MAC = '.iso.3.6.1.2.1.17.4.3.1.1';
  private $OID_PORT = '.iso.3.6.1.2.1.17.4.3.1.2';
  private $OID_PORT_CHAINAGE = '.iso.3.6.1.4.1.45.1.6.13.2.1.1.2';
  private $OID_IP_CHAINAGE =   '.iso.3.6.1.4.1.45.1.6.13.2.1.1.3';
  private $OID_NOM = '.iso.3.6.1.2.1.1.5.0';
  private $OID_LOCALISATION = '.iso.3.6.1.2.1.1.6.0';
 
  private $ip;
  private $communaute;
  private $nom;
  private $localisation;
   
  public function Commutateur($ip_root,$communaute){
   $this->ip = $ip_root;
   $this->communaute = $communaute;
   $this->nom = snmpget($this->ip,$this->communaute,$this->OID_NOM);
   $this->localisation = snmpget($this->ip,$this->communaute,$this->OID_LOCALISATION);
  }
 
  public function getIp(){
   return $this->ip;
  }
  public function getNom(){
   return $this->nom;
  }
  public function getLocalisation(){
   return $this->localisation;
  }
 
  // Recherche @Mac sur le switch
  // Retourne le n° de port ou False
  public function findMac($mac_cherche){
   $mac_cherche=strtoupper($mac_cherche);
   $macs = snmprealwalk($this->ip, $this->communaute, $this->OID_MAC); //Récupère MAC connues du switch par SNMP
   //Boucle sur chaque adresse MAC
   foreach($macs as $cle => $valeur){
    $mac = str_replace(" ",":",substr($valeur,6,17)); // Suppression HEX et espaces
    if($mac == $mac_cherche){ // Filtre sur MAC recherchée
     $oid = $this->OID_PORT.".".substr($cle,26); // Construit OID du port contenant la MAC recherchée
     $ports = snmprealwalk($this->ip, $this->communaute, $this->OID_PORT); // Récupère les ports du switch par SNMP
     // Boucle sur chaque port
     foreach($ports as $cle => $port){
      if($cle == $oid){ // Filtre sur port ayant l'OID recherché
       return $port; // Port trouvé pour l'adresse MAC, on retourne le N° port
      }
     }
    }
   }
   return false; // Port non trouvé : retourne False.
  }
   
  // Retourne le switch suivant à partir du N° de port
  // Retourne @Ip du switch suivant ou False si port non chainé
  public function switchSuivant($chainage){
   // Récupération port chainé du switch
   $snmp=snmprealwalk($this->ip, $this->communaute, $this->OID_PORT_CHAINAGE);
   foreach($snmp as $cle => $port){
    if($port == $chainage){
     $oid_next = rtrim(substr($cle,strlen($this->OID_PORT_CHAINAGE)));
     // Récupération IP des switches suivants
     $snmp=snmprealwalk($this->ip, $this->communaute, $this->OID_IP_CHAINAGE);
     foreach($snmp as $cle => $ip){
      $ip_next = rtrim(substr($ip,strlen('IpAddress: ')%

Reply

Marsh Posté le 17-01-2009 à 09:07:43    

elmarokinho pourrais tu m'envoyer ton programme qui a partir d'un adresse mac ou d'une adresse IP tu determine sur quel port est connecté la machine.
 
Avec des explications si possible
 
j'ai trouvé ce programme
 
<?php
 
 class Commutateur{
  // Constantes MIB Snmp
  private $OID_MAC = '.iso.3.6.1.2.1.17.4.3.1.1';
  private $OID_PORT = '.iso.3.6.1.2.1.17.4.3.1.2';
  private $OID_PORT_CHAINAGE = '.iso.3.6.1.4.1.45.1.6.13.2.1.1.2';
  private $OID_IP_CHAINAGE =   '.iso.3.6.1.4.1.45.1.6.13.2.1.1.3';
  private $OID_NOM = '.iso.3.6.1.2.1.1.5.0';
  private $OID_LOCALISATION = '.iso.3.6.1.2.1.1.6.0';
 
  private $ip;
  private $communaute;
  private $nom;
  private $localisation;
   
  public function Commutateur($ip_root,$communaute){
   $this->ip = $ip_root;
   $this->communaute = $communaute;
   $this->nom = snmpget($this->ip,$this->communaute,$this->OID_NOM);
   $this->localisation = snmpget($this->ip,$this->communaute,$this->OID_LOCALISATION);
  }
 
  public function getIp(){
   return $this->ip;
  }
  public function getNom(){
   return $this->nom;
  }
  public function getLocalisation(){
   return $this->localisation;
  }
 
  // Recherche @Mac sur le switch
  // Retourne le n° de port ou False
  public function findMac($mac_cherche){
   $mac_cherche=strtoupper($mac_cherche);
   $macs = snmprealwalk($this->ip, $this->communaute, $this->OID_MAC); //Récupère MAC connues du switch par SNMP
   //Boucle sur chaque adresse MAC
   foreach($macs as $cle => $valeur){
    $mac = str_replace(" ",":",substr($valeur,6,17)); // Suppression HEX et espaces
    if($mac == $mac_cherche){ // Filtre sur MAC recherchée
     $oid = $this->OID_PORT.".".substr($cle,26); // Construit OID du port contenant la MAC recherchée
     $ports = snmprealwalk($this->ip, $this->communaute, $this->OID_PORT); // Récupère les ports du switch par SNMP
     // Boucle sur chaque port
     foreach($ports as $cle => $port){
      if($cle == $oid){ // Filtre sur port ayant l'OID recherché
       return $port; // Port trouvé pour l'adresse MAC, on retourne le N° port
      }
     }
    }
   }
   return false; // Port non trouvé : retourne False.
  }
   
  // Retourne le switch suivant à partir du N° de port
  // Retourne @Ip du switch suivant ou False si port non chainé
  public function switchSuivant($chainage){
   // Récupération port chainé du switch
   $snmp=snmprealwalk($this->ip, $this->communaute, $this->OID_PORT_CHAINAGE);
   foreach($snmp as $cle => $port){
    if($port == $chainage){
     $oid_next = rtrim(substr($cle,strlen($this->OID_PORT_CHAINAGE)));
     // Récupération IP des switches suivants
     $snmp=snmprealwalk($this->ip, $this->communaute, $this->OID_IP_CHAINAGE);
     foreach($snmp as $cle => $ip){
      $ip_next = rtrim(substr($ip,strlen('IpAddress: ')%

Reply

Marsh Posté le 17-01-2009 à 09:08:04    

elmarokinho pourrais tu m'envoyer ton programme qui a partir d'un adresse mac ou d'une adresse IP tu determine sur quel port est connecté la machine.
 
Avec des explications si possible
 
j'ai trouvé ce programme
 
<?php
 
 class Commutateur{
  // Constantes MIB Snmp
  private $OID_MAC = '.iso.3.6.1.2.1.17.4.3.1.1';
  private $OID_PORT = '.iso.3.6.1.2.1.17.4.3.1.2';
  private $OID_PORT_CHAINAGE = '.iso.3.6.1.4.1.45.1.6.13.2.1.1.2';
  private $OID_IP_CHAINAGE =   '.iso.3.6.1.4.1.45.1.6.13.2.1.1.3';
  private $OID_NOM = '.iso.3.6.1.2.1.1.5.0';
  private $OID_LOCALISATION = '.iso.3.6.1.2.1.1.6.0';
 
  private $ip;
  private $communaute;
  private $nom;
  private $localisation;
   
  public function Commutateur($ip_root,$communaute){
   $this->ip = $ip_root;
   $this->communaute = $communaute;
   $this->nom = snmpget($this->ip,$this->communaute,$this->OID_NOM);
   $this->localisation = snmpget($this->ip,$this->communaute,$this->OID_LOCALISATION);
  }
 
  public function getIp(){
   return $this->ip;
  }
  public function getNom(){
   return $this->nom;
  }
  public function getLocalisation(){
   return $this->localisation;
  }
 
  // Recherche @Mac sur le switch
  // Retourne le n° de port ou False
  public function findMac($mac_cherche){
   $mac_cherche=strtoupper($mac_cherche);
   $macs = snmprealwalk($this->ip, $this->communaute, $this->OID_MAC); //Récupère MAC connues du switch par SNMP
   //Boucle sur chaque adresse MAC
   foreach($macs as $cle => $valeur){
    $mac = str_replace(" ",":",substr($valeur,6,17)); // Suppression HEX et espaces
    if($mac == $mac_cherche){ // Filtre sur MAC recherchée
     $oid = $this->OID_PORT.".".substr($cle,26); // Construit OID du port contenant la MAC recherchée
     $ports = snmprealwalk($this->ip, $this->communaute, $this->OID_PORT); // Récupère les ports du switch par SNMP
     // Boucle sur chaque port
     foreach($ports as $cle => $port){
      if($cle == $oid){ // Filtre sur port ayant l'OID recherché
       return $port; // Port trouvé pour l'adresse MAC, on retourne le N° port
      }
     }
    }
   }
   return false; // Port non trouvé : retourne False.
  }
   
  // Retourne le switch suivant à partir du N° de port
  // Retourne @Ip du switch suivant ou False si port non chainé
  public function switchSuivant($chainage){
   // Récupération port chainé du switch
   $snmp=snmprealwalk($this->ip, $this->communaute, $this->OID_PORT_CHAINAGE);
   foreach($snmp as $cle => $port){
    if($port == $chainage){
     $oid_next = rtrim(substr($cle,strlen($this->OID_PORT_CHAINAGE)));
     // Récupération IP des switches suivants
     $snmp=snmprealwalk($this->ip, $this->communaute, $this->OID_IP_CHAINAGE);
     foreach($snmp as $cle => $ip){
      $ip_next = rtrim(substr($ip,strlen('IpAddress: ')%

Reply

Marsh Posté le 17-01-2009 à 11:32:41    

désolé le msg d'avant n'est pas complet
 
il me faut un programme port adresse mac pour cisco.
j'en ai trouvé un pour nortel mais j'ai des problèmes de correspondance oid pour ces valeurs
p
  private $OID_PORT_CHAINAGE = '.iso.3.6.1.4.1.45.1.6.13.2.1.1.2';
  private $OID_IP_CHAINAGE =   '.iso.3.6.1.4.1.45.1.6.13.2.1.1.3';
  private $OID_LOCALISATION = '.iso.3.6.1.2.1.1.6.0';
 
merci d'avance pour votre aide

Reply

Marsh Posté le 17-01-2009 à 15:55:19    

quel type de switch Cisco ?  
 
Sinon regarde par là :
http://www.cisco.com/en/US/tech/tk [...] 9199.shtml
 
 
.1.3.6.1.2.1.31.1.1.1.1
 
Je te conseill d'utiliser un client snmp pour windows d'abord, tu perdras moins de temps. du genre :
http://3d2f.com/programs/32-258-fr [...] load.shtml


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 17-01-2009 à 21:15:33    

c'est des switch 3560
j'ai lu des liens
il faut qque j'

Reply

Marsh Posté le 17-01-2009 à 21:17:09    

c'est des switch 3560
j'ai lu des liens
il faut que j'arrive à trouver ou faire (plus dur car je ne suis pas programmateur) un programme automatique
plus d'une centaine de mac à identifier

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed