/ Raspberry Pi

Reconectar a internet una Raspberry Pi

Qué cosas tiene la vida. Mi Raspberry Pi, donde tengo alojado un servicio de Nextcloud y otro de Git, de vez en cuando pierde la conexión de internet.

No sé donde se encuentra el problema, ni como ocurre. Pero eso no me preocupa mucho, ya qué, lo normal es que se volviese a conectar automáticamente, y no lo hace.

Por lo tanto, cada vez que pasa esto, me quedo sin servidor, y lo único que puedo hacer es desenchufarlo y volverlo a enchufar. Una práctica nada recomendada, por cierto.

Esto es lo que pasa cuando juegas a ser Diós SysAdmin siendo un autodidacta de pacotilla. Que se crean mil problemas (de los que te enteras) y no sabes como solucionarlo.

Pero como buena persona de bien, me fuí directamente a https://stackoverflow.com internet a buscar una solución, y mira por donde encontré un blog (samhobbs.co.uk) donde el autor tenía el mismo problema. ¿Será algo común y yo sin tener ni idea?

En dicho artículo, el autor crea un script donde mira la conexión a internet, y en caso de estar caída, la intenta levantar (todo esto suena muy p0rn o ¿me lo parece solo a mí?).

Ya sé, querido lector. Te estarás preguntando ¿a que viene contar todo esto si ya está escrito y publicado?. El listo de tarteka ya está duplicando contenido.

En parte teneís razón, eso no lo discuto. Pero también tengo mis razones. Primero que está en inglés, segundo que el autor puede borrar la entrada y perderse entre los mares de bits del internés. Y por último, me gusta tener a mano información que me puede ser útil el día de mañana, y por eso lo dejo en mi blog.

Ahora que ya he reconocido que soy un pecador sin remedio, y que acabaré en el infierno de los geeks (un mundo sin tecnología, donde lo más parecido es la manivela de un organillo), puedo continuar mostrando el proceso y el script.

Cómo lo hace

Crear una carpeta en tu directorio de usuario.

mkdir ~/bin

Entramos en la carpeta recién creada y creamos un archivo llamado network-monitor.sh con el editor que tú prefieras. Por ejemplo, nano network-monitor.sh.

Copiamos el siguiente script:

LOGFILE=/home/TuUsuario/network-monitor.log

if ifconfig eth0 | grep -q "inet addr:" ;
then
        echo "$(date "+%d %m %Y %T") : Ethernet OK" >> $LOGFILE
else
        echo "$(date "+%d %m %Y %T") : Ethernet connection down! Attempting reconnection." >> $LOGFILE
        ifup --force eth0
        OUT=$? #save exit status of last command to decide what to do next
        if [ $OUT -eq 0 ] ; then
                STATE=$(ifconfig eth0 | grep "inet addr:")
                echo "$(date "+%d %m %Y %T") : Network connection reset. Current state is" $STATE >> $LOGFILE
        else
                echo "$(date "+%d %m %Y %T") : Failed to reset ethernet connection" >> $LOGFILE
        fi
fi

Guardamos, cerramos y le damos permisos de ejecución chmod +x network-monitor.sh

Por último solo falta automatizarlo para que se ejecute cada cierto tiempo (en mi caso cada 5 minutos).

Abrimos crontab sudo nano /etc/crontab, y añadimos la última linea del ejemplo:

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
*/5 * * * * root bash /home/TuUsuario/bin/network-monitor.sh

Y eso es todo para que funcione. Aunque ni explico el script, ni te digo donde guarda el registro de todo esto (no creo que haga falta, está en el código).

De todas formas, me gustaría saber si sabeís de alguna otra forma para solucionar el problema, o si el código necesita un repaso. ¿Qué me decís?