Procedure installate sul Raspberry di Civiglio

Pubblicato il Lascia un commentoPubblicato in Uncategorized
  1. Notifica tramite mail dell avvenuto cambiamento del WANIP

Lo script  wan-ip-change-detector.sh permette di conoscere l’indirizzo WAN di Raspberry verificando ogni 5 minuti se l’indirizzo WAN è cambiato , nel qual caso invia mail di notifica.

Procedura di installazione

cd /home/pi
sudo apt-get install curl sendemail nano
sudo apt-get install libio-socket-ssl-perl libnet-ssleay-perl perl
curl ifconfig.me > wan-ip.log

inserire il seguente codice in wan-ip-change-detector.sh

#############################################
!/bin/bash

log_history=”wan-ip.history”
log_last=”wan-ip.last”
service=”ip.bsd-unix.net”
smtp=”smtp.gmail.com”
email_to=”flavio.pontiggia@gmail.com”
email_from=$email_to
email_usr=$email_from
email_pwd=”1956lilli”

wanipold=$(cat /home/pi/$log_last)
wanipnew=$(curl “$service”)

if [ “$wanipold” != “$wanipnew” ]; then
echo “$wanipnew” > $log_last
echo “===========================`eval date +%Y-%m-%d”\ “%H:%M`===========================” >> $log_history
echo “$wanipnew” >> $log_history
sendemail -f $email_from -t $email_to -u “WAN IP Changed” -m “$wanipnew” -s $smtp -o tls=yes -xu $email_usr -xp $ema$
else
echo wan ip not changed
fi

#######################################

sudo chmod+x wan-ip-change-detector.sh
sudo ./wan-ip-change-detector.sh

2. Come conosce l’attuale  indirizzo remoto del nostro Raspberry 

Dare il comando www.flaviopontiggia.it/ipremote.php?pass=123456

How to Flash a Custom Firmware to Sonoff

Pubblicato il Lascia un commentoPubblicato in Uncategorized

 

First, watch the step by step video tutorial below

The code mentioned in the video can be found here: “Reprogram Sonoff Smart Switch with Web Server“.

Safety warning

Make sure you disconnect your Sonoff from mains voltage. Then, open the box enclosure.

 

Sonoff pinout

The Sonoff is meant to be hacked, and you can see clearly that these connections were left out, so that you can solder some pins and upload a custom firmware.

That’s the pinout.

sonoff_gpio-r

I’ve soldered 4 header pins, so that I can easily connect and disconnect wire cables to my Sonoff device.

pins-soldered

Preparing your 3.3V FTDI module

You need an FTDI module to upload a new firmware to your Sonoff. Use the schematics provided as a reference.

schematics-copy

Warning: uploading a custom firmware is irreversible and you’ll no longer be able to use the app eWeLink.

I’ve added a toggle switch in the power line, so that I can easily turn the Sonoff on and off to flash a new firmware without having to unplug the FTDI module.

I used hot glue to glue the ends of the wires together. This prevents you to make wrong connections between the FTDI and the Sonoff in the future.

hot-glue-ftdi

Boot your Sonoff in Flashing Mode

To flash a new firmware to your Sonoff, you have to boot your Sonoff in flashing mode. Follow this 4 step process:

1) Connect your 3.3V FTDI programmer to your computer

2) Hold down the Sonoff button

hold-down-sonoff-button

3) Toggle the switch to apply power to the Sonoff circuit

apply-power-to-sonoff

4) Then, you can release the Sonoff button

Now, your Sonoff should be in flashing mode and you can upload a new firmware.

Backup Raspberry Pi SD card

Pubblicato il Lascia un commentoPubblicato in Uncategorized
Ciao a tutti in questo breve post volevo condividere con voi un piccolo script bash che ho scritto per effettuare il backup della SD card del mio raspberry pi, che utilizzo come webserver domestico.

La prudenza non è mai troppa, e la prevenzione, in informatica, soprattutto quando si ha a che fare con dispositivi di storage, quali hard disk, memory card e memorie flash in generale è fondamentale. Io, ovviamente, non perdo occasione di dimenticarmi questa cosa… Ma il buon Edward Murphy non si dimentica mai di ricordamelo. Qualche giorno fa, infatti, mi si è “cotta” la SD card del raspberry, capita 🙁 , ma dopo una giornata passata a reinstallare il sistema e a riconfigurare il webserver, mi sono detto che era fondamentale fare qualcosa.

Per tanto ho deciso di scrivere un piccolo script per effettuare il backup dell’intero sistema installato sul raspberry pi in un immagine sul mio PC in modo che se dovesse accadere una cosa del genere ancora, spenderei molto meno tempo a ripristinare il tutto.

Ma bando alle ciance, come funziona?

Il concetto è semplice, lo script stabilisce una connessione ssh con il raspberry pi, che si trova nella mia stessa rete locale, e usando il comando dd recupera in input i byte della sd card, ovvero, nel mio caso del device /dev/mmcblk0 e sfruttando le enormi potenzialità della pipe unix e di ssh li trasferisce al mio PC che a sua volta sta eseguendo un’istanza di dd con parametro of=nomeimmagine creando il mio backup!

