Commit 7fde44ea authored by Hamza Dely's avatar Hamza Dely

Merge branch 'switches'

Incorporation des modifications faisant suite au changement
de VLAN pour le management des switches
parents 1819f382 62dbb37d
......@@ -59,3 +59,6 @@ secours/etat_*
# Fichier de son pour asterisk
sip/sound/
#Firmwares des switchs
firmwares_switchs/
......@@ -183,7 +183,7 @@ def get_prise_chbre(data):
Par convention, le nom d'une chambre commence (lettre du bâtiment) par une
majuscule, tandis que la prise correspondante commence par une miniscule.
"""
## Filaire: NAS-Identifier => contient le nom du switch (batm-3.adm.crans.org)
## Filaire: NAS-Identifier => contient le nom du switch (batm-3.switches.crans.org)
## NAS-Port => port du switch (ex 42)
# Lettre du bâtiment (C, B, A, etc, en majuscule)
......
......@@ -353,7 +353,7 @@ def dialogStyle(texte, what):
"""
if isinstance(what, str):
if isinstance(what, (str, unicode)):
what = [what]
dialog_styles = {
......
......@@ -48,7 +48,7 @@ def _need_conn(f):
return first_connect
# Le v est virtuel.
bat_switchs = ["a", "b", "c", "g", "h", "i", "j", "m", "o", "p", "r", "v"]
bat_switchs = ["a", "b", "c", "g", "h", "i", "j", "k", "m", "o", "p", "r", "v"]
class ChbreNotFound(ValueError):
"""Lorsqu'une chambre n'existe pas"""
......@@ -96,6 +96,13 @@ def lieux_public():
results = cur.fetchall()
return [batiment.upper()+chambre for batiment, chambre in results]
@_need_conn
def disabled_radius():
cur = conn.cursor()
cur.execute("SELECT batiment,chambre FROM prises_prise WHERE has_radius=False")
results = cur.fetchall()
return [batiment.upper()+chambre for batiment, chambre in results]
@_need_conn
def reverse(batiment, prise = None):
"""Correspondance prise -> chambre"""
......@@ -145,7 +152,7 @@ uplink_prises={ 'a' :
349 : 'uplink->batb-4', 350 : 'libre-service',
401 : 'uplink->batb-0', 402 : 'uplink->batb-1',
403 : 'uplink->batb-2', 404 : 'uplink->batb-3',
405 : 'uplink->backbone', 523 : 'uplink->batb-4',
405 : 'uplink->backbone',
626 : 'uplink->backbone',
},
'c' :
......@@ -206,7 +213,7 @@ uplink_prises={ 'a' :
421 : 'uplink->batj-3', 422 : 'libre-service',
},
'k' : {
25 : 'uplink->backbone',
23 : 'uplink->backbone',
},
'm' :
{
......@@ -232,18 +239,16 @@ uplink_prises={ 'a' :
149: 'uplink->batp-4 (R3.1)',
249: 'uplink->batp-4 (R2.1)',
350: 'uplink->batp-4 (R1.2)',
# On ne génère pas la conf de batp-4 automatiquement, mais ses uplinks
# peuvent être utiles à connaître
401: 'uplink->batp0', 402: 'uplink->batp-1',
403: 'uplink->batp2', 403: 'uplink->batp-3',
405: 'libre-service', 406: 'uplink->bato-1',
401: 'uplink->batp-3', 402: 'uplink->batp-2',
403: 'uplink->batp-1', 404: 'uplink->batp-0',
405: 'libre-service', 409: 'uplink->bato-1',
},
'o' :
{
25 : 'uplink->bato-1', 26 : 'libre-service',
101 : 'uplink->bato-0', 121: 'uplink->NRD',
122: 'uplink->backbone', 123: 'uplink->backbone (unused)',
124: 'uplink->batp-0'
124: 'uplink->batp-4',
} ,
'r' :
{
......@@ -284,32 +289,25 @@ uplink_prises={ 'a' :
},
}
_SPECIAL_SWITCHES = ['backbone.adm.crans.org',
'multiprise-v6.adm.crans.org',
'batk-0.crans.org',
'minigiga.adm.crans.org',
'batb-5.crans.org',
_SPECIAL_SWITCHES = [
'backbone.switches.crans.org',
'minigiga.switches.crans.org',
]
_HIDDEN_SWITCHES = [
'batp-4.adm.crans.org',
'batv-0.adm.crans.org',
'batp-4.switches.crans.org',
'batv-0.switches.crans.org',
]
def guess_switch_fqdn(switch_name):
"""Retourne le FQDN d'un switch à partir de son nom"""
try:
return socket.gethostbyname_ex(switch_name)[0]
return socket.gethostbyname_ex(switch_name + ".switches.crans.org")[0]
except socket.gaierror:
pass
try:
return socket.gethostbyname_ex(switch_name + ".adm.crans.org")[0]
except socket.gaierror:
pass
try:
return socket.gethostbyname_ex(switch_name + ".crans.org")[0]
return socket.gethostbyname_ex(switch_name)[0]
except socket.gaierror:
pass
......@@ -339,8 +337,10 @@ def all_switchs(bat=None, hide=_SPECIAL_SWITCHES + _HIDDEN_SWITCHES):
continue
if hostname not in hide:
switchs.append(hostname)
switchs = set(switchs)
# on ajoute quand-même le backbone et/ou multiprise-v6 si demandé
switchs += set(_SPECIAL_SWITCHES).difference(hide)
switchs |= (set(_SPECIAL_SWITCHES) - set(hide))
switchs = list(switchs)
switchs.sort()
return switchs
......
# -*- mode: python; coding: utf-8 -*-
# Mapping des versions de switchs <-> firmware à jour
hp_procurve_map = {
"J9777" : ("YA.16.03.0003", "HP 2530"),
"J4899" : ("H.10.119", "HP 2626"),
"J4900" : ("H.10.119", "HP 2650"),
"J9626" : ("RA.16.03.0003", "HP 2620"),
"J9623" : ("RA.16.03.0003", "HP 2620"),
"J9145" : ("W.15.14.0014", "HP 2910 al"),
"J9085" : ("R.11.119", "HP 2610"),
"J9088" : ("R.11.119", "HP 2610"),
"J9021" : ("N.11.75", "HP 2810"),
"J9727" : ("WB.15.15.0012", "HP 2920"),
}
all_models = [
"HP 2530", "HP 2626", "HP 2650", "HP 2620",
"HP 2910 al", "HP 2610", "HP 2810", "HP 2920",
]
#!/bin/bash /usr/scripts/python.sh
# -*- mode: python; coding: utf-8 -*-
from pythondialog import *
......@@ -17,7 +17,11 @@ snmp-server community "public" Operator
time timezone 60
time daylight-time-rule Western-Europe
{%- for s in ntp_servers %}
{%- if sntp_new %}
sntp server priority 1 {{ s }} 4
{%- else %}
sntp server {{ s }}
{%- endif %}
{%- endfor %}
timesync sntp
sntp unicast
......@@ -33,6 +37,12 @@ ip default-gateway {{ gateway }}
{%- else %}
no ip default-gateway
{%- endif %}
max-vlans 50
{%- if oobm %}
oobm
no ip address
exit
{%- endif %}
{%- for vlan in vlans %}
vlan {{ vlan.id }}
name "{{ vlan.name|capitalize }}"
......@@ -76,7 +86,9 @@ aaa port-access mac-based addr-format multi-colon
{%- endif %}
;--- Bricoles ---
no cdp run
{%- if not stack_new %}
no stack
{%- endif %}
;--- DHCP Snooping ---
{%- if dhcp_snooping_vlan_names %}
dhcp-snooping vlan {% for vlanid in dhcp_snooping_vlan_names|vlan_id %}{{vlanid }} {% endfor %}
......
......@@ -32,7 +32,7 @@ import gestion.config as config
import lc_ldap.objets as ldap_classes
import gestion.config.encoding as enc
GIGABIT_MODELS = ['J9021A', 'J9145A']
GIGABIT_MODELS = ['J9021A', 'J9145A', 'J9727A']
MIB_PRISE_VLAN = 'SNMPv2-SMI::enterprises.11.2.14.11.5.1.7.1.15.3.1.1'
MIB_PRISE_MAC = 'SNMPv2-SMI::enterprises.11.2.14.11.5.1.9.4.2'
......@@ -90,6 +90,8 @@ class Port(object):
# : Liste des vlans vus
seen_vlans = None
# Radius activé
has_radius = True
def __init__(self, num):
self.num = num
......@@ -194,7 +196,7 @@ class Port(object):
def radius_auth(self):
"""Doit-on faire de l'auth radius ?"""
return not self.uplink and not self.servers and not self.bornes
return not self.uplink and not self.servers and not self.bornes and self.has_radius
def adherents(self):
"""Adhérents sur la prise"""
......@@ -280,6 +282,8 @@ def get_port_dict(switch):
port = ports[int(prise[1:])]
# (below) beware: type(num) == str (ex: 302g)
port.chambres += [bat.upper() + num for num in chbres]
# On remplit si radius a été désactivé
port.has_radius = not any(x in annuaire.disabled_radius() for x in port.chambres)
# Remplit les uplinks
for num_prise, label in annuaire.uplink_prises[bat].iteritems():
......@@ -287,6 +291,7 @@ def get_port_dict(switch):
continue
port = ports[num_prise % 100]
port.uplink = label
return ports
......@@ -496,22 +501,31 @@ def conf_switch(hostname):
'isolement', 'v6only', 'appts', 'federez','bornes'],
}
for com in switch['info']:
if com.value.startswith(';'):
data['config_header'] = com.value.encode('utf-8')
break
else:
print(((u'Impossible de déterminer le header à utiliser pour %s;' +
u"Utilisation d'une valeur par défaut (remplir ldap)")
% switch).encode('utf-8'), file=sys.stderr)
try:
for com in switch['info']:
if com.value.startswith(';'):
data['config_header'] = com.value.encode('utf-8')
break
else:
print(
(
u'Impossible de déterminer le header à utiliser pour %s;'
u"Utilisation d'une valeur par défaut (remplir ldap)" % switch
).encode('utf-8'),
file=sys.stderr
)
data['config_header']= '; J4899A Configuration Editor; Created on release #H.10.50'
except KeyError:
data['config_header']= '; J4899A Configuration Editor; Created on release #H.10.50'
imodel = data['config_header'].split(' ', 2)[1]
if imodel == "J9145A":
data['module_type'] = 'module 1 type J9145A'
if imodel == "J9727A":
data['module_type'] = 'module 1 type J9727A'
# Pas de snooping pour les 2810
if "2810" in switch['info'][0].value:
if "J9021" in imodel:
data['dhcp_snooping_vlan_names'] = []
else:
data['dhcp_servers'] = []
......@@ -523,13 +537,6 @@ def conf_switch(hostname):
# Si le switch n'est pas en .adm, il n'est pas publique (ex : batk-0)
# (désactivation de radius etc)
# On règle les logs, ntp, suivant si le switch est public ou privé (adm)
if u"adm" in unicode(switch['host']):
data['public'] = False
data['ntp_servers'] = ['10.231.136.98']
data['log_servers'] = ['10.231.136.38']
data['gateway'] = '10.231.136.4'
data['network_id'] = '10.231.136.0'
data['subnet'] = '255.255.255.0'
if u"switches" in unicode(switch['host']):
data['public'] = False
data['ntp_servers'] = ['10.231.100.102']
......@@ -545,15 +552,29 @@ def conf_switch(hostname):
data['subnet'] = '255.255.248.0'
# Ra gards ne concerne que les 2620
if "2620" in switch['info'][0].value:
if "J9626" in imodel or "J9623" in imodel or "J9727" in imodel:
data['ra_filter'] = True
else:
data['ra_filter'] = False
# La syntaxe sntp change depuis 2016 sur 2530, 2620 et 2910
if "J9626" in imodel or "J9623" in imodel or "J9145" in imodel or "J9777" in imodel:
data['sntp_new'] = True
else:
data['sntp_new'] = False
# Switch avec des ports gigabit uniquement
if imodel in GIGABIT_MODELS:
data['gigabit'] = True
# Sur les 2920, le stacking semble être désactivé par défaut
if imodel in ["J9727A"]:
data['stack_new'] = True
# Sur les 2920, l'interface OOBM doit être configurée manuellement
if imodel in ["J9727A"]:
data['oobm'] = True
# Build ports !
ports_list = PortList(get_port_dict(switch).itervalues())
data['ports'] = ports_list
......@@ -572,8 +593,6 @@ def conf_switch(hostname):
V_NO: 'no'}[assign]
vlan.setdefault(attr, PortList())
vlan[attr].extend(p)
if name == 'adm' and not data['public']:
vlan['ip_cfg'] = (gethostbyname(hostname + u".adm.crans.org"), '255.255.255.0')
if name == 'switches':
vlan['ip_cfg'] = (gethostbyname(hostname + u".switches.crans.org"), '255.255.255.0')
if name == 'adherent':
......
......@@ -13,6 +13,8 @@ Licence : GPLv3
### --default-button pour choisir le bouton sélectionner par defaut
### --not-tags pour masquer les tags quand il ne servent à rien pour l'utilisateur (mais sont utilisé comme index par le programme)
from __future__ import unicode_literals
import os
import sys
import argparse
......@@ -22,14 +24,14 @@ if '/usr/scripts' not in sys.path:
import lc_ldap.objets as objets
import lc_ldap.attributs as attributs
from dialog import adherent, club, machine, facture
from dialog.CPS import TailCall, tailcaller
from dialog.lc import main
from cransdialog import adherent, club, machine, facture
from cransdialog.CPS import TailCall, tailcaller
from cransdialog.lc import main
def handle_exit_code(d, code):
"""Gère les codes de retour dialog du menu principal"""
if code in (d.DIALOG_CANCEL, d.DIALOG_ESC):
if code == d.DIALOG_CANCEL:
if code in (d.CANCEL, d.ESC):
if code == d.CANCEL:
#msg = "Vous avez choisi Annuler dans la dernière fenêtre de dialogue.\n\n" \
# "Voulez vous quitter le programme ?"
os.system('clear')
......@@ -37,7 +39,7 @@ def handle_exit_code(d, code):
else:
msg = "Vous avez appuyé sur ESC ou CTRL+C dans la dernière fenêtre de dialogue.\n\n" \
"Voulez vous quitter le programme ?"
if d.yesno(msg, width=60) == d.DIALOG_OK:
if d.yesno(msg, width=60) == d.OK:
os.system('clear')
sys.exit(0)
return False
......@@ -144,7 +146,7 @@ class GestCrans(adherent.Dialog, club.Dialog, facture.Dialog, machine.Dialog):
backtitle=self._connected_as(),
choices=choices)
(code, tag) = self.handle_dialog(TailCall(handle_exit_code, self.dialog, self.dialog.DIALOG_ESC), box, tag)
(code, tag) = self.handle_dialog(TailCall(handle_exit_code, self.dialog, self.dialog.ESC), box, tag)
self_cont = TailCall(self.menu_principal, tag=tag, proprio=proprio, machine=machine)
callback = menu.get(tag, menu[''])['callback']
if handle_exit_code(self.dialog, code) and callback:
......
......@@ -473,7 +473,7 @@ class sw_chbre(hpswitch) :
bat = chbre[0].lower()
prise = chbre_prises(bat, chbre[1:])
self.prise_brute = prise
self.switch = 'bat%s-%i.adm.crans.org' % (bat , int(prise[0]) )
self.switch = 'bat%s-%i.switches.crans.org' % (bat , int(prise[0]) )
if prise[-1] == '-' :
#Prise en 10
self.prise = int(prise[1:-1])
......@@ -506,7 +506,7 @@ class sw_prise(sw_chbre):
bat = prise[0].lower()
prise = prise[1:]
self.prise_brute = prise
self.switch = 'bat%s-%i.adm.crans.org' % (bat , int(prise[0]))
self.switch = 'bat%s-%i.switches.crans.org' % (bat , int(prise[0]))
if prise[-1] == '-' :
#Prise en 10
self.prise = int(prise[1:-1])
......
This diff is collapsed.
......@@ -180,6 +180,19 @@ class ACLChecker(object):
if user == 'root':
return True
# Secrets nécéssaires au câblage
if ((user == 'respbats' and in_group('cablage')) and
name in [
'ldap_readonly_auth_dn',
'ldap_readonly_password',
'ldap_auth_dn',
'ldap_password',
'dhcp_omapi_keyname',
'dhcp_omapi_keys',
'rabbitmq_oie',
]):
return True
# radius a besoin des mdp clients (pour dynamic_clients),
# du ldap et du dhcp pour inscrire des gens
if user == 'freerad' and in_group('freeradius') and \
......
......@@ -278,13 +278,13 @@ class WhoKfet(WhosThere):
def do_scan(self):
self.set_ignore_inactive(privacy, wifi_only=privacy)
self.populate_from_switch('backbone.adm.crans.org', 21)
self.populate_from_switch('backbone.switches.crans.org', 21)
class WhoIlo(WhosThere):
name = u"ilo"
def do_scan(self):
self.populate_from_switch('backbone.adm.crans.org', 29)
self.populate_from_switch('backbone.switches.crans.org', 29)
class Who2B(WhosThere):
name = u"2B"
......@@ -302,7 +302,7 @@ class Who2B(WhosThere):
# Tous les gens au 2B sont supposés actifs (local technique quoi)
# mais on cache quand-même les personnes connectées en WiFi
self.set_ignore_inactive(privacy, wifi_only=privacy)
self.populate_from_switch('backbone.adm.crans.org', 33)
self.populate_from_switch('backbone.switches.crans.org', 33)
self.tty_server=u"vo"
self.populate_from_tty()
......@@ -318,7 +318,7 @@ class Who4J(WhosThere):
name = u"4J"
def do_scan(self):
self.set_ignore_inactive(privacy, wifi_only=privacy)
self.populate_from_switch('batj-3.adm.crans.org', 7)
self.populate_from_switch('batj-3.switches.crans.org', 7)
self.tty_server=u"cochon"
self.populate_from_tty()
......
......@@ -28,7 +28,7 @@ from utils.sendmail import actually_sendmail
import lc_ldap.shortcuts
import lc_ldap.filter2 as lfilter
import gestion.config as config
from pythondialog.dialog import Dialog
from dialog import Dialog
from gestion import mail
# On ouvre une connexion LDAP à la base de test une fois pour toute.
......
......@@ -72,7 +72,7 @@ def scan_bats(bats, annuaire=chbre_prises, verbose=False):
for prise in sorted(prises.keys()):
# Si l'on est pas connecté au switch sur lequel se trouve la prise, on en change
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".switches.crans.org"
current_switch = int(prise[0])
if verbose: print u"Connexion à " + switch_name + u" ..."
try:
......
......@@ -36,10 +36,12 @@ de code."""
#pylint: disable=line-too-long
from __future__ import unicode_literals
import argparse
import sys
import pythondialog
import dialog
import lc_ldap.shortcuts as shortcuts
import lc_ldap.attributs as attributs
......@@ -83,7 +85,7 @@ def traiter_factures(ldap, args):
controle_ok, controle_non, sans_controle = trie_factures(ldap, args)
# On crée une interface dialog.
dialog_interface = pythondialog.Dialog()
dialog_interface = dialog.Dialog()
_prompt = "Que voulez-vous faire ?"
......@@ -144,7 +146,7 @@ def traiter_factures(ldap, args):
choices=[(key, _choices[key]['txt'], _choices[key]['help']) for key in _order]
)
if int(code) > 0:
if code in [dialog.Dialog.CANCEL, dialog.Dialog.ESC, dialog.Dialog.HELP, dialog.Dialog.EXTRA]:
return
# On met à jour le dernier choix
......@@ -373,7 +375,7 @@ def controle(controle_type):
_sentences[controle_type][3]
)
if int(code) > 0:
if code in [dialog.Dialog.CANCEL, dialog.Dialog.ESC, dialog.Dialog.HELP, dialog.Dialog.EXTRA]:
return
# On appelle proceed_with avec les résultats
......
......@@ -31,7 +31,7 @@ def chambre_on_off(chambre, cmd = None):
# On cherche
prise = annuaires_pg.chbre_prises(batiment=bat,chambre=chbre)
switch_name = 'bat'+bat.lower()+'-'+prise[0]+'.adm.crans.org'
switch_name = 'bat' + bat.lower() + '-' + prise[0] + '.switches.crans.org'
# connexion au switch
chbre_sw = hptools2.HPSwitch(switch_name)
......@@ -65,4 +65,3 @@ if __name__ == '__main__':
else:
print __doc__
sys.exit(0)
This diff is collapsed.
Markdown is supported
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