1
0

cleanup.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #!/usr/bin/env python3
  2. """
  3. Script de limpieza para HokoriTemp
  4. Elimina archivos expirados de la base de datos y del sistema de archivos
  5. """
  6. import os
  7. import sys
  8. from datetime import datetime
  9. from database import cleanup_expired_files, get_all_files, hard_delete_file
  10. def cleanup_physical_files(upload_folder='uploads'):
  11. """Eliminar archivos físicos que ya no están en la base de datos"""
  12. if not os.path.exists(upload_folder):
  13. print(f"La carpeta {upload_folder} no existe.")
  14. return
  15. # Obtener todos los archivos en la base de datos
  16. db_files = get_all_files()
  17. db_filenames = {file['stored_filename'] for file in db_files}
  18. # Obtener todos los archivos físicos
  19. physical_files = os.listdir(upload_folder)
  20. # Encontrar archivos huérfanos (físicos pero no en BD)
  21. orphaned_files = []
  22. for filename in physical_files:
  23. if filename not in db_filenames:
  24. orphaned_files.append(filename)
  25. # Eliminar archivos huérfanos
  26. deleted_count = 0
  27. for filename in orphaned_files:
  28. file_path = os.path.join(upload_folder, filename)
  29. try:
  30. os.remove(file_path)
  31. deleted_count += 1
  32. print(f"Eliminado archivo huérfano: {filename}")
  33. except Exception as e:
  34. print(f"Error eliminando {filename}: {e}")
  35. print(f"Se eliminaron {deleted_count} archivos huérfanos.")
  36. def cleanup_expired_from_db():
  37. """Limpiar archivos expirados de la base de datos permanentemente"""
  38. try:
  39. from database import get_active_files, hard_delete_file
  40. import os
  41. # Obtener archivos activos (no expirados)
  42. active_files = get_active_files()
  43. active_file_ids = {file['id'] for file in active_files}
  44. # Obtener todos los archivos
  45. all_files = get_all_files()
  46. # Encontrar archivos expirados
  47. expired_files = []
  48. for file in all_files:
  49. if file['id'] not in active_file_ids:
  50. expired_files.append(file)
  51. # Eliminar archivos expirados permanentemente
  52. deleted_count = 0
  53. for file in expired_files:
  54. try:
  55. # Eliminar archivo físico
  56. file_path = os.path.join('uploads', file['stored_filename'])
  57. if os.path.exists(file_path):
  58. os.remove(file_path)
  59. # Eliminar de la base de datos
  60. hard_delete_file(file['id'])
  61. deleted_count += 1
  62. print(f"Eliminado archivo expirado: {file['original_filename']}")
  63. except Exception as e:
  64. print(f"Error eliminando archivo expirado {file['original_filename']}: {e}")
  65. print(f"Se eliminaron permanentemente {deleted_count} archivos expirados.")
  66. return deleted_count
  67. except Exception as e:
  68. print(f"Error limpiando base de datos: {e}")
  69. return 0
  70. def get_stats():
  71. """Mostrar estadísticas de la base de datos"""
  72. try:
  73. from database import get_file_stats
  74. stats = get_file_stats()
  75. print(f"\nEstadísticas:")
  76. print(f"- Total de archivos: {stats['total_files']}")
  77. print(f"- Archivos activos: {stats['active_files']}")
  78. print(f"- Total de descargas: {stats['total_downloads']}")
  79. except Exception as e:
  80. print(f"Error obteniendo estadísticas: {e}")
  81. def main():
  82. """Función principal del script de limpieza"""
  83. print("=== HokoriTemp - Script de Limpieza ===")
  84. # Verificar argumentos
  85. if len(sys.argv) > 1:
  86. command = sys.argv[1]
  87. if command == '--help' or command == '-h':
  88. print("""
  89. Uso: python cleanup.py [comando]
  90. Comandos disponibles:
  91. --help, -h Mostrar esta ayuda
  92. --stats Mostrar estadísticas de la base de datos
  93. --db-only Solo limpiar base de datos (no archivos físicos)
  94. --files-only Solo limpiar archivos físicos huérfanos
  95. --all Limpiar todo (por defecto)
  96. Ejemplos:
  97. python cleanup.py --stats
  98. python cleanup.py --db-only
  99. python cleanup.py --all
  100. """)
  101. return
  102. elif command == '--stats':
  103. get_stats()
  104. return
  105. elif command == '--db-only':
  106. print("Limpiando solo base de datos...")
  107. cleanup_expired_from_db()
  108. return
  109. elif command == '--files-only':
  110. print("Limpiando solo archivos físicos...")
  111. cleanup_physical_files()
  112. return
  113. # Limpieza completa por defecto
  114. print("Iniciando limpieza completa...")
  115. # Limpiar base de datos
  116. db_deleted = cleanup_expired_from_db()
  117. # Limpiar archivos físicos
  118. cleanup_physical_files()
  119. # Mostrar estadísticas finales
  120. get_stats()
  121. print("\nLimpieza completada.")
  122. if __name__ == '__main__':
  123. main()