# -*- coding: utf-8 -*- from pysnmp.entity.rfc3413.oneliner import cmdgen import re from threading import Thread import time from engine_test import db_refresh SUM = [] # Список ip адресов ASN-ов asn_ip_list = """x.x.x.x""" oid = '.1.3.6.1.4.1.12394.1.20.3.20.19.1.2' # Функция осуществляющая запрос к ASN def snmp_request(oid, ip): # Создаем кортеж элементов oid (1,2,3,4,5) tuple(int(x) for x in list(oid[1:].split("."))) # SNMPwalk errorIndication, errorStatus, errorIndex, varBindTable = cmdgen.CommandGenerator().\ nextCmd(cmdgen.CommunityData('my-agent', 'community', 0), cmdgen.UdpTransportTarget((ip, 161)), oid) if errorIndication: pass # Если ответ есть то ищем в ответе МАК и ОИД else: for mel in list(varBindTable): # Поиска МАКа MAC = re.findall("([a-z0-9]+)'", str(mel)) # Поиск ОИДа OID = re.findall("[\d{1,4}\.*]{100,150}", str(mel)) # Создаем новый ОИД snmp_oid = OID[0].replace('20.19.1.2.31.123.97', "20.19.1.3.31.123.97") # SNMPGet errorIndication_get, errorStatus_get, errorIndex_get, varBindTable_get = cmdgen.CommandGenerator().\ getCmd(cmdgen.CommunityData('my-agent', 'community', 0), cmdgen.UdpTransportTarget((ip, 161)), tuple(int(x) for x in list(snmp_oid.split(".")))) if errorIndication_get: BSID = ["timeout"] else: # Поиск БСИД BSID = re.findall("([a-z0-9]+)'", str(varBindTable_get)) # Создаем новый ОИД snmp_oid = snmp_oid.replace('20.19.1.3.31.123.97', '20.21.1.5.31.123.97') snmp_oid = snmp_oid + ".1" # SNMPGet errorIndication_get, errorStatus_get, errorIndex_get, varBindTable_get = cmdgen.CommandGenerator().\ getCmd(cmdgen.CommunityData('my-agent', 'community', 0), cmdgen.UdpTransportTarget((ip, 161)), tuple(int(x) for x in list(snmp_oid.split(".")))) if errorIndication_get: IP = [errorIndication_get] else: # Поиск IP IP = re.findall("([a-z0-9]+)'", str(varBindTable_get)) SUM.append(MAC + OID + [ip] + BSID + IP) def asn_thread(): Treads = [] # Перебор Ip адресов ASN-ов и для каждого IP создаем поток worker for mil in list(asn_ip_list.split("\n")): worker = Thread(target=snmp_request, args=(oid, mil,)) worker.setDaemon(False) worker.start() Treads.append(worker) time.sleep(2) # Проверяем живы ли потоки for t in Treads: while t.isAlive(): time.sleep(1) db_refresh(SUM) asn_thread()
Помогло только:
for t in Treads: if (t.isAlive()): print t,t.isAlive() t._Thread_delete()
PS. Если видите то из-за чего может у нормального программиста кровь из глаз идти, прошу отписать мне
