Home > Guide, Internet, PhP > Crontab e firmware Routertech: sfruttare il proprio router per eseguire script PHP

Crontab e firmware Routertech: sfruttare il proprio router per eseguire script PHP

d-linktech

Ed eccoci qua al mio primo articolo vero è proprio: conoscete il comando “crontab” di Unix? Per chi non ne avesse mai sentito parlare eccone una breve descrizione tratta da Wikipedia:

Nei sistemi operativi UnixUnix-like, il comando crontab consente lo scheduling di comandi, ovvero consente di registrarli presso il sistema affinché siano poi mandati in esecuzione periodicamente. Lo stesso nome “crontab” si riferisce anche ai file utilizzati dal comando crontab come “registri” dei comandi “schedulati”.

Generalmente, crontab usa un demone, chiamato crond, che è costantemente in esecuzione in background e, una volta al minuto, legge i contenuti del registro dei comandi schedulati ed esegue quelli per cui si è esaurito il periodo di attesa. Un comando mandato in esecuzione da crontab viene chiamato cronjob.

Nello specifico in questo articolo andremo a trattare l’implementazione di tale comando sul firmware della RouterTech; questa community di appassionati si occupa in generale di networking e in particolare di realizzare firmware compatibili con varie tipologie di router.  Nel mio caso utilizzo un router D-link G604T, il firmware è installato da almeno un anno ormai e si comporta davvero molto bene, sopperendo alle enormi lacune delle release ufficiali, quindi ne consiglio l’installazione a tutti i possessori del mio stesso modello.

Vi chiederete: ma nella pratica a cosa ci può servire far eseguire dei job al nostro router? Presto detto: alcuni job sono già impostati di default e si occupano di controllare lo stato della connessione ADSL o di ottimizzare la RAM del router; invece noi andremo a vedere come far eseguire uno script PHP ad intervalli regolari. A cosa può esserci utile? Vi faccio un esempio concreto (il primo che mi viene in mente): volete ricevere un’e-mail in ”tempo reale” ogni volta che l’AppleStore va offline? Basterà creare uno script PHP che, tramite la funzione curl, scarichi la pagina principale per voi, faccia gli opportuni controlli e, dopo averlo caricato su di un host (ad esempio altervista che è gratis),  vi invii in automatico un’e-mail! A questo punto entra in gioco crontab, senza il quale dovremmo eseguire manualmente lo script, che richiederà per noi la pagina ogni minuto/ora/giorno… insomma a nostro piacimento :) La stessa cosa la si potrebbe fare lasciando un PC sempre acceso con il browser aperto sulla nostra pagina e impostando un refresh…ma perché consumare corrente per tenere acceso un intero PC quando abbiamo un router con firmware basato su Linux a nostra disposizione? ;)

Dopo questa lunga premessa iniziamo a spiegare con ordine i passi da eseguire:

  1. accertarsi che il proprio router sia compatibile con il firmware RouterTech 2.8: RUC è un’ottima utility (non funziona con tutti i modelli) creata ad hoc per fugare ogni dubbio; ovviamente potete usare anche una versione più vecchia del firmware se la 2.8 non è supportata dal vostro router, però nelle versioni più vecchie (tipo la 2.3) schedulare i job in modo che non vengano persi allo spegnimento del router è molto più complicato e quindi non mi ci soffermerò

    schermata inizale RouterTech

    Login Screen

  2. scaricare ed eseguire l’installazione del firmware compatibile con il proprio modello dal sito RouterTech (per i possessori di router D-Link con Adam2 consiglio l’utilizzo di tiupgrade e d’informarsi a dovere sull’ottimo sito di DarkWolf)
  3. creare lo script php che si vuole far eseguire e caricarlo sul proprio server
  4. a questo punto è d’obbligo soffermarci su di un punto dolente: la lunghezza complessiva del comando. È fondamentale che l’url risultante sia il più breve possibile, altrimenti (causa limitazioni tecniche) non potremo memorizzare l’intera stringa nella env (area di memoria non volatile), al fine di non perdere il job al riavvio del  router! Un ottimo modo per accorciare l’url è TinyUrl.  Al lato pratico la stringa che verrà salvata in memoria sarà la seguente (nel massimo della sua lunghezza):

    echo "* * * * * wget http://????????????????????????" >> /root_cron
    [ <<<---------------------- 67 caratteri --------------------->>> ]

    Dovremo quindi fare gli opportuni calcoli per non superare i 67 bytes: evitando un url troppo lungo ed evitando troppi parametri temporali (gli asterischi).  Ricordo brevemente a cosa corrisponde ciascun asterisco (se lasciato l’asterisco equivale a “sempre“) nella sintassi di Crontab:

    * * * * * comando da eseguire
    - - - - -
    | | | | |
    | | | | ----- giorno della settimana (0 - 7) (domenica = 0 oppure 7)
    | | | ------- mese (1 - 12)
    | | --------- giorno del mese (1 - 31)
    | ----------- ora (0 - 23)
    ------------- minuti (0 - 59)
  5. ora non resta altro che accedere al proprio router tramite l’apposita interfaccia via browser, andare nella sezione “System”, selezionare “Run Command” ed immettere il seguente comando (che in questo caso esegue ogni minuto il nostro script php) premendo “Run” alla fine:
    cronjob-env.sh "wget http://tinyurl.com/example" "*" "*" "*" "*" "*" "RT_cmd_1"

    Run Command: cronjob-env.sh "wget http://tinyurl.com/example" "*" "*" "*" "*" "*" "RT_cmd_1"

    Run Command: cronjob-env.sh

  6. riavviate il router e incrociate le dita sperando che tutto funzioni ;)
  7. adesso controlliamo che il job sia stato effettivamente memorizzato tramite il comando:
    crontab -l
    Run Command: crontab -l

    Run Command: crontab -l

    se dovessero esserci problemi controlliamo il contenuto della env tramite il comando:

    printenv

    routertech4

    Run Command: printenv

Detto questo penso di aver finalmente terminato il mio primo articolo; nella speranza di esser stato d’aiuto a qualcuno vi sollecito ad indicarmi punti dove sono stato eventualmente poco chiaro, al fine di migliorarmi in futuro. ;)

Categorie:Guide, Internet, PhP Tag: , , ,
  1. Nessun commento ancora...
  1. Nessun trackback ancora...