Многопоточный опрос уровней абонентов станций GPON OLT

На выходе скрипт обновляет таблицу в MySQL, уровнем сигнала:

#!/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("---закончили");

Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.