diff --git a/surveillance/statsVlans.py b/surveillance/statsVlans.py index 6f8e783c..5b39da7c 100755 --- a/surveillance/statsVlans.py +++ b/surveillance/statsVlans.py @@ -21,82 +21,122 @@ from annuaires import chbre_prises from affich_tools import * from ldap_crans import crans_ldap 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 db = crans_ldap() -# 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 +def scan_bats(bats, annuaire=chbre_prises): + """Fonction permettant de scanner un certain nombre de switchs - 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 - 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" ..." + 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() + 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: - switch = hpswitch(switch_name) - except ValueError: - print u"\tImpossible de se connecter à ce switch, abandon du bâtiment..." + vlans = switch.vlans(prise) + except ConversationError: + print u"\tErreur de communication avec " + switch_name + print u"\tAbandon du bâtiment..." break - else: - print u"\tConnexion établie" - # On récupère les VLANs présents sur la prise - vlans = switch.vlans(prise) - if vlans: - prises_up += 1 + if vlans: + # 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": + 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 len(vlans) == 1 and vlans[0] == u"adherent": - 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 - # En récupère les données pour les afficher plus tard - macs = switch.show_prise_mac(int(prise[1:])) - if macs: - for mac in macs: - fm = db.search("mac=%s" % mac) - if len(fm["machine"]) != 0: - m = fm["machine"][0] - if isinstance(m, MachineWifi): t = u"Wifi" - elif isinstance(m, BorneWifi): t = u"Born" - else : t = u"Fixe" - adh = m.proprietaire() - nom = adh.Nom() - data.append([bat.upper() + prise, - adh.chbre(), - adh.Nom(), - m.nom().split('.')[0], - t, - ', '.join(sorted(vlans))]) - else: - prises_down += 1 + if macs: + for mac in macs: + fm = db.search("mac=%s" % mac) + if len(fm["machine"]) != 0: + m = fm["machine"][0] + if isinstance(m, MachineWifi): t = u"Wifi" + elif isinstance(m, BorneWifi): t = u"Born" + else : t = u"Fixe" + adh = m.proprietaire() + nom = adh.Nom() + data.append([bat.upper() + prise, + adh.chbre(), + adh.Nom(), + m.nom().split('.')[0], + t, + ', '.join(sorted(vlans))]) + # Si aucune machine n'est connectée, on ajoute quand même une + # entrée dans les résultats + else: + data.append([bat.upper() + prise, + bat.upper() + prises[prise], + 'Pas de Machine', + '-', + '-', + ', '.join(sorted(vlans))]) -print u"Statistiques des VLANs : ", vlans_stats -print u"Nombres de prises possédant des VLANs : " + str(prises_up) -print u"Nombres de prises ne possédant pas de VLANS : " + str(prises_down) + # On renvoie les résultats + return (vlans_stats,data) -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"]) +# Traitement par défaut si le fichier est directement appellé comme un script +if __name__ == "__main__": + + # 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"])