Commit 3e28e748 by Javier

Actualizo funciones de subida de ficheros pcloud

parent a82a22d4
......@@ -17,3 +17,8 @@ PWD_SFTP_TRUENAS=_RW!2k14
HOST_SFTP_TRUENAS2='192.168.2.240'
USER_SFTP_TRUENAS2=ftp_backup
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):
# Obtiene la lista de archivos en el directorio
archivos = ftp.nlst()
# 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:
# Obtiene la información del archivo
......
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__':
#Crea copia de seguridad y lo almacena en la carpeta backups
create_backup_database_soporte()
correct = upload_sftp_file()
if correct:
#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:
#Borra fichero en Pcloud si su fecha de creación es anterior a 25 dias
delete_file_date()
\ No newline at end of file
delete_file_date_new()
\ No newline at end of file
......@@ -4,62 +4,118 @@ from pcloud import PyCloud
from os import remove
from datetime import datetime, timedelta
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()
with os.scandir(directorio) as ficheros:
ficheros = [fichero.path for fichero in ficheros if fichero.is_file(
)]
if ficheros:
#pc = PyCloud('informatica@rentelwifi.com', '_RW!2k14', endpoint="eapi")
pc = PyCloud('info@rentel.pro', 'Rw20_J!214', endpoint="eapi")
pc.listfolder(folderid=0)
if hyperV:
pc.uploadfile(files=ficheros, path='/Rentel_Wifi/Backup/Hyper-V/Soporte')
else:
pc.uploadfile(files=ficheros, path='/Rentel_Wifi/Backup/Soporte')
with os.scandir(directorio) as f:
ficheros = [fi.path for fi in f if fi.is_file()]
if not ficheros:
print("Fichero inexistente en la carpeta backups")
return False
token = get_pcloud_token()
for fichero in ficheros:
with open(fichero, "rb") as f:
nombre = os.path.basename(fichero)
print(ficheros)
for fichero in ficheros: # Borramos ficheros de la carpeta backups
remove(fichero)
return True
#print('Subido a Pcloud')
m = MultipartEncoder(
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}
)
else:
print("Fichero inexistente en la carpeta backups")
resultado = resp.json()
if resultado.get("result") == 0:
print(f'Subido fichero: {nombre} a pCloud /Backup/Hyper-V/Soporte')
remove(fichero)
else:
print(f'Error subiendo {nombre} a pCloud: {resultado}')
return False
return True
def delete_file_date():
"""Borra fichero en Pcloud si su fecha de creación es anterior a 30 dias
Arg (Pcloud): Conexión Pcloud
Return (list): Nombre de los ficheros borrados en caso que los haya.
def delete_file_date_new():
"""
deletes_files = [] # Ficheros borrados
#pc = PyCloud('informatica@rentelwifi.com', '_RW!2k14', endpoint="eapi")
pc = PyCloud('info@rentel.pro', 'Rw20_J!214', endpoint="eapi")
folder_path = "/Rentel_Wifi/Backup/Hyper-V/Soporte"
folder_info = pc.listfolder(path=folder_path)
for item in folder_info["metadata"]["contents"]: #Recorro los ficheros de la carpeta
file_time = item["created"]
if compare_date_file(file_time): #Si la fecha del fichero es anterior a 30 dias de antiguedad
#Compruebo que el fichero que vamos a borrar pertenece a dentro de la ruta folder_path
item_path = item['path']
if comprobar_item_a_borrar(item_path, folder_path):
#Borar fichero
pc.deletefile(fileid=item["fileid"])
deletes_files.append(item["name"])
if len(deletes_files) == 0:
print("No hay ficheros para borrar en Pcloud que sean más antiguos de 30 dias.")
else:
print("Ficheros borrados de Pcloud ")
print(deletes_files)
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
contents = resultado.get("metadata", {}).get("contents", [])
for item in contents:
if item.get("isfolder"):
continue
# pCloud devuelve la fecha en formato "Day, DD Mon YYYY HH:MM:SS +0000"
fecha_str = item.get("created", "")
try:
fecha = datetime.strptime(fecha_str, "%a, %d %b %Y %H:%M:%S %z").replace(tzinfo=None)
except ValueError:
print(f"No se pudo parsear la fecha de: {item.get('name')} → {fecha_str}")
continue
if fecha < limite:
fileid = item.get("fileid")
nombre = item.get("name")
del_resp = requests.get(f"{PCLOUD_API}/deletefile", params={
"access_token": token,
"fileid": fileid
})
if del_resp.json().get("result") == 0:
print(f"Fichero eliminado de pCloud: {nombre} (creado: {fecha.date()})")
else:
print(f"Error eliminando {nombre}: {del_resp.json()}")
return True
def compare_date_file(file_time_create: str):
......
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