librefi/librefi/librefi.py

83 lines
3.2 KiB
Python
Raw Normal View History

2020-08-30 16:26:29 +02:00
#!/usr/bin/env python3
2020-11-29 05:05:37 +01:00
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import re
import requests
2020-08-30 16:26:29 +02:00
from .connectors import get_connector
from .fxckers._map import fxckers_map
2020-09-05 03:24:34 +02:00
from .logger import _Logger, LOG_LEVELS
2020-08-30 16:26:29 +02:00
class LibreFi:
2020-09-05 03:24:34 +02:00
def __init__(self, log_level=LOG_LEVELS.INFO, logger=_Logger):
2020-08-30 16:26:29 +02:00
self.connector = get_connector()()
self.current_fxcker = None
2020-09-05 03:24:34 +02:00
self.log_level = log_level
self.logger = logger
self.log = self.logger(key="lfi:core", log_level=self.log_level)
self.log.info("Initialized")
2020-08-30 16:26:29 +02:00
def _periodical_check(self):
2020-09-05 03:24:34 +02:00
self.log.debug("Doing periodical check")
2020-08-30 16:26:29 +02:00
status = self.connector.status()
2020-09-05 03:24:34 +02:00
self.log.debug("Disconnected" if not status["connected"]
else 'Connected to {} ("{}")'.format(
status["connection_type"],
status["connection_name"]))
2020-08-30 16:26:29 +02:00
if not status["connected"]:
2020-09-05 03:24:34 +02:00
self.current_fxcker = None
2020-08-30 16:26:29 +02:00
networks = self.connector.list()
chosen_network = None
for network in networks:
2020-09-05 01:54:23 +02:00
self._assign_fxcker_to_network(network)
if self.current_fxcker:
chosen_network = network
break
2020-08-30 16:26:29 +02:00
if chosen_network is not None:
2020-09-05 03:24:34 +02:00
self.log.info(
'Connecting to "{}"'
.format(network["ssid"]))
2020-08-30 16:26:29 +02:00
self.connector.connect(chosen_network)
status = self.connector.status()
2020-09-05 03:24:34 +02:00
else:
self.log.info("No eligible network found")
2020-08-30 16:26:29 +02:00
if status["connected"]:
2020-09-05 01:54:23 +02:00
if not self.current_fxcker:
self._assign_fxcker_to_network(
{"ssid": status["connection_name"]})
if self.current_fxcker:
2020-11-29 05:05:37 +01:00
self.log.debug("Checking internet access")
2020-09-05 01:54:23 +02:00
check_req = requests.get(
"http://detectportal.firefox.com/success.txt",
allow_redirects=False)
if check_req.text.strip() != "success":
2020-09-05 03:24:34 +02:00
self.log.info("No internet access, trying {}.unfxck()"
.format(self.current_fxcker.FXCKER_KEY))
2020-09-05 01:54:23 +02:00
self.current_fxcker.unfxck(
location=check_req.headers.get("Location"),
2020-09-05 01:54:23 +02:00
)
2020-09-05 03:24:34 +02:00
else:
self.log.debug("Internet access working")
2020-09-05 01:54:23 +02:00
def _assign_fxcker_to_network(self, network):
2020-09-05 03:24:34 +02:00
fxcker = None
2020-09-05 01:54:23 +02:00
for fxck_element in fxckers_map:
for fxck_net_name in fxck_element[0]:
2020-11-29 05:05:37 +01:00
if fxck_net_name[:len("re:")] == "re:":
if re.match(fxck_net_name,
network["ssid"][len("re:"):]):
2020-09-05 03:24:34 +02:00
fxcker = fxck_element[1]
2020-09-05 01:54:23 +02:00
break
elif fxck_net_name == network["ssid"]:
2020-09-05 03:24:34 +02:00
fxcker = fxck_element[1]
2020-09-05 01:54:23 +02:00
break
2020-09-05 03:24:34 +02:00
if fxcker:
self.current_fxcker = fxcker(
logger=self.logger, log_level=self.log_level)
self.log.info("Switched fxcker to {}".format(
self.current_fxcker.FXCKER_KEY))
2020-09-05 01:54:23 +02:00
return self.current_fxcker