114 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
#!/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 == "<I>":
 | 
						||
        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)
 |