switchs2.py: ascii-art d'une prise

This commit is contained in:
Daniel STAN 2015-01-13 00:06:18 +01:00
parent 9f03f41d6a
commit d8b258393e

View file

@ -39,6 +39,11 @@ GIGABIT_MODELS = ['J9021A', 'J9145A']
MIB_PRISE_VLAN = 'SNMPv2-SMI::enterprises.11.2.14.11.5.1.7.1.15.3.1.1' 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' MIB_PRISE_MAC = 'SNMPv2-SMI::enterprises.11.2.14.11.5.1.9.4.2'
# Blocs verticaux pour ascii art des prises d'un switch
START_BLOCK = [u'', u'', u'', u'', u'', u'', u'', u'', u'']
MIDDLE_BLOCK = [u'', u'', u'', u'', u'', u'', u'', u'', u'']
END_BLOCK = [u'', u'\u2510', u'', u'', u'\u2524', u'', u'', u'\u2518', u'']
ldap = make_ldap_conn() ldap = make_ldap_conn()
# états possibles # états possibles
@ -113,6 +118,16 @@ class Port(object):
for b in self.bornes)) for b in self.bornes))
return ",".join(labels) or "Inconnu" return ",".join(labels) or "Inconnu"
def brief(self):
"""Description brève de la prise"""
if self.uplink:
return unicode(self.uplink).replace(u'uplink->', u'')
else:
labels = self.servers + self.bornes
labels = map(lambda s: s['host'][0].value.split('.', 1)[0], labels)
labels += map(unicode, self.chambres)
return u",".join(labels)
def __int__(self): def __int__(self):
return self.num return self.num
@ -372,6 +387,60 @@ def fix_prise(machine, prise):
machine.save() machine.save()
print("Done !") print("Done !")
def format_prises_group(data, first, last):
"""Affiche sous forme d'un groupe de prise, en ascii-art, les noms des
prises. Entre first et last"""
first = (first-1)/2*2+1
last = (-last/2)*-2
def align5(txt):
"""Aligne le texte en limitant à 5 char"""
if len(txt) > 5:
return txt[0:4] + u'*'
return txt + (5-len(txt))*u' '
def align2x5(txt):
"""Aligne le texte sur deux lignes de 5 char"""
return (align5(txt[0:5]), align5(txt[5:]))
lines = list(START_BLOCK)
def fill_prise(prise, i_info, i_prise):
"""Remplis le contenu d'une prise, sur deux lignes"""
if prise in data:
txt = data[prise].brief()
else:
txt = u""
(txt1, txt2) = align2x5(txt)
lines[i_info] += txt1
lines[i_info+1] += txt2
lines[i_prise] += u" " + align5(u"%d" % prise)
sep = MIDDLE_BLOCK
for prise in xrange(first, last, 2):
for li in [1, 4, 7]:
lines[li] += u''*5
fill_prise(prise, 2, 0)
fill_prise(prise+1, -4, -1)
if prise == last -1:
sep = END_BLOCK
for line_i in xrange(1, 8):
lines[line_i] += sep[line_i]
return lines
def pretty_print(hostname):
"""Affiche joliement le plan de connexion d'un switch"""
bat, sw_num = get_bat_num(hostname)
switch = ldap.search(u'host=bat%s-%d.adm.crans.org' % (bat, sw_num))[0]
port_dict = get_port_dict(switch)
total = max(port_dict.keys())
first = 1
while first < total:
for line in format_prises_group(port_dict, first, min(first+11, total)):
print(line)
first += 12
def get_bat_num(hostname): def get_bat_num(hostname):
"""Renvoie un tuple (bat, num) où bat est la lettre du bâtiment et """Renvoie un tuple (bat, num) où bat est la lettre du bâtiment et
@ -487,11 +556,15 @@ if __name__ == "__main__":
parser.add_argument('-c', '--check', action='store_true', default=False, parser.add_argument('-c', '--check', action='store_true', default=False,
help="Vérifie la conf par rapport aux macs et vlans effectivement" +\ help="Vérifie la conf par rapport aux macs et vlans effectivement" +\
"présents sur le switch") "présents sur le switch")
parser.add_argument('--pretty', action='store_true', default=False,
help="Affiche un tableau ascii du plan de connexion du switch")
options = parser.parse_args(sys.argv[1:]) options = parser.parse_args(sys.argv[1:])
if options.check: if options.check:
check_conf_ldap(options.hostname) check_conf_ldap(options.hostname)
elif options.pretty:
pretty_print(options.hostname)
else: else:
print(conf_switch(options.hostname)) print(conf_switch(options.hostname))