首页 > 编程问答 >python 中的智能 Cisco IOS 差异

python 中的智能 Cisco IOS 差异

时间:2024-07-26 15:16:01浏览次数:13  
标签:python cisco-ios

之前:

hostname Foo
!
interface GigabitEthernet 1/1
 switchport mode trunk
 switchport trunk allowed vlan 10,20,30
!
interface GigabitEthernet 1/2
 ip address 192.0.2.1 255.255.255.128
 no ip proxy-arp
!

之后:

hostname Foo
!
interface GigabitEthernet 1/1
 switchport mode trunk
 switchport allowed vlan 10,20,30,40
!
interface GigabitEthernet 1/2
 ip address 192.0.2.1 255.255.255.128
!

我知道我可以使用 difflib 来区分这两个字符串,但是 difflib 不理解 Cisco IOS 语法。

Difflib 示例

import difflib

before = open('before.txt').readlines()
after = open('after.txt').readlines()


# Find and print the diff:
for line in difflib.unified_diff(
        before, after, fromfile='before.txt',
        tofile='after.txt', lineterm=''):
    print(line)

当我运行此命令时,我得到:

--- before.txt
+++ after.txt
@@ -2,9 +2,8 @@
 !

 interface GigabitEthernet 1/1

  switchport mode trunk

- switchport trunk allowed vlan 10,20,30

+ switchport allowed vlan 10,20,30,40

 !

 interface GigabitEthernet 1/2

  ip address 192.0.2.1 255.255.255.128

- no ip proxy-arp

 !

这不是适用于 Cisco IOS 的差异。 最重要的是, interface 名称不包含在接口命令的差异集中(例如 no ip proxy-arp );但是,正确的 Cisco IOS 差异需要interface 命令。

所需的输出

使用 python,如何获得与此类似的差异输出,它理解 Cisco 配置格式?

interface GigabitEthernet 1/1
  switchport allowed vlan 10,20,30,40
interface GigabitEthernet 1/2
  ip proxy-arp

注意每个接口命令如何diff 前面是接口名称;此外,由于 ip proxy-arp 已从原始配置中删除,因此添加了 no ip proxy-arp 命令。


可以使用 Cisco 的 python 库来解析配置并生成差异。以下是一个如何执行此操作的示例:

from ciscoconfparse import CiscoConfParse

# 从文件中加载旧配置和新配置
with open("before.txt") as f:
    before_config = f.read()
with open("after.txt") as f:
    after_config = f.read()

# 使用 CiscoConfParse 解析配置
before_parse = CiscoConfParse(before_config.splitlines())
after_parse = CiscoConfParse(after_config.splitlines())

# 查找已添加或已删除的父行
before_parent_lines = set(cfg_ln.text for cfg_ln in before_parse.find_objects(r"^interface"))
after_parent_lines = set(cfg_ln.text for cfg_ln in after_parse.find_objects(r"^interface"))
added_parents = after_parent_lines - before_parent_lines
removed_parents = before_parent_lines - after_parent_lines

# 打印已添加或已删除的父行
print("以下接口已添加:")
for parent in added_parents:
    print(parent)

print("以下接口已删除:")
for parent in removed_parents:
    print(parent)

# 查找已添加或已删除的子行
for parent in before_parent_lines.intersection(after_parent_lines):
    before_children = before_parse.find_objects(f"^{parent}")
    after_children = after_parse.find_objects(f"^{parent}")
    before_children_text = set(child.text for child in before_children)
    after_children_text = set(child.text for child in after_children)
    added_children = after_children_text - before_children_text
    removed_children = before_children_text - after_children_text

    # 打印已添加或已删除的子行
    if added_children or removed_children:
        print(f"接口 {parent} 有以下更改:")
        for child in added_children:
            print(f"+ {child}")
        for child in removed_children:
            print(f"- {child}")

此脚本首先加载旧配置和新配置,并使用 CiscoConfParse 解析它们。然后,它会查找已添加或已删除的父行(在本例中为接口行)。对于每个父行,它会查找已添加或已删除的子行。最后,它以与请求的格式类似的格式打印已添加和已删除的行的列表。

此脚本将生成以下输出:

