H3C设备通过snmp获取聚合接口下物理端口的ifindex
```python
from easysnmp import snmp_walk
from snmp_cmds import snmpwalkdef 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物理接口编号,其获取的是一个十六进制的值,需要将其转换为ifindexlacp_dict={}#此字典是key是聚合接口编号,value是聚合口下物理接口的ifindex的列表for linkPort in LinkPortList:#获取AGG接口的ID,即聚合口的名字,linkPort是一个元组,元组第一个值进行切割,可以得到聚合接口值#元组的第二个值可以得到物理接口的ifindexagg_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,则表示不包含\npasselse:#如果不为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=0phy_port_list=[]#定义好物理接口的列表,后续写入相应的物理端口的ifindexfor string in port_hex_string:#我们要寻找的是不为00的十六进制字符串,通过此字符串,我们可以通过计算得到接口的ifindexif string =='00':#为00,不进行操作,并将i+1i+=1passelse:#非00情况下,就是我们需要进行计算的值hex_ifindex=stringbin_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个0for 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 += 1lacp_dict[ifdesc]=phy_port_list#将聚合接口作为key,物理接口列表作为value加入聚合组的字典#print(lacp_dict)return lacp_dict#返回值为上述字典
结果输出:

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
