最初想法
日常故障排查的过程中,需要定位某个IP对应的同事,所处位置信息。网络人员通过交换机端的ARP信息,查询对象的mac地址,再通过mac地址去查询对应信息。后期发现,此类 查询过程多为重复动作,因此想要寻求方法让系统去做查询的过程。
流程图
入库
显而易见的是,最重要的部分就是两张表。
座位号对应交换机接口的信息,由于很少变动并且相对固定,因此需要人工手动统计。而交换机mac地址与交换机接口对应表则由于其变化性、复杂性等等。需要利用脚本去执行并且更新:
如:
def Initmacinterfacetable():
id=1
switchs=[‘10.101.20.231′,’10.101.20.232′,’10.101.20.233′,’10.101.20.234′,’10.101.20.235′,’10.101.20.236’]
for switch in switchs:
for errorIndication, errorStatus, \
errorIndex, varBinds in bulkCmd(
SnmpEngine(),
CommunityData(‘xindalou-idc’),
UdpTransportTarget((switch, 161)),
ContextData(),
0, 20, # GETBULK specific: request up to 50 OIDs in a single response
ObjectType(ObjectIdentity(‘.1.3.6.1.2.1.17.4.3.1.2’)),
lookupMib=False, lexicographicMode=False,ignoreNonIncreasingOid = True):
if errorIndication:
print(errorIndication)
break
elif errorStatus:
print('%s at %s' % (errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex)-1][0] or '?'))
break
else:
try:
conn = dbinfo()
conncur = conn.cursor()
for varBind in varBinds:
oidmac=[x.prettyPrint() for x in varBind]
macaddress=oidmac[0][23:]
num=int(oidmac[1])
if num > 52:
break
else:
interface=switch+'-'+'G0/0/'+oidmac[1]
sql_mac= "insert into macinterface(id,SWinterface,mac) value('%s','%s','%s')" % (id,interface,macaddress)
conncur.execute(sql_mac)
id=id+1
conn.commit()
conn.close()
except Exception as e:
print(e)
查库
此部分理论方便相对简单,因此直接给出部分代码:
def macinfo(IP):
conn = dbinfo()
conncur = conn.cursor()
connsql = “select macaddress from tcddhcp WHERE ipaddress = ‘%s'” % IP
conncur.execute(connsql)
macaddress = conncur.fetchall()
conn.commit()
conn.close()
info = macaddress[0]
mac= info[‘macaddress’]
mac_list = mac.split(‘-‘)
mac_int_list = [int(i, 16) for i in mac_list]
mac_str_list = [str(i) for i in mac_int_list]
mac_int = ‘.’.join(mac_str_list)
if mac_int:
return mac_int
else:
return 2
def getSWinterface(mac):
conn=dbinfo()
conncur = conn.cursor()
sql_interface=”select SWinterface from macinterface WHERE mac = ‘%s'” % mac
conncur.execute(sql_interface)
swinterfacedic = conncur.fetchall()
swinterface=swinterfacedic[0][‘SWinterface’]
conn.commit()
conn.close()
if swinterface:
return swinterface
else:
return 2