[Script] administration de commutateur via snmp (switch)

Wiki et Scripts Linux par les utilisateurs d’it 2037

[Script] administration de commutateur via snmp (switch)

Messagede Eric le 01 Fév 2008, 16:17

Snmp_get est un script qui collecte les caractéristiques des interfaces réseaux d’un ou plusieurs équipements.

Le code est difficilement réutilisable, j’ai écris ça à mesure de l’évolution des besoins.

Le fichier list_sw contient une adresse IP par ligne.

L’analyse de chaque équipement est lancée en parallèle, attention à la charge généré sur le système (j’ai atteins une charge à 2 chiffres pour une analyse sur une soixantaine de pile).


Code: Tout sélectionner
#!/bin/bash
#
# Ce script distribué sous la licence GNU FDL a été développé a l'origine par Eric BOUCHE
#
# Site officiel du script : http://2037.org/ || http://it.2037.biz/viewtopic.php?t=8626
#
# Permission vous est donné de distribuer, modifier ce script tant que cette note apparaît clairement
#
# Version 1.0.0 du 1 fevrier 2008
#

rm -f logs
rm -f switch.csv

echo ";IP;Nom;Location;SW desc;Num port;Inter desc;PWR Capable;Vitesse;Etat;UPTime;MDA Capable;ATTention;TOIP Capable;" > switch.csv

for e in `cat list_sw`
do
    nice -n 15 ./get_info.sh $e &
    sleep 10
done

while [ "$pause" != "go" ]
  do
    echo "attendre la fin du traitement puis [go]"
    read pause
  done

for e in `cat list_sw`
do
    cat tmp/logs_$e >> logs
    cat tmp/switch_$e.csv >> switch.csv
done


Code: Tout sélectionner
#!/bin/bash
#
# Ce script distribué sous la licence GNU FDL a été développé a l'origine par Eric BOUCHE
#
# Site officiel du script : http://2037.org/ || http://it.2037.biz/viewtopic.php?t=8626
#
# Permission vous est donné de distribuer, modifier ce script tant que cette note apparaît clairement
#
# Version 1.0.0 du 1 fevrier 2008
#

#
# env
ipadd=$1


rm -f tmp/switch_$ipadd.csv
rm -f tmp/logs_$ipadd

# recuperation des infos
/usr/bin/snmpwalk -c /public $ipadd > tmp/tmp_snmp_$ipadd
# cache
execc_snmpwalk="cat tmp/tmp_snmp_$ipadd"

# debug
#debug=true # commenter la ligne pour desativer

# nombre interface reseau
nb_if=`$execc_snmpwalk | awk '/^ifNumber.* /{print \$2}'`
uptimee=`$execc_snmpwalk | awk '/^sysUpTime.* /{print \$2}'`

for y in sysDescr sysName sysLocation
do
    declare ${y}="`$execc_snmpwalk | awk '/'$y'.* /{print \$0}' | sed s/$y...//`"
done

for z in sysUpTime
do
    declare ${z}="`$execc_snmpwalk | awk '/'$z'.* /{print \$2}'`"
done   

#
# variable def switch

port_nb=1
port_tmp=1
nb_port_down=0
nb_port_up=0
nb_port_10=0
nb_port_100=0
nb_port_fx=0
nb_port_pwr=0
nb_port_poss=0
nb_port_toip=0
nb_port_toip_poss=0

