[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,82 +21,122 @@ 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
prises = dict()
for chbre, prise in chbre_prises[bat].iteritems():
prises[prise] = chbre
current_switch = -1 La fonction scanne les switchs enregistrés de annuaire.py se trouvant dans
les bâtiments contenus dans la liste bats.
for prise in sorted(prises.keys()): La fonction utilise l'annuaire passé en argument au celui de annuaire.py
par défaut
# Si l'on est pas connecté au switch sur lequel se trouve la prise, on en change La fonction renvoie un doublet (vlans_stats,data) :
if current_switch != int(prise[0]) : * vlans_stats est un dictionnaire contenant les statistiques des VLANs
switch_name = u"bat" + bat + u"-" + prise[0] + u".adm.crans.org" trouvés
current_switch = int(prise[0]) * data contient les informations sur les machines se trouvant sur des
print u"Connexion à " + switch_name + u" ..." 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()
for chbre, prise in chbre_prises[bat].iteritems():
prises[prise] = chbre
current_switch = -1
switch_name = ' '
for prise in sorted(prises.keys()):
# Si l'on est pas connecté au switch sur lequel se trouve la prise, on en change
if current_switch != int(prise[0]) :
switch_name = u"bat" + bat + u"-" + prise[0] + u".adm.crans.org"
current_switch = int(prise[0])
print u"Connexion à " + switch_name + u" ..."
try:
switch = hpswitch(switch_name)
except ValueError:
print u"\tImpossible de se connecter à ce switch, abandon du bâtiment..."
break
else:
print u"\tConnexion établie"
# On récupère les VLANs présents sur la prise
try: try:
switch = hpswitch(switch_name) vlans = switch.vlans(prise)
except ValueError: except ConversationError:
print u"\tImpossible de se connecter à ce switch, abandon du bâtiment..." print u"\tErreur de communication avec " + switch_name
print u"\tAbandon du bâtiment..."
break break
else:
print u"\tConnexion établie"
# On récupère les VLANs présents sur la prise if vlans:
vlans = switch.vlans(prise) # Si la prise ne possède que le VLAN adherent, on ne va pas plus loin
if vlans: if len(vlans) == 1 and vlans[0] == u"adherent":
prises_up += 1 vlans_stats[vlans[0]] = vlans_stats[vlans[0]] + 1
else:
# Sinon, on récupère tous les VLANs
for vlan in vlans:
if not (vlan in vlans_stats):
vlans_stats[vlan] = 0
vlans_stats[vlan] = vlans_stats[vlan] + 1
# On récupère les données pour les afficher plus tard
try:
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
# Si la prise ne possède que le VLAN adherent, on ne va pas plus loin if macs:
if len(vlans) == 1 and vlans[0] == u"adherent": for mac in macs:
vlans_stats[vlans[0]] = vlans_stats[vlans[0]] + 1 fm = db.search("mac=%s" % mac)
else: if len(fm["machine"]) != 0:
# Sinon, on récupère tous les VLANs m = fm["machine"][0]
for vlan in vlans: if isinstance(m, MachineWifi): t = u"Wifi"
if not (vlan in vlans_stats): elif isinstance(m, BorneWifi): t = u"Born"
vlans_stats[vlan] = 0 else : t = u"Fixe"
vlans_stats[vlan] = vlans_stats[vlan] + 1 adh = m.proprietaire()
# En récupère les données pour les afficher plus tard nom = adh.Nom()
macs = switch.show_prise_mac(int(prise[1:])) data.append([bat.upper() + prise,
if macs: adh.chbre(),
for mac in macs: adh.Nom(),
fm = db.search("mac=%s" % mac) m.nom().split('.')[0],
if len(fm["machine"]) != 0: t,
m = fm["machine"][0] ', '.join(sorted(vlans))])
if isinstance(m, MachineWifi): t = u"Wifi" # Si aucune machine n'est connectée, on ajoute quand même une
elif isinstance(m, BorneWifi): t = u"Born" # entrée dans les résultats
else : t = u"Fixe" else:
adh = m.proprietaire() data.append([bat.upper() + prise,
nom = adh.Nom() bat.upper() + prises[prise],
data.append([bat.upper() + prise, 'Pas de Machine',
adh.chbre(), '-',
adh.Nom(), '-',
m.nom().split('.')[0], ', '.join(sorted(vlans))])
t,
', '.join(sorted(vlans))])
else:
prises_down += 1
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"])