DGND4000 - Amod script noip.com in crontab

 

Ecco un piccolo script per aggiornare il dns no-ip inserito in crontab per garantire un refresh costante.

 Premessa

Il router DGND4000 della Netgear deve preventivamente essere modificato con la mod di Amod, le istruzioni per l'installazione della mod le trovate qui: http://alfie.altervista.org/amod4000/

La directory con le config è scrivibile senza rimontare la root in rw:

mtd:xxx on /config/xxx type jffs2 (rw,relatime)
mtd:xxx                   2048       464      1584  23% /config/xxx

Le varie config e gli script che creeremo saranno sotto la dir /config/xxx/amod

Il target di questo articolo prevede che sia già stato creato e attivato un account utente su https://www.noip.com/ (altresì detto no-ip.com)

Lo script

Creare lo script nella dir qua sotto con le seguenti permission: 

/config/xxx/amod # ls -l no-ip.sh
-rwxr-xr-x    1 root     root          2047 Jun 18 10:09 no-ip.sh

Lo script contiene il codice qua sotto, in buona sostanza ho inserito direttamente username e pwd di noip, una serie di host registrati per l'utente noip dei quali voglio aggiornare il dns. In /tmp/no-ip_oldip.txt ci sarà l'ultimo ip registrato, in /tmp/no-ip.log il log delle azioni compiute dallo script e in /tmp/no-ip_curlupdate.log l'output di curl dato dal sito no-ip.com. All'inizio dello script rilevo l'ip internet corrente e setto LASTIP con "force", vedo se esiste un file con l'ultimo ip assegnato al dns, se non c'è lo creo e ci metto il nuovo ip, altrimenti leggo il file e assegno alla variabile LASTIP il contenuto del file.
Successivamente controllo se l'ip è settato con 127.0.0.1 (a volte ho visto che non prendeva l'ip internet corretto ma quello del localhost) se non è quello proseguo sull'altro if che controlla se l'ultimo ip è diverso dal nuovo e allora significa che devo aggiornare l'ip altrimenti non faccio nulla ed esco. :

#!/bin/sh
USERNAME="username"
PASSWORD="Pa$$word"
HOSTNAME1="miodominio"
HOSTNAME2="www.miodominio.org"
HOSTNAME3="submiodominio.miodominio.org"
oldipfile=/tmp/no-ip_oldip.txt
filelog=/tmp/no-ip.log
curlout=/tmp/no-ip_curlupdate.log
NEWIP=$(curl ifconfig.me)
echo "--------------------------------------------------------" >> $filelog
echo "$(date) Rilevato ip: $NEWIP" >> $filelog
echo "Rilevato ip: $NEWIP"
LASTIP="force"
if [[ -f "$oldipfile" ]]
  then
    echo "$(date) Il file $oldipfile esiste, leggo ultimo ip" >> $filelog
    echo "Il file $oldipfile esiste, leggo ultimo ip"
    LASTIP=$(cat $oldipfile)
    echo "$(date) Ultimo ip letto: $LASTIP" >> $filelog
    echo "Ultimo ip letto: $LASTIP"
  else
    echo "$(date) Il file $oldipfile non esiste, lo creo e ci metto il nuovo ip: $NEWIP" >> $filelog
    echo "Il file $oldipfile non esiste, lo creo e ci metto il nuovo ip: $NEWIP"
    echo $NEWIP > $oldipfile
fi

if [ "$NEWIP" != "127.0.0.1" ]
  then
    if [ "$NEWIP" != "$LASTIP" ]
      then
        echo "$(date) Aggiorno il dns con il nuovo ip: $NEWIP" >> $filelog
        echo "Aggiorno il dns con il nuovo ip: $NEWIP"
        /usr/sbin/curl -u $USERNAME:$PASSWORD "http://dynupdate.no-ip.com/nic/update?hostname=$HOSTNAME1&myip=$NEWIP" >> $curlout
        /usr/sbin/curl -u $USERNAME:$PASSWORD "http://dynupdate.no-ip.com/nic/update?hostname=$HOSTNAME2&myip=$NEWIP" >> $curlout
        /usr/sbin/curl -u $USERNAME:$PASSWORD "http://dynupdate.no-ip.com/nic/update?hostname=$HOSTNAME3&myip=$NEWIP" >> $curlout
        rm $curlout
        grep -e "good" -e "nochg" $curlout
        if [ $? -eq 0 ]
          then
            echo "$(date) Aggiornamento dns ok" >> $filelog
            echo "Aggiornamento dns ok"
          else
            echo "$(date) Aggiornamento dns non andato a buon fine, effettuare dei check" >> $filelog
            echo "Aggiornamento dns non andato a buon fine, effettuare dei check"
        fi
      else
        echo "$(date) IP non e cambiato, tutto ok" >> $filelog
        echo "IP non e cambiato, tutto ok"
    fi
fi

Inserimento in crontab

Controllare che esista e abbia queste permission il file rcS1.user usato per l'esecuzione degli script di boot del router:

/config/xxx/amod # ls -latr rcS1.user
-rwxr-xr-x    1 root     root           259 Jun 18 09:23 rcS1.user

Bisogna aggiungere questa riga di codice al file di cui sopra, in modo che venga inserito lo script nel crontab amod, questo script verrà eseguito ogni 5 minuti:

# cat /etc/amod/conf/rcS1.user
...
...
#!/bin/sh
/etc/amod/bin/cron add "*/5 * * * * /usr/etc/amod/conf/no-ip.sh"

Controllare se dopo il reboot del router ci sono le schedulazioni corrette:

 #  cat /etc/crontabs/root
..................
*/5 * * * * /usr/etc/amod/conf/no-ip.sh
.................