Contenuti

Python, Fritz e l'elfo - parte 3

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:

 1#!/usr/bin/python
 2from fritzconnection import FritzConnection
 3import telepot
 4import re
 5import os
 6
 7fritzpass = 'lamiapassworddelrouter'
 8bottoken = 'INSERT_TOKEN_HERE'
 9chatid = 'INSERT_CHATID_HERE'
10
11# read data from router
12connection = FritzConnection(password=fritzpass)
13ip = connection.call_action('WANPPPConnection', 'GetExternalIPAddress')['NewExternalIPAddress']
14status = connection.call_action('WANPPPConnection', 'GetInfo')['NewConnectionStatus']
15
16# if !connected, exit
17if status != 'Connected':
18    sys.exit
19
20# read last assigned IP address
21mydir = os.path.dirname(os.path.realpath(__file__))
22lastip_file = mydir + '/lastip.txt'
23lastip = ''
24if os.path.exists(lastip_file):
25    with open(lastip_file, 'r') as thefile:
26        lastip=thefile.readline()
27
28# initialize telegram bot connection
29bot = telepot.Bot(bottoken);
30
31# if ip is changed, update the file and notify via telegram
32if ip != lastip:
33    with open(lastip_file, 'w') as thefile:
34        thefile.write("%s" % ip)
35    bot.sendMessage(chatid, 'Current IP: %s ' % (ip) )
36
37# if we're natted, reconnect
38match = re.search('^100\.', ip)
39if match:
40    bot.sendMessage(chatid, 'We\'re natted (%s), requesting reconnection.' % (ip) )
41    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:

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