scripts/surveillance/statsVlans.py
Xavier Lagorce b2c18892a6 Script de statistique des VLANs
Script permettant d'établir des statistiques sur la présence des différents VLANS
sur les prises recensées dans l'annuaire.

Ce script recherche particulièrement les prises qui ont des VLANs autre que
le VLAN "adherent" et affiche alors les machines connectées sur ces prises.

darcs-hash:20090216160308-b8e4c-9f7a20f47fd1198895f756e6a9dc19319cc786f1.gz
2009-02-16 17:03:08 +01:00

102 lines
3.8 KiB
Python
Executable file

#!/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"])