Многопоточный опрос уровней абонентов станций GPON OLT
На выходе скрипт обновляет таблицу в MySQL, уровнем сигнала:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
#!/usr/local/bin/python # coding=utf-8 import mysql.connector from mysql.connector import Error import config import func import socket import re from tendo import singleton from pysnmp.hlapi import * import threading import time vr="1.0" info="Сей дивный скрипт лезет snmp запросом на свичи olt/pon и опрашивает уровни" copyleft="(с) 2018 by Pavel Gribov, http://грибовы.рф"; #выводим имя ПК и версию скрипта hostname = socket.gethostname() print "Server: ",hostname print "Version: ",vr print "info: ",info print "Copyright: ",copyleft workcount=50; #количество потоков для опроса def GetArrayLevels(ip,comm,oid): res=None errorIndication, errorStatus, errorIndex, varBinds = next( getCmd(SnmpEngine(), CommunityData(comm), UdpTransportTarget( (ip, 161), timeout=2.0, retries=0 ), ContextData(), ObjectType(ObjectIdentity(oid))) ) if errorIndication: print("Ошибка:",ip,comm,oid,errorIndication) return res elif errorStatus: print('%s at %s' % (errorStatus.prettyPrint(), errorIndex and varBinds[int(errorIndex) - 1][0] or '?')) return res else: for varBind in varBinds: if varBind[1]<0: res=varBind[1] return res def worker(ip,community,ind,idr): rz=GetArrayLevels(ip,community,".1.3.6.1.4.1.3320.101.10.5.1.5."+str(ind)) try: conn2 = mysql.connector.connect(host=config.noc_host,database=config.noc_base,user=config.noc_user,password=config.noc_pass) #if conn2.is_connected(): func.putlog('--cоединение с БД '+config.noc_base+' установлено') except Error as e: print("Ошибка: ",e); exit(0); finally: if rz!=None: print ("Level:",rz); sql="update oltlevels set level=%s,lastmod=now() where id=%s"; print ("update oltlevels set level="+str(rz)+" where id="+str(idr)) ccr = conn2.cursor(dictionary=True,buffered=True) ccr.execute(sql,[str(rz),idr]); conn2.commit(); conn2=None func.putlog("-скрипт стартовал"); func.putlog("--проверяю, а не запущены ли мы уже?"); try: me = singleton.SingleInstance() except: func.putlog("--мы уже запущены!"); exit(1) func.putlog("--Ок. Одна копия, работаем дальше"); func.putlog("--соединяемся с noc"); try: conn = mysql.connector.connect(host=config.noc_host,database=config.noc_base,user=config.noc_user,password=config.noc_pass) if conn.is_connected(): func.putlog('--cоединение с БД '+config.noc_base+' установлено') except Error as e: print("Ошибка: ",e); exit(0); finally: func.putlog("---делаем выборку устройств для опроса"); sql="select * from oltlevels order by rand()"; cursor = conn.cursor(dictionary=True,buffered=True) cursor.execute(sql); row = cursor.fetchone() while row is not None: ip=row["ip"] community=row["community"] idr=row["id"] ind=row["ind"] func.putlog("----опрашиваем "+str(ip)+" ind="+str(ind)+",id="+str(idr)); thread = threading.Thread(target=worker, args=(ip,community,ind,idr,)).start() while threading.active_count() >workcount: time.sleep(1) row = cursor.fetchone() while threading.active_count() >workcount: time.sleep(1) func.putlog("---закончили"); |