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