Commit adebfe1e authored by Daniel STAN's avatar Daniel STAN
Browse files

[switchs.py] utf-8 + début de ménage

parent f7abf465
#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
# -*- coding: utf-8 -*-
""" met jour les proprits des prises des switchs du bat :
mac autorise(s), tat (activ ou non) et nom de la prise
""" met à jour les propriétés des prises des switchs du bat :
mac autorisée(s), état (activé ou non) et nom de la prise
argument : nom du switch
procdure de configuration initiale :
procédure de configuration initiale :
* mot de passe admin (password manager user-name <username>)
* activation du ssh (crypto key generate ssh)
* copie fichier de conf
......@@ -23,9 +23,10 @@ from ldap_crans import crans_ldap, BorneWifi
from annuaires_pg import uplink_prises, reverse, bat_manuels, all_switchs, bat_switchs
from random import shuffle
from gen_confs import *
from time import localtime
import datetime
import config
import re
from crans.deprecated import deprecated
capture_model = re.compile(r'\((.*)\)')
headers_by_model = {
......@@ -38,27 +39,20 @@ headers_by_model = {
gigabit_models = ['J9021A', 'J9145A']
try:
any
except NameError:
def any(iterable):
for item in iterable:
if item:
return True
return False
class switch(gen_config) :
# Rpertoire ou cire les fichiers de conf
CONF_REP='/tmp/' # avec un / derrire
"""Classe de configuration d'un switch"""
# Répertoire ou écire les fichiers de conf
CONF_REP='/tmp/' # avec un / derrière
config = """%(switch_config_header)s
hostname "%(switch)s"
; Generated %(date_gen)s by switchs.py
%(module-type)s
;-------------------------------------------------------- Snmp
snmp-server contact "root@crans.org"
snmp-server location "Batiment %(bat)s"
;A faire la main
;A faire à la main
snmpv3 enable
snmpv3 restricted-access
;snmpv3 user "initial"
......@@ -121,7 +115,7 @@ vlan %(vlan_appts)s
exit
;-------------------------------------------------------- Logs
%(INTERFACES_CONF)s
;------------------------------------------------------- Accs d'administration
;------------------------------------------------------- Accès d'administration
no telnet-server
no web-management
aaa authentication ssh login public-key none
......@@ -144,7 +138,7 @@ no cdp run
no stack
"""
# Serveur DHCP des diffrent vlans
# Serveur DHCP des différent vlans
dhcp_servers = {
'1':'138.231.136.34',
'3':'138.231.148.34',
......@@ -187,7 +181,7 @@ exit
* un _tulpe_ de noms de switch => reconfig de ces swiths"""
self.db = crans_ldap() # connexion LDAP
if type(truc) == list :
# On enlve les chambres "CRA", "????" et EXT qui n'ont pas besion de config
# On enlève les chambres "CRA", "????" et EXT qui n'ont pas besion de config
self.chbres = [ch for ch in truc if (ch not in [ "CRA", "????", "EXT" ]) ]
self.switch = None
else :
......@@ -199,10 +193,10 @@ exit
def restart(self) :
if self.chbre :
# Tout est dja fait
# Tout est déja fait
return
####### Vu qu'il n'y a pas de serveur tftp ici
# on exccute pas le truc en dessous
# on excécute pas le truc en dessous
#for switch in self.switch :
# self.aff = anim('\treboot de %s' % switch)
# sw = hptools.switch(switch)
......@@ -217,61 +211,11 @@ exit
for switch in self.switch :
self.configure_switch(switch)
@deprecated
def configure_chbre(self,chbre) :
""" Recontigure la chambre fournie chambre """
try :
bat = chbre[0].lower()
if bat in bat_switchs :
prise = sw_chbre(chbre)
prise.reconfigure() # Vitesse et nom (juste au cas ou ca aurait chang)
elif bat in bat_manuels :
class prise_non_manageable :
def __init__(self,chbre) :
self.chbre = chbre
def __mail(self,sujet) :
To = "clef%s@crans.org" % self.chbre[0].lower()
From = To
conn=smtplib.SMTP('localhost')
txt_mail = "From: Crans scripts <%(From)s>\n"
txt_mail+= "To: %(To)s\n"
txt_mail+= "Subject: (CRANS) %s\n\nMerci." % sujet
conn.sendmail(From, To , txt_mail % { 'From' : From, 'To' : To })
conn.quit()
def disable(self) :
self.__mail("Chambre %s dbrancher." % self.chbre)
def enable(self) :
self.__mail("Chambre %s brancher." % self.chbre)
prise=prise_non_manageable(chbre)
else :
# Rien a faire
print OK
return True
a = self.db.search('chbre=%s&paiement=ok' % chbre)
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)
prise.enable()
else :
# Il faut dsactiver la prise
anim('\tdsactivation chbre %s' % chbre)
prise.disable()
print OK
except :
print ERREUR
if self.debug :
import traceback
traceback.print_exc()
return False
return True
""" Recontigure la chambre fournie chambre.
Déprécié. Tous les switchs possèdent une authentification radius."""
return False
def configure_switch(self,switch) :
self.aff = anim('\tconfiguration de %s' % switch)
......@@ -291,9 +235,9 @@ exit
return 1
def __configure_switch(self,switch) :
""" Gnre le fichier de conf du switch donn """
### Rcupration donnes du switch
# Batiment et numro du switch
""" Génère le fichier de conf du switch donné """
### Récupération données du switch
# Batiment et numéro du switch
bat = switch[3].lower()
sw_num = int(switch[5])
dhcp_servers = self.dhcp_servers
......@@ -303,12 +247,13 @@ exit
self.aff.cycle()
## On veut par dfaut tout confier au serveur radius principal
## On veut par défaut tout confier au serveur radius principal
#shuffle(self.rad_servs)
rad = self.rad_template * len(self.rad_servs)
params = { 'switch' : switch, 'bat' : bat.upper() ,
'date_gen': str(datetime.datetime.now()),
'radius_key' : radius_key ,
'radius-serveurs' : rad[:-1] % tuple(self.rad_servs),
}
......@@ -328,7 +273,7 @@ exit
res, msg = commands.getstatusoutput("scp bat%s-%i:cfg/startup-config %s" % (bat, sw_num, old_config.name))
if res != 0:
raise RuntimeError(u"Erreur : impossible de rcuprer l'ancienne configuration du switch")
raise RuntimeError(u"Erreur : impossible de récupérer l'ancienne configuration du switch")
params['switch_config_header'] = old_config.readline()
old_config.close()
......@@ -346,7 +291,7 @@ exit
sys.stderr.write(model)
params['switch_config_header']=headers_by_model[model]
except:
sys.stderr.write('Impossible de dterminer le header utiliser (switch %s)' % switch)
sys.stderr.write('Impossible de déterminer le header à utiliser (switch %s)' % switch)
params['switch_config_header']= '; J4899A Configuration Editor; Created on release #H.10.50'
model = params['switch_config_header'].split(' ', 2)[1]
......@@ -357,10 +302,10 @@ exit
self.aff.cycle()
# Nombre de prises et modle
# Nombre de prises et modèle
nb_prises = machine.nombrePrises()
if nb_prises < 0 :
raise RuntimeError("Erreur : impossible de dterminer les caractristiques du switch.")
raise RuntimeError("Erreur : impossible de déterminer les caractéristiques du switch.")
has_dhcp_snooping = "2810" not in " ".join(machine.info())
......@@ -370,7 +315,7 @@ exit
# Dictionnaire prise -> chambre
prise_chbres = reverse(bat)
# Prises occupes par des machines du Cr@ns
# Prises occupées par des machines du Cr@ns
crans_prises={}
for m in self.db.search('prise=%s%i*' % (bat.upper(), sw_num))['machine'] :
try: crans_prises[m.prise()].append(m)
......@@ -378,7 +323,7 @@ exit
self.aff.iter = nb_prises+1
# Paramtres affecter
# Paramètres à affecter
for key in ( 'uplinks', 'non_uplinks' ) :
params[key] = []
......@@ -387,21 +332,21 @@ exit
'adm_tagged' : [] , 'adm_untagged' : [] ,
'appts_tagged' : [], 'appts_untagged' : [],
# VLans pour le reste: le vlan des adhrents, des
# VLans pour le reste: le vlan des adhérents, des
# inconnus et de ceux qui ne paie pas
'default' : [] }
personnels_loges = self.db.search('etudes=Personnel ENS')['adherent']
prises_appartements= [ p.chbre() for p in personnels_loges ]
# Gnration de la conf de chaque prise
# Génération de la conf de chaque prise
for prise in range(1,nb_prises+1):
self.aff.cycle()
# Conf par dfaut : active, autongociation
# Conf par défaut : activée, autonégociation
prise_params = { 'prise' : prise , 'speed' : '',
'etat' : '', 'no_flowcontrol': '' }
annu_prise = '%i%02i' % (sw_num, prise) # prise telle que note dans l'annuaire
annu_prise = '%i%02i' % (sw_num, prise) # prise telle que notée dans l'annuaire
if uplink_prises[bat].has_key(int(annu_prise)) :
### Prise d'uplink
......@@ -419,7 +364,7 @@ exit
params['non_uplinks'].append(prise)
if crans_prises.has_key("%s%s" % (bat.upper(), annu_prise)) :
### Prise rserve l'association
### Prise réservée à l'association
wifi=0
adm=0
autres=0
......@@ -466,7 +411,7 @@ exit
# chambres.
chbres = prise_chbres.get(annu_prise, [])
# Pour les switchs gigabit, on bloque le gigabit par dfaut, sauf
# Pour les switchs gigabit, on bloque le gigabit par défaut, sauf
# pour les membres actifs et les clubs (cf plus bas)
if model in gigabit_models:
prise_params['speed'] = 'speed-duplex auto-10-100'
......@@ -478,7 +423,7 @@ exit
# On selectionne les eventuels adherents y residant
residents = self.db.search("chbre=%s%s" % (bat, chb))
for adherent in residents['adherent']:
if adherent.droits(): #Seuls les membres actifs ont le droit plus
if adherent.droits(): #Seuls les membres actifs ont le droit à plus
prise_params['speed'] = ''
# On selectionne les machines fixes de l'adherent, et on ajoute le nombre au quota
nombre_de_machines += len(adherent.machines_fixes())
......@@ -487,9 +432,9 @@ exit
# Authentification RADIUS, pas pour les clubs...
if not any("cl" in chbre.lower() for chbre in chbres):
# "unauth-vid" est le vlan sur lequel sont envoys les machines
# quand l'authentification RADIUS choue. On met le VLAN 1 pour
# viter les problmes quand LDAP se ch@#! dessus.
# "unauth-vid" est le vlan sur lequel sont envoyés les machines
# quand l'authentification RADIUS échoue. On met le VLAN 1 pour
# éviter les problèmes quand LDAP se ch@#! dessus.
params['INTERFACES_CONF'] += """aaa port-access mac-based %(prise)s
aaa port-access mac-based %(prise)s addr-limit %(nbmac)s
aaa port-access mac-based %(prise)s logoff-period 3600
......@@ -497,11 +442,11 @@ aaa port-access mac-based %(prise)s unauth-vid 1
""" % { 'nbmac': 2 + nombre_de_machines, 'prise': prise }
# On regle le nombre de machines connectables a la prise au nombre de machines
# sur cette prise dans l'annuaire plus 2
else: # ... et pour les clubs, vlans par dfaut
else: # ... et pour les clubs, vlans par défaut
vlans['default'].append(prise)
# On donne la prise un nom qui dpend des chambres
# connects dessus
# On donne à la prise un nom qui dépend des chambres
# connectés dessus
if chbres :
prise_params['nom'] = 'Chambre'
if len(chbres) > 1 : prise_params['nom'] += 's'
......@@ -522,7 +467,7 @@ aaa port-access mac-based %(prise)s unauth-vid 1
# Petite verif
if not params['uplinks'] or not params['non_uplinks'] :
raise RuntimeError('Switch sans uplink ou sans prise adhrent.')
raise RuntimeError('Switch sans uplink ou sans prise adhérent.')
def mk_list(liste_prise) :
"""
......@@ -544,12 +489,12 @@ aaa port-access mac-based %(prise)s unauth-vid 1
if nouveau == groupe[1] + 1 :
groupe[1] += 1
else :
# Ajout du groupe au rsultat
# Ajout du groupe au résultat
if groupe[0] == groupe[1] :
result.append(str(groupe[0]))
else :
result.append('-'.join(map(str,groupe)))
# Rinit de groupe
# Réinit de groupe
groupe = [ nouveau, nouveau ]
return ','.join(result)
......@@ -563,7 +508,7 @@ aaa port-access mac-based %(prise)s unauth-vid 1
for key, prises in vlans.items() :
vlans[key]=mk_list(prises)
# Config des vlans spciaux (adm, wifi et appartements)
# Config des vlans spéciaux (adm, wifi et appartements)
for v in ('adm', 'wifi', 'hotspot', 'appts') :
params['prises_%s' % v] = ''
for t in ('tagged' , 'untagged') :
......@@ -590,7 +535,7 @@ if __name__ == '__main__' :
opts, args = getopt.getopt(sys.argv[1:], 'hga', ['get-conf', 'help', 'all', 'header=' ])
if '-h' in sys.argv or '--help' in sys.argv or len(sys.argv) == 1 :
print "%s [-g|--get-conf] <switch>" % sys.argv[0].split('/')[-1].split('.')[0]
print "Gnration du fichier de configuration des switchs donns."
print "Génération du fichier de configuration des switchs donnés."
sys.exit(255)
if args[0] == 'all' or 'a' in opts or '--all' in opts :
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment