#!/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 primer parámetro (debiendo especificar también el subdirectorio de OU como segundo parámetro, si procede). 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 sys.argv[2] - Subdirectorio correspondiente a la OU, o "none" si no procede.. - Ejemplo1: none - Ejemplo2: OU_subdirectory Sintaxis ---------- ./getRepoInfo.py image_name|all ou_subdir|none Ejemplos --------- ./getRepoInfo.py all none ./getRepoInfo.py image1.img none ./getRepoInfo.py image1.img OU_subdirectory """ # -------------------------------------------------------------------------------------------- # 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 ou_subdir|none Ejemplo1: {script_name} all none Ejemplo2: {script_name} image1.img none Ejemplo3: {script_name} image1.img OU_subdirectory """ 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 2 parámetros, se muestra un error y la ayuda, y se sale del script: elif len(sys.argv) != 3: print(f"{script_name} Error: Formato incorrecto: Se debe especificar 2 parámetros") show_help() sys.exit(1) 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) 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) def get_ou_image_info(repo_data, trash_data, image_name, image_ext, ou_subdir): """ Busca la imagen basada en OU 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 OU y la imagen en el repositorio, y si los encontramos creamos un diccionario con los datos: if repo_data != "": for ou in repo_data['ous']: if ou['subdir'] == ou_subdir: for image in ou['images']: if image['name'] == image_name and image['type'] == image_ext: dictionary = {"directory": repo_data['directory'], "ous": [{"subdir": ou_subdir, "images": [image]}]} # Buscamos la OU y la imagen en la papelera, y si los encontramos creamos un diccionario con los datos: if trash_data != "": for ou in trash_data['ous']: if ou['subdir'] == ou_subdir: for image in ou['images']: if image['name'] == image_name: dictionary = {"directory": trash_data['directory'], "ous": [{"subdir": ou_subdir, "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(3) # -------------------------------------------------------------------------------------------- # 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, la extensión de la imagen, y/o la OU cuando se necesite): if sys.argv[1] == 'all': get_all_info(repo_data, trash_data) elif sys.argv[2] == 'none': 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) else: image_name = sys.argv[1].split('.')[0] image_ext = sys.argv[1].split('.')[1] ou_subdir = sys.argv[2] get_ou_image_info(repo_data, trash_data, image_name, image_ext, ou_subdir) # -------------------------------------------------------------------------------------------- if __name__ == "__main__": main() # --------------------------------------------------------------------------------------------