# [RISOLTO X SEMPRE!] Netgear DG834G: ping & reboot

## funkoolow

salve a tutti,

Ho un bel routerino+modem adsl della netgear (il DG834G) che va benissimo se non fosse che ogni tanto quei... simpaticoni... della telecozz con cui ho l'abbonamento flat adsl mi fanno cadere la connettività (che vorrei sempre up per il mio serverino domestico), quindi mi chiedevo se vi potesse sembrare fattibile la realizzazione di uno script da eseguire in crontab a scadenza continua che:

1) esegue un ping di test, diciamo a www.yahoo.com

2a) se il ping va, non fa niente

2b) se il ping non va, si logga al menu di admin del router (attraverso l'ip interno) e riavvia il router cliccando sull'apposita voce del menu.

La cosa mi è venuta in mente pensando a quei piccoli tools che girano per mandare SMS via linea di comando, che in sostanza fanno la stessa cosa che servirebbe a me, il problema è REALIZZARLA adattondola a questo diverso scopo  :Rolling Eyes: 

qualcuno ha volontà, idee, consigli (o insulti) al riguardo? intanto, grazie a tutti!  :Smile: 

[Edit: taggo e cambio il titolo]

----------

## Ic3M4n

tutti i router che ho visto sono fatti con linux e busybox. se provi a fare telnet sul suo ip ed ottieni il terminare puoi lanciare un comando di reboot.

----------

## funkoolow

che gaudio, googlando quel busybox + il nome del mio modello, mi è saltato fuori un eccellente pagina che fa proprio al caso mio, che riporto se dovesse servire a qualcun altro possessore di questa bella macchinetta:

http://dg834.grandou.net/index.php?page=TipsandTricks

per ringraziarti della celere dritta, ti vado a firmare la petizione (tantopiù che c'ho pure una 9700pro)!

...vado a telnettare  :Wink: 

----------

## funkoolow

allora, riapro il mio post perchè, dopo essere riuscito a telnettare il mio routerino grazie alla dritta riportata sulla pagina segnalata sopra, ho pure notato la presenza di un comodo scriptino, utile proprio a risolvere il mio specifico problema (evidentemente deve essere un problema noto di questo modello), eccolo qui di seguito:

```
#!/bin/sh

#       @(#)Ping script by Ripserve

# Version 0.2 Feb 2005

# Released under the GPL

# Usually run via cron, which emails output of errors

# If all is well, you will never see any output from this

# see http://www.ripserve.com/gpl/ for latest version

# BUGS: doesn't work with BSD ping, but linux is fine

# Add the IPs or FQDNs of hosts you want to ping.

HOSTS=" localhost www.yahoo.com"

for HOST in $HOSTS

do

#start pinging and suppress output if host is up

    ping -c1 -w1 $HOST > /dev/null

# if pinging fails log to Netgear log

    if [ $? -ne 0 ]

            then

            logger "ping: $HOST failed, preparing to reboot"

# after logging ping failures, reboot the router

      sh /sbin/reboot

   else

   fi

        

done

exit 0

```

ho provato a caricare il file sul router ma la cosa non sembra essere fattibile:

```
wget: ping.sh: Read-only file system
```

Incuriosito, ho provato a farmi una dir nella root, ottenendo la stessa risposta:

```
# ls

bin      etc      proc     tmp      var      www.deu  www.fre

dev      lib      sbin     usr      www      www.eng  www.ita

# mkdir scripts

mkdir: Cannot create directory `scripts': Read-only file system
```

A questo punto, data la mia remotissima comprensione della faccenda, qualcuno potrebbe rendermi la cosa più chiara spiegandomi cosa potrei fare per mettere quello script sul router?

grazie a tutti  :Smile: 

----------

## randomaze

 *funkoolow wrote:*   

> A questo punto, data la mia remotissima comprensione della faccenda, qualcuno potrebbe rendermi la cosa più chiara spiegandomi cosa potrei fare per mettere quello script sul router?

 

Prova a vedere, con il semplcie comando "mount" cosa c'é montato in rw.

----------

## funkoolow

```
# mount

/dev/mtdblock/0 on / type squashfs (ro)

none on /dev type devfs (rw)

/proc on /proc type proc (rw)

ramfs on /tmp type ramfs (rw)
```

non mi sembra che le partizioni in rw siano plausibilmente utilizzabili...

vista la situazione, secondo me si potrebbe operare tramite un altra macchina che, collegata al router via telnet, potrebbe eseguire lo script tramite crontab: finchè pinga, bene; quando non pinga più, si collega via telnet al router e lancia il reboot. il problema è formalizzare il tutto in uno script sh, includendo contestualmente la visita al link che attiva il telnet (come spiegato a questo url).

qualcuno capace?   :Wink: 

----------

## Ic3M4n

domanda stupida: di solito i produttori forniscono le flash aggiornate dei loro prodotti, o comunque sul sito dovresti trovare qualcosa... tipo il mio Ã¨ un formato .bin che credo si possa estrarre. modificarlo prima e poi flasharlo Ã¨ troppo rischioso. vero?

se non si accende piÃ¹ sono C?*$i amari.

----------

## funkoolow

beh, in effetti il firmware c'è e oggi stesso so pure passato dalla v1.0.3 alla 3.0.1.25. nel mio caso il file è in formato .img, e francamente non saprei proprio come trattarlo. Secondo me, se si potesse mettere tutto sull'altra macchina sarebbe meglio,  almeno non si andrebbe a mettere mano al sistema operativo del router che se si sputtana si butta...

----------

## Ic3M4n

si, mi era venuta una mezza idea di fare qualcosa con il mio router.... perÃ² in effetti la cosa Ã¨ un po' rischiosa.

in ogni caso puoi sempre eseguire quello script dal tuo pc, credo che basti  modifarlo leggermente e utilizzare telnet per fare lo shutdown

----------

## funkoolow

 *Ic3M4n wrote:*   

> si, mi era venuta una mezza idea di fare qualcosa con il mio router.... perÃ² in effetti la cosa Ã¨ un po' rischiosa.
> 
> in ogni caso puoi sempre eseguire quello script dal tuo pc, credo che basti  modifarlo leggermente e utilizzare telnet per fare lo shutdown

 

ehm, come?  :Rolling Eyes: 

se tu fossi in grado, te ne sarei molto grato, io sono un pò troppo alle prime armi....

----------

## funkoolow

posto giusto per far presente che sono riuscito a chiudere la questione grazie al superbo expect configurato su una macchina remota per eseguire via telnet lo script di reboot del router in caso di mancato ping  :Wink: 

buonanotte a tutti   :Rolling Eyes: 

----------

## funkoolow

scusate, mi tocca riaprire nuovamente. il punto è che se lancio lo script a mano via bash, il sistema funziona perfettamente: col cavo adsl attaccato dietro al router, lo script verifica che il ping risponde e passa oltre; se invece stacco il cavo della connettività esterna, il ping fallisce e vengono attivati i due script expect che riavviano il router.

La cosa strana è che se automatizzo tutto in crontab, il router non si riavvia. Dal log messages sembra che lo script viene avviato alle scadenze settate nella riga di cron, ma poi non vengono eseguiti i due script expect quando stacco la connettività esterna, nonostante il tutto funzioni se lanciato a mano via bash.

Vi riporto tutti gli script, sperando in una vostra delucidazione:

lo script che pinga ed eventualmente riavvia:

```
#!/bin/sh

#       @(#)Ping script by Ripserve

# Version 0.2 Feb 2005

# Released under the GPL

# Usually run via cron, which emails output of errors

# If all is well, you will never see any output from this

# see http://www.ripserve.com/gpl/ for latest version

# BUGS: doesn't work with BSD ping, but linux is fine

# Add the IPs or FQDNs of hosts you want to ping.

HOSTS=" localhost www.yahoo.com"

for HOST in $HOSTS

do

#start pinging and suppress output if host is up

    ping -c1 -w1 $HOST > /dev/null

# if pinging fails log to Netgear log

    if [ $? -ne 0 ]

            then

            logger "ping: $HOST failed, preparing to reboot"

# after logging ping failures, reboot the router

      /root/router-activtelnet.exp && /root/router-reboot.exp

   fi

done

exit 0
```

lo script expect router-activtelnet.exp che attiva il telnet sul router:

```
#!/usr/bin/expect -f

set timeout 1

set send_human {.1 3 1 .05 2}

spawn lynx http://[ipdelrouter]/setup.cgi?todo=debug

expect "Username"

send -h "[username]\r"

expect "Password: "

send -h "[password]\r"

expect eof
```

lo script expect router-reboot.exp che riavvia il router via telnet

```
#!/usr/bin/expect -f

set timeout 1

set send_human {.1 3 1 .05 2}

spawn telnet [ipdelrouter]

send -h "reboot\r"

expect eof
```

la riga di cron che ho settato per far andare lo script ogni cinque minuti:

```
funkserver ~ # crontab -e

[...]

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /root/router-pingtest.sh
```

un estratto del /var/log/messages che dimostra che lo script di test del ping viene correttamente eseguito ogni cinque minuti:

```
funkserver ~ # tail /var/log/messages

[...]

Feb 20 13:00:01 funkserver cron[7760]: (root) CMD (/root/router-pingtest.sh)

[...]

Feb 20 13:05:02 funkserver cron[7805]: (root) CMD (/root/router-pingtest.sh)

[...]

```

spero che qualcuno riesca a farmi capire, intanto grazie e scusate se chiudo e riapro di continuo ma ogni volta mi illudo di aver risolto!  :Embarassed: 

----------

## funkoolow

nessuno che sa darmi un aiuto?  :Sad: 

----------

## funkoolow

tra una sclerata e l'altra, sono riuscito a scoprire che il problema sembra derivare dallo script che attiverebbe il telnet sul router visitando un link tramite lynx dopo autenticazione (nello specifico, il file /root/router-activtelnet.exp). Infatti, se a mano attivo il link di persona, lo script poi riesce ad andare fino in fondo riavviando il router se stacco il cavo di connessione esterna. Ora il punto è, a parte il mistero persistente del perchè via bash il tutto funzioni e via cron no, capire cosa c'è che non va nel mio script expect in questione.

Li riporto tutti di nuovo, dato che ho provveduto a fare qualche modifica aggiungendo path che in qualche caso mi erano sfuggiti e che si pensava potessero essere il problema.

il file router-pingtest.sh

```
#!/bin/sh

#       @(#)Ping script by Ripserve

# Version 0.2 Feb 2005

# Released under the GPL

# Usually run via cron, which emails output of errors

# If all is well, you will never see any output from this

# see http://www.ripserve.com/gpl/ for latest version

# BUGS: doesn't work with BSD ping, but linux is fine

# Add the IPs or FQDNs of hosts you want to ping.

HOSTS="localhost www.yahoo.com"

for HOST in $HOSTS

do

#start pinging and suppress output if host is up

    /bin/ping -c1 -w1 $HOST > /dev/null

# if pinging fails log to Netgear log

    if [ $? -ne 0 ]

            then

            /usr/bin/logger "ping: $HOST failed, preparing to reboot"

# after logging ping failures, reboot the router

      /root/router-activtelnet.exp && /root/router-reboot.exp

   fi

done

exit 0
```

il file router-activtelnet.exp:

```
#!/usr/bin/expect -f

set timeout 1

set send_human {.1 3 1 .05 2}

set LYNX /usr/bin/lynx

set HOST http://[iprouter]/setup.cgi?todo=debug

set USER [user]

set PASS [pass]

spawn $LYNX $HOST

expect :

send -h "$USER\r"

expect :

send -h "$PASS\r"

expect

send -h "q\r"

send -h "y\r"

expect eof
```

il file router-reboot.exp:

```
#!/usr/bin/expect -f

set timeout 5

set send_human {.1 3 1 .05 2}

set TELNET /usr/bin/telnet

set HOST2 192.168.0.2

set REBOOT reboot

spawn $TELNET $HOST2

expect #

send "$REBOOT\r"

expect eof
```

la riga di crontab incriminata:

```
*/5 * * * * /root/router-pingtest.sh 1> /dev/null 2> /var/log/router.log
```

il log di /var/log/messages non lo riporto tanto non c'è niente di nuovo.

----------

## funkoolow

scusate se riposto nuovamente ma devo assolutamente rendere omaggio al detto "chi la dura la vince". Sono riuscito a risolvere, spero definitivamente. Non so perchè ma con lynx l'expect in cron non andava, quindi ho fatto qualche test con altri browser testuali, finchè il caro links mi è riuscito a venire incontro, seppur esigendo qualche piccola (ennesima) modifica. Posto gli script finali, giusto nel caso in cui qualcuno si trovasse nella mia stessa, stressante condizione:

router-pingtest.sh:

```
#!/bin/sh

#       @(#)Ping script by Ripserve

# Version 0.2 Feb 2005

# Released under the GPL

# Usually run via cron, which emails output of errors

# If all is well, you will never see any output from this

# see http://www.ripserve.com/gpl/ for latest version

# BUGS: doesn't work with BSD ping, but linux is fine

# Add the IPs or FQDNs of hosts you want to ping.

HOSTS="localhost www.yahoo.com www.google.com"

for HOST in $HOSTS

do

#start pinging and suppress output if host is up

    /bin/ping -c1 -w1 $HOST > /dev/null

# if pinging fails log to Netgear log

    if [ $? -ne 0 ]

            then

            /usr/bin/logger "ping: $HOST failed, preparing to reboot"

# after logging ping failures, reboot the router

      /root/router-activtelnet.exp && /root/router-activtelnet.exp && /root/router-activtelnet.exp && /root/router-activtelnet.exp && /root/router-reboot.exp

   fi

done

exit 0
```

router-activtelnet.exp:

```
#!/usr/bin/expect -f

set timeout 1

set send_human {.1 3 1 .05 2}

set LINKS /usr/bin/links

set HOST [iprouter]/setup.cgi?todo=debug

set USER [user]

set PASS [pass]

spawn $LINKS http://$USER:$PASS@$HOST

expect eof
```

router-reboot.exp:

```
#!/usr/bin/expect -f

set timeout 5

set send_human {.1 3 1 .05 2}

set TELNET /usr/bin/telnet

set HOST2 [iprouter]

set REBOOT reboot

spawn $TELNET $HOST2

expect #

send "$REBOOT\r"

expect eof
```

Settato così, sembra riesca ad andare anche in cron, chissà perchè prima no, forse qualche problema legato al lynx... Detto questo, chiudo finalmente felice.

----------

