Un frontend per Ping e WOL in Windows

Nei precedenti articoli di questo blog si è parlato di come sfruttare il protocollo wol ed il comando ping di windows per gestire l’accensione e lo spegnimento di un computer remoto.

Poichè si è fatto uso di script a riga di comando, ho ricevuto alcune email in cui viene richiesta una possibile soluzione “a finestre”.

Purtroppo il mio tempo a disposizione non è molto ma sfruttando comunque il linguaggio di scripting (vbscript) sono riuscito a fare un piccolo applicativo in grado di mostrare lo stato (acceso/spento) di computer appartenenti alla stessa rete con la possibilità di usare il protocollo wol nel caso in cui questi risultassero spenti.

L’esempio che segue consiste in una pagina html di tipo Microsoft (R) HTML Application host (con estensione hta)


<HTML>
<HEAD>
<TITLE>Pannello di Controllo</TITLE>

<HTA:APPLICATION
     ID=”objPannello”
     APPLICATIONNAME=”Pannello di Controllo”
     SCROLL=”No”
     SINGLEINSTANCE=”yes”
>

<SCRIPT LANGUAGE=”VBScript”>
<!–
  option Explicit
  dim strTR
  dim aServer(5)

  aServer(0)=”tizio.local”
  aServer(1)=”caio.local”
  aServer(2)=”sempronio.local”
  aServer(3)=”cesare.local”
  aServer(4)=”cleopatra.local”
  aServer(5)=”antonio.local”
  
  strTR=”<tr>” & _
    ”<td>+SERVERNAME+</td>” & _
    ”<td>+STATUS+</td>” & _
    ”<td>+COMMAND+</td>” & _
    ”</tr>”

  

  function ServerView(ServerName)

    dim objShell, objExec
    dim strPingResult
  
    Set objShell = CreateObject(“WScript.Shell”)
    Set objExec = objShell.Exec(“ping -n 2 -w 1000 ” & ServerName)

    strPingResult = UCase(objExec.StdOut.ReadAll)
    
    ServerView= ( CBool(InStr(UCase(strPingResult), ” TTL=”)))

  end function

  function ServerCommand(ServerName)
    dim objShell
    Set objShell = CreateObject(“WScript.Shell”)  
    objShell.run(“wol.bat ” & replace(ServerName,”.local”,”"))

  end function

–>

</SCRIPT>
</HEAD>
<BODY >
<H3>Pannello di Controllo</H3>
<HR>
<FORM NAME=”ValidForm”>  

<table width=”100%”>
<tr>

<td width=”50%”><b>Server</b></td>
<td width=”20%”><b>Status</b></td>

<td width=”30%”><b>Comandi</b></td>

</tr>

<SCRIPT LANGUAGE=”VBScript”>
<!–
  dim Ciclo
  dim strOutPut, strServerStatus

  dim blserverStatus

  Self.ResizeTo 575,475

  for Ciclo=lbound(aServer) to ubound(aServer)
    blServerStatus=ServerView(aServer(Ciclo))
    if blServerStatus then
      strServerStatus=”ON”
      strCommand=”Attivo”
    else
      strServerStatus=”OFF”
      strCommand=”<INPUT onclick=’ServerCommand(“”" & aServer(Ciclo) & “”")’ NAME=’” & aServer(Ciclo) & “‘ TYPE=’BUTTON’ VALUE=’Attiva’>”
      ’msgbox “<INPUT onclick=’ServerCommand(“”" & aServer(Ciclo) & “”")’ NAME=’” & aServer(Ciclo) & “‘ TYPE=’BUTTON’ VALUE=’Attiva’>”
    end if
    strOutput= replace(strTR,”+SERVERNAME+”,aServer(Ciclo))
    strOutput= replace(strOutput,”+STATUS+”,strServerStatus)
    strOutput= replace(strOutput,”+COMMAND+”,strCommand)  

    document.write strOutput
  next

–>
</script>

</table>
<hr>
<INPUT NAME=”Submit” TYPE=”BUTTON” VALUE=”Aggiorna” onclick=”Location.Reload(True)”>
</FORM>
</BODY>
</HTML>

Potete nominare questo file come volete, purchè mantenga l’estensione hta, altrimenti windows non ne consentirà l’esecuzione.

Prima di concludere volevo ricordare che per maggiori informazioni sul wol, potete dare una occhiata questo articolo.

Alla prossima.

Wake On Lan e risparmio energetico

Fare qualcosa per l’ambiente e per i portafoglio è possibile. Ci sono diverse aziende di piccole e medie dimensioni, come anche liberi professionisti e piccoli uffici, in cui la tecnologia non ha una presenza molto invasiva.
A volte ad esempio, i servizi di stampa, condivisione file, accesso ad Internet non sono necessari 24 ore su 24. Alcune periferiche vanno in stand-by dopo qualche minuto ma altre restano attive fino al loro spegnimento.

Mi è capitato di vedere spesso negli uffici, computer che restano accesi molte ore perchè “qualcuno potrebbe avere bisogno di prelevare un file”. Forse questo articolo può essere utile a chi vuole sfruttare la moderna tecnologia per risparmiare sui consumi energetici salvaguardando l’ambiente.

Da diversi anni ormai, molte periferiche connesse alle rete locale, come ad esempio: stampanti di rete, computer, modem adsl,… supportano il Wake On Lan (WOL); uno standard ethernet in grado di attivare le periferiche on demand (a richiesta) mediante l’invio di un pacchetto di dati detto “Magic Packet”.
Mediante questo standard è possibile ad esempio avviare un computer in remoto, senza doversi recare fisicamente sul posto. WOL funziona anche attraverso Internet, quindi è possibile accendere in computer da qualunque parte del mondo, purchè il computer “dormiente” sia connesso alla rete mediante una periferica compatibile con lo standard.

Nell’esempio che seguirà, ipotizziamo di avere tre server ed uno o più client interconnessi alla medesima rete locale. Per comodità supponiamo che la rete abbia il seguente range di indirizzi IP:

192.168.0.1/24

Per chi non avesse dimestichezza con quanto indicato sopra, in questo esempio supponiamo che gli indirizzi della rete locale varino da 192.168.0.1 a 192.168.0.254.

Cosa fondamentale per utilizzare WOL è la conoscenza degli “indirizzi fisici” assegnati alle periferiche di rete. Questi indirizzi si chiamano MAC Address (Media Access Control Address) e servono ad identificare univocamente l’hardware connesso alla rete.
In effetti, un indirizzo IP viene assegnato al computer dal sistema operativo in uso, ma la consegna effettiva a livello hardware (chiamato strato fisico) avviene tramite il MAC address. Ad esmpio, ogni volta che un computer invia un pacchetto all’indirizzo 192.168.0.1, lo switch (o altra periferica dedicata alla consegna del pacchetto) controlla in una apposita tabella a quale indirizzo fisico corrisponde l’indirizzo 192.168.0.1.

Identificare il MAC address di un computer è cosa molto semplice. Per gli utilizzatori di Windows è sufficiente impartire il seguente comamdo dal prompt dos:

ipconfig /all

Dovreste ottenere un output simile a questo:

Configurazione IP di Windows
Nome host . . . . . . . . . . . . . . : WORKSTATION_1
Suffisso DNS primario . . . . . . . : retelocale.loc
Tipo nodo . . . . . . . . . . . . . . : Ibrido
Routing IP abilitato. . . . . . . . . : No
Proxy WINS abilitato . . . . . . . . : No
Elenco di ricerca suffissi DNS. . . . : retelocale.loc

Scheda Ethernet Connessione alla rete locale (LAN):
Suffisso DNS specifico per connessione: retelocale.loc
Descrizione . . . . . . . . . . . . . : Broadcom NetLink (TM) Gigabit Ethernet
Indirizzo fisico. . . . . . . . . . . : 00-17-18-4C-22-D0
DHCP abilitato. . . . . . . . . . . . : Sì
Configurazione automatica abilitata : Sì
Indirizzo IP. . . . . . . . . . . . . : 191.168.0.2
Subnet mask . . . . . . . . . . . . . : 255.255.255.0
Gateway predefinito . . . . . . . . . : 191.168.0.1
Server DHCP . . . . . . . . . . . . . : 191.168.0.1
Server DNS . . . . . . . . . . . . . : 191.168.0.1
Lease ottenuto. . . . . . . . . . . . : mercoledì 10 ottobre 2009 9.27.34
Scadenza lease . . . . . . . . . . . : giovedì 23 ottobre 2009 9.27.34

Scheda Ethernet Connessione rete senza fili:
Stato supporto . . . . . . . . . . . : Supporto disconnesso
Descrizione . . . . . . . . . . . . . : Intel(R) PRO/Wireless 3945ABG Network Connection
Indirizzo fisico. . . . . . . . . . . : 00-20-D3-66-D9-E5

Per gli utenti di Linux esiste un comando simile:

ifconfig

Con un output del tutto simile a questo:

eth0 Link encap:Ethernet HWaddr 00:20:C5:2E:F2:33
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2238 errors:0 dropped:0 overruns:0 frame:0
TX packets:740 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:208462 (203.5 KB) TX bytes:233284 (227.8 KB)
Interrupt:7 Base address:0xf00

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:58 errors:0 dropped:0 overruns:0 frame:0
TX packets:58 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:5663 (5.5 KB) TX bytes:5663 (5.5 KB)

Abilitare WOL
Tutte le moderne schede madri (mainboard) offrono il supporto a WOL, specie se la scheda di rete è integrata. Che io ricordi anche alcuni Pentium II sono dotati di questo supporto.

Il fatto che il computer supporti lo standard non vuol dire però che questo sia attivo. Per verificare/attivare questa opzione è necessario accedere al BIOS (fare riferimento al manuale della scheda madre oppure lasciare un post su questo articolo). Una volta abilitato il WOL è necessario verificare che il sistema operativo gestisca correttamente lo spegnimento delle periferiche durante lo shutdown. Se il sistema operativo dovesse spegnere completamente il computer, questi non risponderebbe al magic packet anche se nel bios l’opzione WOL fosse attiva. E’ come staccare la presa di alimentazione lasciando il PC senza corrente.

Gli utenti di Windows non devono preoccuparsi perchè, che io sappia, tutte le moderne versioni del sistema operativo di Microsoft consentono alla scheda madre di tenere “accese” le schede di rete qual tanto che basta per ricevere il magic packet.

Per gli utenti Linux bisogna fare un po’ di attenzione. Il kernel di solito è compatibile con il WOL ma le impostazioni necessarie per istruire il kernel di “alimentare la scheda di rete anche dopo lo shutdown” si perdono ad ogni riavvio.
Per questo motivo è necessario istruire il kernel prima di spegnere la macchina. Il parametro che attiva il WOL su linux è il seguente:

/sbin/ethtool -s eth0 wol g

Il parametro “g” serve proprio ad istruire il kernel.
Per fare in modo che questa opzione resti attiva dopo ogni riavvio, io consiglio di inserire il comando precedente dentro il file “/etc/rc.local” così ogni volta che linux fa il boot il kernel viene istruito.

Sfruttare WOL
Al fondo di questo articolo ho inserito i link a due programmi liberamente utilizzabili (uno per Windows e l’altro per Linux) con i quali è possibile sfruttare il WOL.
Gli utenti Windows posso usare il programma mc-wol.exe

mc-wol 11:11:11:11:11:11

Mentre gli amanti del pinguino possono fare uso di ether-wake:

./ether-wake 11:11:11:11:11:11

In entrambi i casi “11:11:11:11:11:11″ è il MAC address della macchina che si intente “svegliare”.

Automatizzare WOL
I comandi elencati in precedenza sono utili per accendere un Pc ma se i PC sono diversi allora può diventare un problema ricordare a memoria tutti gli indirizzi fisici.
Di seguito riporto uno script utile per accendere diverse macchine in base loro nome piuttosto che il MAC address.

Per i client Windows:

@echo off
if (%1) == (tizio) mc-wol 11:11:11:11:11:11 > nul & goto fine
if (%1) == (caio) mc-wol 22:22:22:22:22:22 > nul & goto fine
if (%1) == (sempronio) mc-wol 33:33:33:33:33:33 > nul & goto fine
if (z%1) == (z) echo Usage: %0 servername & exit /B 0

echo Server not found.
echo Usage: %0 servername
exit /B 2

:fine
echo done.
exit /B 0

Per i client Linux:

#!/bin/sh

# do it
case “$1″ in
tizio)
/sbin/ether-wake 11:11:11:11:11:11
;;

caio)
/sbin/ether-wake 22:22:22:22:22:22
;;

