#!/usr/bin/python3.5 ######################################################### # Скрипт разбора лога АТС Panasonic TDA200 # вызов: # для обработки файла созданного, к примеру, программой SMDRLog # > python data_reader.py -file TDA20013082015_12052016.lg # для чтения данных напрямую с com-порта АТС # > python data_reader.py -port /dev/ttyUSB0 ######################################################### import pymysql import sys import re # параметры соединения с СУБД db_host = 'kis' db_user = 'ats' db_pass = 'T,fkfqneyU' def insert(**kwargs): """Вставка данных в БД. В качестве параметров список полей и значений""" qwery = 'INSERT INTO `cdr` (' for key in kwargs.keys(): qwery = qwery + '`' + key +'`, ' qwery = qwery.rstrip(', ') + ') VALUES(' for key in kwargs.keys(): qwery = qwery + '"' + kwargs.get(key) +'", ' qwery = qwery.rstrip(', ') + ');' print(qwery) conn = pymysql.connect(host=db_host, database='ats', user=db_user, password=db_pass, charset='utf8') cur = conn.cursor() cur.execute(qwery) conn.commit() cur.close() conn.close() def parce_string(line): """Получает на вход строку и раскидывает её в нужном виде и пишет в файл""" if line[:3] == "---" or line == "" or line[3:7] == "Date": print(line) return print(line) # Разбор строки # Преобразуем дату к виду "ДД/ММ/ГГГГ" call_date = line[:2] + "." + line[3:5] + ".20" + line[6:8] call_date = "20" + line[6:8] + "/" + line[3:5] + "/" + line[:2] call_time = line[9:14].strip() int_number = line[19:22].strip() ext_co_line = line[23:25].strip() dial_number = line[26:51].strip() ring = line[52:56].strip() call_duration = re.sub("'", ":", line[57:65].strip()) acc_code = line[66:77].strip() call_code = line[77:81].strip() # Проверяем признак входящщего звонка if dial_number == "": call_direct = "Входящий" dial_number = "" elif dial_number[:3] == "EXT": call_direct = "Внутренний" dial_number = dial_number[3:] else: call_direct = "Исходящий" insert(call_date=call_date, call_time=call_time, int_number=int_number, ext_co_line=ext_co_line, dial_number=dial_number, ring=ring, call_duration=call_duration, acc_code=acc_code, call_code=call_code, call_direct=call_direct) def port_data_read(port_name): """Чтение данных из последовательного порта, тестовая реализация""" import serial ser = serial.Serial(port_name) #ser = serial.Serial("com1") ser.baudrate = 9600 print(ser) while True: line = ser.readline() line = line.decode() line = line.rstrip() parce_string(line) if __name__ == "__main__": # В зависисмости от ключей вызова скрипта выполняем ту или иную процедуру # соответсвенно -port - чтение из порта, -file - чтение из файла if len(sys.argv) > 2: if sys.argv[1] == '-port': #action = 'read_port' port_name = sys.argv[2] port_data_read(port_name) if sys.argv[1] == '-file': #action = 'read_file' log_file_name = sys.argv[2] log = open(log_file_name) for line in log: parce_string(line) log.close() else: print ("\nФормат вызова:\n- для обработки файла\ \n # python data_reader.py -file TDA20013082015_12052016.lg\ \n- для чтения данных напрямую с com-порта АТС\ \n # python data_reader.py -port /dev/ttyUSB0\n") sys.exit(1)