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()