ogrepository/py_scripts/getRepoInfo.py

192 lines
7.8 KiB
Python

#!/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()
# --------------------------------------------------------------------------------------------