while [ "$port_nb" -le "$nb_if" ]
do
   
    [ -n "$debug" ] && echo "Traitement $port_tmp"
   
   #
   # def variable port
   ifDescr=`$execc_snmpwalk |  grep "ifDescr.$port_tmp "| sed s/ifDescr...//`
   ifDescrMDA=`echo $ifDescr | egrep '(MDA|Gbic)'`
   ifDescrPWR=`echo $ifDescr | grep 'PWR'`
   ifDescr470=`echo $ifDescr | grep '470'`
   ifSpeed=`$execc_snmpwalk | awk '/ifSpeed'.$port_tmp' /{print \$2}'`
   ifOperStatus=`$execc_snmpwalk |  awk '/^ifOperStatus'.$port_tmp' /{print \$2}'`
   ifLastChange=`$execc_snmpwalk | awk '/ifLastChange'.$port_tmp' /{print \$2}'`

   # on ecarte les ports interconnexions
   mda_csv=""
   if [ -z "$ifDescrMDA" ] && [ "$ifSpeed" -ne 0 ]
    then
   
   # port up
   if [ "$ifOperStatus" -eq 1 ]
    then
       nb_port_up=`expr $nb_port_up + 1`
    # port down
    elif [ "$ifOperStatus" -eq 2 ]
    then
      # si le port est down depuis plus de 60 unites alors il est non utilisé
      if [ $(((sysUpTime-ifLastChange)/8640000)) -gt 60 ]
       then
           nb_port_down=`expr $nb_port_down + 1`
       else
          err="true"
      fi
   fi
   
   # port 10 mbs
        if [ "$ifSpeed" -gt 10000000 ]
     then
       [ -n "$debug" ] && echo "port $port_tmp 100 mbs ou plus"
         nb_port_100=`expr $nb_port_100 + 1`
    elif [ "$ifSpeed" -ne 0 ]
     then
            [ -n "$debug" ] && echo "port $port_tmp 10 mbs"
            nb_port_10=`expr $nb_port_10 + 1`
       err="true"
        fi
   
   # PWR
   PWR_csv=" "
   if [ "$ifDescrPWR" != "" ]
    then
       [ -n "$debug" ] && echo "PWR Capable"
       nb_port_pwr=`expr $nb_port_pwr + 1`
       PWR_csv="PWR Capable"
   elif [ "$ifDescr470" != "" ]
    then   
       nb_port_poss=`expr $nb_port_poss + 1`
       PWR_csv="PWR Possible"
   fi

   # bilan
   toip_csv=""
   if [ "$ifSpeed" -gt 10000000 ] && [ "$ifDescrPWR" != "" ]
    then
       [ -n "$debug" ] && echo "TOIP Capable"
      nb_port_toip=`expr $nb_port_toip + 1`
      toip_csv="TOIP Capable"
   elif [ "$ifSpeed" -gt 10000000 ] && [ "$ifDescr470" != "" ]
    then
       nb_port_toip_poss=`expr $nb_port_toip_poss + 1`
       toip_csv="TOIP Possible"
   fi
      
   else
   [ -n "$debug" ] && echo "$ifDescr"
   nb_port_fx=`expr $nb_port_fx + 1`
   mda_csv=$((ifSpeed/1000000))
   ifSpeed=" "   
   fi
   
   #
   # fichier csv
   echo ";$ipadd;$sysName;$sysLocation;$sysDescr;$port_tmp;$ifDescr;$PWR_csv;$((ifSpeed/1000000));`if [ "$ifOperStatus" = "1" ] ; then echo "up" ; else echo "down"; fi`;$(((sysUpTime-ifLastChange)/8640000));$mda_csv;`[ "$err" = "true" ] && echo "/!\ "`;$toip_csv;" >> tmp/switch_$ipadd.csv
   
   # procedure de fin
   port_tmp=`/usr/bin/snmpgetnext -c /public $ipadd .1.3.6.1.2.1.2.2.1.1.$port_tmp | awk '{print $2}'`
   port_nb=`expr $port_nb + 1`
   err=""
done   

# on fait les comtpes

echo -e "#####################"
echo "IP $ipadd"
echo "Nom  $sysName"
echo "Loca $sysLocation"
echo "Hard $sysDescr"
echo "Time $((sysUpTime/8640000))"

echo -e "\nSwitch $nb_if port" 
echo "$nb_port_up ports up"
echo "$nb_port_down ports down"
echo -e "\n$nb_port_10 ports 10 mbs"
echo "$nb_port_100 ports 100 mbs ou plus"
echo "$nb_port_fx ports autre(s)"
echo -e "\n$nb_port_pwr ports PWR Capable"
echo "$nb_port_poss ports PWR Possible"
echo "$nb_port_toip ports TOIP Capable"
echo "$nb_port_toip_poss ports TOIP Possible"
echo -e "#####################"

echo -e "#####################" >> tmp/logs_$ipadd
echo "IP $ipadd" >> tmp/logs_$ipadd
echo "Nom  $sysName" >> tmp/logs_$ipadd
echo "Loca $sysLocation" >> tmp/logs_$ipadd
echo "Hard $sysDescr" >> tmp/logs_$ipadd
echo "Time $sysUpTime" >> tmp/logs_$ipadd

echo -e "\nSwitch $nb_if port" >> tmp/logs_$ipadd
echo "$nb_port_up ports up" >> tmp/logs_$ipadd
echo "$nb_port_down ports down" >> tmp/logs_$ipadd
echo -e "\n$nb_port_10 ports 10 mbs" >> tmp/logs_$ipadd
echo "$nb_port_100 ports 100 mbs ou plus" >> tmp/logs_$ipadd
echo "$nb_port_fx ports autre(s)" >> tmp/logs_$ipadd
echo -e "\n$nb_port_pwr ports PWR Capable" >> tmp/logs_$ipadd
echo "$nb_port_poss ports PWR Possible" >> tmp/logs_$ipadd
echo "$nb_port_toip ports TOIP Capable" >> tmp/logs_$ipadd
echo "$nb_port_toip_poss ports TOIP Possible" >> tmp/logs_$ipadd
echo -e "#####################\n" >> tmp/logs_$ipadd


exit 0


Exemple de sortie :

Sortie fichier logs a écrit:#####################
IP 10.20.30.40
Nom Switch distrib B30
Loca BAT. 30, rdc, BA01
Hard Business Policy Switch 2000 HW:04 FW:3.0.0.5 SW:v3.0.3.08 ISVN:2
Time 1165819891

Switch 180 port
136 ports up
13 ports down

13 ports 10 mbs
155 ports 100 mbs ou plus
12 ports autre(s)

