Нужна помощь в выяснении, как анализировать и извлекать файл в режиме порта? - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть текстовый файл, который содержит следующую информацию:

interfaces {
ge-2/0/0 {
    description "site1;;hostname1;ge-16/0/9;;;TRUST;";
    unit 0 {
        family ethernet-switching {
            port-mode trunk;
        }
    }
}
ge-2/0/2 {
    description "site2;;hostname2;ge-16/0/8;;;TRUST;";
    unit 0 {
        family ethernet-switching {
            port-mode trunk;
        }
    }
}

С помощью других я смог извлечь идентификатор интерфейса (ge-2/0/0), а такжеописание.

Код для этого следующий:

from ciscoconfparse import CiscoConfParse
parse = CiscoConfParse("testconfig.txt", syntax="junos")

intfs = parse.find_objects_w_parents(r'^interfaces', r'^\s+ge-')
for intfobj in intfs:
    intf_name = intfobj.text.strip()
    descr = intfobj.re_match_iter_typed(r'description\s+"(\S.+?)"$', group=1)
    print ('Intf: {0}, {1}'.format(intf_name, descr))

Это дает мне результат:

Intf: ge-2/0/0, site1;;hostname1;ge-16/0/9;;;TRUST;
Intf: ge-2/0/2, site2;;hostname2;ge-16/0/8;;;TRUST;

До сих пор это было огромным для меня,и я действительно думал, что смогу выяснить, как копать глубже в интерфейс, чтобы извлечь "режим порта".

Мои попытки пока что проваливаются.

Этоэто общий ход мыслей, который я пытался откопать, но безрезультатно:

ltype = parse.find_objects_w_parents(r'^interfaces', r'^\s+ge-', r'^unit\s0', r'^family\sethernet-switching')
for ltypeobj in ltype:
    pmode = intfobj.re_match_iter_typed(r'port-mode\s+"(\S.+?)"$', group=1)
    print ('Port Mode: {0}'.format(pmode))

Я получаю следующее, но просто не могу понять.

Traceback (most recent call last):
  File "convert.py", line 11, in <module>
    ltype = parse.find_objects_w_parents(r'^interfaces', r'^\s+ge-', r'^unit\s0', r'^family\sethernet-switching')
TypeError: find_objects_w_parents() takes from 3 to 4 positional arguments but 5 were given

Любой совет по выполнению этого будет принят.

1 Ответ

0 голосов
/ 20 сентября 2018

проверьте, работает ли этот пример для вас

import re
for i in re.findall('(ge-\d/\d/\d).*\n\s+description\s+(.*)(\n\s+.*){2}\n\s+port-mode\s(.*);', x):
    print 'interface: ', i[0]
    print 'description: ', i[1]
    print 'port mode: ', i[-1]

вывод:

interface:  ge-2/0/0
description:  "site1;;hostname1;ge-16/0/9;;;TRUST;";
port mode:  trunk
interface:  ge-2/0/2
description:  "site2;;hostname2;ge-16/0/8;;;TRUST;";
port mode:  trunk
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...