#!/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). 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 json # -------------------------------------------------------------------------------------------- # VARIABLES # -------------------------------------------------------------------------------------------- script_name = os.path.basename(__file__) repo_file = '/opt/opengnsys/etc/repoinfo.json' trash_file = '/opt/opengnsys/etc/trashinfo.json' # -------------------------------------------------------------------------------------------- # 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 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: 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: 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: 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: 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() # Almacenamos la información de las imágenes del repositorio, en la variable "repo_data": with open(repo_file, 'r') as file: repo_data = json.load(file) # Almacenamos la información de las imágenes de la papelera, en la variable "trash_data": with open(trash_file, 'r') as file: trash_data = json.load(file) # 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() # --------------------------------------------------------------------------------------------