Архив рубрики: Python

Многопоточный опрос уровней абонентов станций 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("---закончили");

AttributeError: ‘module’ object has no attribute ‘SingleInstance’

Всегда ранее проверял запуск «один ли экземпляр скрипта запущен» на python вот так:

    import tendo
    try:
     me = tendo.SingleInstance() 
    except:
	exit(1)
    func.putlog("--Ок. Одна копия, работаем дальше");

Однако после обновления ОС, стало выдавать ошибку вида:

Traceback (most recent call last):
  File "./olt_levels_get.py", line 27, in <module>
    me = tnd.SingleInstance() 
AttributeError: 'module' object has no attribute 'SingleInstance'

Исправляется так:

from tendo import singleton

try:
 me = singleton.SingleInstance() 
except:
    func.putlog("--мы уже запущены!");    
    exit(1)
func.putlog("--Ок. Одна копия, работаем дальше");

Python 3 получение тела письма в base64

Никогда не было и вдруг опять (с). Тензор изменил формат высылаемых на почту электронных чеков. Ранее было вложение PDF в письме, а тут они решили чек «рисовать» средствами HTML прямо в письме. Ну нам без разницы, будем извлекать его..

     raw_email = data[0][1]    
     try:
      email_message = email.message_from_string(raw_email)	
     except TypeError:
      email_message = email.message_from_bytes(raw_email)     
     if email_message.is_multipart():
         for payload in email_message.get_payload():
           body=payload.get_payload();
     else:
      body=email_message.get_payload()      
     dirty=body[0].get_payload().encode('ascii')
     dirty=base64.decodestring(dirty)
     print (dirty.decode('utf8'));

Проблема с кодировкой локали скриптов Python выполняемых из crontab

Столкнулся с проблемой, что скрипт выполняемый из консоли работает корректно, а выполняемый из crontab — пишет ошибку

UnicodeEncodeError: ‘ascii’ codec can’t encode

Дело в том, что задания выполняемые из crontab имеет кодировку по умолчанию ascii. Потому нужно в /etc/crontab добавить строчку:

LANG=ru_RU.UTF-8