From 3d44dc9116b8acb6388721c76677635d6264686e Mon Sep 17 00:00:00 2001 From: ggil Date: Thu, 3 Oct 2024 12:11:03 +0200 Subject: [PATCH] refs #631 - Add 'getRepoStatus.py' and Modify API Proposal --- README.md | 83 ++++++++++++++++++++++------ bin/getRepoStatus.py | 126 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 193 insertions(+), 16 deletions(-) create mode 100644 bin/getRepoStatus.py diff --git a/README.md b/README.md index 23a17b1..a10106a 100644 --- a/README.md +++ b/README.md @@ -20,23 +20,74 @@ El presente documento detalla los endpoints de la API, con sus respectivos pará --- ### Tabla de Contenido: -1. [Obtener Información de todas las Imágenes](#obtener-información-de-todas-las-imágenes) - `GET /ogrepository/v1/images` -2. [Obtener Información de una Imagen concreta](#obtener-información-de-una-imagen-concreta) - `GET /ogrepository/v1/images/{ID_img}` -3. [Actualizar Información del Repositorio](#actualizar-información-del-repositorio) - `PUT /ogrepository/v1/images` -4. [Chequear integridad de Imagen](#chequear-integridad-de-imagen) - `GET /ogrepository/v1/status/images/{ID_img}` -5. [Eliminar una Imagen](#eliminar-una-imagen) - `DELETE /ogrepository/v1/images/{ID_img}` -6. [Recuperar una Imagen](#recuperar-una-imagen) - `POST /ogrepository/v1/trash/images/{ID_img}` -7. [Eliminar una Imagen de la Papelera](#eliminar-una-imagen-de-la-papelera) - `DELETE /ogrepository/v1/trash/images/{ID_img}` -8. [Importar una Imagen](#importar-una-imagen) - `POST /ogrepository/v1/repo/{ID_repo}/images/{ID_img}` -9. [Crear archivos auxiliares](#crear-archivos-auxiliares) - `POST /ogrepository/v1/images/create-torrentsum` -10. [Enviar paquete Wake On Lan](#enviar-paquete-wake-on-lan) - `POST /ogrepository/v1/images/send-wol` -11. [Enviar una Imagen mediante UDPcast](#enviar-una-imagen-mediante-udpcast) - `POST /ogrepository/v1/udpcast/images/{ID_img}` -12. [Enviar una Imagen mediante UFTP](#enviar-una-imagen-mediante-uftp) - `POST /ogrepository/v1/uftp/images/{ID_img}` -13. [Enviar una Imagen mediante P2P](#enviar-una-imagen-mediante-p2p) - `POST /ogrepository/v1/p2p/images/{ID_img}` -14. [Cancelar Transmisión UDPcast](#cancelar-transmisión-udpcast) - `DELETE /ogrepository/v1/udpcast/images/{ID_img}` -15. [Cancelar Transmisiones P2P](#cancelar-transmisiones-p2p) - `DELETE /ogrepository/v1/p2p` -16. [Ver Estado de Transmisiones Multicast-P2P](#ver-estado-de-transmisiones-multicast-p2p) - +1. [Obtener Información de Estado de ogRepository](#obtener-información-de-estado-de-ogrepository) - `GET /ogrepository/v1/status` +2. [Obtener Información de todas las Imágenes](#obtener-información-de-todas-las-imágenes) - `GET /ogrepository/v1/images` +3. [Obtener Información de una Imagen concreta](#obtener-información-de-una-imagen-concreta) - `GET /ogrepository/v1/images/{ID_img}` +4. [Actualizar Información del Repositorio](#actualizar-información-del-repositorio) - `PUT /ogrepository/v1/images` +5. [Chequear integridad de Imagen](#chequear-integridad-de-imagen) - `GET /ogrepository/v1/status/images/{ID_img}` +6. [Eliminar una Imagen](#eliminar-una-imagen) - `DELETE /ogrepository/v1/images/{ID_img}` +7. [Recuperar una Imagen](#recuperar-una-imagen) - `POST /ogrepository/v1/trash/images/{ID_img}` +8. [Eliminar una Imagen de la Papelera](#eliminar-una-imagen-de-la-papelera) - `DELETE /ogrepository/v1/trash/images/{ID_img}` +9. [Importar una Imagen](#importar-una-imagen) - `POST /ogrepository/v1/repo/{ID_repo}/images/{ID_img}` +10. [Crear archivos auxiliares](#crear-archivos-auxiliares) - `POST /ogrepository/v1/images/create-torrentsum` +11. [Enviar paquete Wake On Lan](#enviar-paquete-wake-on-lan) - `POST /ogrepository/v1/images/send-wol` +12. [Enviar una Imagen mediante UDPcast](#enviar-una-imagen-mediante-udpcast) - `POST /ogrepository/v1/udpcast/images/{ID_img}` +13. [Enviar una Imagen mediante UFTP](#enviar-una-imagen-mediante-uftp) - `POST /ogrepository/v1/uftp/images/{ID_img}` +14. [Enviar una Imagen mediante P2P](#enviar-una-imagen-mediante-p2p) - `POST /ogrepository/v1/p2p/images/{ID_img}` +15. [Cancelar Transmisión UDPcast](#cancelar-transmisión-udpcast) - `DELETE /ogrepository/v1/udpcast/images/{ID_img}` +16. [Cancelar Transmisiones P2P](#cancelar-transmisiones-p2p) - `DELETE /ogrepository/v1/p2p` +17. [Ver Estado de Transmisiones Multicast-P2P](#ver-estado-de-transmisiones-multicast-p2p) - +--- +### Obtener Información de Estado de ogRepository + +Se devolverá informacion de CPU, memoria RAM, disco duro y el estado de ciertos servicios y procesos de ogRepository, en formato JSON. +Se puede utilizar el script "**getRepoStatus.py**, que hemos programado recientemente. +**NOTA**: En los apartados "services" y "processes" he especificado los servicios y procesos que me han parecido interesantes, pero se puede añadir o eliminar los que se desee. + +**URL:** `/ogrepository/v1/status` +**Método HTTP:** GET + +**Ejemplo de Solicitud:** + +```bash +curl -X GET -H "Authorization: $API_KEY" http://example.com/ogrepository/v1/status +``` + +**Respuestas:** +- **Código 500 Internal Server Error:** Ocurrió un error al consultar y/o devolver la información de estado. +- **Código 200 OK:** La información de estado se obtuvo exitosamente. + - **Contenido:** Información de estado en formato JSON. + ```json + { + "cpu": { + "used_percentage": "35%" + }, + "ram": { + "total": "7.8GB", + "used": "0.3GB", + "available": "7.2GB", + "used_percentage": "7%" + }, + "disk": { + "total": "11.7GB", + "used": "7.7GB", + "available": "3.4GB", + "used_percentage": "69%" + }, + "services": { + "ssh": "active", + "smbd": "active", + "rsync": "active" + }, + "processes": { + "udp-sender": "stopped", + "uftp": "stopped", + "bttrack": "stopped", + "btlaunchmany": "stopped" + } + } + ``` --- ### Obtener Información de todas las Imágenes diff --git a/bin/getRepoStatus.py b/bin/getRepoStatus.py new file mode 100644 index 0000000..ad46ea2 --- /dev/null +++ b/bin/getRepoStatus.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +""" +Este script devuelve información de CPU, memoria RAM, disco duro y el estado de ciertos servicios y procesos de ogRepository, en formato json. +No recibe ningún parámetro. + +Librerías Python requeridas: "psutil" (se puede instalar con "sudo apt install python3-psutil". o "pip install psutil") +""" + +# -------------------------------------------------------------------------------------------- +# IMPORTS +# -------------------------------------------------------------------------------------------- + +import psutil +import os +import json +import subprocess + + +# -------------------------------------------------------------------------------------------- +# FUNCTIONS +# -------------------------------------------------------------------------------------------- + + +def get_cpu_info(): + """ Obtiene y retorna información de la CPU. + """ + cpu_percent = psutil.cpu_percent(interval=1) + return cpu_percent + + +def get_ram_info(): + """ Obtiene y retorna información de la memoria RAM. + """ + ram = psutil.virtual_memory() + return ram.total, ram.used, ram.available, ram.percent + + +def get_disk_info(): + """ Obtiene y retorna información del disco duro. + """ + disk = psutil.disk_usage('/') + return disk.total, disk.used, disk.free, disk.percent + + +def get_service_status(service): + """ Obtiene y retorna el estado del servicio que recibe como parámetro. + En caso de error, retorna un mensaje estándar. + """ + try: + result = subprocess.run(['systemctl', 'is-active', service], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='UTF8') + service_status = result.stdout.strip() + return service_status + except Exception: + return "status not accesible" + + +def get_process_status(process): + """ Obtiene y retorna el estado del proceso que recibe como parámetro. + """ + #for proc in psutil.process_iter(['pid', 'name', 'status']): + for proc in psutil.process_iter(['name']): + if proc.info['name'] == process: + return 'running' + return 'stopped' + + + +# -------------------------------------------------------------------------------------------- +# MAIN +# -------------------------------------------------------------------------------------------- + +def main(): + """ + """ + # Obtenemos información de la CPU: + cpu_percent = get_cpu_info() + + # Obtenemos información de la memoria RAM: + total_ram, used_ram, available_ram, percent_ram = get_ram_info() + + # Obtenemos información del disco duro: + total_disk, used_disk, free_disk, percent_disk = get_disk_info() + + # Obtenemos el estado de los servicios listados, que almacenamos en un diccionario: + service_list = ['ssh', 'smbd', 'rsync'] + services_status = {service: get_service_status(service) for service in service_list} + + # Obtenemos el estado de los procesos listados, que almacenamos en un diccionario: + process_list = ['udp-sender', 'uftp', 'bttrack', 'btlaunchmany'] + process_status = {process: get_process_status(process) for process in process_list} + + # Creamos un diccionario con toda la información obtenida: + data_dict = { + 'cpu': { + 'used_percentage': f"{int(cpu_percent)}%" + }, + 'ram': { + 'total': f"{round(total_ram / (1024 ** 3), 1)}GB", + 'used': f"{round(used_ram / (1024 ** 3), 1)}GB", + 'available': f"{round(available_ram / (1024 ** 3), 1)}GB", + 'used_percentage': f"{int(percent_ram)}%" + }, + 'disk': { + 'total': f"{round(total_disk / (1024 ** 3), 1)}GB", + 'used': f"{round(used_disk / (1024 ** 3), 1)}GB", + 'available': f"{round(free_disk / (1024 ** 3), 1)}GB", + 'used_percentage': f"{int(percent_disk)}%" + }, + 'services': services_status, + 'processes': process_status + } + + # Convertimos el diccionario a JSON, y lo imprimimos: + json_data = json.dumps(data_dict, indent=4) + print(json_data) + + + +# -------------------------------------------------------------------------------------------- + +if __name__ == "__main__": + main() + +# --------------------------------------------------------------------------------------------