sabato 25 maggio 2019

Il demone cron, OpenWrt e WinSCP per il reboot



Ci sono diversi modi per fare il reboot di un router/access point con OpenWrt, vediamo insieme come si può fare.
Stando alla wiki di OpenWrt si possono ovviamente mettere a calendario delle operazioni grazie al demone cron. La struttura logica non è proprio (almeno per me) lineare, ma funziona in questa maniera:

minuti / ore / giornodelmese / mese / giornodellasettimana


Variabile "minuti"
I minuti possono essere in tre modi:
numeri da 0 a 59 = l'azione verrà compiuta nel minuto indicato
*/XX = dove XX è un numero compreso tra 0 e 59, vuol direi che l'azione verrà compiuta ogni XX minuti
XX,YY = dove XX ed YY sono numeri compresi tra 0 e 59, sta a significare che l'azione verrà compiuta ai minuti XX ed YY

Variabile "ore"
Anche qui, le ore possono essere dichiarate in tre modi:
numeri da 0 a 23 = l'azione verrà compiuta nell'ora indicata
*/XX = dove XX è un numero compreso tra 0 e 23, vuol direi che l'azione verrà compiuta ogni XX ore
XX,YY = dove XX ed YY sono numeri compresi tra 0 e 23, sta a significare che l'azione verrà compiuta alle ore XX ed YY

Nota sulla variabile "ore"
Se vengono specificati due parametri, tipo "10,16" e nella variabile minuti altri due parametri tipo "15,30" l'azione verrà eseguita alle ore 10:15, poi alle 10:30 e successivamente alle 16:15 ed alle 16:30


Variabile "giornodelmese"
I giorni del mese possono essere dichiarati in tre modi:
* = ogni giorno
XX = dove XX è un numero compreso tra 1 e 31, vuol direi che l'azione verrà compiuta il giorno XX
XX,YY = dove XX ed YY sono numeri compresi tra 1 e 31, sta a significare che l'azione verrà compiuta nei giorni XX ed YY


Variabile "mese"
I mesi possono essere dichiarati in tre modi:
* = ogni mese
XX = dove XX è un numero compreso tra 1 e 12, vuol direi che l'azione verrà compiuta il mese XX
XX,YY = dove XX ed YY sono numeri compresi tra 1 e 12, sta a significare che l'azione verrà compiuta nei mesi XX ed YY


Variabile "giornodellasettimana"
I giorni della settimana sono espressi con valori da 1 a 7 secondo questa tabella:

1 = Monday = Lunedì
2 = Tuesday = Martedì
3 = Wednesday = Mercoledì
4 = Thursday = Giovedì
5 = Friday = Venerdì
6 = Saturday = Sabato
7 = Sunday = Domenica


Loro, per cambiare un pochino, possono essere espressi in quattro modi:
* = ogni giorno della settimana
XX = dove XX è un numero compreso tra 1 e 7, vuol direi che l'azione verrà compiuta il giorno XX
XX,YY = dove XX ed YY sono numeri compresi tra 1 e 7, sta a significare che l'azione verrà compiuta nei giorni XX ed YY
XX-YY = dove XX ed YY sono numeri compresi tra 1 e 7, sta a significare che l'azione verrà compiuta tutti i giorni compresi tra XX ed YY

Ora che abbiamo queste basi di sintassi, il comando che mi interessa per riavviare è un banale "reboot".
Vediamo un paio di esempi pratici:

0 4 * * * reboot
Esegue il comando al minuto 0, ora 4, tutti i giorni della settimana, tutte le settimane, tutti i mesi.

15 21 16 1,3,5,7,9,11 * reboot
Esegue il comando al minuto 15, ora 21 , del giorno 16, dei mesi di Gennaio, Marzo, Maggio, Luglio, Settembre e Novembre.

15 21 * 4 5-7 reboot
Esegue il comando al minuto 15, ora 21, del mese di Aprile, ogni Venerdì Sabato e Domenica.

Il problema è che gli apparati solitamente non hanno un orologio in real time a bordo.
Quando si fa il reboot, l'ora di sistema si aggiorna con "sysfixtime" che si va a prendere l'orario più recente tra i files che trova in /etc . Ci si potrebbe quindi trovare nella sgradevole posizione di avere un riavvio ciclico perché cron va a leggere l'ora da sysfixtime, vede che l'ora del riavvio è arrivata e parte, una volta che il sistema è in piedi fa la stessa cosa ad oltranza.

Sì che gira ntpd, ma non sempre si avvia in tempo per dare la corretta indicazione temporale...
La soluzione, quindi, prima del "reboot", è quella di andare a modificare un file che si trova in /etc PRIMA dell'avvio dello script di "cron".

O meglio, non modificarlo ma settare ad un qualsiasi file la data e l'ora correnti.
Per fare questo si usa il comando "touch" del quale potete approfondire l'uso qui.

Oltre a "touch", è cosa buona e giusta aspettare un minutino in modo che "sysfixtime" possa poi vedere un file modificato DOPO l'orario di riavvio evitando di finire così nel ciclo di riavvio infinito.

Per fare questo si usa il banalissimo comando "sleep" che trovate spiegato anche qui.

Io, per esempio, ho seguito i consigli della Wiki di OpenWrt ed ho impostato "sleep" a 70 secondi.

Riassumendo, il gioco in sostanza è quello di avviare la cron mettendo il sistema in pausa per 70 secondi, poi cambiare data/ora ad un file in /etc e POI riavviare.

Ora, su OpenWrt c'è il comodo pannello di Scheduled Task come quello qui sotto:


Tralasciando la prima riga (che magari prossimamente spiegherò) come vedete lo script di riavvio parte ogni giorno alle 6 del mattino, si mette in pausa per 70 secondi, va a modificare il primo file che trova in /etc/banner e poi riavvia.

E questa è la cosa più semplice.
Solo che a volte la cron non parte, e questo per me è un problema, perché vuol dire che una delle due reti wifi resta in down.

Allora ho fatto una robina veloce con WinScp (ne parlavo, oramai un paio di anni fa, qui) per gestire il tutto con il minimo sforzo.

Intanto ho fatto un file batch che chiama i comandi di WinScp

C:\Programmi\WinSCP\winscp.com /script="\\mionas\miacartella\miasottocartella\riavvio.txt"

L'elenco dei comandi contenuti nel file "riavvio.txt" è il seguente :

open scp://user:password@192.168.XXX.XXX -hostkey="sh-rsa 2048 ab:02:4b:30:60:42:5c:08:ce:2b:70:4d:2a:24:0d:52"
call sleep 70 && touch /etc/banner && reboot
close
exit


Molto semplicemente, apre una connessione SCP con il nome utente "user" e la password "password" verso l'host 192.168.xxx.xxx, gli passa la chiave privata e gli dice che deve eseguire i comandi (usando il comando "call") che abbiamo visto prima.
Facile, semplice, veloce.

Ovviamente, questo metodo di eseguire comandi via WinScp può essere utilizzato con tutto il set di comandi standard di OpenWrt per fare di tutto, il mio è solo un esempio stupidino e veloce per risolvere una problematica che talvolta mi si presenta, nulla più :-)

Nessun commento:

Posta un commento

Sei davvero sicuro di voler sprecare tempo prezioso per scrivere qualcosa? Non è che preferisci andare su Google?

Cerca nel blog

I post più letti di sempre