From e4d5d72a9c7dd798e66861b08c3b460489877f53 Mon Sep 17 00:00:00 2001 From: ggil Date: Wed, 4 Sep 2024 14:24:24 +0200 Subject: [PATCH] refs #631 - Add sendWakeOnLan.py --- README.md | 37 +++++++++--- py_scripts/sendWakeOnLan.py | 113 ++++++++++++++++++++++++++++++++++++ 2 files changed, 143 insertions(+), 7 deletions(-) create mode 100644 py_scripts/sendWakeOnLan.py diff --git a/README.md b/README.md index 00a5cd0..43c6f4e 100644 --- a/README.md +++ b/README.md @@ -28,12 +28,13 @@ El presente documento detalla los endpoints de la API, con sus respectivos pará 6. [Recuperar una Imagen](#recuperar-una-imagen) - `POST /ogrepository/v1/images/recover-image` 7. [Importar una Imagen](#importar-una-imagen) - `POST /ogrepository/v1/images/import-image` 8. [Crear archivos ".sum", ".full.sum", ".size" y ".torrent"](#crear-archivos-sum-fullsum-size-y-torrent) - `POST /ogrepository/v1/images/create-torrentsum` -9. [Iniciar el Tracker P2P](#iniciar-el-tracker-p2p) - `POST /ogrepository/v1/images/run-tracker` -10. [Iniciar el Seeder P2P](#iniciar-el-seeder-p2p) - `POST /ogrepository/v1/images/run-seeder` -11. [Enviar una Imagen mediante UDPcast](#enviar-una-imagen-mediante-udpcast) - `POST /ogrepository/v1/images/send-udpcast` -12. [Enviar una Imagen mediante UFTP](#enviar-una-imagen-mediante-uftp) - `POST /ogrepository/v1/images/send-uftp` -13. [Ver Estado de Transmisiones Multicast-P2P](#ver-estado-de-transmisiones-multicast-p2p) - -14. [Cancelar Transmisión Multicast-P2P](#cancelar-transmisión-multicast-p2p) - +9. [Enviar paquete Wake On Lan](#enviar-paquete-wake-on-lan) - `POST /ogrepository/v1/images/send-wol` +10. [Iniciar el Tracker P2P](#iniciar-el-tracker-p2p) - `POST /ogrepository/v1/images/run-tracker` +11. [Iniciar el Seeder P2P](#iniciar-el-seeder-p2p) - `POST /ogrepository/v1/images/run-seeder` +12. [Enviar una Imagen mediante UDPcast](#enviar-una-imagen-mediante-udpcast) - `POST /ogrepository/v1/images/send-udpcast` +13. [Enviar una Imagen mediante UFTP](#enviar-una-imagen-mediante-uftp) - `POST /ogrepository/v1/images/send-uftp` +14. [Ver Estado de Transmisiones Multicast-P2P](#ver-estado-de-transmisiones-multicast-p2p) - +15. [Cancelar Transmisión Multicast-P2P](#cancelar-transmisión-multicast-p2p) - --- ### Obtener Información de todas las Imágenes @@ -222,7 +223,7 @@ curl -X PUT -H "Authorization: $API_KEY" http://example.com/ogrepository/v1/imag 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 ppodrí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. +**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 @@ -337,6 +338,28 @@ curl -X POST -H "Authorization: $API_KEY" -H "Content-Type: application/json" -d - **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:** + +```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/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 diff --git a/py_scripts/sendWakeOnLan.py b/py_scripts/sendWakeOnLan.py new file mode 100644 index 0000000..7fc0923 --- /dev/null +++ b/py_scripts/sendWakeOnLan.py @@ -0,0 +1,113 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +""" +Este script envía un paquete mágico WOL a la dirección MAC especificada como segundo parámetro, a través de la IP de broadcast especificada como primer parámetro. +La IP de broadcast puede corresponder a toda la red ("255.255.255.255"), que es el valor por defecto, o a una subred concreta (por ejemplo, "10.2.7.255"). + + Parámetros +------------ +sys.argv[1] - Dirección IP de broadcast de toda la red o de una subred concreta. + - Ejemplo1: 255.255.255.255 + - Ejemplo2: 10.2.7.255 + +sys.argv[2] - Dirección MAC del equipo que se quiere enceder via WOL. + - Ejemplo: 00:19:99:5c:bb:bb + + Sintaxis +---------- +./sendWakeOnLan.py broadcast_IP MAC + + Ejemplos + --------- +./sendWakeOnLan.py 255.255.255.255 00:19:99:5c:bb:bb +./sendWakeOnLan.py 10.2.7.255 00:19:99:5c:bb:bb +""" + +# -------------------------------------------------------------------------------------------- +# IMPORTS +# -------------------------------------------------------------------------------------------- + +import os +import sys +import subprocess + + +# -------------------------------------------------------------------------------------------- +# VARIABLES +# -------------------------------------------------------------------------------------------- + +script_name = os.path.basename(__file__) + + +# -------------------------------------------------------------------------------------------- +# FUNCTIONS +# -------------------------------------------------------------------------------------------- + + +def show_help(): + """ Imprime la ayuda, cuando se ejecuta el script con el parámetro "help". + """ + help_text = f""" + Sintaxis: {script_name} broadcast_IP MAC + Ejemplo1: {script_name} 255.255.255.255 00:19:99:5c:bb:bb + Ejemplo2: {script_name} 10.2.7.255 00:19:99:5c:bb:bb + """ + print(help_text) + + +def check_params(): + """ Comprueba que se haya enviado la cantidad correcta de parámetros, y en el formato correcto. + Si no es así, muestra un mensaje de error, y sale del script. + LLama a la función "show_help" cuando se ejecuta el script con el parámetro "help". + """ + # Si se ejecuta el script con el parámetro "help", se muestra la ayuda, y se sale del script: + if len(sys.argv) == 2 and sys.argv[1] == "help": + show_help() + sys.exit(0) + # Si se ejecuta el script con más o menos de 2 parámetros, se muestra un error y la ayuda, y se sale del script: + elif len(sys.argv) != 3: + print(f"{script_name} Error: Formato incorrecto: Se debe especificar 2 parámetros") + show_help() + sys.exit(1) + + + +# -------------------------------------------------------------------------------------------- +# MAIN +# -------------------------------------------------------------------------------------------- + + +def main(): + """ + """ + # Evaluamos si se ha enviado la cantidad correcta de parámetros, y en el formato correcto: + check_params() + + # Almacenamos los parámetros en variables: + broadcast_IP = sys.argv[1] + MAC = sys.argv[2] + + # Creamos una lista con el comando a enviar, y lo imprimimos con espacios: + splitted_cmd = f"wakeonlan -i {broadcast_IP} {MAC}".split() + + print(f"Sending command: {' '.join(splitted_cmd)}") + + # Ejecutamos el comando en el sistema, e imprimimos el resultado: + try: + result = subprocess.run(splitted_cmd, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + print(f"ReturnCode: {result.returncode}") + except subprocess.CalledProcessError as error: + print(f"ReturnCode: {error.returncode}") + print(f"Error Output: {error.stderr.decode()}") + except Exception as error_description: + print(f"Unexpeted error: {error_description}") + + + +# -------------------------------------------------------------------------------------------- + +if __name__ == "__main__": + main() + +# --------------------------------------------------------------------------------------------