以下接口有以下更改:
interface GigabitEthernet 1/1
+  switchport allowed vlan 10,20,30,40
-  switchport trunk allowed vlan 10,20,30
interface GigabitEthernet 1/2
-  no ip proxy-arp

如所见,此输出更容易理解,并且提供了有关两个 Cisco IOS 配置之间差异的更多信息。

标签:python,cisco-ios
From: 78759473

相关文章

  • 无法编译 Arduino ESP32 代码:.../python3: exec 格式错误
    昨天我使用MacOSArduinoIDE或VSCode编译Arduino草图没有任何问题。但今天什么也编译不了。我尝试在ArduinoIDE或带有Arduino扩展的VSCode中编译的任何草图都会出现此错误:fork/exec/Library/Frameworks/Python.framework/Versions/3.11/bin/python3:exec......
  • 用Python解析邮件日志
    我的任务有点困难。我有一个邮件日志,如:Oct315:30:18mail1postfix/lmtp[5369]:DB10242054:to=<XXXXX>,orig_to=<XXXXXX>,relay=ip[ip]:port,delay=1.4,delays=0.04/0/0.01/1.4,dsn=2.0.0,status=sent(2502.0.0fromMTA(smtp:[iP]:port):2502.0.0Ok:queueda......
  • Python,Pyinstaller打包含taichi模块的程序
    Python版本3.9、taichi版本1.7.1,pyinstaller版本6.9.0问题描述:正常Pyinstaller打包后报错[Taichi]version1.7.1,llvm15.0.1,commit0f143b2f,win,python3.9.19[Taichi]Startingonarch=x64Traceback(mostrecentcalllast):File"taichi\lang\_wrap_inspec......
  • Python,运行Yolo项目,报错AttributeError: ‘ImageDraw‘ object has no attribute ‘te
    Python3.9问题描述:其他电脑已经运行成功的Python,YOLO代码到我电脑上运行报错Traceback(mostrecentcalllast): File"C:\Users\Administrator\Desktop\20240725\识别项目\predict.py",line122,in<module>  frame=np.array(yolo.detect_image(frame)) Fil......
  • Python从零开始制做文字游戏(荒岛求生)
    文章目录前言开发游戏《荒岛求生》游戏大纲背景内容通关条件游戏过程探索荒岛购买物资休息总结代码开发定义变量当前代码引入背景故事当前代码循环问题解决:函数当前代码制作延时当前代码制作a函数(探索荒岛阶段)展示数......
  • 使用 Python 进行数据分析:入门指南
    使用Python进行数据分析:入门指南1.简介本指南将介绍如何使用Python进行数据分析,涵盖从数据加载到可视化分析的各个方面。2.必要的库NumPy:用于数值计算和数组操作。Pandas:用于数据处理和分析,提供DataFrame结构。Matplotlib:用于数据可视化,创建各种图表。Seab......
  • IT实战课堂计算机毕业设计源码精品基于Python的高校教育教材采购出入库进销存储信息管
    项目功能简介:《[含文档+PPT+源码等]精品基于Python的高校教育教材信息管理系统设计与实现》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功以及课程答疑与微信售后交流群、送查重系统不限次数免费查重等福利!软件开发环境及开发工具:开......
  • 为什么我的 Python 脚本失败并出现 TypeError?
    我正在编写一个Python脚本,该脚本应该计算数字列表的总和。但是,当我运行代码时遇到TypeError这是一个最小的例子:numbers=[1,2,3,'4']total=sum(numbers)print(total)Theerrormessageis:TypeError:unsupportedoperandtype(s)for+:'int'and'str......
  • 如何通过socks代理传递所有Python的流量?
    有如何通过http代理传递所有Python的流量?但是,它不处理sock代理。我想使用sock代理,我们可以通过ssh隧道轻松获得它。ssh-D5005user@server你可以使用socks库,让你的Python代码通过SOCKS代理传递所有流量。这个库可以让你在套接字级别上指定代......
  • 如何在streamlit python中流式传输由LLM生成的输出
    代码:fromlangchain_community.vectorstoresimportFAISSfromlangchain_community.embeddingsimportHuggingFaceEmbeddingsfromlangchainimportPromptTemplatefromlangchain_community.llmsimportLlamaCppfromlangchain.chainsimportRetrievalQAimports......