L’immagine generata viene poi compressa con tar per risparmiare spazio.

Eccovi il codice:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#! /bin/bash
# Descriprion:
# This simple script creates a local sd image backup of a remote raspberry pi in a local folder
# using ssh, dd, and the unix pipe
# Requirements:
# - ssh e sshpass
# - notify-send
RASPBERRY_USER=pi # your raspberry pi username
RASPBERRY_PASS=raspberry # your raspberry pi password, the script assumes this user is in the sudoers file of the raspberry
RASPBERRY_ADDR=192.168.0.8 # IP address (or hostname if you're using a dynamic dns server)
BACKUP_FOLDER=/home/username/RB_BACKUP # local backup destination folder
BACKUP_NAME=$(date +"%Y%m%d_%H%M") # image filename
BACKUP_IMAGE=/home/username/RB_BACKUP/$BACKUP_NAME.img # absolute path to generated image
# Notify user, script is starting, useful if running this script with cron
notify-send "RASPBERRY BACKUP: Starting backup process, raspberry pi: $RASPBERRY_ADDR"
# Try to ping raspberry, if you can't find it, exit now
ping -c 3 $RASPBERRY_ADDR > /dev/null 2> /dev/null
if [ $? -ne 0 ]; then
notify-send "RASPBERRY BACKUP: cannot ping raspberry at: $RASPBERRY_ADDR exiting"
exit 1
fi
# If destination dir does not exist, create it
if [ ! -d "$BACKUP_FOLDER" ]; then
mkdir $BACKUP_FOLDER
fi
notify-send "RASPBERRY BACKUP: Initiating SSH transfer, do not turn off your PC!!!"
# This opens a ssh connection with raspberry, and using dd and the unix pipe creates a local device image
sshpass -p $RASPBERRY_PASS ssh $RASPBERRY_USER@$RASPBERRY_ADDR 'echo $RASPBERRY_PASS | sudo -S dd if=/dev/mmcblk0' | dd of=$BACKUP_IMAGE
# Check if everything is ok
if [ $? -ne 0 ]; then
notify-send "RASPBERRY BACKUP: Something went wrong with the ssh transmission, deleting temporary files, try again!"
rm $BACKUP_IMAGE
exit 1
fi
notify-send "RASPBERRY BACKUP: Transfer complete, compressing image..."
# Compress image
tar -pczf $BACKUP_FOLDER/$BACKUP_NAME.tar.gz $BACKUP_IMAGE
# Check compression result
if [ $? -ne 0 ]; then
notify-send "RASPBERRY BACKUP: Backup complete, BUT it wasn't possible to compress the image"
exit 1
fi
# Delete uncompressed files
rm $BACKUP_IMAGE
notify-send "RASPBERRY BACKUP: Backup Complete! Backup saved in $BACKUP_FOLDER"

Il processo completo, sul mio PC e sulla mia rete locale dura poco più di mezz’ora.

Ovviamente per ripristinare il backup, bisognerà effettuare l’operazione inversa, ovvero collegare al pc la sd card, decomprimere l’immagine con tar,

e lanciare il comando:

1
dd if=/path/all/immagine/da/ripristinare.img of=/dev/nomedevice_nuova_scheda_SD

Lo script è ancora un work in progress, per cui ci possono essere dei problemi, in caso segnalatemeli!

E se volete collaborare scrivete pure qua sotto le vostre modifiche.

Lo script potete trovarlo anche sul mio repository di github a questo indirizzo: https://github.com/elrod/RaspberryBackup , c’è anche allegato un bel readme con istruzioni di utilizzo, i requisiti ecc.

CONOSCERE WAN IP senza DDNS

Pubblicato il Lascia un commentoPubblicato in Uncategorized

Rimpiazzare il proprio servizio di DNS dinamico con una coppia di script PHP e bash.

Esistono moltissimi servizi online anche gratuiti per il DNS dinamico quali DynDNS o NoIP. Questi servizi permettono l’associazione del propro indirizzo IP dinamico ad un nome DNS statico. Grazie ad essi è possibile raggiungere i servizi web installati dietro le proprie ADSL casalinghe (opportunamente nattate) senza dover ricordare e prendere nota dell’indirizzo IP pubblico che il provider di volta in volta ci fornisce.

Avevo un account su DynDNS per gestire da remoto il mio disco di backup ReadyNAS ma purtroppo dopo molto tempo il servizio è stato revocato e messo a pagamento. A tal punto, avendo già un dominio web PHP+MySQL (questo blog per l’appunto) ho deciso di implementarvi sopra un semplice servizio di traduzione IP in modo da raggiungere di nuovo il disco di backup.