0 ports PWR Capable
144 ports PWR Possible
0 ports TOIP Capable
135 ports TOIP Possible
#####################


On a également en sortie un fichier csv (tableau excel) avec le detail de chaque pile, switch, port...

PWR Capable indique que l'élément supporte POE
PWR Possible indique que l'élément supporte POE mais qu'il n'est pas activé sur l'unité (raison de firmware)
TOIP Capable indique que l'élément peut être utilisé pour la téléphonie sur IP
TOIP Capable indique que l'élément est susceptible de pouvoir faire le la TOIP

Commentaire par rapport à ce sujet : topic8977.html
Fichiers joints
snmp_get-excel.png
Dernière édition par Eric le 17 Juin 2008, 14:08, édité 1 fois.
Raison: update
Eric BOUCHE
Fondateur et président de l’association 2037
Ingénieur architecte réseaux et télécoms...
Avatar de l’utilisateur
Eric
Administrateur du réseau
Administrateur du réseau
 
Messages: 493
Inscription: 27 Mar 2005, 00:07
Localisation: Fr / Région PACA

flash_sw.php

Messagede Eric le 17 Juin 2008, 13:38

Ce script php met à jour un commutateur de marque Nortel, opération facilement adaptable à d’autre type de commutateur (switch réseau) supportant SNMP.

La première étape sauvegarde la configuration de l’équipement sur un serveur tftp.
La seconde partie met à jour de bios (boot) depuis un serveur tftp.
La troisième partie met à jour l’IOS (micro logiciel) depuis un serveur tftp.

Code: Tout sélectionner
<?php

if(empty($argv[1]))
{
  echo "Exemple : php snmp-v2.php 192.168.0.254 \n";
  exit;
}

$debug=false;
$C_IP = $argv[1];
$C_COMMUNITY = "public";
$C_COMMUNITY_PRIVATE = "private";


$sysName = snmpgetclear(".iso.org.dod.internet.mgmt.mib-2.system.sysName.0");
$sysLocation = snmpgetclear(".iso.org.dod.internet.mgmt.mib-2.system.sysLocation.0");
$sysDescr = snmpgetclear(".iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0");

// Info sur le commutateur
echo $sysName . " - " . $sysLocation . " - " . "$sysDescr" . "\n";


// Si et seulement si BPS 2000
if(ereg(".*Business\ Policy\ Switch\ 2000.*", $sysDescr))
{

  // backup

  echo execsnmp("set tftp srv", ".1.3.6.1.4.1.45.1.6.4.2.2.1.5.1", "a", "192.168.0.254");
  echo execsnmp("sav conf", ".1.3.6.1.4.1.45.1.6.4.4.4.0", "x", bin2hex("back/flash_" . $C_IP));
  echo execsnmp("exec sav", ".1.3.6.1.4.1.45.1.6.4.2.1.24.0", "i", "4");

sleep('5');

  // set

  echo execsnmp("set tftp srv", ".1.3.6.1.4.1.45.1.6.4.2.2.1.5.1", "a", "192.168.0.254");
// cf http://fr.php.net/bin2hex pour la valeur en hexa
  echo execsnmp("set .bin", ".1.3.6.1.4.1.45.1.6.3.5.1.1.8.8.1.0.2", "x", "425053323030305F333630362E62696E");
  echo execsnmp("exec .bin", ".1.3.6.1.4.1.45.1.6.4.2.1.24.0", "i", "6");

sleep('2');
$sysDescrTMP = "";
while (!ereg(".*FW:3\.6\.0\.6.*", "$sysDescrTMP"))
{

$sysDescrTMP = @snmpgetclear(".iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0");
echo ".";
sleep('1');

}

sleep('2');

  echo execsnmp("set tftp srv", ".1.3.6.1.4.1.45.1.6.4.2.2.1.5.1", "a", "192.168.0.254");
  echo execsnmp("set .img", ".1.3.6.1.4.1.45.1.6.3.5.1.1.8.8.1.0.1", "x", "425053323030305F333231342E696D67");
  echo execsnmp("exec .img", ".1.3.6.1.4.1.45.1.6.4.2.1.24.0", "i", "3");

while (!ereg(".*SW:v3\.2\.1\.04.*", "$sysDescrTMP"))
{

$sysDescrTMP = @snmpgetclear(".iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0");
echo ".";
sleep('1');

}

} // end if BPS 2000

//
// functions

// On format la response SNMP
function snmpgetclear($oid)
{
  $invar = snmpget($GLOBALS['C_IP'],$GLOBALS['C_COMMUNITY'],"$oid");
  $var = eregi_replace("STRING: ","",$invar);
  return eregi_replace("\"","",$var);
}


function execsnmp($message, $oid, $type, $valeur)
{
  // Configuration des fonctionnalités d'auth
  if(snmpset($GLOBALS['C_IP'],$GLOBALS['C_COMMUNITY_PRIVATE'],$oid, $type, $valeur))
   {
    // 802.1x enable
    return "\n !! " . $message  . " !!";
   } else {
    echo "\n !! Erreur snmpset - " . $message . " - " . $GLOBALS['C_IP'] . " - " . $GLOBALS['C_COMMUNITY_PRIVATE']
         . " - " . $oid . " - " . $type . " - " . $valeur . " !! \n";
   }
}


