[statsVLans.py] Ajout de fonctionnalités

* Ajout du support des options
* Ajout d'un mode verbose
* Ajout de la possibilité de scanner seulement certains bâtiments
* Le script ne plante pas si le scan ne renvoie aucune données
* Le script cherche le nom de la personne/club dont la prise possède un VLAN
  bizarre sans avoir de machine branchée.

darcs-hash:20090223145358-b8e4c-101f937e43e9972443fd65adbb5f34ab74fa9417.gz
This commit is contained in:
Xavier Lagorce 2009-02-23 15:53:58 +01:00
parent a6e2642bce
commit e0b5fce402

View file

@ -13,6 +13,7 @@ d'autre VLANs qu'"adherent", ainsi que les machines connectées sur ces prises.
Xavier Lagorce - 2009 Xavier Lagorce - 2009
""" """
import sys, getopt
from sys import path from sys import path
path.append('/usr/scripts/gestion') path.append('/usr/scripts/gestion')
@ -27,20 +28,25 @@ from hptools import hpswitch, ConversationError
# Accès à la base ldap # Accès à la base ldap
db = crans_ldap() db = crans_ldap()
def scan_bats(bats, annuaire=chbre_prises): def scan_bats(bats, annuaire=chbre_prises, verbose=False):
"""Fonction permettant de scanner un certain nombre de switchs """Fonction permettant de scanner un certain nombre de switchs
La fonction scanne les switchs enregistrés de annuaire.py se trouvant dans La fonction scanne les switchs enregistrés de annuaire.py se trouvant dans
les bâtiments contenus dans la liste bats. les bâtiments contenus dans la liste bats.
La fonction utilise l'annuaire passé en argument au celui de annuaire.py La fonction utilise l'annuaire passé en argument au celui de annuaire.py
par défaut par défaut.
La fonction renvoie un doublet (vlans_stats,data) : Si verbose est à 'True', la fonction affiche le détails de ses connexions
aux switchs
La fonction renvoie un triplet (vlans_stats,data,erreurs) :
* vlans_stats est un dictionnaire contenant les statistiques des VLANs * vlans_stats est un dictionnaire contenant les statistiques des VLANs
trouvés trouvés
* data contient les informations sur les machines se trouvant sur des * data contient les informations sur les machines se trouvant sur des
prises possédant d'autres VLANs que le VLAN 'adhérent' prises possédant d'autres VLANs que le VLAN 'adhérent'
* erreurs contient la liste des noms des switchs sur lesquels il a été
impossible de se connecter
""" """
@ -49,6 +55,8 @@ def scan_bats(bats, annuaire=chbre_prises):
vlans_stats = {'adherent' : 0} vlans_stats = {'adherent' : 0}
# liste des résultats particuliers découverts pendant le scan # liste des résultats particuliers découverts pendant le scan
data = [] data = []
# liste des noms de switch en erreur :
erreurs = []
# On Commence par itérer sur chaque batiment : # On Commence par itérer sur chaque batiment :
for bat in bats: for bat in bats:
@ -65,21 +73,25 @@ def scan_bats(bats, annuaire=chbre_prises):
if current_switch != int(prise[0]) : if current_switch != int(prise[0]) :
switch_name = u"bat" + bat + u"-" + prise[0] + u".adm.crans.org" switch_name = u"bat" + bat + u"-" + prise[0] + u".adm.crans.org"
current_switch = int(prise[0]) current_switch = int(prise[0])
print u"Connexion à " + switch_name + u" ..." if verbose: print u"Connexion à " + switch_name + u" ..."
try: try:
switch = hpswitch(switch_name) switch = hpswitch(switch_name)
except ValueError: except ValueError:
print u"\tImpossible de se connecter à ce switch, abandon du bâtiment..." if verbose:
print u"\tImpossible de se connecter à ce switch, abandon du bâtiment..."
erreurs.append(switch_name)
break break
else: else:
print u"\tConnexion établie" if verbose: print u"\tConnexion établie"
# On récupère les VLANs présents sur la prise # On récupère les VLANs présents sur la prise
try: try:
vlans = switch.vlans(prise) vlans = switch.vlans(prise)
except ConversationError: except ConversationError:
print u"\tErreur de communication avec " + switch_name if verbose:
print u"\tAbandon du bâtiment..." print u"\tErreur de communication avec " + switch_name
print u"\tAbandon du bâtiment..."
erreurs.append(switch_name)
break break
if vlans: if vlans:
@ -96,8 +108,10 @@ def scan_bats(bats, annuaire=chbre_prises):
try: try:
macs = switch.show_prise_mac(int(prise[1:])) macs = switch.show_prise_mac(int(prise[1:]))
except ConversationError: except ConversationError:
print u"\tErreur de communication avec " + switch_name if verbose:
print u"\tAbandon du bâtiment..." print u"\tErreur de communication avec " + switch_name
print u"\tAbandon du bâtiment..."
erreurs.append(switch_name)
break break
if macs: if macs:
@ -119,24 +133,128 @@ def scan_bats(bats, annuaire=chbre_prises):
# Si aucune machine n'est connectée, on ajoute quand même une # Si aucune machine n'est connectée, on ajoute quand même une
# entrée dans les résultats # entrée dans les résultats
else: else:
# On tente de trouver le nom de l'adherent :
chbre = bat.upper() + prises[prise]
fm = db.search("chbre=%s" % chbre)
if len(fm['adherent']) != 0:
nom = fm['adherent'][0].Nom()
elif len(fm['club']) != 0:
nom = fm['club'][0].Nom()
data.append([bat.upper() + prise, data.append([bat.upper() + prise,
bat.upper() + prises[prise], chbre,
'Pas de Machine', nom,
'-', '-',
'-', '-',
', '.join(sorted(vlans))]) ', '.join(sorted(vlans))])
# On renvoie les résultats # On renvoie les résultats
return (vlans_stats,data) return (vlans_stats,data,erreurs)
def __usage_brief(err=''):
"""Affiche un message d'erreur court"""
if err:
err = u' : ' + err
else:
err = u'.'
print u"Option(s) invalide(s)" + err
print u"Pour obtenir de l'aide sur l'utilisation de ce programme utilisez l'option -h"
sys.exit(2)
def __usage():
"""Affichage de l'aide sur l'utilisation du script"""
print u"""
statsVLans.py :
Script permettant d'obtenir des statistiques sur les VLans présents sur le réseau
Usage : statsVLans.py OPTIONS
options disponibles :
-a / --all :
Scanne l'intégralité des bâtiments et des switchs présents dans l'annuaire.
Incompatible avec l'option --bats.
-b / --bats :
Permet de spécifier les bâtiments à scanner.
Incompatible avec l'option --all.
ex : --bats=abh
-h / --help :
Affiche ce message d'aide.
-v / --verbose :
Affiche le détail des connexions aux switchs pendant le scan.
Une des options --all ou --bats doit être obligatoirement spécifiée.
"""
sys.exit(0)
# Traitement par défaut si le fichier est directement appellé comme un script # Traitement par défaut si le fichier est directement appellé comme un script
if __name__ == "__main__": if __name__ == "__main__":
# Récupération des options
if len(sys.argv) == 1:
# Pas d'option fournie
__usage_brief()
# On récupère les statistiques sur toutes les prises de l'annuaire try:
vlans_stats, data = scan_bats(chbre_prises.keys()) options, arg = getopt.gnu_getopt(sys.argv[1:],'ab:p:hv',
['all','bats=','prises=','help','verbose'])
except getopt.error, msg :
__usage_brief(unicode(msg))
# Traitement des options
verb = False
bats = ''
all_prises = False
for opt, val in options:
if opt == '-a' or opt == '--all':
if bats:
__usage_brief(u"les options --all et --bats sont incompatibles !")
bats = 'all'
elif opt == '-b' or opt == '--bats':
if bats == 'all':
__usage_brief(u"les options --all et --bats sont incompatibles !")
# On évite les doublons de batiments
for c in val:
if not (c in bats):
bats += c
elif opt == '-h' or opt == '--help' :
__usage()
elif opt == '-v' or opt == '--verbose':
verb = True
if not bats:
__usage_brief(u"il faut spécifier des bâtiments à scanner")
if bats == 'all':
# On récupère tous les bâtiments contenus dans l'annuaire :
lbats = chbre_prises.keys()
else:
# On génère une liste avec les bâtiments pour être propre
lbats = [bat for bat in bats]
# On récupère les statistiques sur les bâtiments demandés
vlans_stats, data, erreurs = scan_bats(lbats,verbose=verb)
# Fonction helper :
def concat(s1,s2):
return s1 + u' ' + s2
# Et on les affiche # Et on les affiche
print u"Statistiques sur les batiments :" + reduce(concat,lbats,'')
if erreurs:
print u"Ces switchs n'ont pas pû être contactés :"
for switch in erreurs:
print u" * " + switch
print u"Statistiques des VLANs : ", vlans_stats print u"Statistiques des VLANs : ", vlans_stats
print u"" 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"]) if data:
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"])