#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Este script recupera la imagen que recibe como parámetro (y todos sus archivos asociados), moviendo los archivos a "/opt/opengnsys/ogrepository/images", desde la papelera. Llama al script "updateRepoInfo.py", para actualizar la información del repositorio. Parámetros ------------ sys.argv[1] - Nombre completo de la imagen a recuperar (con o sin ruta). - Ejemplo1: image1.img - Ejemplo2: /opt/opengnsys/ogrepository/images_trash/image1.img Sintaxis ---------- ./recoverImage.py image_name|/image_path/image_name Ejemplos --------- ./recoverImage.py image1.img ./recoverImage.py /opt/opengnsys/ogrepository/images_trash/image1.img """ # -------------------------------------------------------------------------------------------- # IMPORTS # -------------------------------------------------------------------------------------------- import os import sys import shutil import subprocess # -------------------------------------------------------------------------------------------- # VARIABLES # -------------------------------------------------------------------------------------------- script_name = os.path.basename(__file__) repo_path = '/opt/opengnsys/ogrepository/images/' # No borrar la barra final trash_path = '/opt/opengnsys/ogrepository/images_trash/' # No borrar la barra final update_repo_script = '/opt/opengnsys/ogrepository/bin/updateRepoInfo.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 sin parámetros, se muestra un error y la ayuda, y se sale del script: if len(sys.argv) == 1: print(f"{script_name} Error: Formato incorrecto: Se debe especificar al menos 1 parámetro") show_help() sys.exit(0) # Si se ejecuta el script con el parámetro "help", se muestra la ayuda, y se sale del script: elif len(sys.argv) == 2 and sys.argv[1] == "help": show_help() sys.exit(1) # Si se ejecuta el script con más 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(2) def build_file_path(): """ Construye la ruta completa al archivo a recuperar (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 recover_image(file_path, extensions): """ Recupera la imagen que recibe en el parámetro "file_path", y todos sus archivos asociados, moviéndolos a "/opt/opengnsys/ogrepository/images" (desde la papelera). """ # Iteramos las extensiones de los archivos, y construimos la ruta completa de cada uno de ellos: for ext in extensions: file_to_recover = f"{file_path}{ext}" # Si el archivo actual existe, lo movemos a "/opt/opengnsys/ogrepository/images" (recuperándolo desde la papelera): if os.path.exists(file_to_recover): # Si la extensión del archivo actual es ".info.checked" la renombramos a ".info" (para que lo pille "updateRepoInfo"): if ext == '.info.checked': os.rename(file_to_recover, file_to_recover.strip('.checked')) file_to_recover = file_to_recover.strip('.checked') shutil.move(file_to_recover, repo_path) def update_repo_info(): """ Actualiza la información del repositorio, ejecutando el script "updateRepoInfo.py". Como se ve, es necesario que el script se ejecute como sudo, o dará error. """ try: result = subprocess.run(['sudo', 'python3', update_repo_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() # 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'] # Llamamos a la función que recupera la imagen: print("Recovering image...") recover_image(file_path, extensions) # Actualizamos la información del repositorio, ejecutando el script "updateRepoInfo.py": print("Updating Repository Info...") update_repo_info() # -------------------------------------------------------------------------------------------- if __name__ == "__main__": main() # --------------------------------------------------------------------------------------------