2015-09-08 3 views
2

J'ai été capable d'écrire un script python qui analyse les fichiers de configuration IOS mais je reçois une erreur.Message d'erreur lors de l'exécution du script python pour analyser les fichiers de configuration IOS

Ci-dessous le script:

import glob, os 
from ciscoconfparse import CiscoConfParse 
os.chdir("T:/") 
for cfgfile in glob.glob("*-confg"): 
    parse = CiscoConfParse("T:/" + cfgfile, factory=True, syntax='ios') 
    host = parse.find_objects_dna(r'Hostname') 
    interfaces_with_helpers = parse.find_parents_w_child("^interf", "ip helper-address 10.194.35.201") 
    if interfaces_with_helpers: 
     print (host[0].hostname) 
    for interface in interfaces_with_helpers: 
     print (interface) 

Quand je lance le script, il semble être haletant loin bien et obtenir l'erreur ci-dessous:

Traceback (most recent call last): 
File "<stdin>", line 2, in <module> 
File "C:\Python34\lib\site-packages\ciscoconfparse-1.2.37-py3.4.egg\ciscoconfparse\ciscoconfparse.py", line 186, in __init__ CiscoConfParse=self) 
File "C:\Python34\lib\site-packages\ciscoconfparse-1.2.37-py3.4.egg\ciscoconfparse\ciscoconfparse.py", line 2209, in __init__ 
self._list = self._bootstrap_obj_init(data) 
File "C:\Python34\lib\site-packages\ciscoconfparse-1.2.37-py3.4.egg\ciscoconfparse\ciscoconfparse.py", line 2433, in _bootstrap_obj_init 
syntax='ios') 
File "C:\Python34\lib\site-packages\ciscoconfparse-1.2.37-py3.4.egg\ciscoconfparse\ciscoconfparse.py", line 2982, in ConfigLineFactory 
comment_delimiter=comment_delimiter) # instance of the proper subclass 
File "C:\Python34\lib\site-packages\ciscoconfparse-1.2.37-py3.4.egg\ciscoconfparse\models_cisco.py", line 1758, in __init__raise ValueError 
ValueError 
>>> 

Répondre

1

On dirait un format de fichier de configuration inattendue moi. Si vous regardez la source où le ValueError est jeté dans la bibliothèque CiscoConfParse:

REGEX = r'^aaa\sgroup\sserver\s(?P<protocol>\S+)\s(?P<group>\S+)$' 
    mm = re.search(REGEX, self.text) 
    if not (mm is None): 
     groups = mm.groupdict() 
     self.protocol = groups.get('protocol', '') 
     self.group = groups.get('group', '') 
    else: 
     raise ValueError 

On dirait qu'il a trébuché à travers un fichier de configuration où il attend la ligne pour satisfaire l'expression rationnelle ^aaa\sgroup\sserver\s(?P<protocol>\S+)\s(?P<group>\S+)$ et a échoué.

Pendant l'itération sur les résultats de glob.glob("*-confg"), vous devrez imprimer le nom de fichier avec lequel vous travaillez actuellement pour voir quel fichier est mal formé. Ensuite, corrigez ce fichier de configuration ou affinez les fichiers de configuration que vous essayez d'analyser.

Vous pouvez également ignorer l'erreur comme suit:

import glob, os 
from ciscoconfparse import CiscoConfParse 
os.chdir("T:/") 
for cfgfile in glob.glob("*-confg"): 
    try: 
     parse = CiscoConfParse("T:/" + cfgfile, factory=True, syntax='ios') 
    except ValueError: 
     print "Malformed config file found. Skipping " + cfgfile 
     continue 
    host = parse.find_objects_dna(r'Hostname') 
    interfaces_with_helpers = parse.find_parents_w_child("^interf", "ip helper-address 10.194.35.201") 
    if interfaces_with_helpers: 
     print (host[0].hostname) 
    for interface in interfaces_with_helpers: 
     print (interface) 
+0

merci beaucoup, qui a fait l'affaire. Très appréciée!! – Jason