Giuseppe Parrello

 

Inviare un messaggio WOL per eseguire uno script


In questa pagina descriverò come inviare un messaggio Wake-On-Lan tramite la rete per eseguire uno script su un router (Asus RT-AC56U) - useremo alcuni pacchetti di Entware, pertanto fate riferimento a questa pagina su come installare Entware su un router.
Partiamo dalla premessa che usare un messaggio Wake-On-Lan non è certamente consigliato poiché chiunque può inviare questo messaggio, basta sapere l'indirizzo IP del destinatario, l'indirizzo MAC del dispositivo di rete da accendere e la porta di destinazione. Come se non bastasse, il protocollo Wake-On-Lan non prevede una password. Useremo quindi questa tecnica solo per inviare messaggi non importanti, ad esempio per eseguire uno script che permette di attivare una funzionalità secondaria.
Per inviare il messaggio Wake-On-Lan possiamo usare un qualunque programma che supporta il Wake-On-Lan (fare riferimento a questa pagina per usare la mia applicazione per il sistema operativo Android), per ricevere invece il suddetto messaggio Wake-On-Lan sul router useremo un pacchetto Entware denominato "socat".


Come installare il pacchetto "socat" sul router

Allo scopo di installare il daemon "socat" con i pacchetti Entware, dobbiamo eseguire il seguente comando :
opkg install socat coreutils-od
Il pacchetto "socat" contiene soltanto il daemon "/opt/bin/socat", che andremo in seguito ad analizzare. Mentre il pacchetto "coreutils-od" contiene il comando "/opt/bin/od" usato dallo script che andremo in seguito ad analizzare.


Come impostare il programma per l'invio del messaggio Wake-On-Lan

Il programma che invia il messaggio Wake-On-Lan dovrà essere impostato usando i seguenti parametri:

Come impostare uno script usato dal daemon "socat"

Come vedremo in seguito, il daemon "socat" passerà il messaggio Wake-On-Lan ricevuto ad uno script e questo script dovrà essere in grado di interpretare il messaggio Wake-On-Lan ed eseguire determinate azioni. Qui di seguito vediamo un esempio di script, gli diamo il nome "wol_script.sh" (ricordarsi di impostare opportunamente le proprietà di esecuzione del suddetto script usando il comando "chmod +x wol_script.sh" altrimenti il daemon "socat" non potrà eseguirlo):

#!/bin/bash

read MESSAGE
echo "PID: $$"
echo "$MESSAGE"

hexvar=$(echo $MESSAGE | /opt/bin/od -t x1)
echo $hexvar

# execute action 1
if echo $hexvar | grep -q -i "ff ff ff ff ff ff 11 22 33 44 55 66"; then
    # WOL message is received, we run a command
    echo "1 String contains hex is true."
else
    echo "1 String contains hex is not true."
fi

# execute action 2
if echo $hexvar | grep -q -i "ff ff ff ff ff ff 11 77 88 99 AA BB"; then
    # WOL message is received, we run a command
    echo "2 String contains hex is true."
else
    echo "2 String contains hex is not true."
fi

Come si evince dal suddetto script, eseguiamo le seguenti operazioni:

Le istruzioni "echo" incluse nello script sono usate solo per questioni di debugging, potranno essere eliminate una volta capito il procedimento.
Ovviamente potremo inserire più istruzioni "if" con diversi indirizzi MAC, ricordandoci di usare un carattere spazio tra un numero esadecimale e il successivo. All'atto pratico, nel programma che deve inviare il messaggio Wake-On-Lan, potremo aggiungere più voci Wake-On-Lan, ma l'unica cosa che cambierà sarà il valore dell'indirizzo MAC fittizio, i valori dell'indirizzo IP del router e della porta rimarranno sempre gli stessi.


Come eseguire il daemon "socat" per ricevere il messaggio Wake-On-Lan

Una volta impostato il programma che deve inviare il messaggio Wake-On-Lan ed una volta impostato lo script che dovrà ricevere il messaggio Wake-On-Lan, andiamo ad eseguire il daemon "socat". Una tipica istruzione che possiamo eseguire è la seguente:
/opt/bin/socat -u -T1 UDP-LISTEN:25000,fork system:/opt/etc/wol_script.sh
Nella suddetta istruzione abbiamo i seguenti parametri (per maggiori informazioni sul daemon "socat" fare riferimento a questa pagina su Internet):

La suddetta istruzione, se eseguita nel terminale del router, verrà eseguita in modalità di debugging come utente "root". Per questioni di sicurezza, consiglio di eseguire il daemon "socat" tramite l'utente "nobody" (ovviamente anche lo script verrà eseguito come utente "nobody", e così anche tutti i comandi eseguiti all'interno dello script). Per fare questo, bisogna usare il comando "daemonize", comando che si può installare tramite un pacchetto Entware con l'istruzione "opkg install daemonize".
Il daemon "socat" potrà essere quindi eseguito con la seguente istruzione:
daemonize -u nobody /opt/bin/socat -u -T1 UDP-LISTEN:25000,fork system:/opt/etc/wol_script.sh