?>
Eric BOUCHE
Fondateur et président de l’association 2037
Ingénieur architecte réseaux et télécoms...
Avatar de l’utilisateur
Eric
Administrateur du réseau
Administrateur du réseau
 
Messages: 493
Inscription: 27 Mar 2005, 00:07
Localisation: Fr / Région PACA

config_srv.php

Messagede Eric le 17 Juin 2008, 13:41

Se script sauvegarde la configuration d’un commutateur réseau Nortel sur un serveur tftp et applique une nouvelle configuration stocké sur un serveur tftp.

Code: Tout sélectionner
<?php

if(empty($argv[1]))
{
  echo "Exemple : php snmp-v2.php 192.168.0.254 \n";
  exit;
}

$debug=false;
$C_IP = $argv[1];
$C_COMMUNITY = "public";
$C_COMMUNITY_PRIVATE = "private";


$sysName = snmpgetclear(".iso.org.dod.internet.mgmt.mib-2.system.sysName.0");
$sysLocation = snmpgetclear(".iso.org.dod.internet.mgmt.mib-2.system.sysLocation.0");
$sysDescr = snmpgetclear(".iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0");

// Info sur le commutateur
echo $sysName . " - " . $sysLocation . " - " . "$sysDescr" . "\n";


// Si et seulement si BPS 2000
if(ereg(".*Business\ Policy\ Switch\ 2000.*", $sysDescr))
{

  // backup

  echo execsnmp("set tftp srv", ".1.3.6.1.4.1.45.1.6.4.2.2.1.5.1", "a", "192.168.0.254");
  echo execsnmp("sav conf", ".1.3.6.1.4.1.45.1.6.4.4.4.0", "x", bin2hex("back/conf_" . $C_IP));
  echo execsnmp("exec sav", ".1.3.6.1.4.1.45.1.6.4.2.1.24.0", "i", "4");

sleep('5');

  // set


  echo execsnmp("set tftp srv", ".1.3.6.1.4.1.45.1.6.4.2.2.1.5.1", "a", "192.168.0.254");
  echo execsnmp("set .txt", ".1.3.6.1.4.1.45.1.6.4.4.6.0", "x", bin2hex("config.txt" . $C_IP));
  echo execsnmp("exec .txt", ".1.3.6.1.4.1.45.1.6.4.4.9.0", "i", "4");

} // end if BPS 2000



//
// functions

// On format la response SNMP
function snmpgetclear($oid)
{
  $invar = snmpget($GLOBALS['C_IP'],$GLOBALS['C_COMMUNITY'],"$oid");
  $var = eregi_replace("STRING: ","",$invar);
  return eregi_replace("\"","",$var);
}


function execsnmp($message, $oid, $type, $valeur)
{
  // Configuration des fonctionnalités d'auth
  if(snmpset($GLOBALS['C_IP'],$GLOBALS['C_COMMUNITY_PRIVATE'],$oid, $type, $valeur))
   {
    // 802.1x enable
    return "\n !! " . $message  . " !!";
   } else {
    echo "\n !! Erreur snmpset - " . $message . " - " . $GLOBALS['C_IP'] . " - " . $GLOBALS['C_COMMUNITY_PRIVATE']
         . " - " . $oid . " - " . $type . " - " . $valeur . " !! \n";
   }
}


?>
Eric BOUCHE
Fondateur et président de l’association 2037
Ingénieur architecte réseaux et télécoms...
Avatar de l’utilisateur
Eric
Administrateur du réseau
Administrateur du réseau
 
Messages: 493
Inscription: 27 Mar 2005, 00:07
Localisation: Fr / Région PACA

config_port.php

Messagede Eric le 17 Juin 2008, 14:04

Ce script php écrit pour les commutateurs Nortel active l’IEEE 802.1x sur certain port.

La règle est on active si et seulement si :

Il y a 0 ou 1 adresse mac sur le port
S’il y a une adresse mac, elle doit figurer dans la liste des équipements compatibles
Le port ne doit pas être dans un vlan spécifique (vlan 2 ou vlan 3 dans notre exemple)

Code: Tout sélectionner
<?php
// Tableau des @mac's 8021x capable

$B_mac8021xCapable = array(
'PC-SERIE-30-1' => '000102D',
'PC-SERIE-30-2' => '0007E9',
'PC-SERIE-30-3' => '0010DC1',
'PC-SERIE-30-4' => '00105A',

'PC-SERIE-32-1' => '000CF1',
'PC-SERIE-32-2' => '001111',
'PC-SERIE-32-3' => '001320',

'PC-SERIE-33-1' => '001635A',
'PC-SERIE-33-2' => '001CC4',
'PC-SERIE-33-3' => '001E0B',
'PC-SERIE-33-4' => '001A4B',
'PC-SERIE-33-5' => '001438',
'PC-SERIE-33-6' => '001B784',
'PC-SERIE-33-7' => '0017A4',
'PC-SERIE-33-8' => '001321',
'PC-SERIE-33-9' => '001871',
'PC-SERIE-33-10' => '001279',
'PC-SERIE-33-11' => '001708',

'PC-SERIE-3O-1' => '000102',
'PC-SERIE-3O-2' => ' 0002A5',
'PC-SERIE-3O-3' => '000802',
'PC-SERIE-3O-4' => '000AE4',
'PC-SERIE-3O-5' => '000F1F',
'PC-SERIE-3O-6' => '001143',
'PC-SERIE-3O-7' => '00123F',
'PC-SERIE-3O-8' => '001422',
'PC-SERIE-3O-9' => '0014C2',
'PC-SERIE-3O-10' => '0016D3',
'PC-SERIE-3O-11' => '0016D4',
'PC-SERIE-3O-12' => '001B38'
);


if(empty($argv[1]))
{
  echo "Exemple : php snmp-v2.php 192.168.0.254 \n";
  exit;
}

$debug=false;
$C_IP = $argv[1];
$C_COMMUNITY = "public";
$C_COMMUNITY_PRIVATE = "private";

$authvlanid="23";

$sysName = snmpgetclear(".iso.org.dod.internet.mgmt.mib-2.system.sysName.0");
$sysLocation = snmpgetclear(".iso.org.dod.internet.mgmt.mib-2.system.sysLocation.0");
$sysDescr = snmpgetclear(".iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0");


// Info sur le commutateur
echo $sysName . " - " . $sysLocation . " - " . "$sysDescr" . "\n";

// Configuration de base commutateur
confcommutateur();

// On récupere la liste des ports
// sortie tableau type : [IF-MIB::ifName.577] [ STRING: ifc577 (Slot: 2 Port: 49)]
$portsList = snmprealwalk($GLOBALS['C_IP'],$GLOBALS['C_COMMUNITY'],".1.3.6.1.2.1.31.1.1.1.1");
$B_portslistclear = portslistclear($portsList);

if($debug==true)
{

// Affiche le tableau formaté [id port] [description]
foreach ($B_portslistclear as $key => $value)
  {
   echo $key . " - " . $value . " \n";
  }
}

// On récupere l'association xid port
// Sortie tableau type : [RFC1213-MIB::mib-2.17.4.3.1.2.0.27.56.135.212.238] [INTEGER: 79]
$xidList = snmprealwalk($GLOBALS['C_IP'],$GLOBALS['C_COMMUNITY'],".1.3.6.1.2.1.17.4.3.1.2");
$B_xidlistclear = xidlistclear($xidList);

if($debug==true)
{
// Affiche le tableau formaté [id port] [description]
foreach ($B_xidlistclear as $key => $value)
  {
   echo $key . " - " . $value . " \n";
  }
}

// On récupere l'association xid mac
// Sortie tableau type : [RFC1213-MIB::mib-2.17.4.3.1.1.8.0.78.26.26.157] [Hex-STRING: 08 00 4E 1A 1A 9D]
$macList = snmprealwalk($GLOBALS['C_IP'],$GLOBALS['C_COMMUNITY'],".1.3.6.1.2.1.17.4.3.1.1");
$B_macListclear = macListclear($macList);

if($debug == true)
{
// Affiche le tableau formaté [id port] [description]
foreach ($B_macListclear as $key => $value)
  {
   echo $key . " - " . $value . " \n";
  }
}


// On recupere la liste des vlans pour chaque
$vlanList = snmprealwalk($GLOBALS['C_IP'],$GLOBALS['C_COMMUNITY'],".1.3.6.1.4.1.2272.1.3.3.1.3");
$B_vlanListclear = vlanlistclear($vlanList);

if($debug == true)
{
// Affiche le tableau formaté [id port] [description]
foreach ($B_vlanListclear as $key => $value)
  {
   echo $key . " - " . $value . " \n";
  }
}

// connexion à la base
$db = mysql_connect('localhost', 'root', 'mot_de_passe')  or die('Erreur de connexion '.mysql_error());

// sélection de la base
mysql_select_db('eric',$db)  or die('Erreur de selection '.mysql_error());


// On analyse chaque port
foreach ($B_portslistclear as $port => $desc)
  {
   // On reinitialise le nombre d'xid (mac du port)
   $nbmac = 0;
   echo "\n" . $desc . " - idport : " . $port;
   foreach ($B_xidlistclear as $xid => $port2)
    {
     if($port == $port2)
      {
      // On a trouvé un xid sur le port
      $portxid = $xid;
      $nbmac++;
      if($debug == true)
      {
      foreach ($B_macListclear as $xid2 => $Mac)
       {
        if($xid2==$xid)
         {
          echo " - " . $Mac;
         }
       } // end macListclear
      } // end debug
     } // end $port == $port2
    } // end xidlistclear

    // On affiche le nombre d'xid pour le port
    echo " - nbmac : " . $nbmac;

    //
    // Vérification de l'eligibilité du port au 802.1x

    // Il y a zero ou une adresse mac sur le port   
    if($nbmac < 2)
     {
      // Si il y a une seule adresse mac
     if($nbmac == 1)
      {
       $oke = mac8021xcapable($portxid);
       if(strlen($oke) == '18')
        {
         echo " - $oke";

         // on écrit la requête sql
        } else {
         echo " - $oke - mac inconnu";
        }
      } else {
       $oke = "$nbmac @mac";
      } // end nbmac == 1

      // On effectue les modifications sur le port
      if(($nbmac == 0 || strlen($oke) == '18') && getportvlan($port) && ! ereg('.*MDA.*', $desc))
       {
        echo " - ** 802.1x ACTIVE **";
        confportcommutateur($port);

   $sql = "INSERT INTO conf_sw (`id`, `date`, `sysname`, `sysip`, `sysloca`, `sysdesc`, `portdesc`, `portid`, `vlanid`, `portmac`, `porteap`) VALUES (NULL, NOW(), '{$sysName}', '{$argv[1]}', '{$sysLocation}', '{$sysDescr}', '{$desc}', '{$port}', '{$GLOBALS['vlanid']}', '{$oke}', 'enable')";
       } else {
        echo " - ++ 802.1x NON POSSIBLE ++ ";
        $sql = "INSERT INTO conf_sw (`id`, `date`, `sysname`, `sysip`, `sysloca`, `sysdesc`, `portdesc`, `portid`, `vlanid`, `portmac`, `porteap`) VALUES (NULL, NOW(), '{$sysName}', '{$argv[1]}', '{$sysLocation}', '{$sysDescr}', '{$desc}', '{$port}', '{$GLOBALS['vlanid']}', '{$oke}', 'disable')";
       }

     } else {
     $sql = "INSERT INTO conf_sw (`id`, `date`, `sysname`, `sysip`, `sysloca`, `sysdesc`, `portdesc`, `portid`, `vlanid`, `portmac`, `porteap`) VALUES (NULL, NOW(), '{$sysName}', '{$argv[1]}', '{$sysLocation}', '{$sysDescr}', '{$desc}', '{$port}', '{$GLOBALS['vlanid']}', '{$nbmac} @mac', 'disable')";
     }// end nbmac < 2
     // on insère les informations du formulaire dans la table
     mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
  } // end portslistclear

// on ferme la connexion
mysql_close();




//
// functions

// On format la response SNMP
function snmpgetclear($oid)
{
  $invar = snmpget($GLOBALS['C_IP'],$GLOBALS['C_COMMUNITY'],"$oid");
  $var = eregi_replace("STRING: ","",$invar);
  return eregi_replace("\"","",$var);
}

// On format la liste des ports
function portslistclear($tabportsList)
{
  foreach ($tabportsList as $key => $value)
   {
     // Valeur type "IF-MIB::ifName.577" => "577"
     $key =  eregi_replace(".*\.","",$key);

     // Valeur type "STRING: ifc577 (Slot: 2 Port: 49)" => "Slot: 2 Port: 49"
     $value = eregi_replace(".*\(","",$value);
     $value = eregi_replace("\)","",$value);

     // Génération tableau formaté en retour
     // [port id] [desc]
     $tabportsListclear[$key] = $value;
     
   }
  return $tabportsListclear;
}

// On format la liste xid
function xidlistclear($tabxidList)
{
  foreach ($tabxidList as $key => $value)
   {
     // Valeur type "RFC1213-MIB::mib-2.17.4.3.1.2.0.27.56.135.212.238" => "0.27.56.135.212.238"
     $key =  eregi_replace(".*::mib-2.17.4.3.1.2.","",$key);

     // Valeur type "INTEGER: 79" => "79"
     $value = eregi_replace("INTEGER: ","",$value);

     // Génération tableau formaté en retour
     // [port id] [desc]
     $tabxidlistclear[$key] = $value;

   }
  return $tabxidlistclear;
}

// On format la liste mac
function maclistclear($tabmacList)
{
  foreach ($tabmacList as $key => $value)
   {
     // Valeur type "RFC1213-MIB::mib-2.17.4.3.1.1.8.0.78.26.26.157" => "8.0.78.26.26.157"
     $key =  eregi_replace(".*::mib-2.17.4.3.1.1.","",$key);

     // Valeur type "Hex-STRING: 08 00 4E 1A 1A 9D" => "08004E1A1A9D"
     $value = eregi_replace("Hex-STRING: ","",$value);
     $value = eregi_replace(" ","",$value);

     // Génération tableau formaté en retour
     // [port id] [desc]
     $tabmacListclear[$key] = $value;

   }
  return $tabmacListclear;
}

// On format la liste vlan
function vlanlistclear($tabvlanList)
{
  foreach ($tabvlanList as $key => $value)
   {
    $key =  eregi_replace(".*::enterprises.2272.1.3.3.1.3.","",$key);
    $value = eregi_replace("Hex-STRING: ","",$value);

    // Génération tableau formaté en retour
    // [port id] [desc]
    $tabvlanListclear[$key] = hexdec($value);
   }
  return $tabvlanListclear;
}

// On verifie l'appartenance d'un port à un vlan
function getportvlan($port)
{
  // On balaye le tableau à la recherche du port
  $GLOBALS['vlanid'] = "";
  foreach ($GLOBALS['B_vlanListclear']  as $key => $value)
   {
    if($port == $key)
     {
      echo  " - vlan : $value";
      // log SQL
      $GLOBALS['vlanid'] = $value;
     // On a trouve le port, est-il dans un vlan auth ?
      if(ereg("^[" . $GLOBALS['authvlanid'] . "]$", $value))
       {
        // oke le port est eligible
        return true;
       }
     }
   }
  return false;
}

// Adresse mac eligible ?
// si oui on renvoit l'adresse mac avec la chaine " - OKé"
// si non on renvoit juste l'addresse mac
function mac8021xcapable($xid)
{
//
// On s'assure que l'adresse mac est repertoriee
       
// Assocation xid mac avant la recherche
foreach ($GLOBALS['B_macListclear'] as $xid2 => $mac)
  {
   if($xid == $xid2)
    {
     // On a trouvé l'assocation
     // On compare la mac avec notre base d'adresse 802.1x capable
     foreach ($GLOBALS['B_mac8021xCapable'] as $key => $value)
      {
       // Comparaison
       if(eregi($value . ".*",$mac))
        {
         // oke y a correspondance
         return "$mac - OKé";
        }
      } // end comparaison
      return "$mac";
     }
  } // end foreach $B_macListclear
}

//
// Configuration du commutateur via snmp

function execsnmp($message, $oid, $type, $valeur)
{
  // Configuration des fonctionnalités d'auth
  if(snmpset($GLOBALS['C_IP'],$GLOBALS['C_COMMUNITY_PRIVATE'],$oid, $type, $valeur))
   {
    // 802.1x enable
    return "\n !! " . $message  . " !! \n";
   } else {
    echo "\n !! Erreur snmpset - " . $message . " - " . $GLOBALS['C_IP'] . " - " . $GLOBALS['C_COMMUNITY_PRIVATE']
        . " - " . $oid . " - " . $type . " - " . $valeur . " !! \n";
   }
}

function confcommutateur()
{
  // Configuration des fonctionnalités d'auth
  execsnmp("8021x active sur la pile", ".1.0.8802.1.1.1.1.1.1.0", "i", "1");
}

// Configuration du port via snmp
function confportcommutateur($port)
{
  // Solution pas tres clean pour ecarter les ports Cascade
  if($port < 500)
   {
    execsnmp("portauth auto", ".1.0.8802.1.1.1.1.2.1.1.6.{$port}", "i", "2");
    execsnmp("portreauth", ".1.0.8802.1.1.1.1.2.1.1.13.{$port}", "i", "1");
    execsnmp("delay reauth", ".1.0.8802.1.1.1.1.2.1.1.12.{$port}", "u", "392400");
    execsnmp("port init now", ".1.0.8802.1.1.1.1.1.2.1.4.{$port}", "i", "1");
    execsnmp("port retry auth", ".1.0.8802.1.1.1.1.2.1.1.11.{$port}", "u", "9");
   }
}

// Obtention vlan id du port
function getportvlanid ($port)
{
 
}

?>


Les opérations réalisées sont journalisées dans une base de données :

conf_sw.jpg


Structure de la base de données :

Code: Tout sélectionner
--
-- Base de données: `eric`
--

-- --------------------------------------------------------

--
-- Structure de la table `conf_sw`
--

