Commit a28997e9 by Javier

Descarga de ficheros y almacenamiento de registro del fichero descargado en tb_cdr_ficheeros

parent 467de571
......@@ -8,10 +8,10 @@ load_dotenv()
class ConectorDbWifi():
def __init__(self):
sql_server_hostname = os.getenv("SQLSERVER_SERVER")
sql_server_database = os.getenv("SQLSERVER_DATABASE")
sql_server_username = os.getenv("SQLSERVER_USERNAME")
sql_server_password = os.getenv("SQLSERVER_PASSWORD")
sql_server_hostname = os.getenv("SQLSERVER_SERVER_TEST")
sql_server_database = os.getenv("SQLSERVER_DATABASE_TEST")
sql_server_username = os.getenv("SQLSERVER_USERNAME_TEST")
sql_server_password = os.getenv("SQLSERVER_PASSWORD_TEST")
self.cursor = None
self.connection = None
......
......@@ -346,8 +346,6 @@ def cdr_list(filenames:list) -> list:
Returns:
list: Lista con rutas de los archivos coincidentes
"""
print(filenames)
print(DOWNLOAD_PATH)
list_files= []
for currentpath, folders, files in os.walk(DOWNLOAD_PATH):
for file in files:
......
from app.conector_sftp import SFTPConexion
import os, time, csv, zipfile, shutil, patoolib
from datetime import datetime
from paramiko.ssh_exception import SSHException
from log import logging
from dotenv import load_dotenv
from app.conector_db_wifi import ConectorDbWifi
import rarfile
APP_BASE_PATH: str = os.path.abspath(os.path.join(__file__, "../.."))
DOWNLOAD_PATH_CDR_FIJOS_FIBRA = os.path.join(APP_BASE_PATH,'cdr_fijo_fibra')
load_dotenv()
class ManagerCdrFijosFibra:
def __init__(self):
hostname_fibra = os.getenv('CDR_FIBRA_HOSTNAME')
username_fibra = os.getenv('CDR_FIBRA_USERNAME')
pwd_fibra = os.getenv('CDR_FIBRA_PASSWORD')
port_fibra = int(os.getenv('CDR_SFTP_PORT'))
try:
self.cnx_sftp_fibra = SFTPConexion.connection(
hostname_fibra, username_fibra, pwd_fibra, port_fibra
)
except SSHException as e:
message = "No se ha podido establecer la conexión con el servidor de los CDR fijos (Fibra).. Error: {e}".format(e=e)
logging.info(message)
self.filename_datetime_fijo = {} # Nombre ficher: fecha cración fichero SFTP
self.filename_fijo_download_sftp = [] # Nombres de ficheros a descargar
self.new_names_files = []
self.filename_fijo_download_sftp_path = [] # Path remoto de ficheros a descargar
self.nombre_carpetas_contenedore_txts = {}
def get_cdr_filename_download_fijos_fibra(self):
"""
Obtengo los nombre de los ficheros, el path(ruta absoluta) y fecha_origen los almaceno para posteriormente descargarlos del sftp y
almacenar en la tabla TB_CDR_Ficheros
"""
try:
with ConectorDbWifi() as cursor:
#Consultamos en la tabla la fecha del último fichero subido
cursor.execute("SELECT TOP 1 created_at FROM bdd_wifi.dbo.TB_CDR_Ficheros WHERE tipo = 3 ORDER BY created_at DESC")
row = cursor.fetchone()
last_cdr_fijos_fibra_table_ficheros = row[0]
# REcorro el directorio principal del sftp donde se almacena los da
item_list = self.cnx_sftp_fibra.listdir_attr('/')
for item in item_list:
fecha = time.localtime(item.st_mtime) # Fecha creación fichero en el SFTP
file_date_time = datetime(fecha[0], fecha[1], fecha[2], fecha[3], fecha[4], fecha[5])
# Obtengo el nombre de los ficheros de fijos que la fecha sea posterior al último cdr ingresado en la tabla, y lo guardo en una lista,
# también guardo la ruta absoluta
# y un diccionario con la fecha de creación del fichero en el sftp asociada al nombre del fichero
if last_cdr_fijos_fibra_table_ficheros < file_date_time and 'mvno' not in item.filename and '0000' in item.filename:
item_filename = item.filename
self.filename_datetime_fijo[item_filename]=str(file_date_time)
self.filename_fijo_download_sftp_path.append('/' + item_filename)
message = f'Obtenidos nombre ficheros para su posterior descarga: {self.filename_fijo_download_sftp_path}'
logging.info(message)
except Exception as e:
logging.warning(f'Error al almacenar el nombre de los ficheros para su posterior descarga: {e}')
def extract_dwh_trafico_from_rar(self):
"""
Para cada archivo .rar en `self.filename_fijo_download_sftp_path`, busca un archivo que contenga
'DWH_Trafico' en su nombre y lo descarga para procesarlo.
"""
try:
# Verificamos si el directorio de descarga existe, y si no, lo creamos
if not os.path.exists(DOWNLOAD_PATH_CDR_FIJOS_FIBRA):
os.makedirs(DOWNLOAD_PATH_CDR_FIJOS_FIBRA)
for rar_remote_path_filename in self.filename_fijo_download_sftp_path:
# Descargar el archivo .rar en memoria desde el servidor SFTP
with self.cnx_sftp_fibra.open(rar_remote_path_filename, "rb") as remote_file:
rar_data = remote_file.read()
# Guardar el archivo RAR descargado en disco para verificar su integridad
local_rar_path = '/home/rentel/procesado-cdr-fijos/cdr_fijo_fibra/temp_rar_file.rar' # Ruta temporal
with open(local_rar_path, 'wb') as f:
f.write(rar_data)
logging.info(f"Archivo RAR guardado temporalmente en: {local_rar_path}")
# Usamos la librería rarfile para descomprimir el archivo
try:
with rarfile.RarFile(local_rar_path) as rar:
file_list = rar.namelist()
logging.info(f"Archivos dentro del RAR: {file_list}")
# Buscar un archivo que contenga 'DWH_Trafico' en su nombre
for file_name in file_list:
if 'dwh_trafico' in file_name.lower():
# Obtener solo el nombre del archivo, sin la ruta del directorio
nombre_carpeta = file_name.split('/')[0]
base_file_name, extension = os.path.splitext(os.path.basename(file_name))
new_name_file = f'{base_file_name}_{nombre_carpeta}{extension}'
self.new_names_files.append(new_name_file)
self.nombre_carpetas_contenedore_txts[new_name_file] = rar_remote_path_filename.lstrip('/')
# Construir la ruta de salida, usando solo el nombre del archivo
output_path = os.path.join(DOWNLOAD_PATH_CDR_FIJOS_FIBRA, new_name_file)
# Verifica si el archivo ya existe
if os.path.exists(output_path):
logging.warning(f"El archivo {output_path} ya existe. Se sobrescribirá.")
# Extraer el archivo y guardarlo en disco
with rar.open(file_name) as rar_file:
with open(output_path, 'wb') as output_file:
data = rar_file.read() # Leer el archivo
output_file.write(data) # Escribir el archivo en el disco
logging.info(f"Archivo extraído y guardado: {output_path}")
break # Solo extrae el primer archivo encontrado
else:
# Si no se encuentra un archivo con 'DWH_Trafico' en el nombre
logging.warning(f"No se encontró 'DWH_Trafico' en los archivos del .rar: {rar_remote_path_filename}")
# Eliminamos el .rar descargado
if os.path.exists(local_rar_path):
os.remove(local_rar_path)
except rarfile.BadRarFile as e:
logging.error(f"Error al intentar abrir el archivo RAR: {e}")
continue
except Exception as e:
logging.error(f"Error procesando los archivos .rar: {e}")
def update_insert_date_fijo(self):
"""
Inserto o actualizo en la tabla TB_CDR_ficheros los ficheros de **fijos** , poniendo el campo procesado a null.
"""
# Recorro el nombre de los ficheros descargados y consulto en la tabla si ese fichero existe lo actualizo si no existe lo creo
for cdr_filename in self.new_names_files:
filepath = '/home/rentel/procesado-cdr-fijos/cdr_fijo_fibra/'+ cdr_filename
lineas_fichero_txt = calcular_line_file(filepath)
message = f'Fichero para insertar o actualizar en la tabla TB_CDR_Ficheros {cdr_filename}'
logging.info(message)
with ConectorDbWifi() as cursor:
cursor.execute(
"SELECT count(*) FROM TB_CDR_Ficheros WHERE filename = ?",
cdr_filename
)
fetch = cursor.fetchone()
# Si existe un registro con ese nombre lo actualizo si no lo creo
if fetch[0] != 0:
name_dir_contenedor = self.nombre_carpetas_contenedore_txts.get(cdr_filename)
fecha_creacion_fichero = self.filename_datetime_fijo.get(name_dir_contenedor)
fecha_creacion_fichero_formateada = datetime.strptime(fecha_creacion_fichero, '%Y-%m-%d %H:%M:%S')
cursor.execute("UPDATE TB_CDR_Ficheros SET tipo = ?, fecha_origen = ?,Num_Reg_Txt = ?, Degradado=?, Mensual=? WHERE filename = ?", 3, fecha_creacion_fichero_formateada,lineas_fichero_txt, degradado, mensual, str(cdr_filename))
cursor.commit()
message = f'Fichero {cdr_filename} actualizado en la tabla TB_CDR_Ficheros'
logging.info(message)
else:
name_dir_contenedor = self.nombre_carpetas_contenedore_txts.get(cdr_filename)
fecha_creacion_fichero = self.filename_datetime_fijo.get(name_dir_contenedor)
cursor.execute(
"INSERT INTO TB_CDR_Ficheros (filename, created_at, tipo, fecha_origen, Degradado, Num_Reg_Txt, Mensual) "
"VALUES ( ?, ?, ?, ?, ?, ?, ? )",
(
cdr_filename,
datetime.now(),
3,
fecha_creacion_fichero,
0,
lineas_fichero_txt,
0
),
)
cursor.commit()
message = f'Fichero {cdr_filename} insertado en la tabla TB_CDR_Ficheros'
logging.info(message)
""" def save_cdr_fijos_into_database(self):
""
Procesa los cdr fijos(tipo=3) que esten sin procesar(precessed_at = null) en la tabla TB_CDR_Ficheros
""
with ConectorDbWifi() as cursor:
try:
filenames = []
# Obtengo el nombre del fichero de fijo que necesito procesar
cursor.execute("SELECT filename FROM TB_CDR_Ficheros WHERE tipo = 3 AND processed_at is NULL ORDER BY fecha_origen")
fetch = cursor.fetchall()
if fetch == None:
message = 'No existe ficheros de fijos de fibra para procesar en la tabla TB_CDR_Ficheros'
logging.info(message)
else:
for file in fetch:
filenames.append(file[0])
if len(filenames) != 0:
# Obtengo una lista con las rutas de los ficheros a procesar
path_filenames = cdr_list(filenames)
#Crea el proceso de cdr de fijos introduciendolo en la tabla TB_Cdr_Fibra
cdr_insert_update_cdr_fijos(path_filenames, cursor)
except Exception as e:
logging.error(f"An error occurred: {e}") """
def cdr_list(filenames:list) -> list:
"""
Genera una lista con la ruta de los archivos que coincida con el nombre de los archivos pasados
Param:
filenames -> list: Lista de nombre de ficheros
Returns:
list: Lista con rutas de los archivos coincidentes
"""
list_files= []
for currentpath, folders, files in os.walk(DOWNLOAD_PATH_CDR_FIJOS_FIBRA):
for file in files:
if file in filenames:
list_files.append(os.path.join(currentpath, file))
return list_files
def calcular_line_file(filepath):
with open(filepath, "r") as myfile: # Usa 'r' en lugar de 'rb'
num_lines = myfile.readlines() # Leemos todas las líneas
return len(num_lines)
\ No newline at end of file
from app.manager_cdr_fijos import ManagerCdrFijos
from app.manager_cdr_fijos_fibra import ManagerCdrFijosFibra
### -- Accede al SFTP de xtratelecom y descarga el fichero que le toca y crea registro en tb_cdr_ficheros -- ###
if __name__ == '__main__':
""" NO SE USA YA QUE LAS LLAMADAS DE FIJOS DE ESE TRONCAL NO TIENEN COSTES
### -- Accede al SFTP de xtratelecom y descarga el fichero que le toca y crea registro en tb_cdr_ficheros -- ###
x = ManagerCdrFijos()
# Obtengo nombre de los ficheros de fijos a descargar
x.get_cdr_filename_download_fijos()
......@@ -11,5 +13,11 @@ if __name__ == '__main__':
# Inserto registro en la tb_cdr_ficheros
x.update_insert_date_fijo()
# Procesa ficheros de fijos y los inserta o actualiza en tb_CDR_fijos
x.save_cdr_fijos_into_database()
\ No newline at end of file
# PROCESA ficheros de fijos y los inserta o actualiza en tb_CDR_fijos
x.save_cdr_fijos_into_database() """
### -- Accede al SFTP de fibra y descarga el fichero que le toca y crea registro en tb_cdr_ficheros -- ###
manager = ManagerCdrFijosFibra()
manager.get_cdr_filename_download_fijos_fibra()
manager.extract_dwh_trafico_from_rar()
manager.update_insert_date_fijo()
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment