[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:
parent
a6e2642bce
commit
e0b5fce402
1 changed files with 135 additions and 17 deletions
|
@ -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:
|
||||||
|
if verbose:
|
||||||
print u"\tImpossible de se connecter à ce switch, abandon du bâtiment..."
|
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:
|
||||||
|
if verbose:
|
||||||
print u"\tErreur de communication avec " + switch_name
|
print u"\tErreur de communication avec " + switch_name
|
||||||
print u"\tAbandon du bâtiment..."
|
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:
|
||||||
|
if verbose:
|
||||||
print u"\tErreur de communication avec " + switch_name
|
print u"\tErreur de communication avec " + switch_name
|
||||||
print u"\tAbandon du bâtiment..."
|
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""
|
||||||
|
|
||||||
|
if data:
|
||||||
print u"Prises possédant des VLANs différent d''adherent'"
|
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"])
|
print tableau(data,
|
||||||
|
titre = [u"Prise", u"Chambre", u"Adhérent", u"Machine", u"Type", u"VLANs"])
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue