diff --git a/gestion/gen_confs/switchs.py b/gestion/gen_confs/switchs.py index 9e469f18..b4699677 100755 --- a/gestion/gen_confs/switchs.py +++ b/gestion/gen_confs/switchs.py @@ -20,7 +20,7 @@ import string, sys, os, commands, smtplib sys.path.append('/usr/scripts/gestion') from hptools import hpswitch, sw_chbre from ldap_crans import crans_ldap -from annuaires import chbre_prises, uplink_prises, reverse, bat_manuels +from annuaires import chbre_prises, uplink_prises, reverse, bat_manuels, all_switchs from random import shuffle from gen_confs import * from time import localtime @@ -31,7 +31,7 @@ class switch(gen_config) : # Répertoire ou écire les fichiers de conf CONF_REP='/tmp/' # avec un / derrière - config = """; %(modele)s Configuration Editor; Created on release #H.08.53 + config = """; %(modele)s Configuration Editor; Created on release #H.08.72 hostname "%(switch)s" ;-------------------------------------------------------- Snmp @@ -60,17 +60,22 @@ logging 138.231.144.7 ip default-gateway 138.231.144.4 vlan 1 name "DEFAULT_VLAN" - untagged 1-%(nb_prises)d + %(prises_default)s no ip address ip igmp no ip igmp querier exit vlan 2 - name "Serveurs" + name "Adm" + %(prises_adm)s ip address %(ip)s 255.255.255.0 - tagged %(uplinks)s exit -;-------------------------------------------------------- Accès d'adminsitration +vlan 3 + name "Wifi" + %(prises_wifi)s + no ip address + exit +;------------------------------------------------------- Accès d'adminsitration no telnet-server no web-management aaa authentication ssh login public-key @@ -79,23 +84,23 @@ ip ssh ip ssh version 2 ip authorized-managers 138.231.144.0 255.255.255.0 ip ssh filetransfer -;-------------------------------------------------------- Spanning-tree +;------------------------------------------------------- Spanning-tree spanning-tree ; Config des uplinks no spanning-tree %(uplinks)s edge-port ; Config des prises adhérent spanning-tree %(non_uplinks)s point-to-point-mac auto spanning-tree %(non_uplinks)s priority 15 -;-------------------------------------------------------- Serveurs radius +;------------------------------------------------------- Serveurs radius radius-server dead-time 2 radius-server key %(radius_key)s %(radius-serveurs)s -;-------------------------------------------------------- Filtrage mac -aaa port-access mac-based %(non_uplinks)s -aaa port-access mac-based %(non_uplinks)s addr-limit 3 -aaa port-access mac-based %(non_uplinks)s logoff-period 3600 +;------------------------------------------------------- Filtrage mac +aaa port-access mac-based %(prises_filtrage_mac)s +aaa port-access mac-based %(prises_filtrage_mac)s addr-limit 3 +aaa port-access mac-based %(prises_filtrage_mac)s logoff-period 3600 aaa port-access mac-based addr-format multi-colon -;-------------------------------------------------------- Bricoles +;------------------------------------------------------- Bricoles no cdp run no stack """ @@ -204,7 +209,7 @@ exit def configure_switch(self,switch) : self.aff = anim('\tconfiguration de %s' % switch) - try : + try: warn = self.__configure_switch(switch) self.aff.reinit() if warn : @@ -221,28 +226,25 @@ exit def __configure_switch(self,switch) : """ Génère le fichier de conf du switch donné """ - warn = '' conn = hpswitch(switch) ### Récupération données du switch - # Bat + # Batiment et num-Aéro du switch-b bat = switch[3].lower() + sw_num = int(switch[5]) + + # Conf radius from secrets import radius_key shuffle(self.rad_servs) - rad = self.rad_template * len(self.rad_servs) + rad = self.rad_template * len(self.rad_servs) params = { 'switch' : switch, 'bat' : bat.upper() , - 'uplinks' : [] , 'non_uplinks' : [] , 'radius_key' : radius_key , 'radius-serveurs' : rad[:-1] % tuple(self.rad_servs)} - # Numéro du switch - sw_num = int(switch[5]) - # Nombre de prises et modèle nb_prises = conn.nb_prises() 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 @@ -254,11 +256,27 @@ exit # Dictionnaire prise -> chambre prise_chbres = reverse(bat) + # 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) + except: crans_prises[m.prise()] = [ m ] + self.aff.iter = nb_prises+1 + # Param-Aètres à affecter-b + for key in ( 'uplinks', 'non_uplinks', 'prises_filtrage_mac' ) : + params[key] = [] + + vlans = { 'wifi_tagged' : [] , 'wifi_untagged' : [] , + 'adm_tagged' : [] , 'adm_untagged' : [] , + 'default_tagged' : [] , 'default_untagged' : [] } + + # G-Aénération de la conf de chaque prise-b for prise in range(1,nb_prises+1): self.aff.cycle() - + + # Conf par d-Aéfaut : activée, autonégociation-b prise_params = { 'prise' : prise , 'speed' : '', 'etat' : '' } annu_prise = '%i%02i' % (sw_num, prise) # prise telle que notée dans l'annuaire @@ -266,45 +284,80 @@ exit ### Prise d'uplink prise_params['nom'] = uplink_prises[bat][int(annu_prise)] params['uplinks'].append(prise) - else : - ### Prise adhérent - params['non_uplinks'].append(prise) - - # Interrogation de l'annuaire - if prise_chbres.has_key(annu_prise) : - chbres = prise_chbres[annu_prise] - elif prise_chbres.has_key(annu_prise+'-') : - # Prise en 10 - prise_params['speed'] = '\n speed-duplex auto-10' - chbres = prise_chbres[annu_prise+'-'] - else : - # Prise non référencée dans l'annuaire - prise_params['nom'] = "Pas_dans_l'annuaire" - prise_params['etat']='\n disable' - chbres = [] - - ## Configuration de la prise adhérent - if chbres : - # Nom - prise_params['nom'] = 'Chambre' - if len(chbres) > 1 : prise_params['nom'] += 's' - for chbre in chbres : - prise_params['nom'] += '_%s%s' % (bat.upper(), chbre) - - # Besoin d'activer la prise ? - act = 0 - for chbre in chbres : - res = self.db.search('chbre=%s%s&paiement=ok' % (bat.upper(), chbre) ) - for res in res['adherent'] + res['club'] : - if 'bloq' not in res.blacklist_actif() : - act = 1 - break + vlans['default_untagged'].append(prise) + vlans['adm_tagged'].append(prise) + vlans['wifi_tagged'].append(prise) + params['INTERFACES_CONF'] += self.interface_template % prise_params + continue - if not act : - # Peut être une borne wifi ? - if not self.db.search('prise=%s%s' % (bat.upper(), annu_prise))['machine'] : - prise_params['etat']='\n disable' - + params['non_uplinks'].append(prise) + + if crans_prises.has_key("%s%s" % (bat.upper(), annu_prise)) : + ### Prise réservée à l'association + wifi=0 + adm=0 + autres=0 + for m in crans_prises["%s%s" % (bat.upper(), annu_prise)] : + if m.canal() : wifi+=1 + elif m.Nom().find('.adm.crans.org')!=-1 : adm+=1 + else : autres+=1 + if autres==0 and adm==0 : + # Vlan wifi uniquement + if wifi == 1 : + prise_params['nom'] = "Wifi_%s" % m.nom().split(".")[0] + else : + prise_params['nom'] = "Wifi" + vlans['wifi_untagged'].append(prise) + elif wifi==0 and autres==0 : + # Vlan adm uniquement + if amd == 1 : + prise_params['nom'] = m.nom().split(".")[0] + else : + prise_params['nom'] = "Uplink_adm" + vlans['adm_untagged'].append(prise) + else : + # Tous les vlans + prise_params['nom'] = "Prise_crans" + vlans['default_untagged'].append(prise) + vlans['adm_tagged'].append(prise) + vlans['wifi_tagged'].append(prise) + + params['INTERFACES_CONF'] += self.interface_template % prise_params + continue + + vlans['default_untagged'].append(prise) + # A quelle chambre correspond la prise ? + if prise_chbres.has_key(annu_prise) : + chbres = prise_chbres[annu_prise] + elif prise_chbres.has_key(annu_prise+'-') : + # Prise en 10 + prise_params['speed'] = '\n speed-duplex auto-10' + chbres = prise_chbres[annu_prise+'-'] + else : + # Prise non référencée dans l'annuaire + prise_params['nom'] = "Pas_dans_l'annuaire" + prise_params['etat']='\n disable' + params['INTERFACES_CONF'] += self.interface_template % prise_params + continue + + params['prises_filtrage_mac'].append(prise) + + ## Configuration de la prise adhérent + # Nom + prise_params['nom'] = 'Chambre' + if len(chbres) > 1 : prise_params['nom'] += 's' + for chbre in chbres : + prise_params['nom'] += '_%s%s' % (bat.upper(), chbre) + + # Besoin d'activer la prise ? + prise_params['etat']='\n disable' + for chbre in chbres : + res = self.db.search('chbre=%s%s&paiement=ok' % (bat.upper(), chbre) ) + for res in res['adherent'] + res['club'] : + if 'bloq' not in res.blacklist_actif() : + prise_params['etat']='' + break + params['INTERFACES_CONF'] += self.interface_template % prise_params # Petite verif @@ -316,6 +369,7 @@ exit transforme une liste de prises en une chaine pour le switch exemple : 1, 3, 4, 5, 6, 7, 9, 10, 11, 12 => 1,3-7,9-12 """ + if not liste_prise : return '' liste_prise.sort() # initialisation @@ -339,30 +393,30 @@ exit groupe = [ nouveau, nouveau ] return ','.join(result) - - params['ports_wifi'] = list(params['uplinks']) - # Borne wifi sur la prise ? - for m in self.db.search('host=*.wifi.crans.org&prise=%s%i*' % (bat.upper(), sw_num))['machine'] : - params['ports_wifi'].append(int(m.prise()[2:])) + # Saut de ligne parasite + params['INTERFACES_CONF'] = params['INTERFACES_CONF'][:-1] - params['inv_ports_wifi'] = [] - for prise in range(1,nb_prises+1) : - if prise not in params['ports_wifi'] : - params['inv_ports_wifi'].append(prise) - - # Conversion des listes - for key in [ 'ports_wifi', 'inv_ports_wifi', 'uplinks', 'non_uplinks' ] : + for key in [ 'prises_filtrage_mac', 'uplinks', 'non_uplinks' ] : params[key] = mk_list(params[key]) - params['INTERFACES_CONF'] = params['INTERFACES_CONF'][:-1] - - fd = self._open_conf(self.CONF_REP + switch + '.conf') + for key, prises in vlans.items() : + vlans[key]=mk_list(prises) + + # Config des vlan + for v in ('default', 'adm', 'wifi') : + params['prises_%s' % v] = '' + for t in ('tagged' , 'untagged') : + if vlans['%s_%s' % (v,t)] : + params['prises_%s' % v] += '\n %s %s' % (t, vlans['%s_%s' % (v,t)]) + # Saut de ligne parasite + params['prises_%s' % v] = params['prises_%s' % v][4:] + + # Ecriture + fd = self._open_conf(self.CONF_REP + switch + '.conf') fd.write(self.config % params) fd.close() - return warn - if __name__ == '__main__' : if '-h' in sys.argv or '--help' in sys.argv or len(sys.argv) == 1 : print "%s " % sys.argv[0].split('/')[-1].split('.')[0] @@ -370,12 +424,7 @@ if __name__ == '__main__' : sys.exit(255) if sys.argv[1] == 'all' : - switchs = ( 'batg-6', 'batg-5', 'batg-4', 'batg-2', 'batg-1', 'batg' , - 'batj-2', 'batj-1', 'batj' , - 'bati-2', 'bati-1', 'bati' , - 'bath-1', 'bath' , - 'batc-2', 'batc-1', 'batc' , - 'batb-3', 'batb-2', 'batb-1', 'batb' ) + switchs = all_switchs() else : switchs = tuple(sys.argv[1:]) sw = switch(switchs)