diff --git a/pwnagotchi/plugins/default/bt-tether.py b/pwnagotchi/plugins/default/bt-tether.py
index 7d797c1f..ecd0ed06 100644
--- a/pwnagotchi/plugins/default/bt-tether.py
+++ b/pwnagotchi/plugins/default/bt-tether.py
@@ -123,6 +123,7 @@ MAC_PTTRN = r"^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$"
IP_PTTRN = r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$"
DNS_PTTRN = r"^\s*((\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s*[ ,;]\s*)+((\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s*[ ,;]?\s*)$"
+
class BTTether(plugins.Plugin):
__author__ = "Jayofelony, modified my fmatray"
__version__ = "1.4"
@@ -138,8 +139,7 @@ class BTTether(plugins.Plugin):
@staticmethod
def exec_cmd(cmd, args, pattern=None):
try:
- result = subprocess.run([cmd] + args,
- check=True, capture_output=True, text=True)
+ result = subprocess.run([cmd] + args, check=True, capture_output=True, text=True)
if pattern:
return result.stdout.find(pattern)
return result
@@ -152,7 +152,7 @@ class BTTether(plugins.Plugin):
def nmcli(self, args, pattern=None):
return self.exec_cmd("nmcli", args, pattern)
-
+
def on_loaded(self):
logging.info("[BT-Tether] plugin loaded.")
@@ -162,7 +162,7 @@ class BTTether(plugins.Plugin):
return
if not ("mac" in self.options and re.match(MAC_PTTRN, self.options["mac"])):
logging.error("[BT-Tether] Error with mac address")
- return
+ return
if not ("phone" in self.options and self.options["phone"].lower() in ["android", "ios"]):
logging.error("[BT-Tether] Phone type not supported")
@@ -181,23 +181,30 @@ class BTTether(plugins.Plugin):
self.mac = self.options["mac"]
dns = self.options.get("dns", "8.8.8.8 1.1.1.1")
if not re.match(DNS_PTTRN, dns):
- logging.error(f"[BT-Tether] DNS error: {dns}")
+ if dns == "":
+ logging.error(f"[BT-Tether] Empty DNS setting")
+ else:
+ logging.error(f"[BT-Tether] Wrong DNS setting: '{dns}'")
return
- dns = re.sub("[\s,;]+", " ", dns).strip() # DNS cleaning
+ dns = re.sub("[\s,;]+", " ", dns).strip() # DNS cleaning
try:
# Configure connection. Metric is set to 200 to prefer connection over USB
- self.nmcli(["connection", "modify", f"{self.phone_name}",
- "connection.type", "bluetooth",
- "bluetooth.type", "panu",
- "bluetooth.bdaddr", f"{self.mac}",
- "connection.autoconnect", "yes",
- "connection.autoconnect-retries", "0",
- "ipv4.method", "manual",
- "ipv4.dns", f"{dns}",
- "ipv4.addresses", f"{address}/24",
- "ipv4.gateway", f"{gateway}",
- "ipv4.route-metric", "200" ])
+ self.nmcli(
+ [
+ "connection", "modify", f"{self.phone_name}",
+ "connection.type", "bluetooth",
+ "bluetooth.type", "panu",
+ "bluetooth.bdaddr", f"{self.mac}",
+ "connection.autoconnect", "yes",
+ "connection.autoconnect-retries", "0",
+ "ipv4.method", "manual",
+ "ipv4.dns", f"{dns}",
+ "ipv4.addresses", f"{address}/24",
+ "ipv4.gateway", f"{gateway}",
+ "ipv4.route-metric", "200",
+ ]
+ )
self.nmcli(["connection", "reload"])
self.ready = True
logging.info(f"[BT-Tether] Connection {self.phone_name} configured")
@@ -205,7 +212,7 @@ class BTTether(plugins.Plugin):
logging.error(f"[BT-Tether] Error while configuring: {e}")
return
try:
- time.sleep(5) # Give some delay to configure before going up
+ time.sleep(5) # Give some delay to configure before going up
self.nmcli(["connection", "up", f"{self.phone_name}"])
except Exception as e:
logging.error(f"[BT-Tether] Failed to connect to device: {e}")
@@ -230,9 +237,18 @@ class BTTether(plugins.Plugin):
def on_ui_setup(self, ui):
with ui._lock:
- ui.add_element('bluetooth', LabeledValue(color=BLACK, label='BT', value='-',
- position=(ui.width() / 2 - 10, 0),
- label_font=fonts.Bold, text_font=fonts.Medium))
+ ui.add_element(
+ "bluetooth",
+ LabeledValue(
+ color=BLACK,
+ label="BT",
+ value="-",
+ position=(ui.width() / 2 - 10, 0),
+ label_font=fonts.Bold,
+ text_font=fonts.Medium,
+ ),
+ )
+
def on_ui_update(self, ui):
if not self.ready:
return
@@ -240,17 +256,26 @@ class BTTether(plugins.Plugin):
status = ""
try:
# Checking connection
- if self.nmcli(["-w", "0", "-g", "GENERAL.STATE", "connection", "show", self.phone_name],
- "activated") != -1:
+ if (
+ self.nmcli(["-w", "0", "-g", "GENERAL.STATE", "connection", "show", self.phone_name],
+ "activated",
+ )
+ != -1
+ ):
ui.set("bluetooth", "U")
return
else:
ui.set("bluetooth", "D")
status = "BT Conn. down"
-
+
# Checking device
- if self.nmcli(["-w", "0", "-g", "GENERAL.STATE", "device", "show", self.mac],
- "(connected)") != -1:
+ if (
+ self.nmcli(
+ ["-w", "0", "-g", "GENERAL.STATE", "device", "show", self.mac],
+ "(connected)",
+ )
+ != -1
+ ):
ui.set("bluetooth", "C")
status += "\nBT dev conn."
else:
@@ -269,26 +294,28 @@ class BTTether(plugins.Plugin):
if path == "/" or not path:
try:
bluetooth = self.bluetoothctl(["info", self.mac])
- bluetooth = bluetooth.stdout.replace('\n', '
')
+ bluetooth = bluetooth.stdout.replace("\n", "
")
except Exception as e:
bluetooth = "Error while checking bluetoothctl"
-
- try:
- device = self.nmcli(["-w", "0","device", "show", self.mac])
- device = device.stdout.replace('\n', '
')
+
+ try:
+ device = self.nmcli(["-w", "0", "device", "show", self.mac])
+ device = device.stdout.replace("\n", "
")
except Exception as e:
device = "Error while checking nmcli device"
-
+
try:
- connection = self.nmcli(["-w", "0","connection", "show", self.phone_name])
- connection = connection.stdout.replace('\n', '
')
+ connection = self.nmcli(["-w", "0", "connection", "show", self.phone_name])
+ connection = connection.stdout.replace("\n", "
")
except Exception as e:
connection = "Error while checking nmcli connection"
logging.debug(device)
- return render_template_string(TEMPLATE,
- title="BT-Tether",
- bluetooth=bluetooth,
- device=device,
- connection=connection)
- abort(404)
\ No newline at end of file
+ return render_template_string(
+ TEMPLATE,
+ title="BT-Tether",
+ bluetooth=bluetooth,
+ device=device,
+ connection=connection,
+ )
+ abort(404)