```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
#返回值为上述字典
结果输出: