refs #794 - Add API and modify 'getUDPcastInfo.py'

pull/1/head
Gerardo GIl Elizeire 2024-10-17 17:38:30 +02:00
parent bc30ed1e45
commit 93a1b6c937
6 changed files with 1631 additions and 20 deletions

View File

@ -4,18 +4,19 @@ ogRepository - OpenGnsys Repository Manager
Este repositorio GIT contiene la estructura de datos del repositorio de imágenes de OpenGnsys.
- **admin** --- Archivos de configuración del repositorio.
- **bin** ------ Scripts en Python 3 y binarios de gestión del repositorio.
- **etc** ------ Ficheros y plantillas de configuración del repositorio.
- **admin** --- Archivos de configuración de ogRepository.
- **api** ------ API de ogRepository.
- **bin** ------ Scripts en Python 3 y binarios de gestión de ogRepository.
- **etc** ------ Ficheros y plantillas de configuración de ogRepository.
---
## API de ogRepository
La API de ogRepository proporciona una interfaz para facilitar la administración de las imágenes almacenadas en los repositorios de imágenes, permitiendo eliminarlas, enviarlas a clientes ogLive (con diferentes protocolos de transmisión), importarlas desde otros repositorios, etc.
La API de ogRepository proporciona una interfaz para facilitar la administración de las imágenes almacenadas en los repositorios de imágenes, permitiendo eliminarlas, enviarlas a clientes ogLive (con diferentes protocolos de transmisión), importarlas desde otros repositorios, etc.
El presente documento detalla los endpoints de la API, con sus respectivos parámetros de entrada, así como las acciones que llevan a cabo.
El presente documento detalla los endpoints de la API, con sus respectivos parámetros de entrada, así como las acciones que llevan a cabo.
---
### Tabla de Contenido:
@ -532,7 +533,7 @@ curl -X POST -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d
---
### Ver Estado de Transmisiones UDPcast
Se devolverá el pid de los procesos de transferencias UDPcast activas, y sus imágenes asociadas, en formato JSON, o un mensaje informativo si no hay procesos activos, o si se produce un error.
Se devolverá el pid de los procesos de transferencias UDPcast activas, y sus imágenes asociadas (con nombre e ID), en formato JSON, o un mensaje informativo si no hay procesos activos, o si se produce un error.
Se puede hacer con el script "**getUDPcastInfo.py**", que debe ser llamado por el endpoint.
**URL:** `/ogrepository/v1/udpcast`
@ -551,19 +552,21 @@ curl -X GET -H "Authorization: $API_KEY" http://example.com/ogrepository/v1/udpc
```json
{
"6720": {
"image": "Ubuntu20.img"
"image_id": "22735b9070e4a8043371b8c6ae52b90d",
"image_name": "Ubuntu20.img"
},
"6721": {
"image": "Windows10.img"
"image_id": "9e7cd32c606ebe5bd39ba212ce7aeb02",
"image_name": "Windows10.img"
}
}
```
---
### Cancelar Transmisión UDPcast
### Cancelar Transmisión UDPcast
Se cancelará la transmisión por UDPcast activa de la imagen especificada como parámetro, deteniendo el proceso "udp-sender" asociado a dicha imagen.
Se puede hacer con el script "**stopUDPcast.py**", que debe ser llamado por el endpoint.
**NOTA**: La versión actual de este 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 único parámetro. En principio, ogCore puede acceder a estos datos a partir del ID de la imagen (que hemos quedado que será el contenido del archivo "full.sum"), y la transformación de parámetros puede realizarse en el controlador PHP.
**NOTA**: La versión actual de este 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 ú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").
**URL:** `/ogrepository/v1/udpcast/images/{ID_img}`
**Método HTTP:** DELETE
@ -574,9 +577,10 @@ Se puede hacer con el script "**stopUDPcast.py**", que debe ser llamado por el e
curl -X DELETE -H "Authorization: $API_KEY" http://example.com/ogrepository/v1/udpcast/images/{ID_img}
```
**Respuestas:**
- **Código 500 Internal Server Error:** Ocurrió un error al cancelar la transmisión.
- **Código 500 Internal Server Error:** Ocurrió un error al cancelar la transmisión UDPcast.
- **Código 400 Bad Request:** No se ha encontrado la imagen especificada.
- **Código 200 OK:** La transmisión se ha cancelado exitosamente.
- **Código 400 Bad Request:** No hay transmisiones UCPcast activas para la imagen especificada.
- **Código 200 OK:** La transmisión UDPcast se ha cancelado exitosamente.
---
### Cancelar Transmisiones P2P
@ -594,7 +598,7 @@ Se puede hacer con el script "**stopP2P.py**", que debe ser llamado por el endpo
curl -X DELETE -H "Authorization: $API_KEY" http://example.com/ogrepository/v1/p2p
```
**Respuestas:**
- **Código 500 Internal Server Error:** Ocurrió un error al cancelar las transmisiones.
- **Código 200 OK:** Las transmisiones se han cancelado exitosamente.
- **Código 500 Internal Server Error:** Ocurrió un error al cancelar las transmisiones P2P.
- **Código 200 OK:** Las transmisiones P2P se han cancelado exitosamente.
---

