
Oups, petite erreur de refactoring, maintenant la fonction utilise ses arguments (et son argument passé dans le main est maintenant correct) Plus une petite correction de style dans la déclaration du dictionnaire l'histoire qu'olasd arrêtre de faire un caca nerveux ;) darcs-hash:20090222204703-b8e4c-a740f533ad220eb6d32a38118de5d0051fb3ea1a.gz
142 lines
5.6 KiB
Python
Executable file
142 lines
5.6 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, ConversationError
|
|
|
|
|
|
# Accès à la base ldap
|
|
db = crans_ldap()
|
|
|
|
def scan_bats(bats, annuaire=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 = {'adherent' : 0}
|
|
# liste des résultats particuliers découverts pendant le scan
|
|
data = []
|
|
|
|
# On Commence par itérer sur chaque batiment :
|
|
for bat in bats:
|
|
prises = dict()
|
|
for chbre, prise in annuaire[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:
|
|
vlans = switch.vlans(prise)
|
|
except ConversationError:
|
|
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
|
|
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
|
|
|
|
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))])
|
|
|
|
# On renvoie les résultats
|
|
return (vlans_stats,data)
|
|
|
|
# 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"])
|