Commit 3e28e748 by Javier

Actualizo funciones de subida de ficheros pcloud

parent a82a22d4
...@@ -17,3 +17,8 @@ PWD_SFTP_TRUENAS=_RW!2k14 ...@@ -17,3 +17,8 @@ PWD_SFTP_TRUENAS=_RW!2k14
HOST_SFTP_TRUENAS2='192.168.2.240' HOST_SFTP_TRUENAS2='192.168.2.240'
USER_SFTP_TRUENAS2=ftp_backup USER_SFTP_TRUENAS2=ftp_backup
PWD_SFTP_TRUENAS2=_RW!2k14 PWD_SFTP_TRUENAS2=_RW!2k14
SQLSERVER_SERVER=192.168.2.200
SQLSERVER_DATABASE=bdd_wifi
SQLSERVER_USERNAME=bdbackupservice
SQLSERVER_PASSWORD=bdbs2k21
\ No newline at end of file
import pyodbc
import os
from dotenv import load_dotenv
load_dotenv()
def connect_db_sql():
"""
Conexión a la base de datos db_wifi(SQL)
Return:
cnx_db_wifi : Conexión a la Base de datos
"""
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")
try:
cnx_db_wifi = pyodbc.connect(f"DRIVER=FreeTDS;server={sql_server_hostname};PORT=1433;DATABASE={sql_server_database};UID={sql_server_username};PWD={sql_server_password};TDS_Version=7.0", ansi=True)
if cnx_db_wifi is None or cnx_db_wifi == 'Null':
cnx_db_wifi = pyodbc.connect(f"DRIVER=FreeTDS;server={sql_server_hostname};PORT=1433;DATABASE={sql_server_database};UID={sql_server_username};PWD={sql_server_password};TDS_Version=7.0", ansi=True)
return cnx_db_wifi
except Exception as e:
print(f" Fallo al conectarse con la base de datos SQL. {e}")
...@@ -34,7 +34,7 @@ def eliminar_archivos_antiguos_ftp(ftp): ...@@ -34,7 +34,7 @@ def eliminar_archivos_antiguos_ftp(ftp):
# Obtiene la lista de archivos en el directorio # Obtiene la lista de archivos en el directorio
archivos = ftp.nlst() archivos = ftp.nlst()
# Fecha límite para la eliminación de archivos # Fecha límite para la eliminación de archivos
fecha_limite = datetime.now() - timedelta(days=7) fecha_limite = datetime.now() - timedelta(days=14)
for archivo in archivos: for archivo in archivos:
# Obtiene la información del archivo # Obtiene la información del archivo
......
from create_backup_db_soporte import create_backup_database_soporte, upload_sftp_file from create_backup_db_soporte import create_backup_database_soporte, upload_sftp_file
from upload_pcloud_backup import upload_solo_pcloud_sp, delete_file_date from upload_pcloud_backup import upload_solo_pcloud_new, delete_file_date_new
if __name__ == '__main__': if __name__ == '__main__':
#Crea copia de seguridad y lo almacena en la carpeta backups #Crea copia de seguridad y lo almacena en la carpeta backups
create_backup_database_soporte() create_backup_database_soporte()
correct = upload_sftp_file() correct = upload_sftp_file()
if correct: if correct:
#Sube a Pcloud la backups #Sube a Pcloud la backups
upload_backups_soporte_pcloud = upload_solo_pcloud_sp(True) upload_backups_soporte_pcloud = upload_solo_pcloud_new()
if upload_backups_soporte_pcloud: if upload_backups_soporte_pcloud:
#Borra fichero en Pcloud si su fecha de creación es anterior a 25 dias #Borra fichero en Pcloud si su fecha de creación es anterior a 25 dias
delete_file_date() delete_file_date_new()
\ No newline at end of file \ No newline at end of file
...@@ -4,61 +4,117 @@ from pcloud import PyCloud ...@@ -4,61 +4,117 @@ from pcloud import PyCloud
from os import remove from os import remove
from datetime import datetime, timedelta from datetime import datetime, timedelta
import pytz import pytz
import requests
from conector_db import connect_db_sql
from requests_toolbelt.multipart.encoder import MultipartEncoder
PCLOUD_API = "https://eapi.pcloud.com"
def get_pcloud_token():
"""Obtiene el token de pCloud desde la tabla Parametros."""
cnx = connect_db_sql()
cursor = cnx.cursor()
cursor.execute("SELECT ApiTokenPcloud FROM [bdd_wifi].[dbo].[TB_Parametros]")
row = cursor.fetchone()
cursor.close()
cnx.close()
if not row:
raise ValueError("No se encontró el token de pCloud en la tabla Parametros.")
return row[0]
def upload_solo_pcloud_new():
def upload_solo_pcloud_sp(hyperV : bool = False):
""" """
Subida de la backup almacenada en la carpeta Backup a Pcloud Sube los ficheros de backup a pCloud usando la API REST con token OAuth2.
El token se obtiene de la tabla Parametros.
""" """
#Compruebo si el fichero esta descargado, si esta descargado inicio la subida a pcloud
directorio = pathlib.Path('soporte-backup-db/backups').absolute() directorio = pathlib.Path('soporte-backup-db/backups').absolute()
with os.scandir(directorio) as ficheros: with os.scandir(directorio) as f:
ficheros = [fichero.path for fichero in ficheros if fichero.is_file( ficheros = [fi.path for fi in f if fi.is_file()]
)]
if ficheros: if not ficheros:
#pc = PyCloud('informatica@rentelwifi.com', '_RW!2k14', endpoint="eapi") print("Fichero inexistente en la carpeta backups")
pc = PyCloud('info@rentel.pro', 'Rw20_J!214', endpoint="eapi") return False
pc.listfolder(folderid=0)
if hyperV: token = get_pcloud_token()
pc.uploadfile(files=ficheros, path='/Rentel_Wifi/Backup/Hyper-V/Soporte')
else: for fichero in ficheros:
pc.uploadfile(files=ficheros, path='/Rentel_Wifi/Backup/Soporte') with open(fichero, "rb") as f:
nombre = os.path.basename(fichero)
print(ficheros) m = MultipartEncoder(
for fichero in ficheros: # Borramos ficheros de la carpeta backups fields={
"file": (nombre, f, "application/octet-stream")
}
)
resp = requests.post(f"{PCLOUD_API}/uploadfile", params={
"access_token": token,
"path": "/Backup/Hyper-V/Soporte",
"filename": nombre,
"nopartial": 1
}, data=m,
headers={"Content-Type": m.content_type}
)
resultado = resp.json()
if resultado.get("result") == 0:
print(f'Subido fichero: {nombre} a pCloud /Backup/Hyper-V/Soporte')
remove(fichero) remove(fichero)
else:
print(f'Error subiendo {nombre} a pCloud: {resultado}')
return False
return True return True
#print('Subido a Pcloud')
else: def delete_file_date_new():
print("Fichero inexistente en la carpeta backups") """
Borra ficheros en pCloud /Backup/Hyper-V/Soporte
cuya fecha de creación sea anterior a 30 días.
"""
token = get_pcloud_token()
limite = datetime.now() - timedelta(days=30)
# Listar ficheros de la carpeta
resp = requests.get(f"{PCLOUD_API}/listfolder", params={
"access_token": token,
"path": "/Backup/Hyper-V/Soporte"
})
resultado = resp.json()
if resultado.get("result") != 0:
print(f"Error listando carpeta pCloud: {resultado}")
return False
def delete_file_date(): contents = resultado.get("metadata", {}).get("contents", [])
"""Borra fichero en Pcloud si su fecha de creación es anterior a 30 dias
Arg (Pcloud): Conexión Pcloud for item in contents:
Return (list): Nombre de los ficheros borrados en caso que los haya. if item.get("isfolder"):
""" continue
deletes_files = [] # Ficheros borrados
#pc = PyCloud('informatica@rentelwifi.com', '_RW!2k14', endpoint="eapi") # pCloud devuelve la fecha en formato "Day, DD Mon YYYY HH:MM:SS +0000"
pc = PyCloud('info@rentel.pro', 'Rw20_J!214', endpoint="eapi") fecha_str = item.get("created", "")
folder_path = "/Rentel_Wifi/Backup/Hyper-V/Soporte" try:
folder_info = pc.listfolder(path=folder_path) fecha = datetime.strptime(fecha_str, "%a, %d %b %Y %H:%M:%S %z").replace(tzinfo=None)
for item in folder_info["metadata"]["contents"]: #Recorro los ficheros de la carpeta except ValueError:
file_time = item["created"] print(f"No se pudo parsear la fecha de: {item.get('name')} → {fecha_str}")
if compare_date_file(file_time): #Si la fecha del fichero es anterior a 30 dias de antiguedad continue
#Compruebo que el fichero que vamos a borrar pertenece a dentro de la ruta folder_path
item_path = item['path'] if fecha < limite:
if comprobar_item_a_borrar(item_path, folder_path): fileid = item.get("fileid")
#Borar fichero nombre = item.get("name")
pc.deletefile(fileid=item["fileid"]) del_resp = requests.get(f"{PCLOUD_API}/deletefile", params={
deletes_files.append(item["name"]) "access_token": token,
"fileid": fileid
if len(deletes_files) == 0: })
print("No hay ficheros para borrar en Pcloud que sean más antiguos de 30 dias.") if del_resp.json().get("result") == 0:
print(f"Fichero eliminado de pCloud: {nombre} (creado: {fecha.date()})")
else: else:
print("Ficheros borrados de Pcloud ") print(f"Error eliminando {nombre}: {del_resp.json()}")
print(deletes_files)
return True
......
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