591
api/README.md 100644
View File

@ -0,0 +1,591 @@
## API de ogRepository
La API de ogRepository proporciona una interfaz para facilitar la administración de las imágenes almacenadas en los repositorios de imágenes, permitiendo eliminarlas, enviarlas a clientes ogLive (con diferentes protocolos de transmisión), importarlas desde otros repositorios, etc.
El presente documento detalla los endpoints de la API, con sus respectivos parámetros de entrada, así como las acciones que llevan a cabo.
---
### Tabla de Contenido:
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}?method={method}`
7. [Recuperar una Imagen](#recuperar-una-imagen) - `POST /ogrepository/v1/trash/images`
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/images`
10. [Exportar una Imagen](#exportar-una-imagen) - `PUT /ogrepository/v1/repo/images`
11. [Crear archivos auxiliares](#crear-archivos-auxiliares) - `POST /ogrepository/v1/images/torrentsum`
12. [Enviar paquete Wake On Lan](#enviar-paquete-wake-on-lan) - `POST /ogrepository/v1/wol`
13. [Enviar una Imagen mediante UDPcast](#enviar-una-imagen-mediante-udpcast) - `POST /ogrepository/v1/udpcast`
14. [Enviar una Imagen mediante UFTP](#enviar-una-imagen-mediante-uftp) - `POST /ogrepository/v1/uftp`
15. [Enviar una Imagen mediante P2P](#enviar-una-imagen-mediante-p2p) - `POST /ogrepository/v1/p2p`
16. [Ver Estado de Transmisiones UDPcast](#ver-estado-de-transmisiones-udpcast) - `GET /ogrepository/v1/udpcast`
17. [Cancelar Transmisión UDPcast](#cancelar-transmisión-udpcast) - `DELETE /ogrepository/v1/udpcast/images/{ID_img}`
18. [Cancelar Transmisiones P2P](#cancelar-transmisiones-p2p) - `DELETE /ogrepository/v1/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 debe ser llamado por el endpoint.
**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
Se devolverá la informacion contenida en el archivo "**/opt/opengnsys/etc/repoinfo.json**" (que corresponde a todas las imágenes almacenadas en el repositorio), y en el archivo "**/opt/opengnsys/etc/trashinfo.json**" (que corresponde a las imágenes que fueron eliminadas, que estarán en la papelera).
Se puede utilizar el script "**getRepoInfo.py**, que debe ser llamado por el endpoint.
**NOTA**: La versión actual de este script requiere que se le pase "all" como primer parámetro (que correspondería al nombre de la imagen) y "none" como segundo parámetro (que corresponderia al nombre del subdirectorio correspondiente a la OU). Esta transformación de parámetros se realiza en la API.
**URL:** `/ogrepository/v1/images`
**Método HTTP:** GET
**Ejemplo de Solicitud:**
```bash
curl -X GET -H "Authorization: $API_KEY" http://example.com/ogrepository/v1/images
```
**Respuestas:**
- **Código 500 Internal Server Error:** Ocurrió un error al consultar y/o devolver la información de las imágenes.
- **Código 200 OK:** La información de las imágenes se obtuvo exitosamente.
- **Contenido:** Información de imágenes en formato JSON.
```json
{
"REPOSITORY": {
"directory": "/opt/opengnsys/images",
"images": [
{
"name": "Ubuntu24",
"type": "img",
"clientname": "Ubuntu_24",
"clonator": "partclone",
"compressor": "lzop",
"filesystem": "EXTFS",
"datasize": 9859634200000,
"size": 4505673214,
"sum": "065a933c780ab1aaa044435ad5d4bf87",
"fullsum": "33575b9070e4a8043371b8c6ae52b80e"
},
{
"name": "Windows10",
"type": "img",
"clientname": "Windows_10",
"clonator": "partclone",
"compressor": "lzop",
"filesystem": "NTFS",
"datasize": 24222105600000,
"size": 13198910185,
"sum": "8874d5ab84314f44841c36c69bb5aa82",
"fullsum": "9e7cd32c606ebe5bd39ba212ce7aeb02"
}
],
"ous": [
{
"subdir": "OU_subdir",
"images": [
{
"name": "Ubuntu20",
"type": "img",
"clientname": "Ubuntu_20",
"clonator": "partclone",
"compressor": "lzop",
"filesystem": "EXTFS",
"datasize": 8912896000000,
"size": 3803794535,
"sum": "081a933c780ab1aaa044435ad5d4bf56",
"fullsum": "22735b9070e4a8043371b8c6ae52b90d"
}
]
}
]
}
},
"TRASH": {
"directory": "/opt/opengnsys/images_trash",
"images": [],
"ous": [
{
"subdir": "CentroVirtual",
"images": [
{
"name": "Ubuntu20OLD",
"type": "img",
"clientname": "Ubuntu_20",
"clonator": "partclone",
"compressor": "lzop",
"filesystem": "EXTFS",
"datasize": 8912896000000,
"size": 3803794535,
"sum": "081a933c780ab1aaa044435ad5d4bf56",
"fullsum": "22735b9070e4a8043371b8c6ae52b90d"
}
]
}
]
}
```
- **name**: Nombre de la imagen, sin extensión.
- **type**: Extensión de la imagen.
- **clientname**: Nombre asignado al modelo del que se ha obtenido la imagen.
- **clonator**: Programa utilizado para la clonación.
- **compressor**: Programa utilizado para la compresión.
- **filesystem**: Sistema de archivos utilizado en la partición clonada.
- **datasize**: Tamaño de la imagen una vez restaurada, en bytes (tamaño de los datos).
- **size**: Tamaño del archivo de imagen, en bytes.
- **sum**: Hash MD5 del último MB del archivo de imagen.
- **fullsum**: Hash MD5 de todo el archivo de imagen.
---
### Obtener Información de una Imagen concreta
Se devolverá la informacion de la imagen especificada, que puede estar en el archivo "**/opt/opengnsys/etc/repoinfo.json**" o en el archivo "**/opt/opengnsys/etc/trashinfo.json**" (en este último caso, si la imagen está en la papelera).
Se puede utilizar el script "**getRepoInfo.py**, que debe ser llamado por el endpoint.
**NOTA**: La versión actual de este script requiere que se le pase el nombre de la imagen (con extensión) como primer parámetro, y el subdirectorio correspondiente a la OU (o "none" si no es el caso) como segundo parámetro. Estos datos se obtienen en la API, a partir del ID de la imagen (que corresponde al contenido del archivo "full.sum"), y alli se realiza la transformación de parámetros.
**URL:** `/ogrepository/v1/images/{ID_img}`
**Método HTTP:** GET
**Ejemplo de Solicitud:**
```bash
curl -X GET -H "Authorization: $API_KEY" http://example.com/ogrepository/v1/images/{ID_img}
```
**Respuestas:**
- **Código 500 Internal Server Error:** Ocurrió un error al consultar y/o devolver la información de las imágenes.
- **Código 400 Bad Request:** No se ha encontrado la imagen especificada.
- **Código 200 OK:** La información de la imagen se obtuvo exitosamente.
- **Contenido:** Información de la imagen en formato JSON.
```json
{
"directory": "/opt/opengnsys/images",
"images": [
{
"name": "Windows10",
"type": "img",
"clientname": "Windows_10",
"clonator": "partclone",
"compressor": "lzop",
"filesystem": "NTFS",
"datasize": 9859634200000,
"size": 4505673214,
"sum": "065a933c780ab1aaa044435ad5d4bf87",
"fullsum": "33575b9070e4a8043371b8c6ae52b80e"
}
]
}
```
- **name**: Nombre de la imagen, sin extensión.
- **type**: Extensión de la imagen.
- **clientname**: Nombre asignado al modelo del que se ha obtenido la imagen.
- **clonator**: Programa utilizado para la clonación.
- **compressor**: Programa utilizado para la compresión.
- **filesystem**: Sistema de archivos utilizado en la partición clonada.
- **datasize**: Tamaño de la imagen una vez restaurada, en bytes (tamaño de los datos).
- **size**: Tamaño del archivo de imagen, en bytes.
- **sum**: Hash MD5 del último MB del archivo de imagen.
- **fullsum**: Hash MD5 de todo el archivo de imagen.
---
### Actualizar Información del Repositorio
Se actualizará la información de las imágenes almacenadas en el repositorio, reflejándola en el archivo "**/opt/opengnsys/etc/repoinfo.json**".
Se puede hacer con el script "**updateRepoInfo.py**", que debe ser llamado por el endpoint (y que es similar al script bash original "**checkrepo**").
Este endpoint es llamado por el script "**deleteImage.py**" (para actualizar la información cada vez que se elimine una imagen), y creemos que también debe ser llamado por ogCore u ogLive cada vez que se haya creado una imagen.
**URL:** `/ogrepository/v1/images`
**Método HTTP:** PUT
**Ejemplo de Solicitud:**
```bash
curl -X PUT -H "Authorization: $API_KEY" http://example.com/ogrepository/v1/images
```
**Respuestas:**
- **Código 500 Internal Server Error:** Ocurrió un error al actualizar la información de las imágenes.
- **Código 200 OK:** La actualización se realizó exitosamente.
---
### Chequear Integridad de Imagen
Se comprobará la integridad del fichero de imagen especificado como parámetro.
Se puede hacer con el script "**checkImage.py**", que compara el tamaño actual del archivo con el almacenado en el archivo "**.size**", y el hash MD5 del último MB del archivo con el almacenado en el archivo "**.sum**".
**NOTA**: La versión actual de este 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 único parámetro. Estos datos se obtienen en la API, a partir del ID de la imagen (que corresponde al contenido del archivo "full.sum"), y alli se realiza la transformación de parámetros.
**URL:** `/ogrepository/v1/status/images/{ID_img}`
**Método HTTP:** GET
**Ejemplo de Solicitud:**
```bash
curl -X POST -H "Authorization: $API_KEY" http://example.com/ogrepository/v1/status/images/{ID_img}
```
**Respuestas:**
- **Código 500 Internal Server Error:** Ocurrió un error al chequear la imagen.
- **Código 400 Bad Request:** No se ha encontrado la imagen especificada.
- **Código 200 OK:** La imagen se ha chequeado exitosamente.
- **Código 200 KO:** La imagen se ha chequeado correctamente, pero no ha pasado el test.
---
### Eliminar una Imagen
Se eliminará la imagen especificada como parámetro, pudiendo eliminarla permanentemente o enviarla a la papelera.
Se puede hacer con el script "**deleteimage.py**", que debe ser llamado por el endpoint (y que incluye la funcionalidad "papelera"), y que a su vez llama al script "**updateRepoInfo.py**", para actualizar la información del repositorio.
**NOTA**: La versión actual de este 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 el parámetro opcional "-p" (para que la eliminación sea permanente). Estos datos se obtienen en la API, a partir del ID de la imagen (que corresponde al contenido del archivo "full.sum"), y alli se realiza la transformación de parámetros, pero también hay que especificar el método de eliminación en la URL, como parámetro adicional.
**URL:** `/ogrepository/v1/images/{ID_img}?method={method}`
**Método HTTP:** DELETE
**Parámetro adicional (en URL):**
- **method**: Método de eliminación (puede ser "trash" o "permanent").
**Ejemplo de Solicitud:**
```bash
curl -X DELETE -H "Authorization: $API_KEY" http://example.com/ogrepository/v1/images/{ID_img}?method=trash
```
**Respuestas:**
- **Código 500 Internal Server Error:** Ocurrió un error al eliminar la imagen.
- **Código 400 Bad Request:** No se ha encontrado la imagen especificada.
- **Código 200 OK:** La imagen se eliminó exitosamente.
---
### Recuperar una Imagen
Se recuperará la imagen especificada como parámetro, desde la papelera.
Se puede hacer con el script "**recoverImage.py**", que debe ser llamado por el endpoint, y que a su vez llama al script "**updateRepoInfo.py**", para actualizar la información del repositorio.
**NOTA**: La versión actual de este 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 único parámetro. Estos datos se obtienen en la API, a partir del ID de la imagen (que corresponde al contenido del archivo "full.sum"), y alli se realiza la transformación de parámetros.
**URL:** `/ogrepository/v1/trash/images`
**Método HTTP:** POST
**Cuerpo de la Solicitud (JSON):**
- **ID_img**: Identificador de la imagen (correspondiente al contenido del archivo "full.sum" asociado).
**Ejemplo de Solicitud:**
```bash
curl -X POST -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d '{"ID_img":"image_id"}' http://example.com/ogrepository/v1/trash/images
```
**Respuestas:**
- **Código 500 Internal Server Error:** Ocurrió un error al recuperar la imagen.
- **Código 400 Bad Request:** No se ha encontrado la imagen especificada.
- **Código 200 OK:** La imagen se recuperó exitosamente.
---
### Eliminar una Imagen de la Papelera
Se eliminará permanentemente la imagen especificada como parámetro, desde la papelera.
Se puede hacer con el script "**deleteTrashImage.py**", que debe ser llamado por el endpoint, y que a su vez llama al script "**updateTrashInfo.py**", para actualizar la información de la papelera.
**NOTA**: La versión actual de este 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 único parámetro. Estos datos se obtienen en la API, a partir del ID de la imagen (que corresponde al contenido del archivo "full.sum"), y alli se realiza la transformación de parámetros.
**URL:** `/ogrepository/v1/trash/images/{ID_img}`
**Método HTTP:** DELETE
**Ejemplo de Solicitud:**
```bash
curl -X DELETE -H "Authorization: $API_KEY" http://example.com/ogrepository/v1/trash/images/{ID_img}
```
**Respuestas:**
- **Código 500 Internal Server Error:** Ocurrió un error al eliminar la imagen.
- **Código 400 Bad Request:** No se ha encontrado la imagen especificada.
- **Código 200 OK:** La imagen se eliminó exitosamente.
---
### Importar una Imagen
Se importará una imagen de un repositorio remoto al repositorio local.
Se puede hacer con el script "**importImage.py**", que debe ser llamado por el endpoint.
**NOTA**: La versión actual de este 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, la IP o hostname del repositorio remoto como segundo parámetro, y el usuario remoto como tercer parámetro. Estos parámetros deben enviarse desde ogCore (en el JSON), porque el repositorio local no puede extraer la información de la imagen de un ID almacenado en un repositorio remoto.
**URL:** `/ogrepository/v1/repo/images`
**Método HTTP:** POST
**Cuerpo de la Solicitud (JSON):**
- **image**: Nombre de la imagen (con extensión).
- **ou_subdir**: Subdirectorio correspondiente a la OU (o "none" si no es el caso).
- **repo_ip**: Dirección IP del repositorio remoto (desde el que se importará la imagen).
- **user**: Usuario con el que acceder al repositorio remoto.
**Ejemplo de Solicitud:**
```bash
curl -X POST -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d '{"image":"Windows10.img","ou_subdir":"none","repo_ip":"192.168.56.100","user":"user_name"}' http://example.com/ogrepository/v1/repo/images
```
**Respuestas:**
- **Código 500 Internal Server Error:** Ocurrió un error al importar la imagen.
- **Código 400 Bad Request:** No se ha encontrado la imagen y/o el equipo remoto especificados.
- **Código 200 OK:** La imagen se ha importado exitosamente.
---
### Exportar una Imagen
Se exportará una imagen del repositorio local a un repositorio remoto.
Se puede hacer con el script "**exportImage.py**", que debe ser llamado por el endpoint.
**NOTA**: La versión actual de este 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, la IP o hostname del repositorio remoto como segundo parámetro, y el usuario remoto como tercer parámetro. 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 la IP del repositorio remoto y el usuario remoto deben enviarse desde ogCore (en el JSON).
**URL:** `/ogrepository/v1/repo/images`
**Método HTTP:** PUT
**Cuerpo de la Solicitud (JSON):**
- **ID_img**: Identificador de la imagen (correspondiente al contenido del archivo "full.sum" asociado).
- **repo_ip**: Dirección IP del repositorio remoto (al que se exportrará la imagen).
- **user**: Usuario con el que acceder al repositorio remoto.
**Ejemplo de Solicitud:**
```bash
curl -X PUT -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d '{"ID_img":"image_id","repo_ip":"192.168.56.100","user":"user_name"}' http://example.com/ogrepository/v1/repo/images
```
**Respuestas:**
- **Código 500 Internal Server Error:** Ocurrió un error al exportar la imagen.
- **Código 400 Bad Request:** No se ha encontrado la imagen y/o el equipo remoto especificados.
- **Código 200 OK:** La imagen se ha exportado exitosamente.
---
### Crear archivos auxiliares
Se crearán los archivos ".sum", ".full.sum", ".size" y ".torrent", para la imagen especificada como parámetro.
Se puede hacer con el script "**createTorrentSum.py**", que debe ser llamado por el endpoint.
**NOTA**: La versión actual de este 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 unico parámetro. Este parámetro no puede obtenerse en la API, a partir del ID de imagen (como en otros casos), porque el ID corresponde al contenido del archivo "full.sum" asociado (que no estará creado hasta que no se ejecute este script).
**URL:** `/ogrepository/v1/images/torrentsum`
**Método HTTP:** POST
**Cuerpo de la Solicitud (JSON):**
- **image**: Nombre de la imagen (con extensión).
- **ou_subdir**: Subdirectorio correspondiente a la OU (o "none" si no es el caso).
**Ejemplo de Solicitud:**
```bash
curl -X POST -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d '{"image":"Windows10.img", "ou_subdir":"none"}' http://example.com/ogrepository/v1/images/torrentsum
```
**Respuestas:**
- **Código 500 Internal Server Error:** Ocurrió un error al crear los archivos.
- **Código 400 Bad Request:** No se ha encontrado la imagen especificada.
- **Código 200 OK:** Los archivos se han creado exitosamente.
---
### Enviar paquete Wake On Lan
Se enviará un paquete Wake On Lan a la dirección MAC especificada, a través de la IP de broadcast especificada.
Se puede hacer con el script "**sendWakeOnLan.py**", que debe ser llamado por el endpoint.
**NOTA**: La versión actual de este script requiere que se le pase la dirección IP de broadcast como primer parámetro, y la dirección MAC destino como segundo parámetro. Estos datos deben enviarse desde ogCore (en el JSON).
**URL:** `/ogrepository/v1/wol`
**Método HTTP:** POST
**Cuerpo de la Solicitud (JSON):**
- **broadcast_ip**: IP de broadcast a la que enviar el paquete (puede ser "255.255.255.255", o la IP de broadcast de una subred).
- **mac**: Dirección MAC del equipo que se desea encender via Wake On Lan.
**Ejemplo de Solicitud:**
```bash
curl -X POST -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d '{"broadcast_ip":"255.255.255.255", "mac":"00:19:99:5c:bb:bb"}' http://example.com/ogrepository/v1/wol
```
**Respuestas:**
- **Código 500 Internal Server Error:** Ocurrió un error al enviar el paquete Wake On Lan.
- **Código 200 OK:** El paquete Wake On Lan se ha enviado exitosamente.
---
### Enviar una Imagen mediante UDPcast
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**: La versión actual de este 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).
**URL:** `/ogrepository/v1/udpcast`
**Método HTTP:** POST
**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.
- **ip**: IP Multicast.
- **bitrate**: Velocidad de transmisión (en Mbps).
- **nclients**: Número mínimo de clientes.
- **maxtime**: Tiempo máximo de espera.
**Ejemplo de Solicitud:**
```bash
curl -X POST -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d '{"ID_img":"image_id", "port":"9000", "method":"full", "ip":"239.194.17.2", "bitrate":"70M", "nclients":"20", "maxtime":"120"}' http://example.com/ogrepository/v1/udpcast
```
**Respuestas:**
- **Código 500 Internal Server Error:** Ocurrió un error al enviar la imagen.
- **Código 400 Bad Request:** No se ha encontrado la imagen especificada.
- **Código 200 OK:** La imagen se ha enviado exitosamente.
---
### Enviar una Imagen mediante UFTP
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**: La versión actual de este 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).
**URL:** `/ogrepository/v1/uftp`
**Método HTTP:** POST
**Cuerpo de la Solicitud (JSON):**
- **ID_img**: Identificador de la imagen (correspondiente al contenido del archivo "full.sum" asociado).
- **port**: Puerto Multicast.
- **ip**: IP Unicast/Multicast.
- **bitrate**: Velocidad de transmisión (con "K" para Kbps, "M" para Mbps o "G" para Gbps).
**Ejemplo de Solicitud:**
```bash
curl -X POST -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d '{"ID_img":"image_id", "port":"9000", "ip":"239.194.17.2", "bitrate":"1G"}' http://example.com/ogrepository/v1/uftp
```
**Respuestas:**
- **Código 500 Internal Server Error:** Ocurrió un error al enviar la imagen.
- **Código 400 Bad Request:** No se ha encontrado la imagen especificada.
- **Código 200 OK:** La imagen se ha enviado exitosamente.
---
### Enviar una Imagen mediante P2P
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**: La versión actual de estos scripts requiere que se le 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").
**URL:** `/ogrepository/v1/p2p`
**Método HTTP:** POST
**Cuerpo de la Solicitud (JSON):**
- **ID_img**: Identificador de la imagen (correspondiente al contenido del archivo "full.sum" asociado).
**Ejemplo de Solicitud:**
```bash
curl -X POST -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d '{"ID_img":"image_id"}' http://example.com/ogrepository/v1/p2p
```
**Respuestas:**
- **Código 500 Internal Server Error:** Ocurrió un error al intentar enviar la imagen.
- **Código 400 Bad Request:** No se ha encontrado la imagen especificada.
- **Código 200 OK:** La imagen se está enviando exitosamente.
---
### Ver Estado de Transmisiones UDPcast
Se devolverá el pid de los procesos de transferencias UDPcast activas, y sus imágenes asociadas (con nombre e ID), en formato JSON, o un mensaje informativo si no hay procesos activos, o si se produce un error.
Se puede hacer con el script "**getUDPcastInfo.py**", que debe ser llamado por el endpoint.
**URL:** `/ogrepository/v1/udpcast`
**Método HTTP:** GET
**Ejemplo de Solicitud:**
```bash
curl -X GET -H "Authorization: $API_KEY" http://example.com/ogrepository/v1/udpcast
```
**Respuestas:**
- **Código 500 Internal Server Error:** Ocurrió un error al comprobar las transmisiones UDPcast.
- **Código 400 Bad Request:** No se han encontrado transmisiones UDPcast activas.
- **Código 200 OK:** La información de las transmisiones UDPcast activas se obtuvo exitosamente.
- **Contenido:** Información de las transmisiones UDPcast activas en formato JSON.
```json
{
"6720": {
"image_id": "22735b9070e4a8043371b8c6ae52b90d",
"image_name": "Ubuntu20.img"
},
"6721": {
"image_id": "9e7cd32c606ebe5bd39ba212ce7aeb02",
"image_name": "Windows10.img"
}
}
```
---
### Cancelar Transmisión UDPcast
Se cancelará la transmisión por UDPcast activa de la imagen especificada como parámetro, deteniendo el proceso "udp-sender" asociado a dicha imagen.
Se puede hacer con el script "**stopUDPcast.py**", que debe ser llamado por el endpoint.
**NOTA**: La versión actual de este 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 ú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").
**URL:** `/ogrepository/v1/udpcast/images/{ID_img}`
**Método HTTP:** DELETE
**Ejemplo de Solicitud:**
```bash
curl -X DELETE -H "Authorization: $API_KEY" http://example.com/ogrepository/v1/udpcast/images/{ID_img}
```
**Respuestas:**
- **Código 500 Internal Server Error:** Ocurrió un error al cancelar la transmisión UDPcast.
- **Código 400 Bad Request:** No se ha encontrado la imagen especificada.
- **Código 400 Bad Request:** No hay transmisiones UCPcast activas para la imagen especificada.
- **Código 200 OK:** La transmisión UDPcast se ha cancelado exitosamente.
---
### Cancelar Transmisiones P2P
Se cancelarán las transmisiones P2P activas en el ogRepository al que se envíe la orden, deteniendo los procesos "bttrack" y "btlaunchmany.bittornado".
Se puede hacer con el script "**stopP2P.py**", que debe ser llamado por el endpoint.
**NOTA**: No he encontrado la forma de detener la transmisión de una imagen concreta, ya que "bttrack" y "btlaunchmany.bittornado" hacen tracking y seed (respectivamente) de todos los torrents existentes en la raíz del directorio especificado.
**URL:** `/ogrepository/v1/p2p`
**Método HTTP:** DELETE
**Ejemplo de Solicitud:**
```bash
curl -X DELETE -H "Authorization: $API_KEY" http://example.com/ogrepository/v1/p2p
```
**Respuestas:**
- **Código 500 Internal Server Error:** Ocurrió un error al cancelar las transmisiones P2P.
- **Código 200 OK:** Las transmisiones P2P se han cancelado exitosamente.
---

1008
api/repo_api.py 100644

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -16,6 +16,7 @@ En la práctica, permite comprobar las transminisones UDPcast activas, porque cu
import subprocess
import json
import sys
# --------------------------------------------------------------------------------------------
@ -31,7 +32,7 @@ repo_path = '/opt/opengnsys/images/'
def get_udpsender_processes():
""" Busca procesos de "udp-sender", y si los encuentra retorna el pid y la imagen asociada de cada uno de ellos, en un diccionario.
""" Busca procesos de "udp-sender", y si los encuentra retorna el pid, el ID, y la imagen asociada de cada uno de ellos, en un diccionario.
Si no encuentra ningun proceso, o si se produce un error, retorna un mensaje.
"""
try:
@ -44,12 +45,17 @@ def get_udpsender_processes():
# Si hemos encontrado procesos de udp-sender creamos un diccionario para almacenarlos:
if process_list != []:
result_dict = {}
# Iteramos los procesos y extraemos el pid y el nombre de la imagen de cada uno,
# los almacenamos en el diccionario, y retornamos este:
# Iteramos los procesos y extraemos el pid, el nombre de la imagen (con subdirectorio de OU, si es el caso), y la ruta de la imagen de cada uno:
for process in process_list:
pid = process.split()[1]
image = process.split(repo_path)[1]
result_dict[pid] = {'image':image}
image_name = process.split(repo_path)[1]
image_path = process.split('--file ')[1]
# Obtenemos el ID de la imagen actual:
with open(f"{image_path}.full.sum", 'r') as file:
image_id = file.read().strip('\n')
# Creamos una clave en el diccionario de resultados, correspondiente a la imagen actual:
result_dict[pid] = {'image_id':image_id, 'image_name':image_name}
# Retornamos el diccionario de resultados:
return result_dict
# Si no hemos encontrado procesos de udp-sender retrornamos un mensaje:
else:
@ -71,11 +77,13 @@ def main():
# Obtenemos información sobre los procesos de udp-sender:
results = get_udpsender_processes()
# Si no hay procesos activos, o si se ha producido un error, imprimimos un mensaje explicativo:
# Si no hay procesos activos, o si se ha producido un error, imprimimos un mensaje explicativo, y salimos del script:
if results == "udp-sender process not found":
print("No UDPcast active transmissions")
sys.exit(1)
elif results == "Unexpected error":
print("Unexpected error checking UDPcast transmissions")
sys.exit(2)
# Si hay procesos activos, convertimos el diccionario de resultados a JSON, e imprimimos este:
else:
json_data = json.dumps(results, indent=4)

Binary file not shown.