CREATE TABLE IF NOT EXISTS `conf_sw` (
  `id` int(11) NOT NULL auto_increment,
  `date` date default NULL,
  `sysname` varchar(256) default NULL,
  `sysip` varchar(256) default NULL,
  `sysloca` varchar(256) default NULL,
  `sysdesc` varchar(256) default NULL,
  `portdesc` varchar(256) default NULL,
  `portid` varchar(256) default NULL,
  `vlanid` varchar(255) default NULL,
  `portmac` varchar(256) default NULL,
  `porteap` varchar(256) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Structure de la table `getmac`
--

CREATE TABLE IF NOT EXISTS `getmac` (
  `id` int(16) NOT NULL auto_increment,
  `time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `ip` varchar(64) NOT NULL,
  `mac` varchar(64) NOT NULL,
  `nom` varchar(255) NOT NULL,
  `os` varchar(128) NOT NULL,
  `ossp` varchar(256) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Structure de la table `seteapol`
--

CREATE TABLE IF NOT EXISTS `seteapol` (
  `id` int(16) NOT NULL auto_increment,
  `time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `ip` varchar(64) NOT NULL,
  `mac` varchar(64) NOT NULL,
  `nom` varchar(255) NOT NULL,
  `user` varchar(255) default NULL,
  `os` varchar(128) NOT NULL,
  `ossp` varchar(256) NOT NULL,
  `message` text,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Eric BOUCHE
Fondateur et président de l’association 2037
Ingénieur architecte réseaux et télécoms...
Avatar de l’utilisateur
Eric
Administrateur du réseau
Administrateur du réseau
 
Messages: 493
Inscription: 27 Mar 2005, 00:07
Localisation: Fr / Région PACA

Re: [Script] administration de commutateur via snmp (switch)

Messagede jack daniel le 28 Juil 2008, 12:32

salut,

je suis justement en train de chercher à faire des scripts snmp en php pour le chargement et la sauvegarde des configurations des nortels 25xx.

et j ai un petit soucis...

- j ai créé un fichier .php (j ai aussi essayé avec un .txt) avec la liste des adresses IP des switchs.
- je lis le fichier avec f_gets et stocke les valeurs dans un tableau.
apres ca se corse, je dois utiliser ces valeurs comme parametres dans la fonction snmp_get.
l'hote (l'ip) doit etre du type "192.168.1.1"dans la fonction snmp_get.

dans mon fichier si je met les addresses ip entre guillemet ca changer pas, il me met comme message d'erreur:

Warning: snmpget() [function.snmpget]: Could not open snmp connection: Unknown host [...], comme si le parametre etait incorrect.

voici mon code j aimerai savoir comment régler mon pb, merci d avance:

<?php


$C_COMMUNITY = "*******";
$C_COMMUNITY_PRIVATE = "******";

$fp = fopen("\www\IP-switchs_Nortel.php", "r");

if ($fp !== FALSE) {

while (!feof($fp)){
$ligne = fgets($fp,4096);

$liste = explode("-",$ligne); // Champs séparés par - , on en fait un tableau

$lieu = $liste[0];

$nom = $liste[1];

$C_IP = $liste[2];

//identifiants du commutateur:

echo "lieu: $lieu - nom: $nom - adresse IP: $C_IP <br />";


// save:
$sysName = snmpget($C_IP,$C_COMMUNITY,".iso.org.dod.internet.mgmt.mib-2.system.sysName.0");
echo "$sysName";
?>



premiere ligne de mon fichier .php des listes d adresses:

<lieu> - <nom> - "A.B.C.D"
jack daniel
Nouveau
Nouveau
 
Messages: 4
Inscription: 23 Juil 2008, 17:59

Re: [Script] administration de commutateur via snmp (switch)

Messagede jack daniel le 28 Juil 2008, 14:43

jai utilisé la fonction "include 'fichier_ip.php' " pour éviter la prise de tete.

peut rendre possible l'entrée utilisateur clavier en php sous windows?
je voudrai créer une interface qui demande à l'utilisateur de rentrer les adresses ip sans devoir modifier un fichier.
il y a bien la fonction readline(), mais elle n'est disponible que sous Linux.
jack daniel
Nouveau
Nouveau
 
Messages: 4
Inscription: 23 Juil 2008, 17:59

Re: [Script] administration de commutateur via snmp (switch)

Messagede unibroue le 28 Juil 2008, 14:46

Petite note ... PHP c'est du code pour le développement Web ... donc si tu veux que tes utilisateurs puissent entrer du data, tu dois utiliser une interface web via un léger formulaire qui enverra l'information à ton script qui retournera la valeur ...
Officier S.I.C.K. (Seek Intercept Control Kill) Milsim Painball Crew
Administrateur réseau / CCNA
Administrateur 2037
Administrateur itsg33k.ca
Avatar de l’utilisateur
unibroue
Administrateur
Administrateur
 
Messages: 3255
Inscription: 18 Mai 2005, 16:29
Localisation: Québec, Canada

Re: [Script] administration de commutateur via snmp (switch)

Messagede jack daniel le 29 Juil 2008, 09:47

c est possible de faire une interface en php sous windows? ou je suis obligé de passer par du CMS ou autre?
jack daniel
Nouveau
Nouveau
 
Messages: 4
Inscription: 23 Juil 2008, 17:59

Re: [Script] administration de commutateur via snmp (switch)

Messagede unibroue le 29 Juil 2008, 13:30

Il y a quelque chose que t'as pas compris je crois ...

c'est du WEB ... donc compatible avec n'importe quel plateforme à la base (windows/linux/etc...)

Tu développes sur le système que tu veux y'a pas de souci, c'est le même code!!!

Je t'envois à notre section PHP si tu veux de l'aide : forum36.html
Officier S.I.C.K. (Seek Intercept Control Kill) Milsim Painball Crew
Administrateur réseau / CCNA
Administrateur 2037
Administrateur itsg33k.ca
Avatar de l’utilisateur
unibroue
Administrateur
Administrateur
 
Messages: 3255
Inscription: 18 Mai 2005, 16:29
Localisation: Québec, Canada

Re: [Script] administration de commutateur via snmp (switch)

Messagede jack daniel le 29 Juil 2008, 16:13

ok. j ai fait un formulaire html pour l'interface utilisateur merci.
jack daniel
Nouveau
Nouveau
 
Messages: 4
Inscription: 23 Juil 2008, 17:59


Retourner vers Biki / Scripts

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités