#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Este script devuelve información (en formato json) de todas las imágenes contenidas en el repositorio (incluída la papelera), o de la imagen que se especifique como parámetro. Previamente, llama al script "updateRepoInfo.py", para actualizar la información del repositorio (para evitar que dé error si no hay ninguna, por ejemplo). Parámetros ------------ sys.argv[1] - Nombre completo de la imagen a consultar (con extensión y sin ruta), u "all" (para obtener información de todas las imágenes). - Ejemplo1: all - Ejemplo2: image1.img Sintaxis ---------- ./getRepoInfo.py image_name|all Ejemplos --------- ./getRepoInfo.py all ./getRepoInfo.py image1.img """ # -------------------------------------------------------------------------------------------- # IMPORTS # -------------------------------------------------------------------------------------------- import os import sys import subprocess import json # -------------------------------------------------------------------------------------------- # VARIABLES # -------------------------------------------------------------------------------------------- script_name = os.path.basename(__file__) repo_file = '/opt/opengnsys/ogrepository/etc/repoinfo.json' trash_file = '/opt/opengnsys/ogrepository/etc/trashinfo.json' 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|all Ejemplo1: {script_name} all Ejemplo2: {script_name} 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 update_repo_info(): """ Actualiza la información del repositorio, ejecutando el script "updateRepoInfo.py". """ try: result = subprocess.run(['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) def get_all_info(repo_data, trash_data): """ Imprime un json con la información de todo el repositorio, con todas las imágenes que contiene, incluyendo las imágenes que fueron eliminadas (que estarán en la papelera). """ # Creamos un diccionario, combinando la información del repositorio y de la papelera: dictionary = {"REPOSITORY": repo_data, "TRASH": trash_data} # Convertimos el diccionario a json, y lo imprimimos: final_json = json.dumps(dictionary, indent=2) print(final_json) def get_image_info(repo_data, trash_data, image_name, image_ext): """ Busca la imagen especificada en el repositorio y en la papelera, devolviendo la información asociada si la encuentra, (o devolviendo un mensaje de error y saliendo del script si no la encuentra). """ dictionary = "" # Buscamos la imagen en el repositorio, y si la encontramos creamos un diccionario con los datos: if repo_data != "": for image in repo_data['images']: if image['name'] == image_name and image['type'] == image_ext: dictionary = {"directory": repo_data['directory'], "images": [image]} # Buscamos la imagen en la papelera, y si la encontramos creamos un diccionario con los datos: if trash_data != "": for image in trash_data['images']: if image['name'] == image_name: dictionary = {"directory": trash_data['directory'], "images": [image]} # Si hemos obtenido datos de la imagen, los pasamos a json y los imprmimos, # y si no, imprimimos un mensaje de error y salimos del script: if dictionary != "": final_json = json.dumps(dictionary, indent=2) print(final_json) else: print("No se ha encontrado la imagen especificada en el repositorio") sys.exit(2) # -------------------------------------------------------------------------------------------- # MAIN # -------------------------------------------------------------------------------------------- def main(): """ """ # Evaluamos si se ha enviado la cantidad correcta de parámetros, y en el formato correcto: check_params() # Actualizamos la información del repositorio, ejecutando el script "updateRepoInfo.py": update_repo_info() # Almacenamos la información de las imágenes del repositorio, en la variable "repo_data" # (solo si el archivo tiene contenido, o dará error): if os.path.getsize(repo_file) > 0: with open(repo_file, 'r') as file: repo_data = json.load(file) else: repo_data = "" # Almacenamos la información de las imágenes de la papelera, en la variable "trash_data" # (solo si el archivo tiene contenido, o dará error): if os.path.getsize(trash_file) > 0: with open(trash_file, 'r') as file: trash_data = json.load(file) else: trash_data = "" # Dependiendo del valor de los parámetros, llamamos a la función correspondiente, para imprimir la información # (extrayendo el nombre y la extensión de la imagen): if sys.argv[1] == 'all': get_all_info(repo_data, trash_data) else: image_name = sys.argv[1].split('.')[0] image_ext = sys.argv[1].split('.')[1] get_image_info(repo_data, trash_data, image_name, image_ext) # -------------------------------------------------------------------------------------------- if __name__ == "__main__": main() # --------------------------------------------------------------------------------------------