Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
procesado-cdr-fijos
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jesús
procesado-cdr-fijos
Commits
a28997e9
Commit
a28997e9
authored
Mar 28, 2025
by
Javier
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Descarga de ficheros y almacenamiento de registro del fichero descargado en tb_cdr_ficheeros
parent
467de571
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
265 additions
and
10 deletions
+265
-10
conector_db_wifi.py
app/conector_db_wifi.py
+4
-4
manager_cdr_fijos.py
app/manager_cdr_fijos.py
+0
-2
manager_cdr_fijos_fibra.py
app/manager_cdr_fijos_fibra.py
+249
-0
main.py
main.py
+12
-4
No files found.
app/conector_db_wifi.py
View file @
a28997e9
...
@@ -8,10 +8,10 @@ load_dotenv()
...
@@ -8,10 +8,10 @@ load_dotenv()
class
ConectorDbWifi
():
class
ConectorDbWifi
():
def
__init__
(
self
):
def
__init__
(
self
):
sql_server_hostname
=
os
.
getenv
(
"SQLSERVER_SERVER"
)
sql_server_hostname
=
os
.
getenv
(
"SQLSERVER_SERVER
_TEST
"
)
sql_server_database
=
os
.
getenv
(
"SQLSERVER_DATABASE"
)
sql_server_database
=
os
.
getenv
(
"SQLSERVER_DATABASE
_TEST
"
)
sql_server_username
=
os
.
getenv
(
"SQLSERVER_USERNAME"
)
sql_server_username
=
os
.
getenv
(
"SQLSERVER_USERNAME
_TEST
"
)
sql_server_password
=
os
.
getenv
(
"SQLSERVER_PASSWORD"
)
sql_server_password
=
os
.
getenv
(
"SQLSERVER_PASSWORD
_TEST
"
)
self
.
cursor
=
None
self
.
cursor
=
None
self
.
connection
=
None
self
.
connection
=
None
...
...
app/manager_cdr_fijos.py
View file @
a28997e9
...
@@ -346,8 +346,6 @@ def cdr_list(filenames:list) -> list:
...
@@ -346,8 +346,6 @@ def cdr_list(filenames:list) -> list:
Returns:
Returns:
list: Lista con rutas de los archivos coincidentes
list: Lista con rutas de los archivos coincidentes
"""
"""
print
(
filenames
)
print
(
DOWNLOAD_PATH
)
list_files
=
[]
list_files
=
[]
for
currentpath
,
folders
,
files
in
os
.
walk
(
DOWNLOAD_PATH
):
for
currentpath
,
folders
,
files
in
os
.
walk
(
DOWNLOAD_PATH
):
for
file
in
files
:
for
file
in
files
:
...
...
app/manager_cdr_fijos_fibra.py
0 → 100644
View file @
a28997e9
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
main.py
View file @
a28997e9
from
app.manager_cdr_fijos
import
ManagerCdrFijos
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__'
:
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()
x = ManagerCdrFijos()
# Obtengo nombre de los ficheros de fijos a descargar
# Obtengo nombre de los ficheros de fijos a descargar
x.get_cdr_filename_download_fijos()
x.get_cdr_filename_download_fijos()
...
@@ -11,5 +13,11 @@ if __name__ == '__main__':
...
@@ -11,5 +13,11 @@ if __name__ == '__main__':
# Inserto registro en la tb_cdr_ficheros
# Inserto registro en la tb_cdr_ficheros
x.update_insert_date_fijo()
x.update_insert_date_fijo()
# Procesa ficheros de fijos y los inserta o actualiza en tb_CDR_fijos
# PROCESA ficheros de fijos y los inserta o actualiza en tb_CDR_fijos
x
.
save_cdr_fijos_into_database
()
x.save_cdr_fijos_into_database() """
\ No newline at end of file
### -- 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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment