ogrepository/bin/getRepoInfo.py

181 lines
6.9 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 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".
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)
# --------------------------------------------------------------------------------------------
# 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()
# --------------------------------------------------------------------------------------------