dotfiles/.bin/wlan-autoreconnect.py

101 lines
3.2 KiB
Python

#!/usr/bin/python3
import psutil
import time
import sys
import logging
import subprocess
import requests
import socket
import netifaces
from netaddr import IPNetwork, IPAddress
# Threshold in KB
threshold = 100*1000
# Interface
interface = 'wlp4s0'
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s] %(message)s",
handlers=[
logging.StreamHandler()
])
log = logging.getLogger(__name__)
last_traffic = 0
if interface not in netifaces.interfaces():
log.error(interface + ' was not found')
sys.exit(1)
while True:
traffic = psutil.net_io_counters(pernic=True)[interface]
traffic_wifi = int((traffic.bytes_sent + traffic.bytes_recv)/1024)
log.info('Traffic on ' + interface + ': ' + str(traffic_wifi) + ' KB')
if (traffic_wifi - last_traffic) > threshold or traffic_wifi < last_traffic:
log.warning('Traffic since last mac change above threshold (or traffic counter changed strangely), changing MAC')
last_traffic = traffic_wifi
subprocess.run(['ip', 'link', 'set', interface, 'down'])
subprocess.run(['macchanger', '-r', interface])
subprocess.run(['ip', 'link', 'set', interface, 'up'])
timeout = time.time()+20
ip = "0.0.0.0"
while True:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('10.255.255.255', 1))
ip = s.getsockname()[0]
log.info('Got IPv4 ' + ip)
s.close()
break
except:
time.sleep(1)
if time.time() >= timeout:
log.error('Timeout while waiting for IP address')
break
if IPAddress(ip) in IPNetwork("172.18.0.0/16"):
headers = {
'Host': 'www.wifionice.de',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; irv:58.0) Gecko/20100101 Firefox/58.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en-US,en;q=0.5',
'Referer': 'http://www.wifionice.de/',
'Content-Type': 'application/x-www-form-urlencoded',
'Cookie': 'csrf=42',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1'
}
try:
log.info('Trying login to WIFIonICE in 5 seconds ...')
time.sleep(5)
r = requests.post('http://www.wifionice.de/de/', data={'login': 'true', 'CSRFToken': '42', 'connect': ''}, headers=headers, timeout=15)
if r.status_code == 200:
log.info('Logged in to WIFIonICE')
else:
log.warning('Logging in failed, got status code ' + str(r.status_code))
except requests.exceptions.ConnectTimeout:
log.error('Timeout while trying to login, visit http://www.wifionice.de/ to check')
except:
log.error('Error while trying to log in')
time.sleep(10)