sempronio)
/sbin/ether-wake 33:33:33:33:33:33
;;

–help)
echo “Usage: $0 servername”
exit 0
;;

*)
echo “Server not found.”
echo “Usage: $0 servername” >&2
exit 2
esac
echo “done.”
exit 0

Spegnere le periferiche
Abbiamo visto come sia facile accendere un componente di rete con WOL ma senza un processo in grado di spegnere le risorse quando non servono più l’idea di risparmiare viene meno. Penso che nessuno abbia voglia di spegnere manualmente le periferiche prima di uscire dall’ufficio, specie se come me non gode di una memoria di ferro.
L’idea in questo caso è quella di fare in modo che tutte le risorse “on demand” vadano giù se nessun client è attivo sulla rete.

Ci serve uno script che possa essere eseguito ad intervalli regolari su un server per garantire i servizi solo quando necessitano:

#!/bin/sh
#script staying_alive.sh

myfiledeny=”/root/astutami.dont”

if [ -e $myfiledeny ]; then
exit 0
fi

for myPing in 4 5 9 10 11 12 13 20 21
do
ping -c 30 192.168.0.$myPing && exit 0
done

exit 1

In questo esempio, il server “pinga” alcuni indirizzi della classe 192.168.0.1/24 per capire se ci sono client attivi. In caso di esito negativo esce con un codice di errore 1. Questo valore può essere impiegato in un altro script per spegnere la macchina:

