Python ciscoconfparse - создать базовый конфигурационный файл

Я пытаюсь создать базовую конфигурацию Cisco, основанную на полном конфигурационном файле.

Ниже приведены несколько примеров полной конфигурации файла:

    !
    policy-map QOS
     class GOLD
      priority percent 10
     class SILVER
      bandwidth 30
      random-detect
     class default
    !
    interface Loopback1
     description Management
     ip address 9.9.9.9 255.255.255.255
    !
    interface FastEthernet0/0
     description LAN
     ip address 6.6.6.6 255.255.255.0
    !
    ip access-list standard customer_internal
     permit 1.1.1.1
     permit 2.2.2.2
     permit 3.3.3.3
    !

Я обнаружил эту библиотеку ciscoconfparse ( https://pypi.python.org/pypi/ciscoconfparse). и был в состоянии захватить блоки строк конфигурации в другой файл, но не знал, как исключить блоки из основного файла конфигурации.

from ciscoconfparse import CiscoConfParse

full_config_for_parse = file('./fullconfig.txt')
basic_config_file = open('./basic_config.txt', 'w') # This file needs to contain only basic config, like interface, IP, etc...
security_config_file = open('./security_config_file.txt', 'w') # This is the file that was able to send the line blocks

parse = CiscoConfParse(full_config_for_parse)

class_map = parse.find_all_children('class-map')
access_list = parse.find_all_children('ip access-list')

if class_map != ' ':   # If class_map is not empty, it means that the full config file has class-map configuration, so, it needs to be removed or not copied to basic config file
    for line in class_map:
        security_config_file.write(line)  # separating the blocks to another file
        #basic_config_file.write(remove_this_line) I need to delete/not write this line to basic_config_file

if access_list != ' ':
    for line in access_list:
        security_config_file.write(line)
        #basic_config_file.write(remove_this_line)


# There is another code part that is copying all the rest of the basic configuration to basic_config_file, that is working OK

files.close()

Кто-нибудь знает лучший способ удаления или не копирования этих блоков конфигурации в основной файл конфигурации?

2 ответа

Решение

Насколько я могу сказать, вы хотите удалить policy-map а также ip access-list из конфигурации внизу моего ответа, и сохраните результат как basic_config.txt,

Это самый эффективный способ сделать это...

from ciscoconfparse import CiscoConfParse

parse = CiscoConfParse('fullconfig.txt')

objs = list()
objs.extend(parse.find_objects(r'^policy-map'))    # Append policy-map obj
objs.extend(parse.find_objects(r'ip\saccess-list'))# Append ip access-list obj

for obj in objs:
    # When you delete a parent obj, it recurses through all children
    obj.delete()
parse.commit()

parse.save_as('basic_config.txt')  # Save the new configuration

Когда вы смотрите на basic_config.txt, он будет иметь следующие строки...

!
!
interface Loopback1
 description Management
 ip address 9.9.9.9 255.255.255.255
!
interface FastEthernet0/0
 description LAN
 ip address 6.6.6.6 255.255.255.0
!
!

Имя файла: fullconfig.txt...

!
policy-map QOS
 class GOLD
  priority percent 10
 class SILVER
  bandwidth 30
  random-detect
 class default
!
interface Loopback1
 description Management
 ip address 9.9.9.9 255.255.255.255
!
interface FastEthernet0/0
 description LAN
 ip address 6.6.6.6 255.255.255.0
!
ip access-list standard customer_internal
 permit 1.1.1.1
 permit 2.2.2.2
 permit 3.3.3.3
!

После многих часов исследований и попыток, получил то, что я хочу, редактируя ответ с новым кодом, который сейчас работает:

from ciscoconfparse import CiscoConfParse

def main():

    # 2nd Part - Begin 
    p = CiscoConfParse("./basic_config.txt")
    basic_config_NEW = open('./basic_config_NEW.txt', 'w') # Need to open a new file as using the same one was getting empty file

    for obj in p.find_objects(r'^class-map'):
        obj.delete('class')

    for obj in p.find_objects(r'^ip access-list'):
        obj.delete('ip access-list')

    for line in p.ioscfg:
        basic_config_NEW.write(line)  # This was adding the lines without break lines on the file
        basic_config_NEW.write('\n')  # Have to add it not sure if there is another way of doing it in one single line

    basic_config_NEW.close()        

    # 2nd Part - End

if __name__ == "__main__":
    main()
Другие вопросы по тегам