diff --git a/surveillance/statsVlans.py b/surveillance/statsVlans.py new file mode 100755 index 00000000..6f8e783c --- /dev/null +++ b/surveillance/statsVlans.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +u""" +Script permettant d'obtenir des statistiques sur les VLans actuellement distribués par les switchs. + +Le script va scanner toutes les prises présentes dans le fichier d'annuaire. +S'il est impossbile de se connecter à un switch, on abandonne le batiment concerné + +À la fin sont affichées quelques statistiques, dont les prises sur lesquelles on a trouvé +d'autre VLANs qu'"adherent", ainsi que les machines connectées sur ces prises. + +Xavier Lagorce - 2009 +""" + +from sys import path + +path.append('/usr/scripts/gestion') + +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 + + +# 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 + + current_switch = -1 + + 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 + vlans = switch.vlans(prise) + if vlans: + prises_up += 1 + + # 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 + +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) + +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"])