#!/bin/sh
#script alive.sh

/sbin/staying_alive.sh

EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/sbin/dormi.sh
fi
exit 0

Il codice è utile ad esempio se inserito all’interno di cron (ad esempio nel crontab oppure nella cartella cron.hourly), il servizio di Linux che avvia operazioni pianificate. In questo caso ogni ora il server eseguirebbe un test per capire se ci sono client sulla rete prima di andare a “dormire”.

Gli utenti windows non useranno il cron ma AT (altrimenti conosciuto come “operazioni pianificate”).

Può capitare che per qualche motivo, il server debba restare acceso nonostante la mancanza di client, come ad esempio in caso di manutenzione o aggiornamento. Nell’ultimo script (quello che si preoccupa di spegnere effettivamente il server) possiamo prevedere una “deroga” allo spegnimento in base ad alcune regole.
Nel nostro caso, l’esistenza di un apposito file all’intnerno della directory root, evita lo spegnimento programmato del server:

#!/bin/sh
#script dormi.sh

myfile=”/root/astutami”
myfiledeny=”/root/astutami.dont”

if [ -e $myfiledeny ]; then
echo “Don’t astutami for now.”
else
touch $myfile

wall << "EOF"

ALERT! System is going down after 5 minutes by now!
To avoid shutdown delete the file:

/root/astutami

EOF

echo “waiting…”
sleep 5m
if [ -e $myfile ]; then
rm $myfile
/sbin/astutami.sh
exit 0
fi
fi

Altra cosa interessante è che lo script appena riportato invia un messaggio broadcast (cioè a tutti gli utenti con una console attiva sul server) che indica l’imminente spegnimento ma attende 5 minuti prima di eseguire il comando. In questo periodo è ancora possibile evitare lo shutdown semplicemente eliminando il file /root/astutami.

Infine, l’ultimo script che presento si occupa semplicemente di spegnere la macchina.

#!/bin/sh
#script astutami.sh

shutdown -h now

Per concludere
Basta usare un po’ di fantasia per poter sfruttare ancora meglio le possibilità offerte da WOL.
Si potrebbe utilizzare AT e cron anche per accendere i server; io lo faccio ad esempio per schedulare un backup notturno.

Spero di non avere annoiato nessuno. Grazie per l’attenzione. Alla prossima

Per saperne di più
WOL Wikipedia (EN)
ether-wake
mc-wol