Gestion switchs par snmp.

darcs-hash:20040919204104-41617-9d15a60e1df1bdf65ac3854b9b94a21474a883ea.gz
This commit is contained in:
pauget 2004-09-19 22:41:04 +02:00
parent 3b643b222b
commit af2c3f643e

View file

@ -17,24 +17,20 @@
import string, sys, os, commands, smtplib
import snmp
sys.path.append('/usr/scripts/gestion')
from hptools import hpswitch, sw_chbre
from ldap_crans import crans_ldap, ann_scol
from annuaires import chbre_prises, uplink_prises, reverse
from gen_confs import *
from time import localtime
# from qqch import switchs # Liste des switchs
bat_switchs = [ 'b', 'c', 'h', 'i', 'g' ]
sys.path.append('/CRANS/code')
from hptools import hp
# Liste des switchs
bat_switchs = [ 'b', 'c' , 'h' , 'i' , 'g' , 'j' ]
class switch(gen_config) :
# Répertoire ou écire les fichiers de conf
CONF_REP='/var/tftp_switchs/' # avec un / derrière
config = """; J4899A Configuration Editor; Created on release #H.07.32
config = """; %(modele)s Configuration Editor; Created on release #H.07.32
hostname "%(switch)s"
;-------------------------------------------------------- Snmp
@ -68,8 +64,8 @@ vlan 1
ip igmp
no ip igmp querier
exit
%(MAC_FILTER)s
;-------------------------------------------------------- Accès d'adminsitration
no telnet-server
no web-management
aaa authentication ssh login public-key
ip ssh
@ -86,8 +82,6 @@ no spanning-tree %(uplinks)s edge-port
spanning-tree %(non_uplinks)s point-to-point-mac auto
spanning-tree %(non_uplinks)s priority 15
no cdp run
;-------------------------------------------------------- Avec mot de passe ;)
password manager
"""
interface_template = """interface %(prise)i%(etat)s
@ -100,8 +94,8 @@ exit
def __init__(self,truc):
""" truc est soit :
* une liste de chambres => reconfig de ces chambres
* un nom de switch => reconfig de ce swith"""
* une _liste_ de chambres => reconfig de ces chambres
* un _tulpe_ de noms de switch => reconfig de ces swiths"""
self.db = crans_ldap() # connexion LDAP
if type(truc) == list :
# On enlève la chambre "CRA" et "????"
@ -115,8 +109,15 @@ exit
return 'switchs'
def restart(self) :
# Rien à faire ici
pass
if self.chbre :
# Tout est déja fait
return
####### Vu qu'il n'y a pas de serveur tftp ici
# on excécute pas le truc en dessous
#for switch in self.switch :
# self.aff = anim('\treboot de %s' % switch)
# sw = hptools.switch(switch)
# sw.update()
def gen_conf(self) :
if self.chbres :
@ -124,47 +125,36 @@ exit
for chbre in self.chbres :
self.configure_chbre(chbre)
elif self.switch :
self.configure_switch(self.switch)
for switch in self.switch :
self.configure_switch(switch)
def configure_chbre(self,chbre) :
""" Recontigure la chambre fournie chambre """
bat = chbre[0].lower()
a = self.db.search('chbre=%s&paiement=%i' % (chbre,ann_scol))
a = a['adherent'] + a['club']
if a and 'bloq' not in a[0].blacklist_actif() :
# Il faut activer la prise
anim('\tactivation chbre %s' % chbre)
action = 'enable'
else :
# Il faut désactiver la prise
anim('\tdésactivation chbre %s' % chbre)
action = 'disable'
try :
if bat in bat_switchs :
# Action sur le switch
prise = chbre_prises[bat][chbre[1:].lower()]
sw=hp(bat,int(prise[0]))
if prise[-1]=='-' :
prise=prise[:-1]
sw.set_prise(int(prise[1:4]),'speed-duplex auto-10')
r = sw.set_prise(int(prise[1:4]),action)
sw.close()
if not r :
raise RuntimeError('Erreur de communiquation')
bat = chbre[0].lower()
prise = sw_chbre(chbre)
a = self.db.search('chbre=%s&paiement=%i' % (chbre,ann_scol))
a = a['adherent'] + a['club']
sujet = ''
if a and 'bloq' not in a[0].blacklist_actif() :
# Il faut activer la prise
anim('\tactivation chbre %s' % chbre)
if bat in bat_switchs : prise.enable()
else : sujet = "Chambre %s à brancher." % chbre
else :
# Mail au bat
# Il faut désactiver la prise
anim('\tdésactivation chbre %s' % chbre)
if bat in bat_switchs : prise.disable()
else : sujet = "Chambre %s à débrancher." % chbre
if sujet :
# Il faut envoyer un mail
To = "clef%s@crans.org" % bat
From = To
conn=smtplib.SMTP('localhost')
txt_mail = "From: Crans scripts <%(From)s>\n"
txt_mail+= "To: %(To)s\n"
txt_mail+= "Subject: (CRANS) "
if action == 'disable':
txt_mail+= "Chambre %s à débrancher." % chbre
else:
txt_mail+= "Chambre %s à brancher." % chbre
txt_mail+= '\n\nMerci.'
txt_mail+= "Subject: (CRANS) %s\n\nMerci." % sujet
conn.sendmail(From, To , txt_mail % { 'From' : From, 'To' : To })
conn.quit()
print OK
@ -197,7 +187,7 @@ exit
def __configure_switch(self,switch) :
""" Génère le fichier de conf du switch donné """
warn = ''
conn = snmp.hptools(switch)
conn = hpswitch(switch)
def add_prise(dict, key, prise) :
""" ajoute la prise à la liste de prise du dictionnaire dict
dict[key] est ensuite de la forme 1,3-7,9-12 (ajout des prises
@ -234,18 +224,20 @@ exit
except :
sw_num = 0
# Nombre de prises
# Nombre de prises et modèle
nb_prises = conn.nb_prises()
if not nb_prises :
raise RuntimeError("Erreur : impossible de déterminer le nombre de ports")
modele = conn.version()
if not nb_prises or not modele :
raise RuntimeError("Erreur : impossible de déterminer les caractéristiques du switch.")
params['nb_prises'] = nb_prises
params['modele'] = modele.split()[1]
# IP
params['ip'] = commands.getoutput("host %s" % switch).split()[-1]
### Configuration prises
params['INTERFACES_CONF'] = ''
params['MAC_FILTER'] = ''
params['MAC_FILTER'] = '' # Pas pour l'instant
# Dictionnaire prise -> chambre
prise_chbres = reverse(bat)
@ -271,7 +263,7 @@ exit
chbres = prise_chbres[annu_prise]
elif prise_chbres.has_key(annu_prise+'-') :
# Prise en 10
prise_params['speed'] = ' speed-duplex auto-10\n'
prise_params['speed'] = '\n speed-duplex auto-10'
chbres = prise_chbres[annu_prise+'-']
else :
# Prise non référencée dans l'annuaire
@ -311,7 +303,7 @@ exit
params['MAC_FILTER'] += self.filtre_mac_template % ( prise, macs )
params['INTERFACES_CONF'] += self.interface_template % prise_params
# Petites verif
if not params.has_key('uplinks') or not params.has_key('non_uplinks') :
raise RuntimeError('Switch sans uplink ou sans prise adhérent.')
@ -323,11 +315,11 @@ exit
return warn
if __name__ == '__main__' :
if '-h' in sys.argv or '--help' in sys.argv or len(sys.argv) != 2 :
if '-h' in sys.argv or '--help' in sys.argv or len(sys.argv) == 1 :
print "%s <switch>" % sys.argv[0].split('/')[-1].split('.')[0]
print "Génération du fichier de configuration de switch donnée."
print "Génération du fichier de configuration des switchs donnés."
sys.exit(255)
sw = switch(sys.argv[1])
sw = switch(tuple(sys.argv[1:]))
sw.debug = 1
sw.reconfigure()