PHP/SNMP et les adresses MAC
Il y a un certain temps j’avais un post sur un sujet fort intéressant, comment extraire des switchs la liste des mac-address et les faire correspondres au bon port de switch et ainsi pouvoir bâtir une liste de MAC et de port sans avoir à se connecter manuellement. Ce post à été perdu lors de mon changement de blog, et je viens de décider de le remettre en place.
Vous aurez besoin de :
- Apache
- MySQL
- PHP
- module php-snmp
- SNMP activé et bien configuré dans vos équipements
J’ai inclus le code pour créer la table MySQL même si c’est très simple, question de vous aider à débuter!
CREATE TABLE `rss_mac` ( `id` INT(9) NOT NULL AUTO_INCREMENT, `mac` VARCHAR(70) NOT NULL DEFAULT '', `port` VARCHAR(10) NOT NULL DEFAULT '', `switch` VARCHAR(30) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=3325 DEFAULT CHARSET=latin1;
Et voici le gros du projet en PHP!
<?php include ('connect_mysql_master.php'); $table = array ("x.x.x.x" => "Switch1", "y.y.y.y" => "Switch2", "z.z.z.z" => "Switch3"); $count = count($table); // CHAQUE SWITCH POSSEDE SES PROPRES INFORMATIONS, ON DOIT DONC LES PASSER UNE APRES L'AUTRE foreach ($table as $key20 => $value20) { $tab = snmprealwalk($key20,"ReadOnly Password",".1.3.6.1.2.1.17.4.3.1.1"); // LISTE DES MACs $tab2 = snmprealwalk($key20,"ReadOnly Password",".1.3.6.1.2.1.17.4.3.1.2"); // LISTE DES PORT IDS ASSOCIES AUX MACs $tab3 = snmprealwalk($key20,"ReadOnly Password",".1.3.6.1.2.1.17.1.4.1.2"); // PORT ID REELS $tab4 = snmprealwalk($key20,"ReadOnly Password",".1.3.6.1.2.1.31.1.1.1.1"); // NOM DU PORT ASSOCIE AU PORT //$tab5 = snmprealwalk($key20,"ReadOnly Password","1.3.6.1.2.1.31.1.1.1.18"); // AlIAS DU PORT $switch = $value20; // ON BOUCLE DANS LA LISTE DES MACS POUR TRAITER CHAQUE ENTREE SEPAREMMENT foreach ($tab as $key => $value) { // $value == LA MAC // $key == ID MAC if (preg_match('`[[:digit:]]+\.[[:digit:]]+$`', $key, $tabResult)); $value = str_replace("Hex-STRING:","",$value); $value = trim($value); $value = str_replace(" ","-",$value); //echo $tabResult[0]; //echo " || ".$value; //echo "<br><br>"; // $value2 == PORT ID // $key2 == ID MAC foreach ($tab2 as $key2 => $value2) { if (preg_match('`[[:digit:]]+\.[[:digit:]]+$`', $key2, $tabResult2)); $value2 = str_replace("INTEGER:","",$value2); //echo $tabResult2[0]." || ".$value2."<br><br>"; // SI L'ID MAC EST EGALE DANS TAB1 ET TAB2 ON A UN MATCH ALORS ON CONTINUE LE PROCESSUS if ($tabResult[0] == $tabResult2[0]) { //echo $value." || ".$value2."<br><br>"; // $key3 = ID PORT // $value3 = ID PORT REEL foreach ($tab3 as $key3 => $value3) { if (preg_match('`\.[[:digit:]]+$`', $key3, $tabResult3)); // ON COUPE TOUT CE QUI EST AVANT LE DERNIER . POUR AVOIR LE PORT ID $tabResult3[0] = str_replace(".","",$tabResult3[0]); // ON ENLEVE DU DATA POUR AVOIR SEULEMENT LE PORT ID $value3 = str_replace("INTEGER:","",$value3); // SI LE PORT ID ICI EST EGALE AU PORT ID PRECEDENT ON A UN MATCH ALORS ON CONTINUE LE PROCESSUS if ($tabResult3[0] == $value2) { foreach ($tab4 as $key4 => $value4) { if (preg_match('`\.[[:digit:]]+$`', $key4, $tabResult4)); // ON COUPE TOUT CE QUI EST AVANT LE DERNIER . POUR AVOIR LE PORT ID $tabResult4[0] = str_replace(".","",$tabResult4[0]); // ON COUPE DU DATA POUR AVOIR SEULEMENT LE ifName $value4 = str_replace("STRING: ","",$value4); // SI LE PORT ID ICI EST EGALE AU PORT ID PRECEDENT ON A UN MATCH ALORS ON CONTINUE LE PROCESSUS if ($tabResult4[0] == $value3) { $mac = $value; $port = $value4; $query = "SELECT * FROM rss_mac WHERE mac = '$mac' AND switch = '$switch';"; $result = mysql_query($query, $mysql_connect); $nb_rows = mysql_num_rows($result); if ($nb_rows > 0) { $data = mysql_fetch_array($result); $cswitch = $data['switch']; $id = $data['id']; $query2 = "UPDATE rss_mac SET port = '$port' WHERE id = '$id';"; $result2 = mysql_query($query2, $mysql_connect); echo $mac." || ".$port." UPDATE!!<br><br>"; } else { $query2 = "INSERT INTO rss_mac VALUES ('', '$mac', '$port', '$switch');"; $resutl2 = mysql_query($query2, $mysql_connect); echo $mac." || ".$port." AJOUTE!!<br><br>"; } } } } } } } } } } ?>
Le code est pas mal commenté et des lignes sont cachés volontairement pour faire du debug.
Je dois avouer et que le code n’est peut-être pas parfait, mais pour moi ça fonctionne #1 et ça me permet de faire des interfaces pour mes switchs en linkant avec mes profils utilisateurs interne!
Si vous avez des questions, utilisés la section commentaire et je vous répondrai au mieux de mes connaissances!
It's 