Si è trattato semplicemente di realizzare una pagina web PHP che fornisce un redirect automatico (redirect HTML) al proprio indirizzo IP pubblico. L’indirizzo IP pubblico è memorizzato online in un file di testo ip.txt. E’ chiaro che tale indirizzo cambia con regolarità (al termine del lease-time impostato dal provider o ad ogni riavvio del modem ADSL) e quindi deve esistere un meccanismo per aggiornare tale file con il nuovo indirizzo. Un piccolo script bash che gira localmente sul ReadyNAS provvede ad aggiornare periodicamente il file remoto tramite una semplice richiesta HTTP GET.

In sostanza si tratta di realizzare due software distinti:

  1. ipremote.php: pagina PHP remota sul proprio dominio web che effettua il redirect all’indirizzo IP di casa
  2. ipupdater.sh: script bash locale (dietro ADSL) che ad intervalli regolari notifica la pagina web inviando il nuovo indirizzo IP

1) Pagina PHP (ipremote.php)

Molto semplicemente assolve alla duplice funzione di 1) redirect automatico e 2) aggiornamento del file ip.txt da parte dello script bash locale. Per accedere come redirect basta fornire la password corretta (in questo caso 123456) tramite una semplice richiesta GET: la pagina legge l’indirizzo IP pubblico corrente dal file e crea l’HTML per il redirect a quell’indirizzo. Per accedere in modalità aggiornamento (script bash presumibilmente) basta fornire, sempre in GET,  la password e il nuovo indirizzo IP: la pagina salverà l’indizzo IP specificato nel file di testo.

Ecco il codice:

<?php
$file = "ip.txt";
if(isset($_GET['newip']) == true && isset($_GET['pass']) == true)
{
   $ip = $_GET['newip'];
   $pass = $_GET['pass'];
   if($pass == "123456")
   {
      // update IP address
      file_put_contents($file, $ip);
   }
   else
   {
      echo "wrong password";
   }
}
else if(isset($_GET['pass']) == true)
{
   $pass = $_GET['pass'];
   if($pass == "123456")
   {
      // get IP address
      $ip = file_get_contents($file);
      echo '<html>';
      echo '<head>';
      echo '<meta http-equiv="refresh" content="0; url=http://'.$ip.'" />';
      echo '</head>';
      echo '<body>';
      echo '</html>';
   }
   else
   {
      echo "wrong password";
   }
}
?>

2) Script bash locale (ipupdater.sh)

Lo script bash viene eseguito periodicamente grazie a cron (ebbene si, il ReadyNAS è un embedded Linux a tutti gli effetti) e provvede a rilevare l’indirizzo pubblico corrente e a notificarlo alla pagina web PHP remota. La regola cron può essere impostata su una volta al minuto, una volta all’ora o quello che si vuole: più il rate di notifica è alto più bassa sarà la probabilità di trovare la pagina web momentaneamente disallineata col vero indirizzo IP.

Ecco lo script:

#!/bin/bash
ip=$(curl -s icanhazip.com)
password="123456"
wget -qO- $url &> /dev/null

Lo script valorizza la variabile $ip con l’IP pubblico corrente. A tal file viene utilizzato il servizio web icanhazip.com che molto semplicemente restituisce l’indirizzo corrente.
Viene quindi composta la stringa URL con la richiesta GET di aggiornamento IP verso la pagina ipremote.php. www.mysite.it è il proprio dominio web, dove risiede ipremote.php.
Infine viene mandata la richiesta HTTP GET tramite wget ovviamente disabilitando opportunamente l’output su file e su console (a noi non interessa).

Come si usa

Accedere al ReadyNAS locale diventa ora banale: basta collegarsi all’indirizzo http://www.mysite.it/ipremote.php?pass=123456 per ottenere il redirect.
Ovvimente il sistema funziona non solo per accedere a dischi di rete, ma tutto quello che avete deciso di esporre nella vostra rete LAN (pannello di gestione remota del modem ADSL, VNC server, programmi vari etc..).

Perchè la password?

E’ chiaro che solo lo script bash locale deve essere in grado di aggiornare l’indirizzo altrimenti potreste ritrovarvi con un redirect ad un IP impostato da terzi. Anche il semplice redirect deve essere protetto da password, più che altro per questioni di privacy: conviene che solo voi possiate raggiungere i servizi della vostra rete LAN (protetti anch’essi da password, ovviamente).

Conclusioni

Vantaggi del sistema? Innanzitutto non occorre registrarsi e fare affidamento a servizi di terze parti (DynDNS, NoIP etc..). Il sistema non soffre dei ritardi di propagazione tipici del DNS per cui il nuovo IP pubblico è prontamente rilevato e aggiornato (basta settare un rate di aggiornamento ragionevolmente breve, tipo 5 minuti). Con un pò di fortuna è possibile embeddare lo script bash direttamente nel modem ADSL; è sufficiente che il modem si appoggi su una qualche distro Linux e abbia il demone cron installato.

Esistono alcuni contro però: la password fissa è soggetta ad attacchi di tipo replay-attack. Converrebbe implementare o un rolling code (ma introduce la possibilità di disallineamento) o meglio ancora uno schema più raffinato di tipo challenge-response.
Altro problema è che occore avere un dominio web PHP funzionante dove appoggiare la pagina ipremote.php.