Python_hwfw-snmpv3获取路由表信息

13 篇文章 0 订阅

#!/usr/bin/python3
# -*- coding=utf-8 -*-
from pysnmp.entity import engine, config
from pysnmp.entity.rfc3413 import cmdgen
from pysnmp.carrier.asynsock.dgram import udp

dic_intercer_dic={}
ip='IP地址'
user='zbx-net'
hash_key='秘钥(usmHMACSHAAuthProtocol)'
cry_key='密钥(usmAesCfb128Protocol)'

snmpEngine = engine.SnmpEngine()
config.addSocketTransport(
    snmpEngine,
    udp.domainName,
    udp.UdpSocketTransport().openClientMode())

def cbFun1(sendRequesthandle, errorIndication, errorStatus, errorIndex,
          varBindTable, cbCtx):

    for varBindRow in varBindTable:
        for oid, val in varBindRow:
            if not oid.prettyPrint().startswith('1.3.6.1.2.1.31.1.1.1.18'): return False
            k1=oid.prettyPrint().replace('1.3.6.1.2.1.31.1.1.1.18.','')
            v1=val.prettyPrint().replace('Huawei, USG6670 Series,','').replace(' Interface','')
            dic_intercer_dic[k1]=v1
    return True

def snmpv3_getbulk(oid=''):
    config.addTargetAddr(
        snmpEngine, 'yourDevice',
        udp.domainName, (ip, 161),
        'my-creds' )
    hashval = config.usmHMACSHAAuthProtocol
    cryval = config.usmAesCfb128Protocol
    model = 'authPriv'
    config.addV3User(
        snmpEngine, user,
        hashval, hash_key,
        cryval, cry_key)
    config.addTargetParams(snmpEngine, 'my-creds', user, model)

    cmdgen.BulkCommandGenerator().sendReq(
        snmpEngine,
        'yourDevice',
        0, 25,   # non-repeaters, max-repetitions
        ( (oid, None),),
        cbFun1)
    snmpEngine.transportDispatcher.runDispatcher()
snmpv3_getbulk('1.3.6.1.2.1.31.1.1.1.18') ##拿到接口的索引值,存入字典dic_intercer_dic


def cbFun2(sendRequesthandle, errorIndication, errorStatus, errorIndex,
          varBindTable, cbCtx):

    for varBindRow in varBindTable:
        for oid, val in varBindRow:
            if not oid.prettyPrint().startswith('1.3.6.1.2.1.4.24.4.1.5'): return False
            data_ipinfo=oid.prettyPrint().replace('1.3.6.1.2.1.4.24.4.1.5.',' ')
            data_ipinfo=data_ipinfo.split('.')
            print('.'.join(data_ipinfo[0:4]),'.'.join(data_ipinfo[5:9]),'.'.join(data_ipinfo[9:]),dic_intercer_dic.get(val.prettyPrint()))
    return True # signal dispatcher to continue walking
def snmpv3_getbulk2(oid=''):

    config.addTargetAddr(
        snmpEngine, 'yourDevice',
        udp.domainName, (ip, 161),
        'my-creds')
    # usmHMACSHAAuthProtocol - SHA hashing
    # usmNoAuthProtocol - no authentication
    # usmDESPrivProtocol - DES encryption
    # usm3DESEDEPrivProtocol - triple-DES encryption
    # usmAesCfb128Protocol - AES encryption, 128-bit
    # usmAesCfb192Protocol - AES encryption, 192-bit
    # usmAesCfb256Protocol - AES encryption, 256-bit
    # usmNoPrivProtocol - no encryption
    hashval = config.usmHMACSHAAuthProtocol
    cryval = config.usmAesCfb128Protocol
    model = 'authPriv'
    config.addV3User(
        snmpEngine, user,
        hashval, hash_key,
        cryval, cry_key
    )
    config.addTargetParams(snmpEngine, 'my-creds', user, model)

    cmdgen.BulkCommandGenerator().sendReq(
        snmpEngine,
        'yourDevice',
        0, 25,   # non-repeaters, max-repetitions
        ( (oid, None),),
        cbFun2)
    snmpEngine.transportDispatcher.runDispatcher()

snmpv3_getbulk2('1.3.6.1.2.1.4.24.4.1.5') ##查看路由信息,结合端口显示出来

'''
目的地址  掩码 下一条 出接口
10.xx.114.0 255.255.0.0 10.xx.8.50  Eth-Trunk8.3207
10.xx.115.0 255.255.0.0 10.xx.8.50  Eth-Trunk8.3207
10.xx.116.0 255.255.0.0 10.xx.8.50  Eth-Trunk8.3207
'''

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据您提供的代码,我看到其中一个潜在的问题是在遍历邻居路由表时,如果本地路由表中没有目标网络,则将新路由信息添加到本地路由表中。但是在添加新路由信息时,仅仅是在本地路由表中新创建了一个节点,并将该节点插入到了链表的头部,但并没有将新的路由信息返回。因此,如果该函数在执行过程中,没有发现需要更新的路由信息,则会返回原始的路由表信息,而不是添加了新的路由信息路由表。以下是修改后的代码: ``` struct Route* adj_update_routetable(struct Route *rtinfo, struct Route *adj_rtinfo) { struct Route *res = rtinfo; struct Route *p = rtinfo; // 定义指针p指向路由表头部 struct Route *q = adj_rtinfo; // 定义指针q指向邻居路由表头部 // 遍历邻居路由表,将邻居路由表信息添加到本地路由表中 while (q != NULL) { // 在本地路由表中查找目标网络 while (p != NULL && p->rt_net != q->rt_net) { p = p->rt_next; } if (p == NULL) { // 如果本地路由表中没有目标网络,则添加该路由信息 struct Route *new_rt = (struct Route *)malloc(sizeof(struct Route)); new_rt->rt_ifnum = q->rt_ifnum; new_rt->rt_net = q->rt_net; new_rt->rt_mask = q->rt_mask; new_rt->rt_nexthop = q->rt_nexthop; new_rt->rt_distance = q->rt_distance + 1; // 距离加1 new_rt->rt_next = res; res = new_rt; p = new_rt; // 将指针p重新指向新创建的节点 } else { // 如果本地路由表中已经有目标网络,则更新该路由信息 if (p->rt_distance > q->rt_distance + 1) { // 如果新路由距离更短,则更新该路由信息 p->rt_ifnum = q->rt_ifnum; p->rt_nexthop = q->rt_nexthop; p->rt_distance = q->rt_distance + 1; // 距离加1 } } q = q->rt_next; p = res; // 指针p重新指向路由表头部 } return res; } ``` 在修改后的代码中,如果本地路由表中没有目标网络,则在添加新路由信息后,将指针p重新指向新创建的节点,确保在更新完所有的邻居路由信息后,返回的路由表包含了新添加的路由信息

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值