181 lines
6.9 KiB
Python
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()
|
|
|
|
# --------------------------------------------------------------------------------------------
|