将网络设备配置保存到数据库中

问题描述

我尝试从网络设备(交换机、路由器、防火墙)获取配置并将其保存到数据库中。为此,我将 Netconf 与 ncclient 库一起使用。配置以 XML 格式接收。这是一个配置示例。

<native xmlns=\"http://cisco.com/ns/yang/Cisco-IOS-XE-native\">
    <hostname>R1</hostname>
    <username>
        <name>testuser</name>
        <password>
            <encryption>15</encryption>
            <password>123</password>
        </password>
    </username>
    <username>
        <name>user</name>
        <privilege>15</privilege>
        <secret>
            <encryption>15</encryption>
            <secret>123</secret>
        </secret>
    </username>
    <interface>
        <GigabitEthernet>
            <name>1</name>
            <description>MANAGEMENT INTERFACE</description>
            <ip>
                <address>
                    <primary>
                        <address>10.10.20.48</address>
                        <mask>255.255.255.0</mask>
                    </primary>
                </address>
            </ip>
        </GigabitEthernet>
        <GigabitEthernet>
            <name>2</name>
            <description>Test</description>
            <ip>
                <address>
                    <primary>
                        <address>10.10.30.2</address>
                        <mask>255.255.255.0</mask>
                    </primary>
                </address>
            </ip>
        </GigabitEthernet>
    </interface>
    <ntp>
        <server
            xmlns=\"http://cisco.com/ns/yang/Cisco-IOS-XE-ntp\">
            <server-list>
                <ip-address>2.3.4.5</ip-address>
            </server-list>
            <server-list>
                <ip-address>6.6.6.6</ip-address>
            </server-list>
        </server>
    </ntp>
</native>

我使用带有以下模型的 django REST 框架:

class Interface(models.Model):
    SPEED = (('10Base','10'),('100Base','100'),('1GBase','1000'),('2.5GBase','2500'),('5GBase','5000'),('10GBase','10000'),('40GBase','40000'),('100GBase','100000'))

    name = models.CharField(max_length=50,blank=False,null=False)
    description = models.CharField(max_length=200,blank=True,null=True)
    speed = models.CharField(max_length=50,choices=SPEED,null=False)
    if_type = models.CharField(max_length=50,null=True)
    enabled = models.BooleanField(blank=True,null=True)

class Device(models.Model):
    hostname = models.CharField(max_length=50,null=True)
    boot_variable = models.CharField(max_length=50,null=True)
    interfaces = models.ManyToManyField(to=Interface,related_name='interfaces')

为了将配置保存到数据库中,我使用 ElementTree:

from xml.etree import ElementTree as ET

def parse_xml_to_dict(self,xml_data: str) -> dict:
    dom = ET.fromstring(xml_data)
    device_data = {}
    device_data['hostname'] = dom.findall('.//native/hostname')

    return device_data

要更新数据库中的设备,我会这样做:

Device.objects.filter(pk=pk).update(**device_data)

这可行,但这种方法的问题是我必须手动完成所有解析。通常,XML 数据超过 1500 行,所有供应商都使用自己的格式。解析所有设备将是一项巨大的工作。

我正在寻找更简单的解决方案。我想到了这样的翻译表:

translation_table = {'Cisco-IOS-XE-native':
                         {'hostname': 'native/hostname'}}

'Cisco-IOS-XE-native' 是设备支持的 yang 模型的名称。所以我可以从设备中获取所有功能并检查它是否有阳模型的转换表。如果是,我将使用内部字典(本机/主机名)中的值进行 xpath 搜索在这里我有一个可行的解决方案,但问题是,我该如何做相反的事情。当我更改数据库中的某些内容以更新设备时。我可能需要另一个翻译表,这也是一项巨大的努力。

一个想法是将 XML 放入翻译表中,如下所示:

translation_table = {'Cisco-IOS-XE-native':
                         {'hostname': '<native><hostname></hostname></native>'}}

在这里我被卡住了。是否可以搜索 <native><hostname></hostname></native> 在 XML 数据中并获取它的值?通过这种方法,我可以在数据库和 XML 之间进行双向转换。 还是这完全是错误方法

如果有人能指出我正确的方向,我会很高兴。

谢谢 雷莫

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...