H3C设备通过snmp获取聚合接口下物理端口的ifindex


```python
from easysnmp import snmp_walk
from snmp_cmds import snmpwalk
    def lacp(device_ip,community):
        LinkPortList=snmpwalk(oid='1.3.6.1.4.1.25506.8.25.1.1.1.4', ipaddress=device_ip, community=community)
        #获取lldp物理接口编号,其获取的是一个十六进制的值,需要将其转换为ifindex

        lacp_dict={}
        #此字典是key是聚合接口编号,value是聚合口下物理接口的ifindex的列表
        for linkPort in LinkPortList:
        #获取AGG接口的ID,即聚合口的名字,linkPort是一个元组,元组第一个值进行切割,可以得到聚合接口值
        #元组的第二个值可以得到物理接口的ifindex
            agg_port_id=int(linkPort[0].split('.')[-1])
            #AGG接口1 and end with 16384.是二层聚合口
            #16385之后是三层聚合接口
            if agg_port_id <16384:
                #将二层接口号进行拼接
                ifdesc='Bridge-Aggregation'+str(agg_port_id)
            else:
                #将三层接口号进行拼接
                ifdesc = 'Route-Aggregation' + str(agg_port_id-16384)

            port_hex_string=linkPort[1].strip('"').strip().split(' ')
            #元组的第二个值是包含物理接口的十六进制,首先将其切割得到所有的十六进制字符串
            if port_hex_string[0]=='00' and len(port_hex_string)==1:
            #如果得到的值长度是1,而且这个值是00的话,则代表创建了聚合口,但是聚合口下没有物理接口
                lacp_dict[ifdesc]="null"
            else:
            #其他情况下,由于的出来的值有的会包含\n,我们需要先将包含\n的字符串转换为没有\n的字符串
                #print(port_hex_string)
                for index,hex_string in enumerate(port_hex_string):
                    #对整个十六进制字符串进行遍历
                    if len(hex_string)==2:
                        #字符串长度为2,则表示不包含\n
                        pass
                    else:
                        #如果不为2(一般床都是4),则我们将字符串去掉\n后重新进行写入
                        port_hex_string[index]=hex_string.strip().split('\n')[0]
                    #print(port_hex_string)

                #lacp_dict[ifdesc] = port_hex_string
                #print(port_hex_string)
                i=0
                phy_port_list=[]
                #定义好物理接口的列表,后续写入相应的物理端口的ifindex
                for string in port_hex_string:
                    #我们要寻找的是不为00的十六进制字符串,通过此字符串,我们可以通过计算得到接口的ifindex
                    if string =='00':
                        #为00,不进行操作,并将i+1
                        i+=1
                        pass
                    else:
                        #非00情况下,就是我们需要进行计算的值
                        hex_ifindex=string
                        bin_string=bin(int(hex_ifindex,16))[2:]
                        #先将十六进制字符串转换为二进制字符串
                        # if len(bin_string)==4:
                        #     #如果二进制字符串长度为4,则代表其高4位是0
                        #     zero_lenth=i*8+4
                        #     #此时第一个非0字符串前一共有zero_lenth个0
                        #     for every_bin_string_index,every_bin_string in enumerate(bin_string):
                        #         #我们需要判断二进制字符串中总共有几个非0字符串,几个非0字符串则代表有几个物理接口
                        #         if every_bin_string =='1':
                        #             ifindex=zero_lenth+every_bin_string_index+1
                        #             #物理接口的ifindex的计算方法,就是看此非0肌肤穿前总共有几个0,然互再+1,即此非0字符串是处于第几位上,其ifinde就是几
                        #             phy_port_list.append(ifindex)
                        #             #将接口的ifindex值加入到物理接口列表
                        # else:
                            #这个是字符串长度为
                        zero_lenth=i*8+8-len(bin_string)
                        #此时第一个非0字符串前一共有zero_lenth个0
                        for every_bin_string_index, every_bin_string in enumerate(bin_string):
                        # 我们需要判断二进制字符串中总共有几个非0字符串,几个非0字符串则代表有几个物理接口
                            if every_bin_string == '1':
                                ifindex = zero_lenth + every_bin_string_index + 1
                                # 物理接口的ifindex的计算方法,就是看此非0字符串前总共有几个0,然互再+1,即此非0字符串是处于第几位上,其ifindex就是几
                                phy_port_list.append(ifindex)
                                # 将接口的ifindex值加入到物理接口列表

                        i += 1

                lacp_dict[ifdesc]=phy_port_list
                #将聚合接口作为key,物理接口列表作为value加入聚合组的字典
        #print(lacp_dict)
        return lacp_dict
        #返回值为上述字典

结果输出:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值