[statsVLANs.py] réorganisation et amélioration du comportement

Quelques petites modifications :
 * Réorganisation du script sous forme d'une fonction pour pouvoir utiliser la fonction
   de scan depuis un autre script
 * Affichage des prises avec des VLANs bizarres mais sans machine connectée
 * Gestion des erreurs de communication avec les switchs :
    Si un switch ne répond pas, hptools.py ne renvoie pas d'erreur à la connection
    mais rale à la première commande envoyée...

darcs-hash:20090222202703-b8e4c-45ba54d74a93fdc05d13f2c6588eb8231d7355cb.gz
This commit is contained in:
Xavier Lagorce 2009-02-22 21:27:03 +01:00
parent 7c66054928
commit 3c7fcb3e63

View file

@ -21,27 +21,43 @@ from annuaires import chbre_prises
from affich_tools import * from affich_tools import *
from ldap_crans import crans_ldap from ldap_crans import crans_ldap
from ldap_crans import MachineCrans, MachineWifi, BorneWifi from ldap_crans import MachineCrans, MachineWifi, BorneWifi
from hptools import hpswitch from hptools import hpswitch, ConversationError
# nombre de prises possédant des VLANs ou pas
prises_up = 0
prises_down = 0
# nombre de prises possédant chaque VLAN
vlans_stats = dict([('adherent',0)])
# liste des résultats particuliers découverts pendant le scan
data = []
# Accès à la base ldap # Accès à la base ldap
db = crans_ldap() db = crans_ldap()
# On Commence par itérer sur chaque batiment : def scan_bats(bats, annuaire=chbre_prises):
for bat in chbre_prises: """Fonction permettant de scanner un certain nombre de switchs
La fonction scanne les switchs enregistrés de annuaire.py se trouvant dans
les bâtiments contenus dans la liste bats.
La fonction utilise l'annuaire passé en argument au celui de annuaire.py
par défaut
La fonction renvoie un doublet (vlans_stats,data) :
* vlans_stats est un dictionnaire contenant les statistiques des VLANs
trouvés
* data contient les informations sur les machines se trouvant sur des
prises possédant d'autres VLANs que le VLAN 'adhérent'
"""
# Initialistation des données :
# nombre de prises possédant chaque VLAN
vlans_stats = dict([('adherent',0)])
# liste des résultats particuliers découverts pendant le scan
data = []
# On Commence par itérer sur chaque batiment :
for bat in chbre_prises:
prises = dict() prises = dict()
for chbre, prise in chbre_prises[bat].iteritems(): for chbre, prise in chbre_prises[bat].iteritems():
prises[prise] = chbre prises[prise] = chbre
current_switch = -1 current_switch = -1
switch_name = ' '
for prise in sorted(prises.keys()): for prise in sorted(prises.keys()):
@ -59,10 +75,14 @@ for bat in chbre_prises:
print u"\tConnexion établie" print u"\tConnexion établie"
# On récupère les VLANs présents sur la prise # On récupère les VLANs présents sur la prise
try:
vlans = switch.vlans(prise) vlans = switch.vlans(prise)
if vlans: except ConversationError:
prises_up += 1 print u"\tErreur de communication avec " + switch_name
print u"\tAbandon du bâtiment..."
break
if vlans:
# Si la prise ne possède que le VLAN adherent, on ne va pas plus loin # Si la prise ne possède que le VLAN adherent, on ne va pas plus loin
if len(vlans) == 1 and vlans[0] == u"adherent": if len(vlans) == 1 and vlans[0] == u"adherent":
vlans_stats[vlans[0]] = vlans_stats[vlans[0]] + 1 vlans_stats[vlans[0]] = vlans_stats[vlans[0]] + 1
@ -72,8 +92,14 @@ for bat in chbre_prises:
if not (vlan in vlans_stats): if not (vlan in vlans_stats):
vlans_stats[vlan] = 0 vlans_stats[vlan] = 0
vlans_stats[vlan] = vlans_stats[vlan] + 1 vlans_stats[vlan] = vlans_stats[vlan] + 1
# En récupère les données pour les afficher plus tard # On récupère les données pour les afficher plus tard
try:
macs = switch.show_prise_mac(int(prise[1:])) macs = switch.show_prise_mac(int(prise[1:]))
except ConversationError:
print u"\tErreur de communication avec " + switch_name
print u"\tAbandon du bâtiment..."
break
if macs: if macs:
for mac in macs: for mac in macs:
fm = db.search("mac=%s" % mac) fm = db.search("mac=%s" % mac)
@ -90,13 +116,27 @@ for bat in chbre_prises:
m.nom().split('.')[0], m.nom().split('.')[0],
t, t,
', '.join(sorted(vlans))]) ', '.join(sorted(vlans))])
# Si aucune machine n'est connectée, on ajoute quand même une
# entrée dans les résultats
else: else:
prises_down += 1 data.append([bat.upper() + prise,
bat.upper() + prises[prise],
'Pas de Machine',
'-',
'-',
', '.join(sorted(vlans))])
print u"Statistiques des VLANs : ", vlans_stats # On renvoie les résultats
print u"Nombres de prises possédant des VLANs : " + str(prises_up) return (vlans_stats,data)
print u"Nombres de prises ne possédant pas de VLANS : " + str(prises_down)
print u"" # Traitement par défaut si le fichier est directement appellé comme un script
print u"Prises possédant des VLANs différent d''adherent'" if __name__ == "__main__":
print tableau(data, titre = [u"Prise", u"Chambre", u"Adhérent", u"Machine", u"Type", u"VLANs"])
# On récupère les statistiques sur toutes les prises de l'annuaire
vlans_stats, data = scan_bats(chbre_prises.keys)
# Et on les affiche
print u"Statistiques des VLANs : ", vlans_stats
print u""
print u"Prises possédant des VLANs différent d''adherent'"
print tableau(data, titre = [u"Prise", u"Chambre", u"Adhérent", u"Machine", u"Type", u"VLANs"])