|
||
---|---|---|
admin/Sources/Services | ||
bin | ||
etc | ||
py_scripts | ||
LICENSE.en.txt | ||
README.md |
README.md
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 ----------- Binarios y scripts de gestión del repositorio.
- etc ----------- Ficheros y plantillas de configuración del repositorio.
- py_scripts --- Scripts en Python 3, algunos de los cuales son traducciones de los scripts bash situados en "bin".
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:
- Obtener Información de todas las Imágenes -
GET /ogrepository/v1/images/get-info
- Obtener Información de una Imagen concreta -
GET /ogrepository/v1/images/get-info
- Actualizar Información del Repositorio -
PUT /ogrepository/v1/images
- Chequear integridad de Imagen -
GET /ogrepository/v1/images/check-image
- Eliminar una Imagen -
DELETE /ogrepository/v1/images/delete-image
- Recuperar una Imagen -
POST /ogrepository/v1/images/recover-image
- Importar una Imagen -
POST /ogrepository/v1/images/import-image
- Crear archivos auxiliares -
POST /ogrepository/v1/images/create-torrentsum
- Enviar paquete Wake On Lan -
POST /ogrepository/v1/images/send-wol
- Iniciar el Tracker P2P -
POST /ogrepository/v1/images/run-tracker
- Iniciar el Seeder P2P -
POST /ogrepository/v1/images/run-seeder
- Enviar una Imagen mediante UDPcast -
POST /ogrepository/v1/images/send-udpcast
- Enviar una Imagen mediante UFTP -
POST /ogrepository/v1/images/send-uftp
- Ver Estado de Transmisiones Multicast-P2P -
- Cancelar Transmisión Multicast-P2P -
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 hemos programado recientemente.
URL: /ogrepository/v1/images/get-info
Método HTTP: GET
Cuerpo de la Solicitud (JSON):
- image: Nombre de la imagen (con extensión), pero en este caso "all".
- ou_subdir: Subdirectorio correspondiente a la OU, pero en este caso "none".
Ejemplo de Solicitud:
curl -X GET -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d '{"image":"all","ou_subdir":"none"}' http://example.com/ogrepository/v1/images/get-info
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.
{ "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.
- Contenido: Información de imágenes en formato JSON.
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 hemos programado recientemente.
URL: /ogrepository/v1/images/get-info
Método HTTP: GET
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:
curl -X GET -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d '{"image":"Windows10.img","ou_subdir":"none"}' http://example.com/ogrepository/v1/images/get-info
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.
{ "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.
- Contenido: Información de la imagen en formato JSON.
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 hemos programado recientemente (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:
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: En lugar del archivo ".sum", se podría usar el archivo ".full.sum" (que contiene el hash MD5 de todo el archivo), pero en ese caso la comprobación tardaría un poco, dependiendo del tamaño de la imagen.
URL: /ogrepository/v1/images/check-image
Método HTTP: GET
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:
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/check-image
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 hemos programado recientemente (y que incluye la funcionalidad "papelera"), y que a su vez llama al script "updateRepoInfo.py", para actualizar la información del repositorio.
URL: /ogrepository/v1/images/delete-image
Método HTTP: DELETE
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).
- method: Método de eliminación (puede ser "trash" o "permanent").
Ejemplo de Solicitud:
curl -X DELETE -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d '{"image":"Windows10.img", "ou_subdir":"none", "method":"trash"}' http://example.com/ogrepository/v1/images/delete-image
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 hemos programado recientemente, y que a su vez llama al script "updateRepoInfo.py", para actualizar la información del repositorio.
URL: /ogrepository/v1/images/recover-image
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:
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/recover-image
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.
Importar una Imagen
Se importará una imagen de un repositorio remoto al repositorio local.
Se puede hacer con el script "importImage.py", que hemos programado recientemente.
URL: /ogrepository/v1/images/import-image
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 o hostname del repositorio remoto.
- user: Usuario con el que acceder al repositorio remoto.
Ejemplo de Solicitud:
curl -X POST -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d '{"image":"Windows10.img", "ou_subdir":"none", "repo":"192.168.56.100", "user":"user_name"}' http://example.com/ogrepository/v1/images/import-image
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.
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 hemos programado recientemente.
URL: /ogrepository/v1/images/create-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:
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/create-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 hemos programado recientemente.
URL: /ogrepository/v1/images/send-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:
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/images/send-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.
Iniciar el Tracker P2P
Se iniciará el tracker "bttrack" (o se reiniciará, en el caso de que ya estuviera iniciado), para hacer tracking de los torrents almacenados en el directorio de imágenes de ogRepository.
Se puede hacer con el script "runTorrentTracker.py", que hemos programado recientemente.
NOTA: Actualmente esto se hace automáticamente, al iniciar ogRepopository (desde el script "/etc/init.d/opengnsys"), pero creemos que solo debe hacerse cuando se solicite una descarga P2P.
URL: /ogrepository/v1/images/run-tracker
Método HTTP: POST
Ejemplo de Solicitud:
curl -X POST -H "Authorization: $API_KEY" http://example.com/ogrepository/v1/images/run-tracker
Respuestas:
- Código 500 Internal Server Error: Ocurrió un error al iniciar el tracker.
- Código 200 OK: El tracker se ha iniciado exitosamente.
Iniciar el Seeder P2P
Se iniciará el seeder "bittornado" (o se reiniciará, en el caso de que ya estuviera iniciado), para hacer seed de los torrents almacenados en la raíz del directorio de imágenes de ogRepository (o en el subidrectorio de OU que se especifique).
Se puede hacer con el script "runTorrentSeeder.py", que hemos programado recientemente.
NOTA: Actualmente esto se hace automáticamente, al iniciar ogRepopository (desde el script "/etc/init.d/opengnsys"), pero creemos que solo debe hacerse cuando se solicite una descarga P2P.
URL: /ogrepository/v1/images/run-seeder
Método HTTP: POST
Cuerpo de la Solicitud (JSON):
- ou_subdir: Subdirectorio correspondiente a la OU (o "none" si no es el caso).
Ejemplo de Solicitud:
curl -X POST -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d '{"ou_subdir":"none"}' http://example.com/ogrepository/v1/images/run-seeder
Respuestas:
- Código 500 Internal Server Error: Ocurrió un error al iniciar el seeder.
- Código 200 OK: El seeder se ha iniciado exitosamente.
Enviar una Imagen mediante UDPcast
Se enviará una imagen 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.
URL: /ogrepository/v1/images/send-udpcast
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).
- 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:
curl -X POST -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d '{"image":"Windows10.img", "ou_subdir":"none", "port":"9000", "method":"full", "ip":"239.194.17.2", "bitrate":"70M", "nclients":"20", "maxtime":"120"}' http://example.com/ogrepository/v1/images/send-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á una imagen 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").
NOTA: Los envíos mediante "UFTP" funcionan al revés que los envíos mediante "UDPcast" (con este último, primero se debe ejecutar un comando en el servidor, y luego en los clientes).
URL: /ogrepository/v1/images/send-uftp
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).
- 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:
curl -X POST -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d '{"image":"Windows10.img", "ou_subdir":"none", "port":"9000", "ip":"239.194.17.2", "bitrate":"1G"}' http://example.com/ogrepository/v1/images/send-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.
Ver Estado de Transmisiones Multicast-P2P
Se devolverá información del estado de las transmisiones existentes, con un identificador de cada sesión multicast o P2P, y la imagen asociada.
Se debe estudiar como realizar esta tarea para cada uno de los protocolos de transmisión, ya que cada uno tiene sus particularidades, y habitualmente no tienen comandos asociados para comprobar el estado de las transmisiones.
Y tampoco está claro qué protocolo se utilizará para transimisiones Multicast (¿"UDPcast", "UFTP", o ambos?), ni qué programas se utilizarán para P2P (¿"ctorrent/bttrack" u "opentracker/Transmission"?).
NOTA: Posiblemente deba crearse un endpoint específico para cada uno de los protocolos que se utilicen.
Cancelar Transmisión Multicast-P2P
Se cancelará la transmisión Multicast o P2P cuyo identificador se especifique como parámetro.
Aunque cancelar una transmisión Multicast o P2P es una tarea sencilla (independientemente del protocolo o programa que se utilice), en principio deberá crearse un script para cada uno de ellos.
Y la definición del endpoint depende de como se defina el endpoint anterior ("Ver Estado de Transmisiones Multicast-P2P"), ya que será el que determine cómo se especifica el identificador de la transmisión.