diff --git a/gestion/hptools.py b/gestion/hptools.py index 0e92b375..619e0851 100755 --- a/gestion/hptools.py +++ b/gestion/hptools.py @@ -17,6 +17,7 @@ from os.path import exists from os import system import sys from re import findall +import re from config import vlans path.append('/usr/scripts/gestion') @@ -145,11 +146,11 @@ class snmp : self._engineid = '0000000b0000%s' % self.getBaseMac() def __exec(self,cmd) : - s, r = getstatusoutput(cmd) - if s : - r=r.replace('snmpget: ','') - raise ConversationError(r,cmd) - return r + status, response = getstatusoutput(cmd) + if status: + response = response.replace('snmpget: ','') + print 'Erreur : '+response+' : '+cmd + return response def get(self,oid) : """ Retourne le résultat correspondant à l'oid demandé """ @@ -182,12 +183,14 @@ class snmp : """ Retourne le résultat de snmpwalk le retour est un dictionnaire { oid : valeur } """ - lignes = self.__exec('snmpwalk -O q %s %s' % (self.options, base_oid ) ).split('\n') + lignes = self.__exec('snmpwalk -Ox %s %s' % (self.options, base_oid ) ).split('\n') result = {} - for l in lignes : - if l !="" : - oid, valeur = l.split(' ', 1) + for ligne in lignes: + try: + oid, valeur = ligne.split('Hex-STRING: ') result[oid] = valeur + except: + pass return result ############################################################################################# @@ -228,11 +231,11 @@ class hpswitch : data = self.walk('STATISTICS-MIB::hpSwitchPortFdbAddress.%d' % int(prise)) macs = [] for value in data.itervalues(): - mac = findall('".*"', value)[0][1:-1] - if ' ' in mac: - macs.append(":".join(mac.lower().split(" ")[:-1])) - else: - macs.append(":".join("%02x" % ord(digit) for digit in mac)) + mac = value.replace(' ', '').lower().replace('"', '') + if not re.match('([0-9a-f]{2}){6}', mac): + mac = mac.encode('hex').lower() + mac = "%s:%s:%s:%s:%s:%s" % (mac[0:2], mac[2:4], mac[4:6], mac[6:8], mac[8:10], mac[10:12]) + macs.append(mac) return macs except ValueError: # Pas de MAC trouvée @@ -241,12 +244,7 @@ class hpswitch : def where_is_mac(self, mac) : """Retrouve la prise correspondant à une adresse MAC donnée""" if self.__debug : self.__logDest.write("HP DEBUG : where_is_mac(mac=%s)\n" % mac) - # On va transformer l'adresse MAC cherchée pour la mettre au format 0A 0A 0A 0A 0A 0A - mac = mac.upper() - mac = filter(lambda x: x in "0123456789ABCDEF", mac) # 0A0A0A0A0A0A - mac = "%s %s %s %s %s %s" % (mac[0:2], mac[2:4], mac[4:6], - mac[6:8], mac[8:10], mac[10:12]) - + mac = mac.lower() # On interroge le switch try: data = self.walk('STATISTICS-MIB::hpSwitchPortFdbAddress') @@ -257,13 +255,15 @@ class hpswitch : # On cherche dans data la bonne adresse MAC for (onesnmp, onemac) in data.iteritems(): try: - onemac = findall('".*"', onemac)[0][1:-1] - if ' ' not in onemac: - onemac = " ".join("%02x" % ord(digit) for digit in mac) + onemac = onemac.replace(' ', '').lower().replace('"', '') + if not re.match('([0-9a-f]{2}){6}', onemac): + onemac = onemac.encode('hex').lower() + onemac = "%s:%s:%s:%s:%s:%s" % (onemac[0:2], onemac[2:4], onemac[4:6], onemac[6:8], onemac[8:10], onemac[10:12]) if onemac.startswith(mac): return int(onesnmp.split(".")[1]) except: pass + onemac = "" # On a rien trouvé return None diff --git a/gestion/tools/locate_mac.py b/gestion/tools/locate_mac.py index 33f85d61..2b37cffa 100755 --- a/gestion/tools/locate_mac.py +++ b/gestion/tools/locate_mac.py @@ -82,4 +82,4 @@ def trace_machine(mac, affiche_uplinks=False): if __name__ == '__main__': mac = format_mac(sys.argv[1]) affiche_uplinks = len(sys.argv) > 2 and bool(sys.argv[2]) - print trace_machine(mac, affiche_uplinks) + print trace_machine(mac, affiche_uplinks).encode('utf-8')