swagger: "2.0" info: title: "OgRepository API" version: "1.0" description: | --- **API de ogRepository, programada en Flask**. Responde a peticiones HTTP mediante endpoints, que a su vez ejecutan los scripts de Python 3 almacenados en ogRepository. En el entorno real, estas peticiones HTTP se enviarán desde ogCore. En la mayoría de los casos, transforma los parámetros recibidos 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). --- Paquetes APT requeridos: - **uftp** (se puede instalar con "sudo DEBIAN_FRONTEND=noninteractive apt install uftp -y", para que no pida la ruta predeterminada) - **udpcast** (se puede instalar con "sudo apt install ./udpcast_20230924_amd64.deb", apuntando al paquete) - **ctorrent** (se puede instalar con "sudo apt install ctorrent") - **bittorrent** (se puede instalar con "sudo apt install bittorrent", pero previamente hay que añadir un repositorio de Debian) - **bittornado** (se puede instalar con "sudo apt install bittornado", pero previamente hay que añadir un repositorio de Debian) Librerías Python requeridas: - **flask** (se puede instalar con "sudo apt install python3-flask") - **paramiko** (se puede instalar con "sudo apt install python3-paramiko") - **psutil** (se puede instalar con "sudo apt install python3-psutil") - **flasgger** (se puede instalar con "sudo apt install python3-flasgger") Para que todos los endpoints de la API funcionen con la configuración actual deben existir los siguientes directorios: - **/opt/opengnsys/ogrepository/images/** - **/opt/opengnsys/ogrepository/images_trash/** (debe estar en la misma partición que el anterior, o tardarán mucho las eliminaciones y restauraciones) - **/opt/opengnsys/ogrepository/bin/** (aquí deben estar todos los scripts de Python, y el binario "udp-sender") - **/opt/opengnsys/ogrepository/etc/** (aquí se guardan los archivos "repoinfo.json" y "trashinfo.json") - **/opt/opengnsys/ogrepository/log/** (aquí se guardan los logs) Y también debe existir el siguiente archivo: - **/opt/opengnsys/ogrepository/etc/ogAdmRepo.cfg** (de aquí pilla la IP de ogRepository) --- # ----------------------------------------------------------------------------------------------------------- # Esto hace que el Swagger se ordene por los tags (apartados), de la forma especificada: tags: - name: "Estado de ogRepository" - name: "Información de Imágenes" - name: "Eliminar y Recuperar Imágenes" - name: "Transferencia de Imágenes (UDPcast)" - name: "Transferencia de Imágenes (UFTP)" - name: "Transferencia de Imágenes (P2P)" - name: "Importar y Exportar Imágenes" - name: "Varios" # ----------------------------------------------------------------------------------------------------------- # Apartado "Estado de ogRepository" # ----------------------------------------------------------------------------------------------------------- paths: /ogrepository/v1/status: get: summary: "Obtener Información de Estado de ogRepository" description: > Este endpoint ejecuta el script "**getRepoStatus.py**" y devuelve su salida en formato JSON, incluyendo información sobre la CPU, memoria RAM, disco duro, servicios, y procesos específicos de ogRepository. tags: - "Estado de ogRepository" responses: "200": description: "La información de estado se obtuvo exitosamente." schema: type: object properties: success: type: boolean example: true output: type: object properties: cpu: type: object properties: used_percentage: type: string example: "35%" ram: type: object properties: total: type: string example: "7.8GB" used: type: string example: "0.3GB" available: type: string example: "7.2GB" used_percentage: type: string example: "7%" disk: type: object properties: total: type: string example: "11.7GB" used: type: string example: "7.7GB" available: type: string example: "3.4GB" used_percentage: type: string example: "69%" services: type: object properties: ssh: type: string example: "active" smbd: type: string example: "active" rsync: type: string example: "active" processes: type: object properties: udp-sender: type: string example: "stopped" uftp: type: string example: "stopped" bttrack: type: string example: "stopped" btlaunchmany: type: string example: "stopped" "500 (Error)": description: "Error al consultar y/o devolver la información de estado." schema: type: object properties: success: type: boolean example: false error: type: string example: "(Error description)" "500 (Exception)": description: "Excepción inesperada al consultar y/o devolver la información de estado." schema: type: object properties: success: type: boolean example: false exception: type: string example: "(Exception description)" # ----------------------------------------------------------------------------------------------------------- # Apartado "Información de Imágenes" # ----------------------------------------------------------------------------------------------------------- /ogrepository/v1/images: put: summary: "Actualizar Información del Repositorio" description: | Este endpoint actualiza la información de las imágenes almacenadas en el repositorio, reflejándola en los archivos "**repoinfo.json**" y "**trashinfo.json**". Utiliza el script "**updateRepoInfo.py**", que a su vez llama al script "**updateTrashInfo.py**", para actualizar también la información de la papelera. No hace falta que se le llame al crear o exportar una imagen, ya que lo llama el endpoint "**Crear archivos auxiliares**" (que sí debe ser llamado en esos casos). tags: - "Información de Imágenes" responses: "200": description: "La actualización de la información de las imágenes se realizó exitosamente." schema: type: object properties: success: type: boolean example: true output: type: string example: "Repository info updated successfully" "500 (Error)": description: "Error al actualizar la información de las imágenes." schema: type: object properties: success: type: boolean example: false error: type: string example: "(Error description)" "500 (Exception)": description: "Excepción inesperada al actualizar la información de las imágenes." schema: type: object properties: success: type: boolean example: false exception: type: string example: "(Exception description)" # ----------------------------------------------------------------------------------------------------------- #/ogrepository/v1/images: get: summary: "Obtener Información de todas las Imágenes" description: | Este endpoint ejecuta el script "**getRepoInfo.py**" con los parámetros "**all**" y "**none**" para devolver información de todas las imágenes almacenadas en el repositorio y en la papelera. Devuelve detalles como el nombre de la imagen, tipo, nombre del cliente, clonador, compresor, sistema de archivos, tamaño de los datos, tamaño de la imagen, y hashes MD5. tags: - "Información de Imágenes" responses: "200": description: "La información de las imágenes se obtuvo exitosamente." schema: type: object properties: success: type: boolean example: true output: type: object properties: REPOSITORY: type: object properties: directory: type: string example: "/opt/opengnsys/ogrepository/images" images: type: array items: type: object properties: name: type: string example: "Ubuntu24" type: type: string example: "img" clientname: type: string example: "Ubuntu_24" clonator: type: string example: "partclone" compressor: type: string example: "lzop" filesystem: type: string example: "EXTFS" datasize: type: integer example: 9859634200000 size: type: integer example: 4505673214 sum: type: string example: "065a933c780ab1aaa044435ad5d4bf87" fullsum: type: string example: "33575b9070e4a8043371b8c6ae52b80e" ous: type: array items: type: object properties: subdir: type: string example: "OU_subdir" images: type: array items: type: object properties: name: type: string example: "Ubuntu20" type: type: string example: "img" clientname: type: string example: "Ubuntu_20" clonator: type: string example: "partclone" compressor: type: string example: "lzop" filesystem: type: string example: "EXTFS" datasize: type: integer example: 8912896000000 size: type: integer example: 3803794535 sum: type: string example: "081a933c780ab1aaa044435ad5d4bf56" fullsum: type: string example: "22735b9070e4a8043371b8c6ae52b90d" TRASH: type: object properties: directory: type: string example: "/opt/opengnsys/ogrepository/images_trash" images: type: array items: type: object ous: type: array items: type: object properties: subdir: type: string example: "CentroVirtual" images: type: array items: type: object properties: name: type: string example: "Ubuntu20OLD" type: type: string example: "img" clientname: type: string example: "Ubuntu_20" clonator: type: string example: "partclone" compressor: type: string example: "lzop" filesystem: type: string example: "EXTFS" datasize: type: integer example: 8912896000000 size: type: integer example: 3803794535 sum: type: string example: "081a933c780ab1aaa044435ad5d4bf56" fullsum: type: string example: "22735b9070e4a8043371b8c6ae52b90d" "500 (Error)": description: "Error al consultar y/o devolver la información de las imágenes." schema: type: object properties: success: type: boolean example: false error: type: string example: "(Error description)" "500 (Exception)": description: "Excepción inesperada al consultar y/o devolver la información de las imágenes." schema: type: object properties: success: type: boolean example: false exception: type: string example: "(Exception description)" # ----------------------------------------------------------------------------------------------------------- /ogrepository/v1/images/{imageId}: get: summary: "Obtener Información de una Imagen concreta" description: | Este endpoint devuelve información de la imagen especificada mediante su ID, en formato JSON. Utiliza el script "**getRepoInfo.py**" que recibe como parámetros el nombre de la imagen con extensión y el subdirectorio correspondiente a la OU (o "none" si no es el caso). La imagen puede estar en el archivo "**repoinfo.json**" (si está almacenada en el repositorio) o en "**trashinfo.json**" (si está en la papelera). tags: - "Información de Imágenes" parameters: - name: imageId in: path required: true type: string description: "Identificador de la imagen (correspondiente al contenido del archivo 'full.sum')" responses: "200": description: "La información de la imagen se obtuvo exitosamente." schema: type: object properties: success: type: boolean example: true output: type: object properties: directory: type: string example: "/opt/opengnsys/ogrepository/images" images: type: array items: type: object properties: name: type: string example: "Windows10" type: type: string example: "img" clientname: type: string example: "Windows_10" clonator: type: string example: "partclone" compressor: type: string example: "lzop" filesystem: type: string example: "NTFS" datasize: type: integer example: 9859634200000 size: type: integer example: 4505673214 sum: type: string example: "065a933c780ab1aaa044435ad5d4bf87" fullsum: type: string example: "33575b9070e4a8043371b8c6ae52b80e" "400": description: "No se ha encontrado la imagen especificada." schema: type: object properties: success: type: boolean example: false error: type: string example: "Image not found" "500 (Error)": description: "Error al consultar y/o devolver la información de la imagen." schema: type: object properties: success: type: boolean example: false error: type: string example: "(Error description)" "500 (Exception)": description: "Excepción inesperada al consultar y/o devolver la información de la imagen." schema: type: object properties: success: type: boolean example: false exception: type: string example: "(Exception description)" # ----------------------------------------------------------------------------------------------------------- /ogrepository/v1/status/images/{imageId}: get: summary: "Chequear Integridad de Imagen" description: | Este endpoint comprueba la integridad de la imagen especificada como parámetro, comparando el tamaño y el hash MD5 del último MB con los valores almacenados en los archivos ".size" y ".sum". Utiliza el script "**checkImage.py**", que recibe el nombre de la imagen (con extensión) y el subdirectorio correspondiente a la OU, si aplica. tags: - "Información de Imágenes" parameters: - name: imageId in: path required: true type: string description: "Identificador de la imagen (correspondiente al contenido del archivo 'full.sum')" responses: "200 (Check OK)": description: "La imagen se ha chequeado exitosamente." schema: type: object properties: success: type: boolean example: true output: type: string example: "Image file passed the Integrity Check correctly" "200 (Check KO)": description: "La imagen se ha chequeado exitosamente, pero no ha pasado el test de integridad." schema: type: object properties: success: type: boolean example: true output: type: string example: "Image file didn't pass the Integrity Check" "400": description: "No se ha encontrado la imagen especificada." schema: type: object properties: success: type: boolean example: false error: type: string example: "Image not found (inexistent or deleted)" "500 (Error)": description: "Error al chequear la integridad de la imagen." schema: type: object properties: success: type: boolean example: false error: type: string example: "(Error description)" "500 (Exception)": description: "Excepción inesperada al chequear la integridad de la imagen." schema: type: object properties: success: type: boolean example: false exception: type: string example: "(Exception description)" # ----------------------------------------------------------------------------------------------------------- # Apartado "Eliminar y Recuperar Imágenes" # ----------------------------------------------------------------------------------------------------------- /ogrepository/v1/images/{imageId}?method={method}: delete: summary: "Eliminar una Imagen" description: | Este endpoint elimina la imagen especificada como parámetro (y todos sus archivos asociados), moviéndolos a la papelera o eliminándolos permanentemente (dependiendo del parámetro "method"). Utiliza el script "**deleteImage.py**" que recibe el nombre de la imagen (con extensión y subdirectorio correspondiente a la OU, si aplica) como primer parámetro, y opcionalmente el parámetro "-p" (para eliminación permanente), que a su vez llama al script "**updateRepoInfo.py**", para actualizar la información del repositorio. tags: - "Eliminar y Recuperar Imágenes" parameters: - name: imageId in: path required: true type: string description: "Identificador de la imagen (correspondiente al contenido del archivo 'full.sum')" - name: method in: query required: true type: string description: "Método de eliminación (puede ser 'trash', para enviar la imagen a la papelera, o 'permanent', para eliminarla definitivamente)" responses: "200": description: "La imagen se eliminó exitosamente." schema: type: object properties: success: type: boolean example: true output: type: string example: "Image deleted successfully" "400": description: "No se ha encontrado la imagen especificada." schema: type: object properties: success: type: boolean example: false error: type: string example: "Image not found (inexistent or deleted)" "500 (Error)": description: "Error al eliminar la imagen." schema: type: object properties: success: type: boolean example: false error: type: string example: "(Error description)" "500 (Exception)": description: "Excepción inesperada al eliminar la imagen." schema: type: object properties: success: type: boolean example: false exception: type: string example: "(Exception description)" # ----------------------------------------------------------------------------------------------------------- /ogrepository/v1/trash/images: post: summary: "Recuperar una Imagen" description: | Este endpoint recupera la imagen especificada, moviéndola desde la papelera al repositorio de imágenes. Utiliza el script "**recoverImage.py**", que recibe el nombre de la imagen (con extensión y subdirectorio correspondiente a la OU, si aplica), que a su vez llama al script "**updateRepoInfo.py**", para actualizar la información del repositorio. tags: - "Eliminar y Recuperar Imágenes" parameters: - name: JSON in: body required: true description: | * **ID_img** - Identificador de la imagen, correspondiente al contenido del archivo 'full.sum' schema: type: object properties: ID_img: type: string example: "22735b9070e4a8043371b8c6ae52b90d" responses: "200": description: "La imagen se recuperó exitosamente." schema: type: object properties: success: type: boolean example: true output: type: string example: "Image recovered successfully" "400": description: "No se ha encontrado la imagen especificada." schema: type: object properties: success: type: boolean example: false error: type: string example: "Image not found (inexistent or recovered previously)" "500 (Error)": description: "Error al recuperar la imagen." schema: type: object properties: success: type: boolean example: false error: type: string example: "(Error description)" "500 (Exception)": description: "Excepción inesperada al recuperar la imagen." schema: type: object properties: success: type: boolean example: false exception: type: string example: "(Exception description)" # ----------------------------------------------------------------------------------------------------------- /ogrepository/v1/trash/images/{imageId}: delete: summary: "Eliminar una Imagen de la Papelera" description: | Este endpoint elimina permanentemente la imagen especificada, desde la papelera. Utiliza el script "**deleteTrashImage.py**", que recibe el nombre de la imagen (con extensión y subdirectorio correspondiente a la OU, si aplica), que a su vez llama al script "**updateTrashInfo.py**", para actualizar la información de la papelera. tags: - "Eliminar y Recuperar Imágenes" parameters: - name: imageId in: path required: true type: string description: "Identificador de la imagen (correspondiente al contenido del archivo 'full.sum')" responses: "200": description: "La imagen se eliminó exitosamente." schema: type: object properties: success: type: boolean example: true output: type: string example: "Image deleted successfully" "400": description: "No se ha encontrado la imagen especificada en la papelera." schema: type: object properties: success: type: boolean example: false error: type: string example: "Image not found at trash" "500 (Error)": description: "Error al eliminar la imagen de la papelera." schema: type: object properties: success: type: boolean example: false error: type: string example: "(Error description)" "500 (Exception)": description: "Excepción inesperada al eliminar la imagen de la papelera." schema: type: object properties: success: type: boolean example: false exception: type: string example: "(Exception description)" # ----------------------------------------------------------------------------------------------------------- # Apartado "Transferencia de Imágenes (UDPcast)" # ----------------------------------------------------------------------------------------------------------- /ogrepository/v1/udpcast: post: summary: "Enviar una Imagen mediante UDPcast" description: | 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 (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: - name: JSON in: body required: true description: | * **ID_img** - Identificador de la imagen, correspondiente al contenido del archivo 'full.sum' * **port** - Puerto Multicast * **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 * **maxtime** - Tiempo máximo de espera schema: type: object properties: ID_img: type: string example: "22735b9070e4a8043371b8c6ae52b90d" port: type: string description: "Puerto Multicast a utilizar para la transmisión" example: "9000" method: type: string description: "Modalidad de transmisión (puede ser 'half' o 'full' para half-duplex o full-duplex)" example: "full" ip: type: string description: "IP Multicast a la que se enviará la imagen" example: "239.194.17.2" bitrate: type: string description: "Velocidad de transmisión en Mbps" example: "70M" nclients: type: integer description: "Número mínimo de clientes" example: 20 maxtime: type: integer description: "Tiempo máximo de espera en segundos" example: 120 responses: "200": description: "La imagen se está enviando mediante UDPcast." schema: type: object properties: success: type: boolean example: true output: type: string example: "Sending image.." "400": description: "No se ha encontrado la imagen especificada." schema: type: object properties: success: type: boolean example: false error: type: string example: "Image not found" "500 (Error)": description: "Error al enviar la imagen mediante UDPcast." schema: type: object properties: success: type: boolean example: false error: type: string example: "Image send failed" "500 (Exception)": description: "Excepción inesperada al enviar la imagen mediante UDPcast." schema: type: object properties: success: type: boolean example: false exception: type: string example: "(Exception description)" # ----------------------------------------------------------------------------------------------------------- #/ogrepository/v1/udpcast: get: summary: "Ver Estado de Transmisiones UDPcast" description: | Este endpoint devuelve información sobre los procesos activos de "**udp-sender**" en formato JSON, permitiendo comprobar las transferencias UDPcast activas. Utiliza el script "**getUDPcastInfo.py**" para obtener esta información. tags: - "Transferencia de Imágenes (UDPcast)" responses: "200": description: "La información de las transmisiones UDPcast activas se obtuvo exitosamente." schema: type: object properties: success: type: boolean example: true output: type: object additionalProperties: type: object properties: image_id: type: string example: "22735b9070e4a8043371b8c6ae52b90d" image_name: type: string example: "Ubuntu20.img" "400": description: "No se han encontrado transmisiones UDPcast activas." schema: type: object properties: success: type: boolean example: false exception: type: string example: "No UDPCast active transmissions" "500 (Error)": description: "Error al comprobar las transmisiones UDPcast activas." schema: type: object properties: success: type: boolean example: false error: type: string example: "(Error description)" "500 (Exception)": description: "Excepción inesperada al comprobar las transmisiones UDPcast activas." schema: type: object properties: success: type: boolean example: false exception: type: string example: "(Exception description)" # ----------------------------------------------------------------------------------------------------------- /ogrepository/v1/udpcast/images/{imageId}: delete: summary: "Cancelar Transmisión UDPcast" description: | Este endpoint cancela la transmisión UDPcast activa de la imagen especificada, deteniendo el proceso "**udp-sender**" asociado. Utiliza el script "**stopUDPcast.py**" para finalizar la transmisión. tags: - "Transferencia de Imágenes (UDPcast)" parameters: - name: imageId in: path required: true type: string description: "Identificador de la imagen (correspondiente al contenido del archivo 'full.sum')" responses: "200": description: "La transmisión UDPcast se ha cancelado exitosamente." schema: type: object properties: success: type: boolean example: true output: type: string example: "Image transmission canceled successfully" "400 (Image not found)": description: "No se ha encontrado la imagen especificada." schema: type: object properties: success: type: boolean example: false exception: type: string example: "Image not found" "400 (No transmissions for image)": description: "No hay transmisiones UDPcast activas para la imagen especificada." schema: type: object properties: success: type: boolean example: false exception: type: string example: "No UDPCast active transmissions for specified image" "500 (Error)": description: "Error al cancelar la transmisión UDPcast." schema: type: object properties: success: type: boolean example: false error: type: string example: "(Error description)" "500 (Check Exception)": description: "Error al verificar las transmisiones UDPcast activas." schema: type: object properties: success: type: boolean example: false exception: type: string example: "Unexpected error checking UDPcast transmissions" "500 (Finalize Exception)": description: "Error inesperado al finalizar la transmisión UDPcast." schema: type: object properties: success: type: boolean example: false exception: type: string example: "Unexpected error finalizing UDPcast transmission" "500 (General Exception)": description: "Excepción inesperada al cancelar la transmisión UDPcast." schema: type: object properties: success: type: boolean example: false exception: type: string example: "(Exception description)" # ----------------------------------------------------------------------------------------------------------- # Apartado "Transferencia de Imágenes (UFTP)" # ----------------------------------------------------------------------------------------------------------- /ogrepository/v1/uftp: post: summary: "Enviar una Imagen mediante UFTP" description: | Este endpoint envía una imagen especificada a través de UFTP, utilizando el script "**sendFileUFTP.py**". 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 (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: - name: JSON in: body required: true description: | * **ID_img** - Identificador de la imagen, correspondiente al contenido del archivo 'full.sum' * **port** - Puerto Multicast * **ip** - IP Unicast/Multicast), * **bitrate** - Velocidad de transmisión, con 'K' para Kbps, 'M' para Mbps o 'G' para Gbps schema: type: object properties: ID_img: type: string example: "22735b9070e4a8043371b8c6ae52b90d" port: type: string description: "Puerto para la transmisión UFTP" example: "9000" ip: type: string description: "IP Unicast o Multicast para la transmisión" example: "239.194.17.2" bitrate: type: string description: "Velocidad de transmisión (con 'K' para Kbps, 'M' para Mbps, o 'G' para Gbps)" example: "1G" responses: "200": description: "La imagen se está enviando mediante UFTP." schema: type: object properties: success: type: boolean example: true output: type: string example: "Sending image..." "400": description: "No se ha encontrado la imagen especificada." schema: type: object properties: success: type: boolean example: false error: type: string example: "Image not found" "500 (Error)": description: "Error al enviar la imagen mediante UFTP." schema: type: object properties: success: type: boolean example: false error: type: string example: "Image send failed" "500 (Exception)": description: "Excepción inesperada al enviar la imagen mediante UFTP." schema: type: object properties: success: type: boolean example: false exception: type: string example: "(Exception description)" # ----------------------------------------------------------------------------------------------------------- #/ogrepository/v1/uftp: get: summary: "Ver Estado de Transmisiones UFTP" description: | Este endpoint devuelve información sobre los procesos activos de "**uftp**" en formato JSON, permitiendo comprobar las transferencias UFTP activas. Utiliza el script "**getUFTPInfo.py**" para obtener esta información. tags: - "Transferencia de Imágenes (UFTP)" responses: "200": description: "La información de las transmisiones UFTP activas se obtuvo exitosamente." schema: type: object properties: success: type: boolean example: true output: type: object additionalProperties: type: object properties: image_id: type: string example: "22735b9070e4a8043371b8c6ae52b90d" image_name: type: string example: "Ubuntu20.img" "400": description: "No se han encontrado transmisiones UFTP activas." schema: type: object properties: success: type: boolean example: false exception: type: string example: "No UFTP active transmissions" "500 (Error)": description: "Error al comprobar las transmisiones UFTP activas." schema: type: object properties: success: type: boolean example: false error: type: string example: "(Error description)" "500 (Exception)": description: "Excepción inesperada al comprobar las transmisiones UFTP activas." schema: type: object properties: success: type: boolean example: false exception: type: string example: "(Exception description)" # ----------------------------------------------------------------------------------------------------------- /ogrepository/v1/uftp/images/{imageId}: delete: summary: "Cancelar Transmisión UFTP" description: | Este endpoint cancela la transmisión UFTP activa de una imagen especificada, deteniendo el proceso "**uftp**" asociado. Utiliza el script "**stopUFTP.py**" para finalizar la transmisión. tags: - "Transferencia de Imágenes (UFTP)" parameters: - name: imageId in: path required: true type: string description: "Identificador de la imagen (correspondiente al contenido del archivo 'full.sum')" responses: "200": description: "La transmisión UFTP se ha cancelado exitosamente." schema: type: object properties: success: type: boolean example: true output: type: string example: "Image transmission canceled successfully" "400 (Image not found)": description: "No se ha encontrado la imagen especificada." schema: type: object properties: success: type: boolean example: false exception: type: string example: "Image not found" "400 (No transmissions for image)": description: "No hay transmisiones UFTP activas para la imagen especificada." schema: type: object properties: success: type: boolean example: false exception: type: string example: "No UFTP active transmissions for specified image" "500 (Error)": description: "Error al cancelar la transmisión UFTP." schema: type: object properties: success: type: boolean example: false error: type: string example: "(Error description)" "500 (Check Exception)": description: "Error al verificar las transmisiones UFTP activas." schema: type: object properties: success: type: boolean example: false exception: type: string example: "Unexpected error checking UFTP transmissions" "500 (Finalize Exception)": description: "Error inesperado al finalizar la transmisión UFTP." schema: type: object properties: success: type: boolean example: false exception: type: string example: "Unexpected error finalizing UFTP transmission" "500 (General Exception)": description: "Excepción inesperada al cancelar la transmisión UFTP." schema: type: object properties: success: type: boolean example: false exception: type: string example: "(Exception description)" # ----------------------------------------------------------------------------------------------------------- # Apartado "Transferencia de Imágenes (P2P)" # ----------------------------------------------------------------------------------------------------------- /ogrepository/v1/p2p: post: summary: "Enviar una Imagen mediante P2P" description: | 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 (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: - name: JSON in: body required: true description: | * **ID_img** - Identificador de la imagen, correspondiente al contenido del archivo 'full.sum' schema: type: object properties: ID_img: type: string example: "22735b9070e4a8043371b8c6ae52b90d" responses: "200": description: "La imagen se está enviando mediante P2P." schema: type: object properties: success: type: boolean example: true output: type: string example: "Tracker and Seeder serving image correctly" "400": description: "No se ha encontrado la imagen especificada." schema: type: object properties: success: type: boolean example: false error: type: string example: "Image not found" "500": description: "Error al enviar la imagen mediante P2P." schema: type: object properties: success: type: boolean example: false error: type: string example: "Tracker or Seeder (or both) not running" # ----------------------------------------------------------------------------------------------------------- #/ogrepository/v1/p2p: delete: summary: "Cancelar Transmisiones P2P" description: | Este endpoint cancela todas las transmisiones P2P activas, finalizando los procesos "**bttrack**" (tracker) y "**btlaunchmany.bittornado**" (seeder). Utiliza el script "**stopP2P.py**" para detener las transmisiones P2P activas en el servidor. tags: - "Transferencia de Imágenes (P2P)" responses: "200": description: "Las transmisiones P2P se han cancelado exitosamente." schema: type: object properties: success: type: boolean example: true output: type: string example: "P2P transmissions canceled successfully" "500 (Error)": description: "Error al cancelar las transmisiones P2P." schema: type: object properties: success: type: boolean example: false error: type: string example: "(Error description)" "500 (Exception)": description: "Excepción inesperada al cancelar las transmisiones P2P." schema: type: object properties: success: type: boolean example: false exception: type: string example: "(Exception description)" # ----------------------------------------------------------------------------------------------------------- # Apartado "Importar y Exportar Imágenes" # ----------------------------------------------------------------------------------------------------------- /ogrepository/v1/repo/images: post: summary: "Importar una Imagen" description: | Este endpoint importa la imagen especificada desde un servidor remoto al servidor local. Utiliza el script "**importImage.py**", que recibe como parámetros el nombre de la imagen, la IP o hostname del servidor remoto, el usuario para la conexión, y el subdirectorio correspondiente a la OU (si aplica), que a su vez llama al script "**updateRepoInfo.py**", para actualizar la información del repositorio. **NOTA**: Este endpoint es asíncrono, ya que puede tardar mucho tiempo, por lo que solo informa de que la imagen se está importando, y abre un proceso paralelo, que avisará a ogCore cuando finalice la tarea (llamando a un endpoint de ogCore). tags: - "Importar y Exportar Imágenes" parameters: - name: JSON in: body required: true description: | * **image** - Nombre de la imagen, con extensión * **ou_subdir** - Subdirectorio correspondiente a la OU, o 'none' si no procede * **repo_ip** - Dirección IP del servidor remoto * **user** - Usuario con el que conectar al servidor remoto schema: type: object properties: image: type: string example: "Windows10.img" ou_subdir: type: string description: "Subdirectorio correspondiente a la OU (o 'none' si no es el caso)" example: "none" repo_ip: type: string description: "Dirección IP del repositorio remoto" example: "192.168.56.100" user: type: string description: "Usuario para acceder al repositorio remoto" example: "user_name" responses: "200": description: "La imagen se está importando." schema: type: object properties: success: type: boolean example: true output: type: string example: "Importing image..." "400 (Connection fail)": description: "Error de conexión con el servidor remoto." schema: type: object properties: success: type: boolean example: false exception: type: string example: "Can't connect to remote server" "400 (Image not found)": description: "No se ha encontrado la imagen remota." schema: type: object properties: success: type: boolean example: false exception: type: string example: "Remote image not found" "400 (Image locked)": description: "La imagen remota está bloqueada." schema: type: object properties: success: type: boolean example: false exception: type: string example: "Remote image is locked" "500": description: "Error al importar la imagen." schema: type: object properties: success: type: boolean example: false error: type: string example: "Image import failed" "500 (Error)": description: "Error al importar la imagen." schema: type: object properties: success: type: boolean example: false error: type: string example: "(Error description)" "500 (Exception)": description: "Excepción inesperada al importar la imagen." schema: type: object properties: success: type: boolean example: false exception: type: string example: "(Exception description)" # ----------------------------------------------------------------------------------------------------------- #/ogrepository/v1/repo/images: put: summary: "Exportar una Imagen" description: | Este endpoint exporta la imagen especificada desde el servidor local a un servidor remoto. Utiliza el script "**exportImage.py**", que recibe como parámetros el nombre de la imagen, la IP o hostname del servidor remoto, el usuario para la conexión, y el subdirectorio correspondiente a la OU (si aplica). Una vez que acabe, debe llamarse al endpoint "**Actualizar Información del Repositorio**" en el ogRepository destino de la exportación, para actualizar la información del repositorio. **NOTA**: Este endpoint es asíncrono, ya que puede tardar mucho tiempo, por lo que solo informa de que la imagen se está exportando, y abre un proceso paralelo, que avisará a ogCore cuando finalice la tarea (llamando a un endpoint de ogCore). tags: - "Importar y Exportar Imágenes" parameters: - name: JSON in: body required: true description: | * **ID_img** - Identificador de la imagen, correspondiente al contenido del archivo 'full.sum' * **repo_ip** - Dirección IP del servidor remoto * **user** - Usuario con el que conectar al servidor remoto schema: type: object properties: ID_img: type: string example: "22735b9070e4a8043371b8c6ae52b90d" repo_ip: type: string description: "Dirección IP del repositorio remoto" example: "192.168.56.100" user: type: string description: "Usuario para acceder al repositorio remoto" example: "user_name" responses: "200": description: "La imagen se está exportando." schema: type: object properties: success: type: boolean example: true output: type: string example: "Exporting image..." "400 (Image not found)": description: "No se ha encontrado la imagen." schema: type: object properties: success: type: boolean example: false exception: type: string example: "Image not found" "400 (Image locked)": description: "La imagen está bloqueada." schema: type: object properties: success: type: boolean example: false exception: type: string example: "Image is locked" "400 (Connection fail)": description: "Error de conexión con el servidor remoto." schema: type: object properties: success: type: boolean example: false exception: type: string example: "Can't connect to remote server" "400 (Image present)": description: "La imagen ya existe en el servidor remoto." schema: type: object properties: success: type: boolean example: false exception: type: string example: "Image already exists on remote server" "500": description: "Error al exportar la imagen." schema: type: object properties: success: type: boolean example: false error: type: string example: "Export image failed" "500 (Error)": description: "Error al exportar la imagen." schema: type: object properties: success: type: boolean example: false error: type: string example: "(Error description)" "500 (Exception)": description: "Excepción inesperada al exportar la imagen." schema: type: object properties: success: type: boolean example: false exception: type: string example: "(Exception description)" # ----------------------------------------------------------------------------------------------------------- # Apartado "Varios" # ----------------------------------------------------------------------------------------------------------- /ogrepository/v1/images/torrentsum: post: summary: "Crear archivos auxiliares" description: | Este endpoint crea los archivos "**size**", "**sum**", "**full.sum**" y "**torrent**" para la imagen especificada. Utiliza el script "**createTorrentSum.py**", que recibe como parámetro el nombre de la imagen (con subdirectorio de OU, si aplica), que a su vez llama al script "**updateRepoInfo.py**, para actualizar la información del repositorio". Debe ser llamado cada vez que se cree una imagen desde un ogLive, y cada vez que se llame al endpoint "**Exportar una Imagen**" (en este último caso, debe ejecutarse en el ogRepository destino de la exportación). **NOTA**: Este endpoint es asíncrono, ya que puede tardar cierto tiempo, por lo que solo informa de que se están creando los archivos auxiliares, y abre un proceso paralelo, que avisará a ogCore cuando finalice la tarea (llamando a un endpoint de ogCore). tags: - "Varios" parameters: - name: JSON in: body required: true description: | * **image** - Nombre de la imagen, con extensión * **ou_subdir** - Subdirectorio correspondiente a la OU, o 'none' si no procede schema: type: object properties: image: type: string example: "Windows10.img" ou_subdir: type: string example: "none" responses: "200": description: "Los archivos auxiliares se están creando." schema: type: object properties: success: type: boolean example: true output: type: string example: "Creating auxiliar files..." "400 (Image not found)": description: "No se ha encontrado la imagen." schema: type: object properties: success: type: boolean example: false exception: type: string example: "Image not found" "400 (Image locked)": description: "La imagen está bloqueada." schema: type: object properties: success: type: boolean example: false exception: type: string example: "Image is locked" "500 (Error)": description: "Error al crear los archivos auxiliares." schema: type: object properties: success: type: boolean example: false error: type: string example: "(Error description)" "500 (Exception)": description: "Excepción inesperada al crear los archivos auxiliares." schema: type: object properties: success: type: boolean example: false exception: type: string example: "(Exception description)" # ----------------------------------------------------------------------------------------------------------- /ogrepository/v1/wol: post: summary: "Enviar paquete Wake On Lan" description: | Este endpoint envía un paquete mágico Wake On Lan (**WOL**) a la dirección MAC especificada, a través de la IP de broadcast especificada. Utiliza el script "**sendWakeOnLan.py**", que recibe como parámetros la IP de broadcast y la dirección MAC del equipo a encender. tags: - "Varios" parameters: - name: JSON in: body required: true description: | * **broadcast_ip** - IP de broadcast a la que se enviará el paquete WOL, que 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 schema: type: object properties: broadcast_ip: type: string example: "255.255.255.255" mac: type: string example: "00:19:99:5c:bb:bb" responses: "200": description: "El paquete Wake On Lan se ha enviado exitosamente." schema: type: object properties: success: type: boolean example: true output: type: string example: "Wake On Lan packet sent successfully" "500 (Error)": description: "Error al enviar el paquete Wake On Lan." schema: type: object properties: success: type: boolean example: false error: type: string example: "(Error description)" "500 (Exception)": description: "Excepción inesperada al enviar el paquete Wake On Lan." schema: type: object properties: success: type: boolean example: false exception: type: string example: "(Exception description)" # -----------------------------------------------------------------------------------------------------------