refs #1084 - Modify API and Swagger / Add 'listenUFTP.py'
parent
7c29e453e6
commit
06a29fc9ef
|
@ -462,7 +462,7 @@ curl -X POST -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d
|
|||
Se enviará la imagen especificada por Multicast, mediante la aplicación UDPcast.
|
||||
Se puede hacer con el script "**sendFileMcast.py**", que a su vez llama al binario "**udp-sender**", que es quien realmente realiza el envío.
|
||||
**NOTA**: El script requiere que se le pase el nombre de la imagen (con extensión, e incluyendo el nombre del directorio correspondiente a la OU, si fuera el caso) como primer parámetro, y los datos de transferencia como segundo parámetro (en una cadena, con los datos separados por dos puntos). El primer parámetro se obtiene en la API, a partir del ID de la imagen (que corresponde al contenido del archivo "full.sum"), pero los datos de transferencia deben enviarse desde ogCore (y luego son tratados en la API, para construir la cadena correspondiente al parámetro).
|
||||
**NOTA2**: Este endpoint es asíncrono, ya que puede tardar mucho tiempo, por lo que solo informa de que la imagen se está enviando, y abre un proceso paralelo, que avisará a ogCore cuando finalice la tarea (llamando a un endpoint de ogCore).
|
||||
**NOTA2**: Este endpoint es asíncrono, ya que puede tardar mucho tiempo, por lo que solo informa de que la imagen se está enviando, y abre un proceso paralelo (pero no avisa a ogCore de su finalización, porque no puede comprobar cuando acaba la tarea de restauración de la imagen).
|
||||
|
||||
**URL:** `/ogrepository/v1/udpcast`
|
||||
**Método HTTP:** POST
|
||||
|
@ -470,7 +470,7 @@ Se puede hacer con el script "**sendFileMcast.py**", que a su vez llama al binar
|
|||
**Cuerpo de la Solicitud (JSON):**
|
||||
- **ID_img**: Identificador de la imagen (correspondiente al contenido del archivo "full.sum" asociado).
|
||||
- **port**: Puerto Multicast.
|
||||
- **method**: Modalidad half-duplex o full-duplex.
|
||||
- **method**: Modalidad half-duplex o full-duplex ("half" o "full").
|
||||
- **ip**: IP Multicast.
|
||||
- **bitrate**: Velocidad de transmisión (en Mbps).
|
||||
- **nclients**: Número mínimo de clientes.
|
||||
|
@ -492,7 +492,7 @@ curl -X POST -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d
|
|||
Se enviará la imagen especificada por Unicast o Multicast, mediante el protocolo "UFTP".
|
||||
Se puede hacer con el script "**sendFileUFTP.py**", que requiere que previamente los clientes ogLive destino se pongan en escucha con un daemon "UFTPD" (ejecutando el script "**listenUFTPD.py**"). Esto funciona al revés que "UDPcast", ya que primero se debe ejecutar un comando en los clientes, y luego en el servidor.
|
||||
**NOTA**: El script requiere que se le pase el nombre de la imagen (con extensión, e incluyendo el nombre del directorio correspondiente a la OU, si fuera el caso) como primer parámetro, y los datos de transferencia como segundo parámetro (en una cadena, con los datos separados por dos puntos). El primer parámetro se obtiene en la API, a partir del ID de la imagen (que corresponde al contenido del archivo "full.sum"), pero los datos de transferencia deben enviarse desde ogCore (y luego son tratados en la API, para construir la cadena correspondiente al parámetro).
|
||||
**NOTA2**: Este endpoint es asíncrono, ya que puede tardar mucho tiempo, por lo que solo informa de que la imagen se está enviando, y abre un proceso paralelo, que avisará a ogCore cuando finalice la tarea (llamando a un endpoint de ogCore).
|
||||
**NOTA2**: Este endpoint es asíncrono, ya que puede tardar mucho tiempo, por lo que solo informa de que la imagen se está enviando, y abre un proceso paralelo (pero no avisa a ogCore de su finalización, porque no puede comprobar cuando acaba la tarea de restauración de la imagen).
|
||||
|
||||
**URL:** `/ogrepository/v1/uftp`
|
||||
**Método HTTP:** POST
|
||||
|
@ -519,7 +519,7 @@ curl -X POST -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d
|
|||
Se enviará la imagen especificada mediante "P2P", iniciando el tracker y el seeder (que harán tracking y seed de los torrents contenidos en la raiz del directorio especificado).
|
||||
Se puede hacer con los scripts "**runTorrentTracker.py**" y "**runTorrentSeeder.py**", que deben ser llamados por el endpoint.
|
||||
**NOTA**: Estos scripts requieren que se les pase el directorio en el que está situada la imagen a enviar como único parámetro. Este dato se obtiene en la API, a partir del ID de la imagen (que corresponde al contenido del archivo "full.sum").
|
||||
**NOTA2**: Este endpoint es asíncrono, ya que puede tardar mucho tiempo, por lo que solo informa de que la imagen se está enviando, y abre un proceso paralelo, que avisará a ogCore cuando finalice la tarea (llamando a un endpoint de ogCore).
|
||||
**NOTA2**: Este endpoint es asíncrono, ya que puede tardar mucho tiempo, por lo que solo informa de que la imagen se está enviando, y abre un proceso paralelo (pero no avisa a ogCore de su finalización, porque no puede comprobar cuando acaba la tarea de restauración de la imagen).
|
||||
|
||||
|
||||
**URL:** `/ogrepository/v1/p2p`
|
||||
|
|
|
@ -449,7 +449,7 @@ curl -X POST -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d
|
|||
Se enviará la imagen especificada por Multicast, mediante la aplicación UDPcast.
|
||||
Se puede hacer con el script "**sendFileMcast.py**", que a su vez llama al binario "**udp-sender**", que es quien realmente realiza el envío.
|
||||
**NOTA**: El script requiere que se le pase el nombre de la imagen (con extensión, e incluyendo el nombre del directorio correspondiente a la OU, si fuera el caso) como primer parámetro, y los datos de transferencia como segundo parámetro (en una cadena, con los datos separados por dos puntos). El primer parámetro se obtiene en la API, a partir del ID de la imagen (que corresponde al contenido del archivo "full.sum"), pero los datos de transferencia deben enviarse desde ogCore (y luego son tratados en la API, para construir la cadena correspondiente al parámetro).
|
||||
**NOTA2**: Este endpoint es asíncrono, ya que puede tardar mucho tiempo, por lo que solo informa de que la imagen se está enviando, y abre un proceso paralelo, que avisará a ogCore cuando finalice la tarea (llamando a un endpoint de ogCore).
|
||||
**NOTA2**: Este endpoint es asíncrono, ya que puede tardar mucho tiempo, por lo que solo informa de que la imagen se está enviando, y abre un proceso paralelo (pero no avisa a ogCore de su finalización, porque no puede comprobar cuando acaba la tarea de restauración de la imagen).
|
||||
|
||||
**URL:** `/ogrepository/v1/udpcast`
|
||||
**Método HTTP:** POST
|
||||
|
@ -457,7 +457,7 @@ Se puede hacer con el script "**sendFileMcast.py**", que a su vez llama al binar
|
|||
**Cuerpo de la Solicitud (JSON):**
|
||||
- **ID_img**: Identificador de la imagen (correspondiente al contenido del archivo "full.sum" asociado).
|
||||
- **port**: Puerto Multicast.
|
||||
- **method**: Modalidad half-duplex o full-duplex.
|
||||
- **method**: Modalidad half-duplex o full-duplex ("half" o "full").
|
||||
- **ip**: IP Multicast.
|
||||
- **bitrate**: Velocidad de transmisión (en Mbps).
|
||||
- **nclients**: Número mínimo de clientes.
|
||||
|
@ -479,7 +479,7 @@ curl -X POST -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d
|
|||
Se enviará la imagen especificada por Unicast o Multicast, mediante el protocolo "UFTP".
|
||||
Se puede hacer con el script "**sendFileUFTP.py**", que requiere que previamente los clientes ogLive destino se pongan en escucha con un daemon "UFTPD" (ejecutando el script "**listenUFTPD.py**"). Esto funciona al revés que "UDPcast", ya que primero se debe ejecutar un comando en los clientes, y luego en el servidor.
|
||||
**NOTA**: El script requiere que se le pase el nombre de la imagen (con extensión, e incluyendo el nombre del directorio correspondiente a la OU, si fuera el caso) como primer parámetro, y los datos de transferencia como segundo parámetro (en una cadena, con los datos separados por dos puntos). El primer parámetro se obtiene en la API, a partir del ID de la imagen (que corresponde al contenido del archivo "full.sum"), pero los datos de transferencia deben enviarse desde ogCore (y luego son tratados en la API, para construir la cadena correspondiente al parámetro).
|
||||
**NOTA2**: Este endpoint es asíncrono, ya que puede tardar mucho tiempo, por lo que solo informa de que la imagen se está enviando, y abre un proceso paralelo, que avisará a ogCore cuando finalice la tarea (llamando a un endpoint de ogCore).
|
||||
**NOTA2**: Este endpoint es asíncrono, ya que puede tardar mucho tiempo, por lo que solo informa de que la imagen se está enviando, y abre un proceso paralelo (pero no avisa a ogCore de su finalización, porque no puede comprobar cuando acaba la tarea de restauración de la imagen).
|
||||
|
||||
**URL:** `/ogrepository/v1/uftp`
|
||||
**Método HTTP:** POST
|
||||
|
@ -506,7 +506,7 @@ curl -X POST -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d
|
|||
Se enviará la imagen especificada mediante "P2P", iniciando el tracker y el seeder (que harán tracking y seed de los torrents contenidos en la raiz del directorio especificado).
|
||||
Se puede hacer con los scripts "**runTorrentTracker.py**" y "**runTorrentSeeder.py**", que deben ser llamados por el endpoint.
|
||||
**NOTA**: Estos scripts requieren que se les pase el directorio en el que está situada la imagen a enviar como único parámetro. Este dato se obtiene en la API, a partir del ID de la imagen (que corresponde al contenido del archivo "full.sum").
|
||||
**NOTA2**: Este endpoint es asíncrono, ya que puede tardar mucho tiempo, por lo que solo informa de que la imagen se está enviando, y abre un proceso paralelo, que avisará a ogCore cuando finalice la tarea (llamando a un endpoint de ogCore).
|
||||
**NOTA2**: Este endpoint es asíncrono, ya que puede tardar mucho tiempo, por lo que solo informa de que la imagen se está enviando, y abre un proceso paralelo (pero no avisa a ogCore de su finalización, porque no puede comprobar cuando acaba la tarea de restauración de la imagen).
|
||||
|
||||
|
||||
**URL:** `/ogrepository/v1/p2p`
|
||||
|
|
|
@ -8,8 +8,8 @@ Responde a peticiones HTTP (en principio, enviadas desde ogCore) mediante endpoi
|
|||
En ciertos casos, transforma los parámetros recibidos desde el portal, para adaptarlos a los que es necesario enviar a los scripts
|
||||
(por ejemplo, a partir del ID de una imagen obtiene su nombre, su extensión y el subdirectorio de OU).
|
||||
|
||||
Librerías Python requeridas: - flask (se puede instalar con "sudo apt install python3-flask")
|
||||
- paramiko (se puede instalar con "sudo apt install python3-paramiko")
|
||||
Librerías Python requeridas: - flask (se puede instalar con "sudo apt install python3-flask")
|
||||
- paramiko (se puede instalar con "sudo apt install python3-paramiko")
|
||||
- requests (se puede instalar con "sudo apt install python3-requests") - No tengo claro que para este paquete sea necesario
|
||||
- flasgger (se puede instalar con "sudo apt install python3-flasgger")
|
||||
"""
|
||||
|
@ -233,11 +233,11 @@ def check_aux_files(image_file_path):
|
|||
|
||||
# Almacenamos en un diccionario los datos a enviar a ogCore:
|
||||
data = {
|
||||
'job_id': 222,
|
||||
'job_id': 222, # Este no es un dato real (deberá pasarmelo ogCore previamente)
|
||||
'image_id': image_id
|
||||
}
|
||||
# Llamamos al endpoint de ogCore, enviando los datos:
|
||||
recall_ogcore(data)
|
||||
# Llamamos al endpoint de ogCore, enviando los datos (de momento comento la llamada, porque la función llama a un endpoint inexistente):
|
||||
#recall_ogcore(data)
|
||||
break
|
||||
# Esperamos 10 segundos para volver a realizar la comprobación:
|
||||
sleep(10)
|
||||
|
|
|
@ -3,6 +3,8 @@ info:
|
|||
title: "OgRepository API"
|
||||
version: "1.0"
|
||||
description: |
|
||||
---
|
||||
|
||||
**API de ogRepository, programada en Flask**.
|
||||
|
||||
Responde a peticiones HTTP (enviadas desde ogCore) mediante endpoints, que a su vez ejecutan los scripts Python almacenados en ogRepository.
|
||||
|
@ -10,10 +12,28 @@ info:
|
|||
|
||||
Librerías Python requeridas:
|
||||
- **flask** (se puede instalar con "sudo apt install python3-flask")
|
||||
- **paramiko** (se puede instalar con "sudo apt install python3-paramiko")
|
||||
- **paramiko** (se puede instalar con "sudo apt install python3-paramiko")
|
||||
- **psutil** (se puede instalar con "sudo apt install python3-psutil")
|
||||
- **requests** (se puede instalar con "sudo apt install python3-requests") - No tengo claro que para este paquete sea necesario
|
||||
- **flasgger** (se puede instalar con "sudo apt install python3-flasgger")
|
||||
|
||||
Paquetes APT requeridos:
|
||||
- **uftp** (se puede instalar con "sudo DEBIAN_FRONTEND=noninteractive apt install uftp -y", para que no pida la ruta predeterminada)
|
||||
- **ctorrent** (se puede instalar con "sudo apt install ctorrent")
|
||||
- **udpcast** (se puede instalar con "sudo apt install ./udpcast_20230924_amd64.deb", apuntando al paquete)
|
||||
|
||||
Para que todos los endpoints de la API funcionen con la configuración actual deben existir los siguientes directorios:
|
||||
- **/opt/opengnsys/images/**
|
||||
- **/opt/opengnsys/images_trash/** (debe estar en la misma unidad que el anterior, o tardarán mucho las eliminaciones y restauraciones)
|
||||
- **/opt/opengnsys/bin/** (aquí deben estar todos los scripts de Python, y el binario "udp-sender")
|
||||
- **/opt/opengnsys/etc/** (aquí se guardan los archivos "repoinfo.json" y "trashinfo.json")
|
||||
- **/opt/opengnsys/log/** (aquí se guardan los logs)
|
||||
|
||||
Y también debe existir el siguiente archivo:
|
||||
- **/opt/opengnsys/etc/ogAdmRepo.cfg** (de aquí pilla la IP de ogRepo)
|
||||
|
||||
---
|
||||
|
||||
# -----------------------------------------------------------------------------------------------------------
|
||||
|
||||
# Esto hace que el Swagger se ordene por los tags (apartados), de la forma especificada:
|
||||
|
@ -754,7 +774,7 @@ paths:
|
|||
Este endpoint envía la imagen especificada a través de UDPcast, utilizando el script "**sendFileMcast.py**".
|
||||
Recibe la imagen y los parámetros de configuración de transferencia, que son usados para construir la cadena de parámetros que se envía al script.
|
||||
|
||||
**NOTA**: Este endpoint es asíncrono, ya que puede tardar mucho tiempo, por lo que solo informa de que la imagen se está enviando, y abre un proceso paralelo, que avisará a ogCore cuando finalice la tarea (llamando a un endpoint de ogCore).
|
||||
**NOTA**: Este endpoint es asíncrono, ya que puede tardar mucho tiempo, por lo que solo informa de que la imagen se está enviando, y abre un proceso paralelo (pero no avisa a ogCore de su finalización, porque no puede comprobar cuando acaba la tarea de restauración de la imagen).
|
||||
tags:
|
||||
- "Transferencia de Imágenes (UDPcast)"
|
||||
parameters:
|
||||
|
@ -764,7 +784,7 @@ paths:
|
|||
description: |
|
||||
* **ID_img** - Identificador de la imagen, correspondiente al contenido del archivo 'full.sum'
|
||||
* **port** - Puerto Multicast
|
||||
* **method** - Modalidad half-duplex o full-duplex
|
||||
* **method** - Modalidad half-duplex o full-duplex ("half" o "full")
|
||||
* **ip** - IP Multicast
|
||||
* **bitrate** - Velocidad de transmisión, en Mbps
|
||||
* **nclients** - Número minimo de clientes
|
||||
|
@ -1016,8 +1036,7 @@ paths:
|
|||
Requiere que los clientes ogLive estén previamente en escucha con un daemon "UFTPD", ejecutando el script "**listenUFTPD.py**".
|
||||
Recibe la imagen y los parámetros de configuración de transferencia, que son usados para construir la cadena de parámetros que se envía al script.
|
||||
|
||||
**NOTA**: Este endpoint es asíncrono, ya que puede tardar mucho tiempo, por lo que solo informa de que la imagen se está enviando,
|
||||
y abre un proceso paralelo, que avisará a ogCore cuando finalice la tarea (llamando a un endpoint de ogCore).
|
||||
**NOTA**: Este endpoint es asíncrono, ya que puede tardar mucho tiempo, por lo que solo informa de que la imagen se está enviando, y abre un proceso paralelo (pero no avisa a ogCore de su finalización, porque no puede comprobar cuando acaba la tarea de restauración de la imagen).
|
||||
tags:
|
||||
- "Transferencia de Imágenes (UFTP)"
|
||||
parameters:
|
||||
|
@ -1263,7 +1282,7 @@ paths:
|
|||
Este endpoint inicia el tracker y el seeder de torrents para enviar una imagen especificada mediante P2P.
|
||||
Utiliza los scripts "**runTorrentTracker.py**" y "**runTorrentSeeder.py**" para iniciar el tracker y el seeder en el directorio de la imagen.
|
||||
|
||||
**NOTA**: Este endpoint es asíncrono, ya que puede tardar mucho tiempo, por lo que solo informa de que la imagen se está enviando, y abre un proceso paralelo, que avisará a ogCore cuando finalice la tarea (llamando a un endpoint de ogCore).
|
||||
**NOTA**: Este endpoint es asíncrono, ya que puede tardar mucho tiempo, por lo que solo informa de que la imagen se está enviando, y abre un proceso paralelo (pero no avisa a ogCore de su finalización, porque no puede comprobar cuando acaba la tarea de restauración de la imagen).
|
||||
tags:
|
||||
- "Transferencia de Imágenes (P2P)"
|
||||
parameters:
|
||||
|
|
|
@ -0,0 +1,116 @@
|
|||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Este script hace que el cliente se ponga a escuchar en el puerto e IP Multicast especificados en el único parámetro (cuya sintaxis es "Port:IP"), con un proceso "uftpd".
|
||||
Posteriormente, el servidor puede hacer una transferencia UFTP a la IP Multicast, o directamente a la IP de un cliente ogLive.
|
||||
NOTA: La imagen se enviará a la ruta de la caché de los clientes (que actualmente es "/opt/opengnsys/cache").
|
||||
|
||||
Paquetes APT requeridos: "uftp" (se puede instalar con "sudo apt install uftp").
|
||||
|
||||
Parámetros
|
||||
------------
|
||||
sys.argv[1] - Parámetros Multicast (en formato "Port:IP")
|
||||
- Ejemplo: 9000:239.194.17.2
|
||||
|
||||
Sintaxis
|
||||
----------
|
||||
./listenUFTPD.py Port:IP
|
||||
|
||||
Ejemplo
|
||||
---------
|
||||
./listenUFTPD.py 9000:239.194.17.2
|
||||
"""
|
||||
|
||||
# --------------------------------------------------------------------------------------------
|
||||
# IMPORTS
|
||||
# --------------------------------------------------------------------------------------------
|
||||
|
||||
import os
|
||||
import sys
|
||||
import subprocess
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------------------------
|
||||
# VARIABLES
|
||||
# --------------------------------------------------------------------------------------------
|
||||
|
||||
script_name = os.path.basename(__file__)
|
||||
cache_path = '/opt/opengnsys/cache'
|
||||
log_file = '/tmp/uftpd.log'
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------------------------
|
||||
# FUNCTIONS
|
||||
# --------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
def show_help():
|
||||
""" Imprime la ayuda, cuando se ejecuta el script con el parámetro "help".
|
||||
"""
|
||||
help_text = f"""
|
||||
Sintaxis: {script_name} Port:IP
|
||||
Ejemplo: {script_name} 9000:239.194.17.2
|
||||
"""
|
||||
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 la función con más o menos de 1 parámetro, se muestra un mensaje de error, y se sale del script:
|
||||
elif len(sys.argv) != 2:
|
||||
print(f"{script_name} Error: Formato incorrecto: Se debe especificar 1 parámetro (port:ip)")
|
||||
sys.exit(1)
|
||||
# Si en el parámetro no hay 2 elementos (separados por ":"), se muestra un mensaje de error, y se sale del script:
|
||||
param_list = sys.argv[1].split(':')
|
||||
if len(param_list) != 2:
|
||||
print(f"{script_name} Error: Datos Multicast incorrectos: \"{sys.argv[1]}\" (se debe especificar \"puerto:ip\")")
|
||||
sys.exit(2)
|
||||
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------------------------
|
||||
# MAIN
|
||||
# --------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
def main():
|
||||
"""
|
||||
"""
|
||||
# Evaluamos si se ha enviado la cantidad correcta de parámetros, y en el formato correcto:
|
||||
check_params()
|
||||
|
||||
# Almacenamos los elementos del parámetro en variables (su formato es "puerto:ip"):
|
||||
param_list = sys.argv[1].split(':')
|
||||
port, ip = param_list
|
||||
|
||||
# Creamos una lista con el comando a enviar (esto es requerido por la función "subprocess.run"), e impimimos el comando con espacios:
|
||||
splitted_cmd = f"uftpd -M {ip} -p {port} -L {log_file} -D {cache_path} -E -K rsa:1024".split()
|
||||
|
||||
print(f"Sending command: {' '.join(splitted_cmd)}")
|
||||
|
||||
# Ejecutamos el comando en el sistema, e imprimimos el resultado:
|
||||
try:
|
||||
result = subprocess.run(splitted_cmd, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
print(f"ReturnCode: {result.returncode}")
|
||||
except subprocess.CalledProcessError as error:
|
||||
print(f"ReturnCode: {error.returncode}")
|
||||
print(f"Error Output: {error.stderr.decode()}")
|
||||
except Exception as error:
|
||||
print(f"Se ha producido un error inesperado: {error}")
|
||||
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------------------------
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
# --------------------------------------------------------------------------------------------
|
Loading…
Reference in New Issue