ogrepository/bin/deleteTrashImage.py

152 lines
5.6 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Este script elimina permanentemente la imagen que recibe como parámetro (y todos sus archivos asociados), desde la papelera.
Llama al script "updateTrashInfo.py", para actualizar la información de las imágenes de la papelera.
Parámetros
------------
sys.argv[1] - Nombre completo de la imagen a eliminar (con o sin ruta).
- Ejemplo1: image1.img
- Ejemplo2: /opt/opengnsys/ogrepository/images_trash/image1.img
Sintaxis
----------
./deleteTrashImage.py image_name|/image_path/image_name
Ejemplos
---------
./deleteTrashImage.py image1.img
./deleteTrashImage.py /opt/opengnsys/ogrepository/images_trash/image1.img
"""
# --------------------------------------------------------------------------------------------
# IMPORTS
# --------------------------------------------------------------------------------------------
import os
import sys
import subprocess
# --------------------------------------------------------------------------------------------
# VARIABLES
# --------------------------------------------------------------------------------------------
script_name = os.path.basename(__file__)
trash_path = '/opt/opengnsys/ogrepository/images_trash/' # No borrar la barra final
update_trash_script = '/opt/opengnsys/ogrepository/bin/updateTrashInfo.py'
# --------------------------------------------------------------------------------------------
# FUNCTIONS
# --------------------------------------------------------------------------------------------
def show_help():
""" Imprime la ayuda, cuando se ejecuta el script con el parámetro "help".
"""
help_text = f"""
Sintaxis: {script_name} image_name|/image_path/image_name
Ejemplo1: {script_name} image1.img
Ejemplo2: {script_name} /opt/opengnsys/ogrepository/images_trash/image1.img
"""
print(help_text)
def check_params():
""" Comprueba que se haya enviado la cantidad correcta de parámetros, y en el formato correcto.
Si no es así, muestra un mensaje de error, y sale del script.
LLama a la función "show_help" cuando se ejecuta el script con el parámetro "help".
"""
# Si se ejecuta el script con el parámetro "help", se muestra la ayuda, y se sale del script:
if len(sys.argv) == 2 and sys.argv[1] == "help":
show_help()
sys.exit(0)
# Si se ejecuta el script con más o menos de 1 parámetro, se muestra un error y la ayuda, y se sale del script:
elif len(sys.argv) != 2:
print(f"{script_name} Error: Formato incorrecto: Se debe especificar 1 parámetro")
show_help()
sys.exit(1)
def build_file_path():
""" Construye la ruta completa al archivo a eliminar
(agregando "/opt/opengnsys/ogrepository/images_trash/" si no se ha especificado en el parámetro).
"""
param_path = sys.argv[1]
# Construimos la ruta completa:
if not param_path.startswith(trash_path):
file_path = os.path.join(trash_path, param_path)
else:
file_path = param_path
return file_path
def delete_image(file_path, extensions):
""" Elimina permanentemente la imagen que recibe en el parámetro "file_path", y todos sus archivos asociados.
"""
# Iteramos las extensiones de los archivos, y construimos la ruta completa de cada uno de ellos:
for ext in extensions:
file_to_remove = f"{file_path}{ext}"
# Si el archivo actual existe, lo eliminamos permanentemente:
if os.path.exists(file_to_remove):
os.remove(file_to_remove)
def update_trash_info():
""" Actualiza la información de la papelera, ejecutando el script "updateTrashInfo.py".
Como se ve, es necesario que el script se ejecute como sudo, o dará error.
"""
try:
result = subprocess.run(['sudo', 'python3', update_trash_script], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
except subprocess.CalledProcessError as error:
print(f"Error Output: {error.stderr.decode()}")
sys.exit(3)
except Exception as error:
print(f"Se ha producido un error inesperado: {error}")
sys.exit(4)
# --------------------------------------------------------------------------------------------
# MAIN
# --------------------------------------------------------------------------------------------
def main():
"""
"""
# Evaluamos si se ha enviado la cantidad correcta de parámetros, y en el formato correcto:
check_params()
# Obtenemos la ruta completa al archivo a eliminar:
file_path = build_file_path()
# Si no existe el archivo de imagen, imprimimos un mensaje de error y salimos del script:
if not os.path.exists(file_path):
print("Image file doesn't exist")
sys.exit(2)
# Creamos una lista con las extensiones de los archivos asociados a la imagen
# (incluyendo ninguna extensión, que corresponde a la propia imagen):
extensions = ['', '.size', '.sum', '.full.sum', '.torrent', '.info', '.info.checked']
# Eliminamos la imagen y sus archivos asociados:
delete_image(file_path, extensions)
# Actualizamos la información de la papelera, ejecutando el script "updateTrashInfo.py":
print("Updating Trash Info...")
update_trash_info()
# --------------------------------------------------------------------------------------------
if __name__ == "__main__":
main()
# --------------------------------------------------------------------------------------------