Извинения за действительно длинный вопрос.
Я пытаюсь прочитать в файле конфигурации и получить список правил.
Я пытался использовать ConfigParser, чтобы сделать это, но это не стандартный файл конфигурации.
Файл не содержит заголовка раздела и токена.
т.е.
раздел конфигурации a
установить что-то другое
подраздел config
установите это к этому
следующий
конец
config firewall policy
редактировать 76
установить srcintf "Там"
установить dstintf "Здесь"
установить srcaddr "все"
установить dstaddr "все"
установить действие принять
установить расписание "всегда"
установить услугу "TCP_5600"
следующий
редактировать 77
установить srcintf "здесь"
установить dstintf "там"
установить srcaddr "все"
установить dstaddr "все"
установить действие принять
установить расписание "всегда"
комплект услуг "ПИНГ"
следующий
конец
Поскольку я не мог понять, как заставить ConfigParser работать, я подумал, что попытаюсь перебрать файл, к сожалению, у меня не так много навыков программирования, поэтому я застрял.
Я действительно думаю, что делаю это более сложным, чем должно быть.
Вот код, который я написал;
class Parser(object):
def __init__(self):
self.config_section = ""
self.config_header = ""
self.section_list = []
self.header_list = []
def parse_config(self, fields): # Create a new section
new_list = []
self.config_section = " ".join(fields)
new_list.append(self.config_section)
if self.section_list: # Create a sub section
self.section_list[-1].append(new_list)
else: self.section_list.append(new_list)
def parse_edit(self, line): # Create a new header
self.config_header = line[0]
self.header_list.append(self.config_header)
self.section_list[-1].append(self.header_list)
def parse_set(self, line): # Key and values
key_value = {}
key = line[0]
values = line[1:]
key_value[key] = values
if self.header_list:
self.header_list.append(key_value)
else: self.section_list[-1].append(key_value)
def parse_next(self, line): # Close the header
self.config_header = []
def parse_end(self, line): # Close the section
self.config_section = []
def parse_file(self, path):
with open(path) as f:
for line in f:
# Clean up the fields and remove unused lines.
fields = line.replace('"', '').strip().split(" ")
if fields[0] == "set":
pass
elif fields[0] == "end":
pass
elif fields[0] == "edit":
pass
elif fields[0] == "config":
pass
elif fields[0] == "next":
pass
else: continue
# fetch and call method.
method = fields[0]
parse_method = "parse_" + method
getattr(Parser, parse_method)(self, fields[1:])
return self.section_list
config = Parser().parse_file('test_config.txt')
print config
Вывод, который я ищу, выглядит примерно так:
[['section a', {'нечто': 'чему-то другому'}, ['subsection a', {'this': 'to' ']]], [' policy firewall ', [' 76 ', {' srcintf ':' There '}, {' dstintf ':' Here '} {etc.} {etc.}]]]
и вот что я получаю
[['section a']]
EDIT
Я изменил вышесказанное, чтобы отразить, где я сейчас нахожусь.
У меня все еще есть проблемы с получением результата, которого я ожидаю. Я просто не могу понять список правильно.