Contenuti

Python, Fritz e l'elfo - parte 3

Contenuti

Siamo messi cosi’: c’è uno script che gira ogni 5 minuti, controlla l’ip della connessione esterna e se ci è stato dato un IP non pubblico, manda un messaggio via telegram e richiede una riconnessione.

Ma l’elfo è antipatico e, nonostante i suoi deliri, immagina già la situazione: una bel mercoledì sera, nella sede del BgLUG, mi devo connettere con la rete di casa perché le le modifiche che mi servono si trovano sul repo git del nas e non sul mio portatile; ovviamente in quell’istante la linea di casa si riconnette, viene assegnato un ip nattato e il mio script fa il suo dovere: mi comunica la cosa e richiede una riconnessione. Ora non mi resta che aspettare il tempo di propagazione del dns dinamico… se solo avessi modo di ricevere via telegram anche il nuovo IP…

E niente, non ce n’è, l’elfo ha ragione. Già che lo script gira ogni 5 minuti, ci vuole poco per farsi dire anche quale è l’indirizzo IP.

La soluzione è semplice: si scrive in un file l’ultimo indirizzo IP esterno attivo; si legge questo file ad ogni esecuzione e se l’indirizzo IP esterno e’ diverso da quello del file, allora lo si segnala, sempre via Telegram.

Ecco:

#!/usr/bin/python
from fritzconnection import FritzConnection
import telepot
import re
import os

fritzpass = 'lamiapassworddelrouter'
bottoken = 'INSERT_TOKEN_HERE'
chatid = 'INSERT_CHATID_HERE'

# read data from router
connection = FritzConnection(password=fritzpass)
ip = connection.call_action('WANPPPConnection', 'GetExternalIPAddress')['NewExternalIPAddress']
status = connection.call_action('WANPPPConnection', 'GetInfo')['NewConnectionStatus']

# if !connected, exit
if status != 'Connected':
    sys.exit

# read last assigned IP address
mydir = os.path.dirname(os.path.realpath(__file__))
lastip_file = mydir + '/lastip.txt'
lastip = ''
if os.path.exists(lastip_file):
    with open(lastip_file, 'r') as thefile:
        lastip=thefile.readline()

# initialize telegram bot connection
bot = telepot.Bot(bottoken);

# if ip is changed, update the file and notify via telegram
if ip != lastip:
    with open(lastip_file, 'w') as thefile:
        thefile.write("%s" % ip)
    bot.sendMessage(chatid, 'Current IP: %s ' % (ip) )

# if we're natted, reconnect
match = re.search('^100\.', ip)
if match:
    bot.sendMessage(chatid, 'We\'re natted (%s), requesting reconnection.' % (ip) )
    connection.reconnect()

(aggiornamento) Netflix e il teletrasporto

E alla fine e’ successo: mia moglie ha scoperto Netflix.

Purtroppo Eolo ha comprato una nuova classe di indirizzi IP che in precedenza era statunitense; questo implica che quando viene assegnato un indirizzo IP di questa classe alla mia connessione, Netflix ci associa al catalogo statunitense. E mia moglie rogna…

Aggiungiamo qualche riga allo script e sistemiamo la cosa:

# if we're in USA, reconnect
match = re.search('^149\.35', ip)
if match:
    bot.sendMessage(chatid, 'We\'re in USA (%s), requesting reconnection.' % (ip) )
    connection.reconnect()