Commit d5701e85 authored by Gabriel Detraz's avatar Gabriel Detraz

Merge branch 'switches' of https://gitlab.adm.crans.org/nounous/scripts into switches

parents 376f24ab f6652434
......@@ -152,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' :
......@@ -213,7 +213,7 @@ uplink_prises={ 'a' :
421 : 'uplink->batj-3', 422 : 'libre-service',
},
'k' : {
25 : 'uplink->backbone',
23 : 'uplink->backbone',
},
'm' :
{
......@@ -239,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' :
{
......@@ -294,7 +292,6 @@ uplink_prises={ 'a' :
_SPECIAL_SWITCHES = [
'backbone.switches.crans.org',
'minigiga.switches.crans.org',
'batb-5.switches.crans.org',
]
_HIDDEN_SWITCHES = [
'batp-4.switches.crans.org',
......
......@@ -11,9 +11,10 @@ hp_procurve_map = {
"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 2910 al", "HP 2610", "HP 2810", "HP 2920",
]
......@@ -183,9 +183,15 @@ class TailCall(object) :
return call(*self.args, **self.kwargs)
def unicode_of_Error(x):
"""Formatte des exception"""
return u"\n".join(unicode(i, 'utf-8') if type(i) == str
else repr(i) for i in x.args)
"""Formatte des exceptions"""
def _exc_formatter(element):
if isinstance(element, str):
return element.decode('utf-8')
elif isinstance(element, unicode):
return element
else:
return repr(element)
return "\n".join(_exc_formatter(i) for i in x.args)
def raiseKeyboardInterrupt(x, y):
"""fonction utilisée pour réactiver les Ctrl-C"""
......@@ -385,7 +391,7 @@ class Dialog(object):
@tailcaller
def get_password(self, cont, confirm=True, title="Choix d'un mot de passe", **kwargs):
"""
Affiche une série d'inpuxbox pour faire entrer un mot de passe puis le retourne,
Affiche une série d'inputbox pour faire entrer un mot de passe puis le retourne,
si confirm=True, il y a une confirmation du mot de passe de demandée
"""
def todo(self_cont, cont):
......
......@@ -581,7 +581,7 @@ class Dialog(proprio.Dialog):
tag_paiment,
comment_paiement
)
},
}
menu_order.append("%s mois" % i)
if facture:
......
......@@ -283,7 +283,7 @@ class Dialog(proprio.Dialog):
list_height=0,
choices=[
(
impr,
unicode(impr),
self.conn.search(u'aid=%s' % impr)[0]['nom'][0].value,
0
) for impr in club['imprimeurClub']],
......@@ -361,7 +361,10 @@ class Dialog(proprio.Dialog):
}
menu_order = ["Responsable"]
if has_compte:
menu_order.extend(['Ajouter un imprimeur', "Retirer un imprimeur"])
menu_order.append('Ajouter un imprimeur')
if club['imprimeurClub']:
menu_order.append('Retirer un imprimeur')
def box(default_item=None):
return self.dialog.menu(
"Quelle action administrative effectuer",
......
......@@ -103,8 +103,8 @@ class Dialog(CPS.Dialog):
else:
sys.stderr.write(
u"%s ne possède aucun des droits :\n"
" * %s\n"
"nécessaire pour utiliser ce programme\n" % (
u" * %s\n"
u"nécessaire pour utiliser ce programme\n" % (
self.conn.current_login,
'\n * '.join(allowed_right)
)
......@@ -153,7 +153,8 @@ class Dialog(CPS.Dialog):
timeout=self.timeout,
list_height=7,
choices=choices,
title=title)
title=title
)
def todo(values, obj, attribs, cont):
# On met à jour chaque attribut si sa valeur à changé
......
......@@ -39,12 +39,19 @@ class Dialog(certificat.Dialog, blacklist.Dialog):
"""
a = attributs
# Quel sont les attributs ldap dont on veut afficher et la taille du champs d'édition correspondant
to_display = [(a.host, 40), (a.macAddress, 17), (a.ipHostNumber, 15)]
to_display = [(a.host, 40),
(a.macAddress, 17),
(a.ipHostNumber, 15)]
to_display_port = [(a.portTCPout, 50), (a.portTCPin, 50), (a.portUDPout, 50),
(a.portUDPin, 50)]
to_display_port = [(a.portTCPout, 50),
(a.portTCPin, 50),
(a.portUDPout, 50),
(a.portUDPin, 50)]
to_display_borne = [(a.canal, 10), (a.puissance, 10), (a.positionBorne, 50), (a.prise, 10)]
to_display_borne = [(a.canal, 10),
(a.puissance, 10),
(a.positionBorne, 50),
(a.prise, 10)]
to_display_machine_crans = [(a.prise, 10)]
......@@ -198,7 +205,7 @@ class Dialog(certificat.Dialog, blacklist.Dialog):
values = [v for v in values.split(separateur) if v]
# Pour host, on fait quelques vérification de syntaxe
if a.ldap_name == 'host':
attrs[a.ldap_name]=check_host(values, objectClass, realm)
attrs[a.ldap_name] = check_host(values, objectClass, realm, proprio)
else:
attrs[a.ldap_name]=values
# Soit on édite une machine existante
......@@ -282,7 +289,7 @@ class Dialog(certificat.Dialog, blacklist.Dialog):
"""Raccourci vers edit_blacklist spécifique aux machines"""
return self.edit_blacklist(
obj=machine,
title="Éditions des blacklist de la machine %s" % machine['host'][0],
title=u"Édition des blacklist de la machine %s" % machine['host'][0],
update_obj='machine',
cont=cont
)
......@@ -293,7 +300,7 @@ class Dialog(certificat.Dialog, blacklist.Dialog):
obj=machine,
update_obj='machine',
attr=attr,
title="Modification de la machine %s" % machine['host'][0],
title=u"Modification de la machine %s" % machine['host'][0],
cont=cont
)
......@@ -308,13 +315,11 @@ class Dialog(certificat.Dialog, blacklist.Dialog):
return self.edit_boolean_attributs(
obj=machine,
attribs=attribs,
title="Édition des attributs booléen de la machine %s" % machine['host'][0],
title="Édition des attributs booléens de la machine %s" % machine['host'][0],
update_obj='machine',
cont=cont
)
def modif_machine(self, cont, machine=None, tag=None):
"""
Permet d'éditer une machine. Si fournie en paramètre on éditer en place,
......@@ -346,39 +351,39 @@ class Dialog(certificat.Dialog, blacklist.Dialog):
}
menu = {
'Information' : {
'text' : "Modifier le nom de machine, l'IP, adresse MAC",
'text' : u"Modifier le nom de machine, l'IP, adresse MAC",
"callback":self.machine_information
},
'Autre' : {
'text' : "Modifier les attribut booléen comme actif/inactif ou dnsIpv6",
'text' : u"Modifier les attribut booléen comme actif/inactif ou dnsIpv6",
"callback" : self.modif_machine_boolean
},
'Blackliste' : {
'text' : 'Modifier les blacklist de la machine',
'text' : u'Modifier les blacklist de la machine',
'callback' : self.modif_machine_blacklist
},
'Certificat' : {
'text' : 'Modifier les certificats de la machine',
'text' : u'Modifier les certificats de la machine',
'callback' : self.modif_machine_certificat
},
'Exemption' : {
'text' : "Modifier la liste d'exemption d'upload de la machine",
'text' : u"Modifier la liste d'exemption d'upload de la machine",
'attribut':attributs.exempt
},
'Alias' : {
'text' : 'Créer ou supprimer un alias de la machine',
'text' : u'Créer ou supprimer un alias de la machine',
'attribut' : attributs.hostAlias
},
'Remarques' : {
'text' : 'Ajouter ou supprimer une remarque de la machine',
'text' : u'Ajouter ou supprimer une remarque de la machine',
'attribut' : attributs.info
},
'SshKey' : {
'text' : 'Ajouter ou supprimer une clef ssh pour la machine',
'text' : u'Ajouter ou supprimer une clef ssh pour la machine',
'attribut':attributs.sshFingerprint
},
'Supprimer' : {
'text' : 'Supprimer la machine',
'text' : u'Supprimer la machine',
'callback' : self.delete_machine
},
}
......
......@@ -72,10 +72,10 @@ L'adhérent devra impérativement consulter l'adresse mail associée
def get_login(proprio, self_cont, cont):
# Essaye-t-on de forcer le login à utiliser
nom = unicodedata.normalize('NFKD', proprio['nom'][0]).encode('ascii', 'ignore').lower().replace(' ', '-')
nom = unicodedata.normalize('NFKD', unicode(proprio[u'nom'][0])).encode('ascii', 'ignore').lower().replace(' ', '-')
login_crans = nom
if proprio.get('prenom', [False])[0]:
prenom = unicodedata.normalize('NFKD', proprio['prenom'][0]).encode('ascii', 'ignore').lower().replace(' ', '-')
prenom = unicodedata.normalize('NFKD', unicode(proprio['prenom'][0])).encode('ascii', 'ignore').lower().replace(' ', '-')
baselogin = nom
for rang,let in enumerate(prenom):
if self.conn.search(u'uid=%s' % login_crans) == []:
......@@ -200,11 +200,11 @@ L'adhérent possède également l'alias :
if test_password(password, self_cont):
if return_obj:
proprio['userPassword'] = unicode(lc_utils.hash_password(password))
proprio['userPassword'] = unicode(lc_utils.hash_password(password.encode('ascii')))
return proprio
else:
with self.conn.search(dn=proprio.dn, scope=0, mode='rw')[0] as proprio:
proprio['userPassword'] = unicode(lc_utils.hash_password(password))
proprio['userPassword'] = unicode(lc_utils.hash_password(password.encode('ascii')))
proprio.validate_changes()
proprio.history_gen()
proprio.save()
......@@ -334,7 +334,7 @@ Repasser le solde à 0€ pour supprimer le compte.""" % proprio.get('solde', [0
'badPassSh' : [a.nounou],
'disconnect_shell':[a.nounou],
}
shell = os.path.basename(proprio['loginShell'][0]).lower()
shell = os.path.basename(unicode(proprio['loginShell'][0])).lower()
shells = config.shells_gest_crans
shells_order = config.shells_gest_crans_order
def box():
......@@ -351,8 +351,8 @@ Repasser le solde à 0€ pour supprimer le compte.""" % proprio.get('solde', [0
choices = [
(
unicode(s),
unicode(shells[s]['desc']),
1 if s == shell else 0
shells[s]['desc'].decode('utf-8'),
1 if unicode(s) == shell else 0
) for s in editable_sheels
]
return self.dialog.radiolist(
......@@ -397,7 +397,7 @@ Repasser le solde à 0€ pour supprimer le compte.""" % proprio.get('solde', [0
choices_values=[
(
unicode(s),
unicode(shells[s]['desc']),
shells[s]['desc'].decode('utf-8'),
1 if s == output else 0
) for s in shells_order
]
......@@ -1288,7 +1288,7 @@ Repasser le solde à 0€ pour supprimer le compte.""" % proprio.get('solde', [0
if proprio:
attrs = dict((k, [unicode(a) for a in at]) for (k, at) in proprio.items())
if 'cransAccount' in proprio['objectClass']:
#input_type[attributs.mail] = attributs.mail.max_length
input_type[attributs.mail] = 1
to_display.append((attributs.mailExt, 30))
else:
attrs = {}
......@@ -1298,7 +1298,7 @@ Repasser le solde à 0€ pour supprimer le compte.""" % proprio.get('solde', [0
timeout=self.timeout,
title="Création d'un utilisateur",
width=50) == self.dialog.OK:
#input_type[attributs.mail] = attributs.mail.max_length
input_type[attributs.mail] = 1
make_compte_crans = True
to_display.append((attributs.mailExt, 30))
else:
......@@ -1373,16 +1373,16 @@ Repasser le solde à 0€ pour supprimer le compte.""" % proprio.get('solde', [0
1,
fields_attrs.get(a, separateur.join(attrs.get(a.ldap_name, [a.default] if a.default else []))),
num + 1,
#max(map(lambda x: len(x[0].legend))) + 3,
l+1,
min(a.max_length, 40),
l,
input_type.get(a, input_type['default'])
) for num, (a,l) in enumerate(to_display)
]
(code, tags) = self.dialog.form(
"",
fields,
(code, tags) = self.dialog.mixedform(
text="",
elements=fields,
timeout=self.timeout,
height=0, width=0, form_height=0,
title="Création d'un utilisateur" if proprio is None else "Édition des informations de %s %s" % (proprio.get('prenom', [''])[0], proprio['nom'][0]),
......@@ -1581,8 +1581,8 @@ Repasser le solde à 0€ pour supprimer le compte.""" % proprio.get('solde', [0
(code, tags, make_compte_crans) = self.handle_dialog(cont, box, make_compte_crans)
# On prépare les fiels à afficher à l'utilisateur si une erreure à lieu
# pendant le traitement des donnée (on n'éfface pas ce qui a déjà été entré
# On prépare les fields à afficher à l'utilisateur si une erreur à lieu
# pendant le traitement des donnée (on n'efface pas ce qui a déjà été entré
# c'est au cableur de corriger ou d'annuler
fields_attrs = dict((a, values) for ((a, l), values) in zip(to_display, tags))
retry_cont = TailCall(
......
......@@ -38,6 +38,11 @@ ip default-gateway {{ gateway }}
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 }}"
......@@ -81,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'
......@@ -468,8 +468,22 @@ def get_bat_num(hostname):
def get_header(hostname):
from gestion.majswitch2 import get_version
firmware, model = get_version(hostname + ".switches.crans.org")
header = "; %s Configuration Editor; Created on release #%s" % (model, firmware)
header = None
# On commence par chercher le header dans la base LDAP
try:
switch = ldap.search(
u'(&(host=%s.switches.crans.org)'
u'(objectClass=switchCrans))' % hostname
)[0]
for line, com in enumerate(switch['info']):
if com.value.startswith(';'):
header = com.value.encode('utf-8')
except (IndexError, KeyError):
pass
# S'il n'y est pas, on fallback sur celui du switch en prod'
if header is None:
firmware, model = get_version(hostname + ".switches.crans.org")
header = "; %s Configuration Editor; Created on release #%s" % (model, firmware)
return header
def conf_switch(hostname):
......@@ -527,6 +541,8 @@ def conf_switch(hostname):
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 "J9021" in imodel:
......@@ -556,7 +572,7 @@ def conf_switch(hostname):
data['subnet'] = '255.255.248.0'
# Ra gards ne concerne que les 2620
if "J9626" in imodel or "J9623" in imodel:
if "J9626" in imodel or "J9623" in imodel or "J9727" in imodel:
data['ra_filter'] = True
else:
data['ra_filter'] = False
......@@ -571,6 +587,14 @@ def conf_switch(hostname):
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
......
......@@ -36,6 +36,8 @@ de code."""
#pylint: disable=line-too-long
from __future__ import unicode_literals
import argparse
import sys
......@@ -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
......
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