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
.................