Архив метки: mysql

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

Работа с MySQL из 1С в среде Windows

Для работы необходимо предварительно установить среду Visual studio 2015 redistributable и ODBC драйвер Mysql

Далее работаем из 1С с драйвером на прямую:

1) Установка соединения:

ИмяODBC = "noc.уцкаука.ru";
ИмяБазы = "ыаукаыук";
ИмяПользователя = "укаыука";
Пароль = "ыукаыука";

Connection = Новый COMОбъект("ADODB.Connection");
СтрокаПодключения = "DRIVER={MySQL ODBC 8.0 Unicode Driver};DATABASE=" + ИмяБазы + ";PWD=" + Пароль + ";PORT=3306;SERVER=" + ИмяODBC + ";UID=" + ИмяПользователя + ";";
Connection.Open(СокрЛП(СтрокаПодключения));

Выборка:

Запрос="select * from users";
Table = Connection.Execute(Запрос); 
Пока Table.EOF() = 0 Цикл 
	Сообщить(Table.Fields("login").Value); 
	Table.MoveNext();
КонецЦикла;
Table.Close();

Выполнение запроса:

		Запрос="insert into checks_1c (id,docnum,dt,goods,cost,seller,inn,kassa,type_pay,type_sell,result,cnt,summ) values (null,'"+Документ.Номер+"',now(),'"+ном+"',"+цена+",'"+продавец+"','"+инн+"',"+касса+","+ТипОплаты+","+ВидЧека+",9,"+количество+","+сумма+")";
		//Сообщить(Запрос);
		РезультатЗапроса = Connection.Execute(Запрос);

Шейпер трафика на cpp под FreeBSD

Вот нашел в своих старых файлах.  Пытался когда-то переписать шейпер с PHP на cpp, думал что выигрыш в скорости работы получу. Не получил ничего кроме усложнения 😉 Потому осталось в «столе» и в продакшен не пошло. Узкоспециализированная разработка, использовать которую вот так просто не получится. Выложил для «истории», чтоб не потерялась если что.. Читать далее Шейпер трафика на cpp под FreeBSD

Вложеный запрос в процедуре MySQL, курсоры и прочие прелести

Оставляю код процедуры для «истории».

CREATE  PROCEDURE `GetInfo`(IN `mac_sw` VARCHAR(20), IN `port_sw` VARCHAR(20)) NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER BEGIN
DECLARE value2 varchar(200); 
DECLARE type2 int(11); 
DECLARE code2 int(11); 
DECLARE cnt INT(10);
DECLARE DONE integer default 0;
DECLARE ip_cur CURSOR FOR SELECT code, type, value FROM dhcp_subnets where segment_id in (SELECT segment_id FROM dhcp_clients_by_relay WHERE upper(relay_id) = upper(mac_sw) AND upper(relay_port) = upper(port_sw)) UNION SELECT code, type, value FROM dhcp_clients_by_relay WHERE upper(relay_id) = upper(mac_sw) AND upper(relay_port) = upper(port_sw) ORDER BY CODE;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
   OPEN ip_cur;  
   SET cnt=0;
   REPEAT
     FETCH ip_cur INTO code2,type2,value2;
     IF NOT DONE THEN
       SELECT code2 as code,type2 as type,value2 as value;
    END IF;
    SET cnt=cnt+1;
   UNTIL DONE END REPEAT;
   CLOSE ip_cur;
  IF cnt=1 THEN 
   SELECT 1 as code,5 as type,"255.255.224.0" as value;
   SELECT 3 as code,5 as type,"172.30.128.1" as value;
   SELECT 6 as code,5 as type,"11.163.82.1,8.8.8.8" as value;
   SELECT 15 as code,4 as type,"цывацу.ru" as value;
   SELECT 51 as code,2 as type,"86400" as value;
   SELECT 1009 as code,5 as type,CONCAT("172.30.",ROUND((RAND() * (254 - 0)) + 0),".",ROUND((RAND() * (254 - 0)) + 0)) as value;
  END IF;
END

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

Сия надпись говорит о том, что вы скорее пытаетсеь создать пользователя MySQL со слишком простым паролем.

Решение (плохое):

mysql> SET GLOBAL validate_password_policy=LOW;
Query OK, 0 rows affected (0.00 sec)

Хорошее решение конечно придумать пароль сложнее