From 43d910427dd33b0207c8173fdb0463f34f3fbe6f Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Fri, 15 Sep 2023 13:12:52 +0200 Subject: [PATCH 01/49] v2.3.9 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/bluetoothsniffer.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/pwnagotchi/plugins/default/bluetoothsniffer.py b/pwnagotchi/plugins/default/bluetoothsniffer.py index b78c93bf..e7d0aa6b 100644 --- a/pwnagotchi/plugins/default/bluetoothsniffer.py +++ b/pwnagotchi/plugins/default/bluetoothsniffer.py @@ -2,17 +2,15 @@ import logging import os import subprocess import json -import re import time -import pwnagotchi -import pwnagotchi.agent import pwnagotchi.plugins as plugins import pwnagotchi.ui.fonts as fonts from pwnagotchi.ui.components import LabeledValue from pwnagotchi.ui.view import BLACK from datetime import datetime + class BluetoothSniffer(plugins.Plugin): __author__ = 'diytechtinker' __version__ = '0.1.3' @@ -31,7 +29,6 @@ class BluetoothSniffer(plugins.Plugin): self.data = {} self.last_scan_time = 0 - def on_loaded(self): logging.info("[BtS] bluetoothsniffer plugin loaded.") logging.info("[BtS] Bluetooth devices file location: %s", self.options['devices_file']) @@ -48,7 +45,6 @@ class BluetoothSniffer(plugins.Plugin): with open(self.options['devices_file'], 'r') as f: self.data = json.load(f) - def on_ui_setup(self, ui): ui.add_element('BtS', LabeledValue(color=BLACK, label='BT SNFD', @@ -62,7 +58,6 @@ class BluetoothSniffer(plugins.Plugin): with ui._lock: ui.remove_element('BtS') - def on_ui_update(self, ui): current_time = time.time() # Checking the time elapsed since last scan @@ -70,11 +65,10 @@ class BluetoothSniffer(plugins.Plugin): self.last_scan_time = current_time #logging.info("[BtS] Bluetooth sniffed: %s", str(self.bt_sniff_info())) ui.set('BtS', str(self.bt_sniff_info())) - self.scan() - + self.scan(ui) # Method for scanning the nearby bluetooth devices - def scan(self): + def scan(self, display): logging.info("[BtS] Scanning for bluetooths...") current_time = time.time() changed = False From 960563dff0337e27b387a2014df4d9b7b9512637 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Fri, 15 Sep 2023 13:35:29 +0200 Subject: [PATCH 02/49] v2.3.9 Signed-off-by: Jeroen Oudshoorn --- .../plugins/default/bluetoothsniffer.py | 30 ++-- pwnagotchi/plugins/default/bt-tether.py | 3 +- pwnagotchi/plugins/default/fix_services.py | 44 ++--- pwnagotchi/plugins/default/gps.py | 19 +- pwnagotchi/plugins/default/memtemp.py | 166 +++++++++--------- 5 files changed, 135 insertions(+), 127 deletions(-) diff --git a/pwnagotchi/plugins/default/bluetoothsniffer.py b/pwnagotchi/plugins/default/bluetoothsniffer.py index e7d0aa6b..5f5b0306 100644 --- a/pwnagotchi/plugins/default/bluetoothsniffer.py +++ b/pwnagotchi/plugins/default/bluetoothsniffer.py @@ -46,26 +46,28 @@ class BluetoothSniffer(plugins.Plugin): self.data = json.load(f) def on_ui_setup(self, ui): - ui.add_element('BtS', LabeledValue(color=BLACK, - label='BT SNFD', - value=" ", - position=(int(self.options["bt_x_coord"]), - int(self.options["bt_y_coord"])), - label_font=fonts.Small, - text_font=fonts.Small)) + with ui._lock: + ui.add_element('BtS', LabeledValue(color=BLACK, + label='BT SNFD', + value=" ", + position=(int(self.options["bt_x_coord"]), + int(self.options["bt_y_coord"])), + label_font=fonts.Small, + text_font=fonts.Small)) def on_unload(self, ui): with ui._lock: ui.remove_element('BtS') def on_ui_update(self, ui): - current_time = time.time() - # Checking the time elapsed since last scan - if current_time - self.last_scan_time >= self.options['timer']: - self.last_scan_time = current_time - #logging.info("[BtS] Bluetooth sniffed: %s", str(self.bt_sniff_info())) - ui.set('BtS', str(self.bt_sniff_info())) - self.scan(ui) + with ui._lock: + current_time = time.time() + # Checking the time elapsed since last scan + if current_time - self.last_scan_time >= self.options['timer']: + self.last_scan_time = current_time + #logging.info("[BtS] Bluetooth sniffed: %s", str(self.bt_sniff_info())) + ui.set('BtS', str(self.bt_sniff_info())) + self.scan(ui) # Method for scanning the nearby bluetooth devices def scan(self, display): diff --git a/pwnagotchi/plugins/default/bt-tether.py b/pwnagotchi/plugins/default/bt-tether.py index a65c603b..dd0008a0 100644 --- a/pwnagotchi/plugins/default/bt-tether.py +++ b/pwnagotchi/plugins/default/bt-tether.py @@ -583,4 +583,5 @@ class BTTether(plugins.Plugin): label_font=fonts.Bold, text_font=fonts.Medium)) def on_ui_update(self, ui): - ui.set('bluetooth', self.status) + with ui._lock: + ui.set('bluetooth', self.status) diff --git a/pwnagotchi/plugins/default/fix_services.py b/pwnagotchi/plugins/default/fix_services.py index c26af9cb..3ddc0878 100644 --- a/pwnagotchi/plugins/default/fix_services.py +++ b/pwnagotchi/plugins/default/fix_services.py @@ -378,32 +378,34 @@ class FixServices(plugins.Plugin): # called to setup the ui elements def on_ui_setup(self, ui): - # add custom UI elements - if "position" in self.options: - pos = self.options['position'].split(',') - pos = [int(x.strip()) for x in pos] - else: - pos = (ui.width() / 2 + 35, ui.height() - 11) + with ui._lock: + # add custom UI elements + if "position" in self.options: + pos = self.options['position'].split(',') + pos = [int(x.strip()) for x in pos] + else: + pos = (ui.width() / 2 + 35, ui.height() - 11) - logging.info("Got here") - ui.add_element('brcmfmac_status', Text(color=BLACK, value='--', position=pos, font=fonts.Small)) - - # called when the ui is updated + logging.info("Got here") + ui.add_element('brcmfmac_status', Text(color=BLACK, value='--', position=pos, font=fonts.Small)) + # called when the ui is updated def on_ui_update(self, ui): - # update those elements - if self._status: - ui.set('brcmfmac_status', "wlan0mon %s" % self._status) - else: - ui.set('brcmfmac_status', "rst#%s" % self._count) + with ui._lock: + # update those elements + if self._status: + ui.set('brcmfmac_status', "wlan0mon %s" % self._status) + else: + ui.set('brcmfmac_status', "rst#%s" % self._count) def on_unload(self, ui): - try: - ui.remove_element('brcmfmac_status') - logging.info("[Fix_Services] unloaded") - except Exception as err: - logging.info("[Fix_Services] unload err %s " % repr(err)) - pass + with ui._lock: + try: + ui.remove_element('brcmfmac_status') + logging.info("[Fix_Services] unloaded") + except Exception as err: + logging.info("[Fix_Services] unload err %s " % repr(err)) + pass # run from command line to brute force a reload diff --git a/pwnagotchi/plugins/default/gps.py b/pwnagotchi/plugins/default/gps.py index 888282d4..74f74c85 100644 --- a/pwnagotchi/plugins/default/gps.py +++ b/pwnagotchi/plugins/default/gps.py @@ -151,12 +151,13 @@ class GPS(plugins.Plugin): ui.remove_element('altitude') def on_ui_update(self, ui): - if self.coordinates and all([ - # avoid 0.000... measurements - self.coordinates["Latitude"], self.coordinates["Longitude"] - ]): - # last char is sometimes not completely drawn ¯\_(ツ)_/¯ - # using an ending-whitespace as workaround on each line - ui.set("latitude", f"{self.coordinates['Latitude']:.4f} ") - ui.set("longitude", f"{self.coordinates['Longitude']:.4f} ") - ui.set("altitude", f"{self.coordinates['Altitude']:.1f}m ") + with ui._lock: + if self.coordinates and all([ + # avoid 0.000... measurements + self.coordinates["Latitude"], self.coordinates["Longitude"] + ]): + # last char is sometimes not completely drawn ¯\_(ツ)_/¯ + # using an ending-whitespace as workaround on each line + ui.set("latitude", f"{self.coordinates['Latitude']:.4f} ") + ui.set("longitude", f"{self.coordinates['Longitude']:.4f} ") + ui.set("altitude", f"{self.coordinates['Altitude']:.1f}m ") diff --git a/pwnagotchi/plugins/default/memtemp.py b/pwnagotchi/plugins/default/memtemp.py index d9ac75ce..e3cf3ac8 100644 --- a/pwnagotchi/plugins/default/memtemp.py +++ b/pwnagotchi/plugins/default/memtemp.py @@ -103,90 +103,91 @@ class MemTemp(plugins.Plugin): return " " * (self.FIELD_WIDTH - len(data)) + data def on_ui_setup(self, ui): - try: - # Configure field list - self.fields = self.options['fields'].split(',') - self.fields = [x.strip() for x in self.fields if x.strip() in self.ALLOWED_FIELDS.keys()] - self.fields = self.fields[:3] # limit to the first 3 fields - except Exception: - # Set default value - self.fields = self.DEFAULT_FIELDS + with ui._lock: + try: + # Configure field list + self.fields = self.options['fields'].split(',') + self.fields = [x.strip() for x in self.fields if x.strip() in self.ALLOWED_FIELDS.keys()] + self.fields = self.fields[:3] # limit to the first 3 fields + except Exception: + # Set default value + self.fields = self.DEFAULT_FIELDS - try: - # Configure line_spacing - line_spacing = int(self.options['linespacing']) - except Exception: - # Set default value - line_spacing = self.LINE_SPACING + try: + # Configure line_spacing + line_spacing = int(self.options['linespacing']) + except Exception: + # Set default value + line_spacing = self.LINE_SPACING + + try: + # Configure position + pos = self.options['position'].split(',') + pos = [int(x.strip()) for x in pos] + if self.options['orientation'] == "vertical": + v_pos = (pos[0], pos[1]) + else: + h_pos = (pos[0], pos[1]) + except Exception: + # Set default position based on screen type + if ui.is_waveshare_v2(): + h_pos = (178, 84) + v_pos = (197, 74) + elif ui.is_waveshare_v1(): + h_pos = (170, 80) + v_pos = (165, 61) + elif ui.is_waveshare144lcd(): + h_pos = (53, 77) + v_pos = (73, 67) + elif ui.is_inky(): + h_pos = (140, 68) + v_pos = (160, 54) + elif ui.is_waveshare27inch(): + h_pos = (192, 138) + v_pos = (211, 122) + else: + h_pos = (155, 76) + v_pos = (175, 61) - try: - # Configure position - pos = self.options['position'].split(',') - pos = [int(x.strip()) for x in pos] if self.options['orientation'] == "vertical": - v_pos = (pos[0], pos[1]) + # Dynamically create the required LabeledValue objects + for idx, field in enumerate(self.fields): + v_pos_x = v_pos[0] + v_pos_y = v_pos[1] + ((len(self.fields) - 3) * -1 * line_spacing) + ui.add_element( + f"memtemp_{field}", + LabeledValue( + color=BLACK, + label=f"{self.pad_text(field)}:", + value="-", + position=(v_pos_x, v_pos_y + (idx * line_spacing)), + label_font=fonts.Small, + text_font=fonts.Small, + label_spacing=self.LABEL_SPACING, + ) + ) else: - h_pos = (pos[0], pos[1]) - except Exception: - # Set default position based on screen type - if ui.is_waveshare_v2(): - h_pos = (178, 84) - v_pos = (197, 74) - elif ui.is_waveshare_v1(): - h_pos = (170, 80) - v_pos = (165, 61) - elif ui.is_waveshare144lcd(): - h_pos = (53, 77) - v_pos = (73, 67) - elif ui.is_inky(): - h_pos = (140, 68) - v_pos = (160, 54) - elif ui.is_waveshare27inch(): - h_pos = (192, 138) - v_pos = (211, 122) - else: - h_pos = (155, 76) - v_pos = (175, 61) - - if self.options['orientation'] == "vertical": - # Dynamically create the required LabeledValue objects - for idx, field in enumerate(self.fields): - v_pos_x = v_pos[0] - v_pos_y = v_pos[1] + ((len(self.fields) - 3) * -1 * line_spacing) + # default to horizontal + h_pos_x = h_pos[0] + ((len(self.fields) - 3) * -1 * 25) + h_pos_y = h_pos[1] ui.add_element( - f"memtemp_{field}", - LabeledValue( + 'memtemp_header', + Text( color=BLACK, - label=f"{self.pad_text(field)}:", - value="-", - position=(v_pos_x, v_pos_y + (idx * line_spacing)), - label_font=fonts.Small, - text_font=fonts.Small, - label_spacing=self.LABEL_SPACING, + value=" ".join([self.pad_text(x) for x in self.fields]), + position=(h_pos_x, h_pos_y), + font=fonts.Small, ) ) - else: - # default to horizontal - h_pos_x = h_pos[0] + ((len(self.fields) - 3) * -1 * 25) - h_pos_y = h_pos[1] - ui.add_element( - 'memtemp_header', - Text( - color=BLACK, - value=" ".join([self.pad_text(x) for x in self.fields]), - position=(h_pos_x, h_pos_y), - font=fonts.Small, + ui.add_element( + 'memtemp_data', + Text( + color=BLACK, + value=" ".join([self.pad_text("-") for x in self.fields]), + position=(h_pos_x, h_pos_y + line_spacing), + font=fonts.Small, + ) ) - ) - ui.add_element( - 'memtemp_data', - Text( - color=BLACK, - value=" ".join([self.pad_text("-") for x in self.fields]), - position=(h_pos_x, h_pos_y + line_spacing), - font=fonts.Small, - ) - ) def on_unload(self, ui): with ui._lock: @@ -199,10 +200,11 @@ class MemTemp(plugins.Plugin): ui.remove_element('memtemp_data') def on_ui_update(self, ui): - if self.options['orientation'] == "vertical": - for idx, field in enumerate(self.fields): - ui.set(f"memtemp_{field}", getattr(self, self.ALLOWED_FIELDS[field])()) - else: - # default to horizontal - data = " ".join([self.pad_text(getattr(self, self.ALLOWED_FIELDS[x])()) for x in self.fields]) - ui.set('memtemp_data', data) + with ui._lock: + if self.options['orientation'] == "vertical": + for idx, field in enumerate(self.fields): + ui.set(f"memtemp_{field}", getattr(self, self.ALLOWED_FIELDS[field])()) + else: + # default to horizontal + data = " ".join([self.pad_text(getattr(self, self.ALLOWED_FIELDS[x])()) for x in self.fields]) + ui.set('memtemp_data', data) From 9752cafc3afcd0957a59e6c0da00c82d28183ff0 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Fri, 15 Sep 2023 22:45:49 +0200 Subject: [PATCH 03/49] v2.3.9 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/bluetoothsniffer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pwnagotchi/plugins/default/bluetoothsniffer.py b/pwnagotchi/plugins/default/bluetoothsniffer.py index 5f5b0306..dedb3d87 100644 --- a/pwnagotchi/plugins/default/bluetoothsniffer.py +++ b/pwnagotchi/plugins/default/bluetoothsniffer.py @@ -65,7 +65,7 @@ class BluetoothSniffer(plugins.Plugin): # Checking the time elapsed since last scan if current_time - self.last_scan_time >= self.options['timer']: self.last_scan_time = current_time - #logging.info("[BtS] Bluetooth sniffed: %s", str(self.bt_sniff_info())) + # logging.info("[BtS] Bluetooth sniffed: %s", str(self.bt_sniff_info())) ui.set('BtS', str(self.bt_sniff_info())) self.scan(ui) From 43ee7f128be2eaab485efa26baa22b28ff8d7b28 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Fri, 15 Sep 2023 23:15:54 +0200 Subject: [PATCH 04/49] v2.3.9 Signed-off-by: Jeroen Oudshoorn --- bin/pwnagotchi | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/bin/pwnagotchi b/bin/pwnagotchi index 0418d88d..290a5b56 100755 --- a/bin/pwnagotchi +++ b/bin/pwnagotchi @@ -114,6 +114,9 @@ if __name__ == '__main__': parser.add_argument('--debug', dest="debug", action="store_true", default=False, help="Enable debug logs.") + parser.add_argument('--version', dest="version", action="store_true", default=False, + help="Print the version.") + parser.add_argument('--print-config', dest="print_config", action="store_true", default=False, help="Print the configuration.") @@ -130,6 +133,10 @@ if __name__ == '__main__': rc = plugins_cmd.handle_cmd(args, config) sys.exit(rc) + if args.version: + print(pwnagotchi.__version__) + sys.exit(0) + if args.donate: print("Donations can made @ https://www.patreon.com/pwnagotchi_torch \n\nBut only if you really want to!") sys.exit(0) From 7e11387423abf4b820c2bdfea8667bc9707d2301 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Sat, 16 Sep 2023 01:37:20 +0200 Subject: [PATCH 05/49] v2.3.9 Signed-off-by: Jeroen Oudshoorn --- bin/pwnagotchi | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/pwnagotchi b/bin/pwnagotchi index 290a5b56..7c8cd457 100755 --- a/bin/pwnagotchi +++ b/bin/pwnagotchi @@ -120,6 +120,7 @@ if __name__ == '__main__': parser.add_argument('--print-config', dest="print_config", action="store_true", default=False, help="Print the configuration.") + # Jayofelony added these parser.add_argument('--check-update', dest="check_update", action="store_true", default=False, help="Check for updates on Pwnagotchi. And tells current version.") parser.add_argument('--donate', dest="donate", action="store_true", default=False, From eaf65e4819cc046741561cdbaa945ced07d5e4cc Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Sat, 16 Sep 2023 01:44:02 +0200 Subject: [PATCH 06/49] v2.3.9 Signed-off-by: Jeroen Oudshoorn --- builder/pwnagotchi.yml | 15 ++++++++++++++- pwnagotchi/bettercap.py | 41 ++++++++++++++++++++++++----------------- 2 files changed, 38 insertions(+), 18 deletions(-) diff --git a/builder/pwnagotchi.yml b/builder/pwnagotchi.yml index c3a018e4..4ed9eac5 100644 --- a/builder/pwnagotchi.yml +++ b/builder/pwnagotchi.yml @@ -1,6 +1,7 @@ --- - hosts: - - all + - 127.0.0.1 + gather_facts: true become: true vars: pwnagotchi: @@ -137,8 +138,20 @@ - libpcap-dev - libusb-1.0-0-dev - libnetfilter-queue-dev + environment: + ARCHFLAGS: "-arch armv8" tasks: + - name: System details + debug: + msg="{{ item }}" + with_items: + - "{{ ansible_distribution }}" + - "{{ ansible_distribution_version }}" + - "{{ ansible_distribution_major_version }}" + - "{{ ansible_architecture }}" + - "{{ ansible_machine }}" + - name: change hostname lineinfile: dest: /etc/hostname diff --git a/pwnagotchi/bettercap.py b/pwnagotchi/bettercap.py index fb57f077..93e160b3 100644 --- a/pwnagotchi/bettercap.py +++ b/pwnagotchi/bettercap.py @@ -1,4 +1,3 @@ -import json import logging import requests import websockets @@ -8,12 +7,14 @@ import random from requests.auth import HTTPBasicAuth from time import sleep -requests.adapters.DEFAULT_RETRIES = 5 # increase retries number +requests.adapters.DEFAULT_RETRIES = 5 # increase retries number -ping_timeout = 90 -ping_interval = 60 +ping_timeout = 180 +ping_interval = 15 +max_queue = 10000 -max_sleep = 2.0 +min_sleep = 0.5 +max_sleep = 5.0 def decode(r, verbose_errors=True): @@ -59,7 +60,7 @@ class Client(object): # logging.debug("Error while parsing event (%s)", ex) # except websockets.exceptions.ConnectionClosedError: # sleep_time = max_sleep*random.random() - # logger.warning('Retrying websocket connection in {} sec'.format(sleep_time)) + # logging.warning('Retrying websocket connection in {} sec'.format(sleep_time)) # await asyncio.sleep(sleep_time) # continue @@ -67,7 +68,7 @@ class Client(object): while True: logging.info("creating new websocket...") try: - async with websockets.connect(s, ping_interval=ping_interval, ping_timeout=ping_timeout) as ws: + async with websockets.connect(s, ping_interval=ping_interval, ping_timeout=ping_timeout, max_queue=max_queue) as ws: # listener loop while True: try: @@ -75,35 +76,41 @@ class Client(object): try: await consumer(msg) except Exception as ex: - logging.debug("error while parsing event (%s)", ex) - except websockets.exceptions.ConnectionClosedError: + logging.debug("error while parsing event (%s)", ex) + except websockets.ConnectionClosedError: try: pong = await ws.ping() await asyncio.wait_for(pong, timeout=ping_timeout) logging.warning('ping OK, keeping connection alive...') continue except: - sleep_time = max_sleep*random.random() + sleep_time = min_sleep + max_sleep*random.random() logging.warning('ping error - retrying connection in {} sec'.format(sleep_time)) await asyncio.sleep(sleep_time) break except ConnectionRefusedError: - sleep_time = max_sleep*random.random() - logging.warning('nobody seems to listen to the bettercap endpoint...') + sleep_time = min_sleep + max_sleep*random.random() + logging.warning('nobody seems to be listening at the bettercap endpoint...') + logging.warning('retrying connection in {} sec'.format(sleep_time)) + await asyncio.sleep(sleep_time) + continue + except OSError: + sleep_time = min_sleep + max_sleep*random.random() + logging.warning('connection to the bettercap endpoint failed...') logging.warning('retrying connection in {} sec'.format(sleep_time)) await asyncio.sleep(sleep_time) continue def run(self, command, verbose_errors=True): - for _ in range(0, 2): + while True: try: r = requests.post("%s/session" % self.url, auth=self.auth, json={'cmd': command}) except requests.exceptions.ConnectionError as e: - sleep_time = max_sleep*random.random() - logging.exception("Request connection error (%s) while running command (%s)", e, command) - logging.warning('Retrying run in {} sec'.format(sleep_time)) + sleep_time = min_sleep + max_sleep*random.random() + logging.warning("can't run my request... connection to the bettercap endpoint failed...") + logging.warning('retrying run in {} sec'.format(sleep_time)) sleep(sleep_time) else: break - return decode(r, verbose_errors=verbose_errors) + return decode(r, verbose_errors=verbose_errors) \ No newline at end of file From 2ce7a2e1ebbb7d81c0382db804360bd2563275ec Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Sat, 16 Sep 2023 09:03:01 +0200 Subject: [PATCH 07/49] v2.3.9 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pwnagotchi/_version.py b/pwnagotchi/_version.py index b9fdf8c0..24da7c50 100644 --- a/pwnagotchi/_version.py +++ b/pwnagotchi/_version.py @@ -1 +1 @@ -__version__ = '2.3.9' +__version__ = '2.3.9b' From d8d0db176c032f4245f37f62d22aeab5ed4c246f Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Sat, 16 Sep 2023 09:49:55 +0200 Subject: [PATCH 08/49] v2.3.9 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/fix_services.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/pwnagotchi/plugins/default/fix_services.py b/pwnagotchi/plugins/default/fix_services.py index 3ddc0878..1ceaba02 100644 --- a/pwnagotchi/plugins/default/fix_services.py +++ b/pwnagotchi/plugins/default/fix_services.py @@ -36,6 +36,7 @@ class FixServices(plugins.Plugin): self.pattern2 = re.compile(r'wifi error while hopping to channel') self.pattern3 = re.compile(r'Firmware has halted or crashed') self.pattern4 = re.compile(r'error 400: could not find interface wlan0mon') + self.pattern5 = re.compiler(r'cannot schedule new futures after shutdown') self.isReloadingMon = False self.connection = None self.LASTTRY = 0 @@ -173,7 +174,7 @@ class FixServices(plugins.Plugin): except Exception as err: logging.error("[Fix_Services monstart]: %s" % repr(err)) - # Look for pattern 3 + # Look for pattern 4 elif len(self.pattern4.findall(other_other_last_lines)) >= 3: logging.info("[Fix_Services] wlan0 is down!") if hasattr(agent, 'view'): @@ -187,6 +188,20 @@ class FixServices(plugins.Plugin): except Exception as err: logging.error("[Fix_Services monstart]: %s" % repr(err)) + # Look for pattern 5 + elif len(self.pattern4.findall(other_other_last_lines)) >= 3: + logging.info("[Fix_Services] Threading issues, restarting") + if hasattr(agent, 'view'): + display = agent.view() + display.set('status', 'Restarting pwnagotchi now!') + display.update(force=True) + try: + # Run the monstart command to restart wlan0mon + cmd_output = subprocess.check_output("systemctl restart pwnagotchi", shell=True) + logging.info("[Fix_Services systemd]: %s" % repr(cmd_output)) + except Exception as err: + logging.error("[Fix_Services systemd]: %s" % repr(err)) + else: print("logs look good") From 004c68dc3cc25e1e5f381f4c658afa3a5216a69f Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Sat, 16 Sep 2023 22:03:04 +0200 Subject: [PATCH 09/49] v2.3.9 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/fix_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pwnagotchi/plugins/default/fix_services.py b/pwnagotchi/plugins/default/fix_services.py index 1ceaba02..7bc3217b 100644 --- a/pwnagotchi/plugins/default/fix_services.py +++ b/pwnagotchi/plugins/default/fix_services.py @@ -189,7 +189,7 @@ class FixServices(plugins.Plugin): logging.error("[Fix_Services monstart]: %s" % repr(err)) # Look for pattern 5 - elif len(self.pattern4.findall(other_other_last_lines)) >= 3: + elif len(self.pattern4.findall(other_other_last_lines)) >= 1: logging.info("[Fix_Services] Threading issues, restarting") if hasattr(agent, 'view'): display = agent.view() From fbbdea033a096b7b18193bb358a167b24c6644d0 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Sat, 16 Sep 2023 22:03:37 +0200 Subject: [PATCH 10/49] v2.3.9 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/fix_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pwnagotchi/plugins/default/fix_services.py b/pwnagotchi/plugins/default/fix_services.py index 7bc3217b..d73b959b 100644 --- a/pwnagotchi/plugins/default/fix_services.py +++ b/pwnagotchi/plugins/default/fix_services.py @@ -189,7 +189,7 @@ class FixServices(plugins.Plugin): logging.error("[Fix_Services monstart]: %s" % repr(err)) # Look for pattern 5 - elif len(self.pattern4.findall(other_other_last_lines)) >= 1: + elif len(self.pattern5.findall(other_other_last_lines)) >= 1: logging.info("[Fix_Services] Threading issues, restarting") if hasattr(agent, 'view'): display = agent.view() From 9251a3426852a523a8a5233e4bb7c31a7552f87f Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Sat, 16 Sep 2023 22:05:42 +0200 Subject: [PATCH 11/49] v2.3.9 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/fix_services.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pwnagotchi/plugins/default/fix_services.py b/pwnagotchi/plugins/default/fix_services.py index d73b959b..31aecf17 100644 --- a/pwnagotchi/plugins/default/fix_services.py +++ b/pwnagotchi/plugins/default/fix_services.py @@ -4,6 +4,8 @@ import subprocess import time import random from io import TextIOWrapper + +import pwnagotchi from pwnagotchi import plugins import pwnagotchi.ui.faces as faces @@ -197,8 +199,8 @@ class FixServices(plugins.Plugin): display.update(force=True) try: # Run the monstart command to restart wlan0mon - cmd_output = subprocess.check_output("systemctl restart pwnagotchi", shell=True) - logging.info("[Fix_Services systemd]: %s" % repr(cmd_output)) + pwnagotchi.restart("AUTO") + logging.info("[Fix_Services systemd]: restarting bettercap and pwnagotchi") except Exception as err: logging.error("[Fix_Services systemd]: %s" % repr(err)) From cac9c36f8869f1015831268cb3e1b9e81f049e8b Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Sat, 16 Sep 2023 22:08:49 +0200 Subject: [PATCH 12/49] v2.3.9 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/fix_services.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pwnagotchi/plugins/default/fix_services.py b/pwnagotchi/plugins/default/fix_services.py index 31aecf17..e996d044 100644 --- a/pwnagotchi/plugins/default/fix_services.py +++ b/pwnagotchi/plugins/default/fix_services.py @@ -198,9 +198,9 @@ class FixServices(plugins.Plugin): display.set('status', 'Restarting pwnagotchi now!') display.update(force=True) try: - # Run the monstart command to restart wlan0mon - pwnagotchi.restart("AUTO") + # Restarting bettercap and pwnagotchi logging.info("[Fix_Services systemd]: restarting bettercap and pwnagotchi") + pwnagotchi.restart("AUTO") except Exception as err: logging.error("[Fix_Services systemd]: %s" % repr(err)) From 5c7416bbd275ecee571ffeee8ff5c187fa6d322b Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Sat, 16 Sep 2023 22:14:02 +0200 Subject: [PATCH 13/49] v2.3.9 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/fix_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pwnagotchi/plugins/default/fix_services.py b/pwnagotchi/plugins/default/fix_services.py index e996d044..d84f201f 100644 --- a/pwnagotchi/plugins/default/fix_services.py +++ b/pwnagotchi/plugins/default/fix_services.py @@ -38,7 +38,7 @@ class FixServices(plugins.Plugin): self.pattern2 = re.compile(r'wifi error while hopping to channel') self.pattern3 = re.compile(r'Firmware has halted or crashed') self.pattern4 = re.compile(r'error 400: could not find interface wlan0mon') - self.pattern5 = re.compiler(r'cannot schedule new futures after shutdown') + self.pattern5 = re.compile(r'cannot schedule new futures after shutdown') self.isReloadingMon = False self.connection = None self.LASTTRY = 0 From 32d1bd5aeffb63d4e90da57f9abf89f42a815350 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Sat, 16 Sep 2023 22:18:52 +0200 Subject: [PATCH 14/49] v2.3.9 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/__init__.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/pwnagotchi/plugins/__init__.py b/pwnagotchi/plugins/__init__.py index f6104a2e..53ee9342 100644 --- a/pwnagotchi/plugins/__init__.py +++ b/pwnagotchi/plugins/__init__.py @@ -1,19 +1,17 @@ import os import glob +import _thread import threading -import importlib -import importlib.util +import importlib, importlib.util import logging -from concurrent.futures import ThreadPoolExecutor + + default_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "default") loaded = {} database = {} locks = {} -THREAD_POOL_SIZE = 10 -executor = ThreadPoolExecutor(max_workers=THREAD_POOL_SIZE) - class Plugin: @classmethod @@ -98,7 +96,7 @@ def one(plugin_name, event_name, *args, **kwargs): try: lock_name = "%s::%s" % (plugin_name, cb_name) locked_cb_args = (lock_name, callback, *args, *kwargs) - executor.submit(locked_cb, *locked_cb_args) + _thread.start_new_thread(locked_cb, locked_cb_args) except Exception as e: logging.error("error while running %s.%s : %s" % (plugin_name, cb_name, e)) logging.error(e, exc_info=True) From 8ccd27c0afc7785213fa6ddd04879a11ee583ede Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Sat, 16 Sep 2023 22:38:40 +0200 Subject: [PATCH 15/49] v2.3.9 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/__init__.py | 1 - pwnagotchi/plugins/default/fix_services.py | 15 --------------- 2 files changed, 16 deletions(-) diff --git a/pwnagotchi/plugins/__init__.py b/pwnagotchi/plugins/__init__.py index 53ee9342..57e86976 100644 --- a/pwnagotchi/plugins/__init__.py +++ b/pwnagotchi/plugins/__init__.py @@ -6,7 +6,6 @@ import importlib, importlib.util import logging - default_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "default") loaded = {} database = {} diff --git a/pwnagotchi/plugins/default/fix_services.py b/pwnagotchi/plugins/default/fix_services.py index d84f201f..0fc99f42 100644 --- a/pwnagotchi/plugins/default/fix_services.py +++ b/pwnagotchi/plugins/default/fix_services.py @@ -38,7 +38,6 @@ class FixServices(plugins.Plugin): self.pattern2 = re.compile(r'wifi error while hopping to channel') self.pattern3 = re.compile(r'Firmware has halted or crashed') self.pattern4 = re.compile(r'error 400: could not find interface wlan0mon') - self.pattern5 = re.compile(r'cannot schedule new futures after shutdown') self.isReloadingMon = False self.connection = None self.LASTTRY = 0 @@ -190,20 +189,6 @@ class FixServices(plugins.Plugin): except Exception as err: logging.error("[Fix_Services monstart]: %s" % repr(err)) - # Look for pattern 5 - elif len(self.pattern5.findall(other_other_last_lines)) >= 1: - logging.info("[Fix_Services] Threading issues, restarting") - if hasattr(agent, 'view'): - display = agent.view() - display.set('status', 'Restarting pwnagotchi now!') - display.update(force=True) - try: - # Restarting bettercap and pwnagotchi - logging.info("[Fix_Services systemd]: restarting bettercap and pwnagotchi") - pwnagotchi.restart("AUTO") - except Exception as err: - logging.error("[Fix_Services systemd]: %s" % repr(err)) - else: print("logs look good") From 663e73a73093b779f2c51a497be604c60e398141 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Sun, 17 Sep 2023 09:55:18 +0200 Subject: [PATCH 16/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/_version.py | 2 +- pwnagotchi/defaults.toml | 2 +- .../plugins/default/bluetoothsniffer.py | 15 +- pwnagotchi/plugins/default/bt-tether.py | 3 +- pwnagotchi/plugins/default/fix_services.py | 56 ++++--- pwnagotchi/plugins/default/memtemp.py | 151 +++++++++--------- 6 files changed, 123 insertions(+), 106 deletions(-) diff --git a/pwnagotchi/_version.py b/pwnagotchi/_version.py index 24da7c50..c15f8ed3 100644 --- a/pwnagotchi/_version.py +++ b/pwnagotchi/_version.py @@ -1 +1 @@ -__version__ = '2.3.9b' +__version__ = '2.4.x' diff --git a/pwnagotchi/defaults.toml b/pwnagotchi/defaults.toml index 5baead7a..1aed4564 100644 --- a/pwnagotchi/defaults.toml +++ b/pwnagotchi/defaults.toml @@ -1,4 +1,4 @@ -main.name = "" +main.name = "pwnagotchi" main.lang = "en" main.confd = "/etc/pwnagotchi/conf.d/" main.custom_plugin_repos = [ diff --git a/pwnagotchi/plugins/default/bluetoothsniffer.py b/pwnagotchi/plugins/default/bluetoothsniffer.py index dedb3d87..3657f063 100644 --- a/pwnagotchi/plugins/default/bluetoothsniffer.py +++ b/pwnagotchi/plugins/default/bluetoothsniffer.py @@ -60,14 +60,13 @@ class BluetoothSniffer(plugins.Plugin): ui.remove_element('BtS') def on_ui_update(self, ui): - with ui._lock: - current_time = time.time() - # Checking the time elapsed since last scan - if current_time - self.last_scan_time >= self.options['timer']: - self.last_scan_time = current_time - # logging.info("[BtS] Bluetooth sniffed: %s", str(self.bt_sniff_info())) - ui.set('BtS', str(self.bt_sniff_info())) - self.scan(ui) + current_time = time.time() + # Checking the time elapsed since last scan + if current_time - self.last_scan_time >= self.options['timer']: + self.last_scan_time = current_time + # logging.info("[BtS] Bluetooth sniffed: %s", str(self.bt_sniff_info())) + ui.set('BtS', str(self.bt_sniff_info())) + self.scan(ui) # Method for scanning the nearby bluetooth devices def scan(self, display): diff --git a/pwnagotchi/plugins/default/bt-tether.py b/pwnagotchi/plugins/default/bt-tether.py index dd0008a0..a65c603b 100644 --- a/pwnagotchi/plugins/default/bt-tether.py +++ b/pwnagotchi/plugins/default/bt-tether.py @@ -583,5 +583,4 @@ class BTTether(plugins.Plugin): label_font=fonts.Bold, text_font=fonts.Medium)) def on_ui_update(self, ui): - with ui._lock: - ui.set('bluetooth', self.status) + ui.set('bluetooth', self.status) diff --git a/pwnagotchi/plugins/default/fix_services.py b/pwnagotchi/plugins/default/fix_services.py index 0fc99f42..5266aa28 100644 --- a/pwnagotchi/plugins/default/fix_services.py +++ b/pwnagotchi/plugins/default/fix_services.py @@ -17,8 +17,8 @@ import pwnagotchi.ui.fonts as fonts class FixServices(plugins.Plugin): - __author__ = 'xBits' - __version__ = '0.1.1' + __author__ = 'jayofelony' + __version__ = '1.0' __license__ = 'GPL3' __description__ = 'Fix blindness, firmware crashes and brain not being loaded' __name__ = 'Fix_Services' @@ -38,6 +38,7 @@ class FixServices(plugins.Plugin): self.pattern2 = re.compile(r'wifi error while hopping to channel') self.pattern3 = re.compile(r'Firmware has halted or crashed') self.pattern4 = re.compile(r'error 400: could not find interface wlan0mon') + self.pattern5 = re.compile(r'connection to the bettercap endpoint failed') self.isReloadingMon = False self.connection = None self.LASTTRY = 0 @@ -98,7 +99,8 @@ class FixServices(plugins.Plugin): logging.info("[Fix_Services] wifi.recon flip: success!") if hasattr(agent, 'view'): display = agent.view() - if display: display.update(force=True, new_data={"status": "Wifi recon flipped!", + if display: + display.update(force=True, new_data={"status": "Wifi recon flipped!", "face": faces.COOL}) else: print("Wifi recon flipped") @@ -189,6 +191,20 @@ class FixServices(plugins.Plugin): except Exception as err: logging.error("[Fix_Services monstart]: %s" % repr(err)) + # Look for pattern 5 + elif len(self.pattern5.findall(other_other_last_lines)) >= 3: + logging.info("[Fix_Services] bettercap is down!") + if hasattr(agent, 'view'): + display = agent.view() + display.set('status', 'Restarting wlan0 now!') + display.update(force=True) + try: + # Restart bettercap/pwnagotchi + logging.info("[Fix_Services restarting]") + pwnagotchi.restart("AUTO") + except Exception as err: + logging.error("[Fix_Services restarting]: %s" % repr(err)) + else: print("logs look good") @@ -224,7 +240,8 @@ class FixServices(plugins.Plugin): self._status = "BL" if hasattr(connection, 'view'): display = connection.view() - if display: display.update(force=True, new_data={"status": "I'm blind! Try turning it off and on again", + if display: + display.update(force=True, new_data={"status": "I'm blind! Try turning it off and on again", "brcmfmac_status": self._status, "face": faces.BORED}) else: @@ -312,7 +329,7 @@ class FixServices(plugins.Plugin): # try accessing mon0 in bettercap result = connection.run("set wifi.interface wlan0mon") if "success" in result: - logging.info("[Fix_Services set wifi.interface wlan0mon] worked: %s" % repr(result)) + logging.info("[Fix_Services set wifi.interface wlan0mon] worked!") self._status = "" self._count = self._count + 1 time.sleep(1) @@ -325,21 +342,25 @@ class FixServices(plugins.Plugin): logging.info( "[Fix_Services set wifi.interface wlan0mon] except: %s" % repr(err)) except Exception as cerr: # - if not display: print("failed loading wlan0mon attempt #%s: %s" % (tries, repr(cerr))) + if not display: + print("failed loading wlan0mon attempt #%s: %s" % (tries, repr(cerr))) except Exception as err: # from modprobe - if not display: print("Failed reloading brcmfmac") + if not display: + print("Failed reloading brcmfmac") logging.error("[Fix_Services] Failed reloading brcmfmac %s" % repr(err)) except Exception as nope: # from modprobe -r # fails if already unloaded, so probably fine logging.error("[Fix_Services #%s modprobe -r] %s" % (tries, repr(nope))) - if not display: print("[Fix_Services #%s modprobe -r] %s" % (tries, repr(nope))) + if not display: + print("[Fix_Services #%s modprobe -r] %s" % (tries, repr(nope))) pass tries = tries + 1 if tries < 3: logging.info("[Fix_Services] wlan0mon didn't make it. trying again") - if not display: print(" wlan0mon didn't make it. trying again") + if not display: + print(" wlan0mon didn't make it. trying again") # exited the loop, so hopefully it loaded if tries < 3: @@ -363,15 +384,15 @@ class FixServices(plugins.Plugin): if "success" in result: # and result["success"] is True: self._status = "" if display: - display.update(force=True, new_data={"status": "I can see again! (probably): %s" % repr(result), + display.update(force=True, new_data={"status": "I can see again! (probably)", "brcmfmac_status": self._status, "face": faces.HAPPY}) else: print("I can see again") - logging.info("[Fix_Services] wifi.recon on %s" % repr(result)) + logging.info("[Fix_Services] wifi.recon on") self.LASTTRY = time.time() + 120 # 2-minute pause until next time. else: - logging.error("[Fix_Services] wifi.recon did not start up: %s" % repr(result)) + logging.error("[Fix_Services] wifi.recon did not start up") self.LASTTRY = time.time() - 300 # failed, so try again ASAP self.isReloadingMon = False @@ -393,12 +414,11 @@ class FixServices(plugins.Plugin): # called when the ui is updated def on_ui_update(self, ui): - with ui._lock: - # update those elements - if self._status: - ui.set('brcmfmac_status', "wlan0mon %s" % self._status) - else: - ui.set('brcmfmac_status', "rst#%s" % self._count) + # update those elements + if self._status: + ui.set('brcmfmac_status', "wlan0mon %s" % self._status) + else: + ui.set('brcmfmac_status', "rst#%s" % self._count) def on_unload(self, ui): with ui._lock: diff --git a/pwnagotchi/plugins/default/memtemp.py b/pwnagotchi/plugins/default/memtemp.py index e3cf3ac8..aab7210f 100644 --- a/pwnagotchi/plugins/default/memtemp.py +++ b/pwnagotchi/plugins/default/memtemp.py @@ -103,91 +103,90 @@ class MemTemp(plugins.Plugin): return " " * (self.FIELD_WIDTH - len(data)) + data def on_ui_setup(self, ui): - with ui._lock: - try: - # Configure field list - self.fields = self.options['fields'].split(',') - self.fields = [x.strip() for x in self.fields if x.strip() in self.ALLOWED_FIELDS.keys()] - self.fields = self.fields[:3] # limit to the first 3 fields - except Exception: - # Set default value - self.fields = self.DEFAULT_FIELDS + try: + # Configure field list + self.fields = self.options['fields'].split(',') + self.fields = [x.strip() for x in self.fields if x.strip() in self.ALLOWED_FIELDS.keys()] + self.fields = self.fields[:3] # limit to the first 3 fields + except Exception: + # Set default value + self.fields = self.DEFAULT_FIELDS - try: - # Configure line_spacing - line_spacing = int(self.options['linespacing']) - except Exception: - # Set default value - line_spacing = self.LINE_SPACING - - try: - # Configure position - pos = self.options['position'].split(',') - pos = [int(x.strip()) for x in pos] - if self.options['orientation'] == "vertical": - v_pos = (pos[0], pos[1]) - else: - h_pos = (pos[0], pos[1]) - except Exception: - # Set default position based on screen type - if ui.is_waveshare_v2(): - h_pos = (178, 84) - v_pos = (197, 74) - elif ui.is_waveshare_v1(): - h_pos = (170, 80) - v_pos = (165, 61) - elif ui.is_waveshare144lcd(): - h_pos = (53, 77) - v_pos = (73, 67) - elif ui.is_inky(): - h_pos = (140, 68) - v_pos = (160, 54) - elif ui.is_waveshare27inch(): - h_pos = (192, 138) - v_pos = (211, 122) - else: - h_pos = (155, 76) - v_pos = (175, 61) + try: + # Configure line_spacing + line_spacing = int(self.options['linespacing']) + except Exception: + # Set default value + line_spacing = self.LINE_SPACING + try: + # Configure position + pos = self.options['position'].split(',') + pos = [int(x.strip()) for x in pos] if self.options['orientation'] == "vertical": - # Dynamically create the required LabeledValue objects - for idx, field in enumerate(self.fields): - v_pos_x = v_pos[0] - v_pos_y = v_pos[1] + ((len(self.fields) - 3) * -1 * line_spacing) - ui.add_element( - f"memtemp_{field}", - LabeledValue( - color=BLACK, - label=f"{self.pad_text(field)}:", - value="-", - position=(v_pos_x, v_pos_y + (idx * line_spacing)), - label_font=fonts.Small, - text_font=fonts.Small, - label_spacing=self.LABEL_SPACING, - ) - ) + v_pos = (pos[0], pos[1]) else: - # default to horizontal - h_pos_x = h_pos[0] + ((len(self.fields) - 3) * -1 * 25) - h_pos_y = h_pos[1] + h_pos = (pos[0], pos[1]) + except Exception: + # Set default position based on screen type + if ui.is_waveshare_v2(): + h_pos = (178, 84) + v_pos = (197, 74) + elif ui.is_waveshare_v1(): + h_pos = (170, 80) + v_pos = (165, 61) + elif ui.is_waveshare144lcd(): + h_pos = (53, 77) + v_pos = (73, 67) + elif ui.is_inky(): + h_pos = (140, 68) + v_pos = (160, 54) + elif ui.is_waveshare27inch(): + h_pos = (192, 138) + v_pos = (211, 122) + else: + h_pos = (155, 76) + v_pos = (175, 61) + + if self.options['orientation'] == "vertical": + # Dynamically create the required LabeledValue objects + for idx, field in enumerate(self.fields): + v_pos_x = v_pos[0] + v_pos_y = v_pos[1] + ((len(self.fields) - 3) * -1 * line_spacing) ui.add_element( - 'memtemp_header', - Text( + f"memtemp_{field}", + LabeledValue( color=BLACK, - value=" ".join([self.pad_text(x) for x in self.fields]), - position=(h_pos_x, h_pos_y), - font=fonts.Small, + label=f"{self.pad_text(field)}:", + value="-", + position=(v_pos_x, v_pos_y + (idx * line_spacing)), + label_font=fonts.Small, + text_font=fonts.Small, + label_spacing=self.LABEL_SPACING, ) ) - ui.add_element( - 'memtemp_data', - Text( - color=BLACK, - value=" ".join([self.pad_text("-") for x in self.fields]), - position=(h_pos_x, h_pos_y + line_spacing), - font=fonts.Small, - ) + else: + # default to horizontal + h_pos_x = h_pos[0] + ((len(self.fields) - 3) * -1 * 25) + h_pos_y = h_pos[1] + ui.add_element( + 'memtemp_header', + Text( + color=BLACK, + value=" ".join([self.pad_text(x) for x in self.fields]), + position=(h_pos_x, h_pos_y), + font=fonts.Small, ) + ) + ui.add_element( + 'memtemp_data', + Text( + color=BLACK, + value=" ".join([self.pad_text("-") for x in self.fields]), + position=(h_pos_x, h_pos_y + line_spacing), + font=fonts.Small, + ) + ) def on_unload(self, ui): with ui._lock: From 125ab3f245a0b74ed2a3b7d3b0513a807fc24247 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Sun, 17 Sep 2023 09:55:33 +0200 Subject: [PATCH 17/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pwnagotchi/_version.py b/pwnagotchi/_version.py index c15f8ed3..5cd7abf8 100644 --- a/pwnagotchi/_version.py +++ b/pwnagotchi/_version.py @@ -1 +1 @@ -__version__ = '2.4.x' +__version__ = '2.4.1' From 8bbc72edc99346f18c82a73a9607fb1f341078ec Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Sun, 17 Sep 2023 10:13:37 +0200 Subject: [PATCH 18/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/fix_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pwnagotchi/plugins/default/fix_services.py b/pwnagotchi/plugins/default/fix_services.py index 5266aa28..9dfd8129 100644 --- a/pwnagotchi/plugins/default/fix_services.py +++ b/pwnagotchi/plugins/default/fix_services.py @@ -196,7 +196,7 @@ class FixServices(plugins.Plugin): logging.info("[Fix_Services] bettercap is down!") if hasattr(agent, 'view'): display = agent.view() - display.set('status', 'Restarting wlan0 now!') + display.set('status', 'Restarting bettercap now!') display.update(force=True) try: # Restart bettercap/pwnagotchi From 3082b2846143d8358cee488c6e1d9b78517f5d84 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Sun, 17 Sep 2023 21:16:22 +0200 Subject: [PATCH 19/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/bettercap.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pwnagotchi/bettercap.py b/pwnagotchi/bettercap.py index 93e160b3..5e2eb689 100644 --- a/pwnagotchi/bettercap.py +++ b/pwnagotchi/bettercap.py @@ -7,9 +7,11 @@ import random from requests.auth import HTTPBasicAuth from time import sleep +import pwnagotchi + requests.adapters.DEFAULT_RETRIES = 5 # increase retries number -ping_timeout = 180 +ping_timeout = 180 ping_interval = 15 max_queue = 10000 @@ -66,7 +68,7 @@ class Client(object): # restarted every time the connection fails while True: - logging.info("creating new websocket...") + logging.info("[bettercap] creating new websocket...") try: async with websockets.connect(s, ping_interval=ping_interval, ping_timeout=ping_timeout, max_queue=max_queue) as ws: # listener loop @@ -97,8 +99,7 @@ class Client(object): except OSError: sleep_time = min_sleep + max_sleep*random.random() logging.warning('connection to the bettercap endpoint failed...') - logging.warning('retrying connection in {} sec'.format(sleep_time)) - await asyncio.sleep(sleep_time) + pwnagotchi.restart("AUTO") continue def run(self, command, verbose_errors=True): From fb5479e7e53bf27d961c3a04b49327820342e021 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Sun, 17 Sep 2023 21:17:01 +0200 Subject: [PATCH 20/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/fix_services.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/pwnagotchi/plugins/default/fix_services.py b/pwnagotchi/plugins/default/fix_services.py index 9dfd8129..cad18a26 100644 --- a/pwnagotchi/plugins/default/fix_services.py +++ b/pwnagotchi/plugins/default/fix_services.py @@ -38,7 +38,6 @@ class FixServices(plugins.Plugin): self.pattern2 = re.compile(r'wifi error while hopping to channel') self.pattern3 = re.compile(r'Firmware has halted or crashed') self.pattern4 = re.compile(r'error 400: could not find interface wlan0mon') - self.pattern5 = re.compile(r'connection to the bettercap endpoint failed') self.isReloadingMon = False self.connection = None self.LASTTRY = 0 @@ -191,20 +190,6 @@ class FixServices(plugins.Plugin): except Exception as err: logging.error("[Fix_Services monstart]: %s" % repr(err)) - # Look for pattern 5 - elif len(self.pattern5.findall(other_other_last_lines)) >= 3: - logging.info("[Fix_Services] bettercap is down!") - if hasattr(agent, 'view'): - display = agent.view() - display.set('status', 'Restarting bettercap now!') - display.update(force=True) - try: - # Restart bettercap/pwnagotchi - logging.info("[Fix_Services restarting]") - pwnagotchi.restart("AUTO") - except Exception as err: - logging.error("[Fix_Services restarting]: %s" % repr(err)) - else: print("logs look good") From d25038b715ca7294922838e17016e007fbd86836 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Sun, 17 Sep 2023 21:22:10 +0200 Subject: [PATCH 21/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/fix_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pwnagotchi/plugins/default/fix_services.py b/pwnagotchi/plugins/default/fix_services.py index cad18a26..2363569a 100644 --- a/pwnagotchi/plugins/default/fix_services.py +++ b/pwnagotchi/plugins/default/fix_services.py @@ -74,7 +74,7 @@ class FixServices(plugins.Plugin): logging.warning("[Fix_Services turnOffAndOn] %s" % repr(err)) else: - logging.info("[Fix_Services] Logs look good, too:\n%s" % last_lines) + logging.info("[Fix_Services] Logs look good!") self._status = "" except Exception as err: From b18af212100b533287962cd6289930cb27dee5a3 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Sun, 17 Sep 2023 21:23:36 +0200 Subject: [PATCH 22/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/fix_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pwnagotchi/plugins/default/fix_services.py b/pwnagotchi/plugins/default/fix_services.py index 2363569a..ca770b04 100644 --- a/pwnagotchi/plugins/default/fix_services.py +++ b/pwnagotchi/plugins/default/fix_services.py @@ -67,7 +67,7 @@ class FixServices(plugins.Plugin): display = agent.view() display.set('status', 'Blind-Bug detected. Restarting.') display.update(force=True) - logging.info('[Fix_Services] Blind-Bug detected. Restarting.\n%s' % repr(last_lines)) + logging.info('[Fix_Services] Blind-Bug detected. Restarting.') try: self._tryTurningItOffAndOnAgain(agent) except Exception as err: From a8415f8d185ca8fa60931781aa368e537cbedef0 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Sun, 17 Sep 2023 21:44:42 +0200 Subject: [PATCH 23/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/fix_services.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pwnagotchi/plugins/default/fix_services.py b/pwnagotchi/plugins/default/fix_services.py index ca770b04..b1f5410b 100644 --- a/pwnagotchi/plugins/default/fix_services.py +++ b/pwnagotchi/plugins/default/fix_services.py @@ -105,8 +105,10 @@ class FixServices(plugins.Plugin): print("Wifi recon flipped") else: logging.warning("[Fix_Services] wifi.recon flip: FAILED: %s" % repr(result)) + self._tryTurningItOffAndOnAgain(agent) except Exception as err: logging.error("[Fix_Services]SYSLOG wifi.recon flip fail: %s" % err) + self._tryTurningItOffAndOnAgain(agent) def on_epoch(self, agent, epoch, epoch_data): last_lines = ''.join(list(TextIOWrapper(subprocess.Popen(['journalctl', '-n10', '-k'], From 7be689bdfc91baa20d8339c89fa547d30d66236b Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Sun, 17 Sep 2023 22:08:27 +0200 Subject: [PATCH 24/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/fix_services.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pwnagotchi/plugins/default/fix_services.py b/pwnagotchi/plugins/default/fix_services.py index b1f5410b..c7886697 100644 --- a/pwnagotchi/plugins/default/fix_services.py +++ b/pwnagotchi/plugins/default/fix_services.py @@ -385,6 +385,7 @@ class FixServices(plugins.Plugin): except Exception as err: logging.error("[Fix_Services wifi.recon on] %s" % repr(err)) + pwnagotchi.reboot() # called to setup the ui elements def on_ui_setup(self, ui): From 28be3adb8ff1501bd21e5b9eccf225dfc96e51bc Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Sun, 17 Sep 2023 22:14:09 +0200 Subject: [PATCH 25/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/ai/train.py | 20 ++++++++++---------- pwnagotchi/plugins/default/fix_services.py | 2 ++ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/pwnagotchi/ai/train.py b/pwnagotchi/ai/train.py index c007230f..58758d6f 100644 --- a/pwnagotchi/ai/train.py +++ b/pwnagotchi/ai/train.py @@ -54,7 +54,7 @@ class Stats(object): def load(self): with self._lock: if os.path.exists(self.path) and os.path.getsize(self.path) > 0: - logging.info("[ai] loading %s" % self.path) + logging.info("[AI] loading %s" % self.path) with open(self.path, 'rt') as fp: obj = json.load(fp) @@ -64,7 +64,7 @@ class Stats(object): def save(self): with self._lock: - logging.info("[ai] saving %s" % self.path) + logging.info("[AI] saving %s" % self.path) data = json.dumps({ 'born_at': self.born_at, @@ -114,7 +114,7 @@ class AsyncTrainer(object): _thread.start_new_thread(self._ai_worker, ()) def _save_ai(self): - logging.info("[ai] saving model to %s ..." % self._nn_path) + logging.info("[AI] saving model to %s ..." % self._nn_path) temp = "%s.tmp" % self._nn_path self._model.save(temp) os.replace(temp, self._nn_path) @@ -133,15 +133,15 @@ class AsyncTrainer(object): def on_ai_policy(self, new_params): plugins.on('ai_policy', self, new_params) - logging.info("[ai] setting new policy:") + logging.info("[AI] setting new policy:") for name, value in new_params.items(): if name in self._config['personality']: curr_value = self._config['personality'][name] if curr_value != value: - logging.info("[ai] ! %s: %s -> %s" % (name, curr_value, value)) + logging.info("[AI] ! %s: %s -> %s" % (name, curr_value, value)) self._config['personality'][name] = value else: - logging.error("[ai] param %s not in personality configuration!" % name) + logging.error("[AI] param %s not in personality configuration!" % name) self.run('set wifi.ap.ttl %d' % self._config['personality']['ap_ttl']) self.run('set wifi.sta.ttl %d' % self._config['personality']['sta_ttl']) @@ -152,12 +152,12 @@ class AsyncTrainer(object): plugins.on('ai_ready', self) def on_ai_best_reward(self, r): - logging.info("[ai] best reward so far: %s" % r) + logging.info("[AI] best reward so far: %s" % r) self._view.on_motivated(r) plugins.on('ai_best_reward', self, r) def on_ai_worst_reward(self, r): - logging.info("[ai] worst reward so far: %s" % r) + logging.info("[AI] worst reward so far: %s" % r) self._view.on_demotivated(r) plugins.on('ai_worst_reward', self, r) @@ -174,7 +174,7 @@ class AsyncTrainer(object): self._model.env.render() # enter in training mode? if random.random() > self._config['ai']['laziness']: - logging.info("[ai] learning for %d epochs ..." % epochs_per_episode) + logging.info("[AI] learning for %d epochs ..." % epochs_per_episode) try: self.set_training(True, epochs_per_episode) # back up brain file before starting new training set @@ -184,7 +184,7 @@ class AsyncTrainer(object): self._view.set("mode", " AI") self._model.learn(total_timesteps=epochs_per_episode, callback=self.on_ai_training_step) except Exception as e: - logging.exception("[ai] error while training (%s)", e) + logging.exception("[AI] error while training (%s)", e) finally: self.set_training(False) obs = self._model.env.reset() diff --git a/pwnagotchi/plugins/default/fix_services.py b/pwnagotchi/plugins/default/fix_services.py index c7886697..ed06d3d2 100644 --- a/pwnagotchi/plugins/default/fix_services.py +++ b/pwnagotchi/plugins/default/fix_services.py @@ -348,6 +348,8 @@ class FixServices(plugins.Plugin): logging.info("[Fix_Services] wlan0mon didn't make it. trying again") if not display: print(" wlan0mon didn't make it. trying again") + else: + pwnagotchi.reboot() # exited the loop, so hopefully it loaded if tries < 3: From eb42c23685a78a137097c85770ee58b6be96bcb7 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Sun, 17 Sep 2023 22:18:02 +0200 Subject: [PATCH 26/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/fix_services.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pwnagotchi/plugins/default/fix_services.py b/pwnagotchi/plugins/default/fix_services.py index ed06d3d2..32d907cd 100644 --- a/pwnagotchi/plugins/default/fix_services.py +++ b/pwnagotchi/plugins/default/fix_services.py @@ -349,6 +349,7 @@ class FixServices(plugins.Plugin): if not display: print(" wlan0mon didn't make it. trying again") else: + logging.info("[Fix_Services] wlan0mon loading failed, no choice but to reboot ..") pwnagotchi.reboot() # exited the loop, so hopefully it loaded From d131f55614c96a2e57075d539b08f89d7573e69e Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Sun, 17 Sep 2023 22:22:12 +0200 Subject: [PATCH 27/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/fix_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pwnagotchi/plugins/default/fix_services.py b/pwnagotchi/plugins/default/fix_services.py index 32d907cd..9ff4cba3 100644 --- a/pwnagotchi/plugins/default/fix_services.py +++ b/pwnagotchi/plugins/default/fix_services.py @@ -301,7 +301,7 @@ class FixServices(plugins.Plugin): # reload the brcmfmac kernel module cmd_output = subprocess.check_output("sudo modprobe brcmfmac", shell=True) - self.logPrintView("info", "[FixBRCMF] reloaded brcmfmac") + self.logPrintView("info", "[Fix_Services] reloaded brcmfmac") self._status = "rl" time.sleep(10 + 4 * tries) # give it some time for wlan device to stabilize, or whatever From e884cd337893cbee961e6399eda54dc1eeaa69d2 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Mon, 18 Sep 2023 00:11:22 +0200 Subject: [PATCH 28/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/fix_services.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pwnagotchi/plugins/default/fix_services.py b/pwnagotchi/plugins/default/fix_services.py index 9ff4cba3..43131037 100644 --- a/pwnagotchi/plugins/default/fix_services.py +++ b/pwnagotchi/plugins/default/fix_services.py @@ -38,6 +38,7 @@ class FixServices(plugins.Plugin): self.pattern2 = re.compile(r'wifi error while hopping to channel') self.pattern3 = re.compile(r'Firmware has halted or crashed') self.pattern4 = re.compile(r'error 400: could not find interface wlan0mon') + self.pattern5 = re.compile(r'waiting for bettercap API to be available') self.isReloadingMon = False self.connection = None self.LASTTRY = 0 @@ -192,6 +193,19 @@ class FixServices(plugins.Plugin): except Exception as err: logging.error("[Fix_Services monstart]: %s" % repr(err)) + # Look for pattern 5 + elif len(self.pattern5.findall(other_other_last_lines)) >= 8: + logging.info("[Fix_Services] bettercap is down, restarting!") + if hasattr(agent, 'view'): + display = agent.view() + display.set('status', 'Rebooting now!') + display.update(force=True) + try: + logging.info("[Fix_Services rebooting now]") + pwnagotchi.reboot() + except Exception as err: + logging.error("[Fix_Services monstart]: %s" % repr(err)) + else: print("logs look good") From 49f42e020aa4d59f597c72eff7135ea539f0b9c1 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Mon, 18 Sep 2023 00:11:42 +0200 Subject: [PATCH 29/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- .../plugins/default/display-password.py | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 pwnagotchi/plugins/default/display-password.py diff --git a/pwnagotchi/plugins/default/display-password.py b/pwnagotchi/plugins/default/display-password.py new file mode 100644 index 00000000..cc9552f7 --- /dev/null +++ b/pwnagotchi/plugins/default/display-password.py @@ -0,0 +1,66 @@ +# display-password shows recently cracked passwords on the pwnagotchi display +# +# +############################################################### +# +# Inspired by, and code shamelessly yoinked from +# the pwnagotchi memtemp.py plugin by https://github.com/xenDE +# +############################################################### +from pwnagotchi.ui.components import LabeledValue +from pwnagotchi.ui.view import BLACK +import pwnagotchi.ui.fonts as fonts +import pwnagotchi.plugins as plugins +import pwnagotchi +import logging +import os + + +class DisplayPassword(plugins.Plugin): + __author__ = '@nagy_craig' + __version__ = '1.0.0' + __license__ = 'GPL3' + __description__ = 'A plugin to display recently cracked passwords' + + def on_loaded(self): + logging.info("display-password loaded") + + def on_ui_setup(self, ui): + with ui._lock(): + if ui.is_waveshare_v2(): + h_pos = (0, 95) + v_pos = (180, 61) + elif ui.is_waveshare_v1(): + h_pos = (0, 95) + v_pos = (170, 61) + elif ui.is_waveshare144lcd(): + h_pos = (0, 92) + v_pos = (78, 67) + elif ui.is_inky(): + h_pos = (0, 83) + v_pos = (165, 54) + elif ui.is_waveshare27inch(): + h_pos = (0, 153) + v_pos = (216, 122) + else: + h_pos = (0, 91) + v_pos = (180, 61) + + if self.options['orientation'] == "vertical": + ui.add_element('display-password', LabeledValue(color=BLACK, label='', value='', + position=v_pos, + label_font=fonts.Bold, text_font=fonts.Small)) + else: + # default to horizontal + ui.add_element('display-password', LabeledValue(color=BLACK, label='', value='', + position=h_pos, + label_font=fonts.Bold, text_font=fonts.Small)) + + def on_unload(self, ui): + with ui._lock: + ui.remove_element('display-password') + + def on_ui_update(self, ui): + last_line = 'tail -n 1 /root/handshakes/wpa-sec.cracked.potfile | awk -F: \'{print $3 " - " $4}\'' + ui.set('display-password', + "%s" % (os.popen(last_line).read().rstrip())) \ No newline at end of file From c674a4858e0055b1e439a197d54e479b84179631 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Mon, 18 Sep 2023 00:13:08 +0200 Subject: [PATCH 30/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/defaults.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pwnagotchi/defaults.toml b/pwnagotchi/defaults.toml index 1aed4564..4c8ec31a 100644 --- a/pwnagotchi/defaults.toml +++ b/pwnagotchi/defaults.toml @@ -40,6 +40,8 @@ main.plugins.pisugar2.enabled = false main.plugins.pisugar2.shutdown = 5 main.plugins.pisugar2.sync_rtc_on_boot = false +main.plugins.display-password.enabled = false + main.plugins.grid.enabled = true main.plugins.grid.report = true main.plugins.grid.exclude = [ From 649a990311ea75464b96ffff710abb3e88957ef1 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Mon, 18 Sep 2023 00:18:50 +0200 Subject: [PATCH 31/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/display-password.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/pwnagotchi/plugins/default/display-password.py b/pwnagotchi/plugins/default/display-password.py index cc9552f7..6c412a53 100644 --- a/pwnagotchi/plugins/default/display-password.py +++ b/pwnagotchi/plugins/default/display-password.py @@ -47,20 +47,17 @@ class DisplayPassword(plugins.Plugin): v_pos = (180, 61) if self.options['orientation'] == "vertical": - ui.add_element('display-password', LabeledValue(color=BLACK, label='', value='', - position=v_pos, - label_font=fonts.Bold, text_font=fonts.Small)) + ui.add_element('display_password', LabeledValue(color=BLACK, label='', value='', position=v_pos, + label_font=fonts.Bold, text_font=fonts.Small)) else: # default to horizontal - ui.add_element('display-password', LabeledValue(color=BLACK, label='', value='', - position=h_pos, - label_font=fonts.Bold, text_font=fonts.Small)) + ui.add_element('display_password', LabeledValue(color=BLACK, label='', value='', position=h_pos, + label_font=fonts.Bold, text_font=fonts.Small)) def on_unload(self, ui): with ui._lock: - ui.remove_element('display-password') + ui.remove_element('display_password') def on_ui_update(self, ui): last_line = 'tail -n 1 /root/handshakes/wpa-sec.cracked.potfile | awk -F: \'{print $3 " - " $4}\'' - ui.set('display-password', - "%s" % (os.popen(last_line).read().rstrip())) \ No newline at end of file + ui.set('display_password', "%s" % (os.popen(last_line).read().rstrip())) \ No newline at end of file From e39b04c80fd11e4054bab83a2f306d328d937f64 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Mon, 18 Sep 2023 00:24:58 +0200 Subject: [PATCH 32/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/display-password.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/pwnagotchi/plugins/default/display-password.py b/pwnagotchi/plugins/default/display-password.py index 6c412a53..58a6ad93 100644 --- a/pwnagotchi/plugins/default/display-password.py +++ b/pwnagotchi/plugins/default/display-password.py @@ -21,6 +21,13 @@ class DisplayPassword(plugins.Plugin): __version__ = '1.0.0' __license__ = 'GPL3' __description__ = 'A plugin to display recently cracked passwords' + __name__ = 'display-password' + __help__ = """ + Displays recently cracked passwords + """ + __defaults__ = { + 'enabled': True, + } def on_loaded(self): logging.info("display-password loaded") @@ -47,17 +54,17 @@ class DisplayPassword(plugins.Plugin): v_pos = (180, 61) if self.options['orientation'] == "vertical": - ui.add_element('display_password', LabeledValue(color=BLACK, label='', value='', position=v_pos, + ui.add_element('display-password', LabeledValue(color=BLACK, label='', value='', position=v_pos, label_font=fonts.Bold, text_font=fonts.Small)) else: # default to horizontal - ui.add_element('display_password', LabeledValue(color=BLACK, label='', value='', position=h_pos, + ui.add_element('display-password', LabeledValue(color=BLACK, label='', value='', position=h_pos, label_font=fonts.Bold, text_font=fonts.Small)) def on_unload(self, ui): with ui._lock: - ui.remove_element('display_password') + ui.remove_element('display-password') def on_ui_update(self, ui): last_line = 'tail -n 1 /root/handshakes/wpa-sec.cracked.potfile | awk -F: \'{print $3 " - " $4}\'' - ui.set('display_password', "%s" % (os.popen(last_line).read().rstrip())) \ No newline at end of file + ui.set('display-password', "%s" % (os.popen(last_line).read().rstrip())) From 1216d6376ba8fd0cd25ad7a24a0637fcc86bb385 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Mon, 18 Sep 2023 00:26:06 +0200 Subject: [PATCH 33/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/display-password.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pwnagotchi/plugins/default/display-password.py b/pwnagotchi/plugins/default/display-password.py index 58a6ad93..5392870d 100644 --- a/pwnagotchi/plugins/default/display-password.py +++ b/pwnagotchi/plugins/default/display-password.py @@ -26,7 +26,7 @@ class DisplayPassword(plugins.Plugin): Displays recently cracked passwords """ __defaults__ = { - 'enabled': True, + 'enabled': False, } def on_loaded(self): From 3bb47500d1e9f163493c3ba0ed1e79cc359fced6 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Mon, 18 Sep 2023 00:48:26 +0200 Subject: [PATCH 34/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/defaults.toml | 2 - pwnagotchi/plugins/__init__.py | 2 +- .../plugins/default/display-password.py | 70 ------------------- 3 files changed, 1 insertion(+), 73 deletions(-) delete mode 100644 pwnagotchi/plugins/default/display-password.py diff --git a/pwnagotchi/defaults.toml b/pwnagotchi/defaults.toml index 4c8ec31a..1aed4564 100644 --- a/pwnagotchi/defaults.toml +++ b/pwnagotchi/defaults.toml @@ -40,8 +40,6 @@ main.plugins.pisugar2.enabled = false main.plugins.pisugar2.shutdown = 5 main.plugins.pisugar2.sync_rtc_on_boot = false -main.plugins.display-password.enabled = false - main.plugins.grid.enabled = true main.plugins.grid.report = true main.plugins.grid.exclude = [ diff --git a/pwnagotchi/plugins/__init__.py b/pwnagotchi/plugins/__init__.py index 57e86976..21a5bc9f 100644 --- a/pwnagotchi/plugins/__init__.py +++ b/pwnagotchi/plugins/__init__.py @@ -43,7 +43,7 @@ def toggle_plugin(name, enable=True): global loaded, database if pwnagotchi.config: - if not name in pwnagotchi.config['main']['plugins']: + if name not in pwnagotchi.config['main']['plugins']: pwnagotchi.config['main']['plugins'][name] = dict() pwnagotchi.config['main']['plugins'][name]['enabled'] = enable save_config(pwnagotchi.config, '/etc/pwnagotchi/config.toml') diff --git a/pwnagotchi/plugins/default/display-password.py b/pwnagotchi/plugins/default/display-password.py deleted file mode 100644 index 5392870d..00000000 --- a/pwnagotchi/plugins/default/display-password.py +++ /dev/null @@ -1,70 +0,0 @@ -# display-password shows recently cracked passwords on the pwnagotchi display -# -# -############################################################### -# -# Inspired by, and code shamelessly yoinked from -# the pwnagotchi memtemp.py plugin by https://github.com/xenDE -# -############################################################### -from pwnagotchi.ui.components import LabeledValue -from pwnagotchi.ui.view import BLACK -import pwnagotchi.ui.fonts as fonts -import pwnagotchi.plugins as plugins -import pwnagotchi -import logging -import os - - -class DisplayPassword(plugins.Plugin): - __author__ = '@nagy_craig' - __version__ = '1.0.0' - __license__ = 'GPL3' - __description__ = 'A plugin to display recently cracked passwords' - __name__ = 'display-password' - __help__ = """ - Displays recently cracked passwords - """ - __defaults__ = { - 'enabled': False, - } - - def on_loaded(self): - logging.info("display-password loaded") - - def on_ui_setup(self, ui): - with ui._lock(): - if ui.is_waveshare_v2(): - h_pos = (0, 95) - v_pos = (180, 61) - elif ui.is_waveshare_v1(): - h_pos = (0, 95) - v_pos = (170, 61) - elif ui.is_waveshare144lcd(): - h_pos = (0, 92) - v_pos = (78, 67) - elif ui.is_inky(): - h_pos = (0, 83) - v_pos = (165, 54) - elif ui.is_waveshare27inch(): - h_pos = (0, 153) - v_pos = (216, 122) - else: - h_pos = (0, 91) - v_pos = (180, 61) - - if self.options['orientation'] == "vertical": - ui.add_element('display-password', LabeledValue(color=BLACK, label='', value='', position=v_pos, - label_font=fonts.Bold, text_font=fonts.Small)) - else: - # default to horizontal - ui.add_element('display-password', LabeledValue(color=BLACK, label='', value='', position=h_pos, - label_font=fonts.Bold, text_font=fonts.Small)) - - def on_unload(self, ui): - with ui._lock: - ui.remove_element('display-password') - - def on_ui_update(self, ui): - last_line = 'tail -n 1 /root/handshakes/wpa-sec.cracked.potfile | awk -F: \'{print $3 " - " $4}\'' - ui.set('display-password', "%s" % (os.popen(last_line).read().rstrip())) From eed0cfe485c89de6ec91428659ac406abf1cc213 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Mon, 18 Sep 2023 01:05:22 +0200 Subject: [PATCH 35/49] Revert "v2.4.1" This reverts commit 3bb47500d1e9f163493c3ba0ed1e79cc359fced6. --- pwnagotchi/defaults.toml | 2 + pwnagotchi/plugins/__init__.py | 2 +- .../plugins/default/display-password.py | 70 +++++++++++++++++++ 3 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 pwnagotchi/plugins/default/display-password.py diff --git a/pwnagotchi/defaults.toml b/pwnagotchi/defaults.toml index 1aed4564..4c8ec31a 100644 --- a/pwnagotchi/defaults.toml +++ b/pwnagotchi/defaults.toml @@ -40,6 +40,8 @@ main.plugins.pisugar2.enabled = false main.plugins.pisugar2.shutdown = 5 main.plugins.pisugar2.sync_rtc_on_boot = false +main.plugins.display-password.enabled = false + main.plugins.grid.enabled = true main.plugins.grid.report = true main.plugins.grid.exclude = [ diff --git a/pwnagotchi/plugins/__init__.py b/pwnagotchi/plugins/__init__.py index 21a5bc9f..57e86976 100644 --- a/pwnagotchi/plugins/__init__.py +++ b/pwnagotchi/plugins/__init__.py @@ -43,7 +43,7 @@ def toggle_plugin(name, enable=True): global loaded, database if pwnagotchi.config: - if name not in pwnagotchi.config['main']['plugins']: + if not name in pwnagotchi.config['main']['plugins']: pwnagotchi.config['main']['plugins'][name] = dict() pwnagotchi.config['main']['plugins'][name]['enabled'] = enable save_config(pwnagotchi.config, '/etc/pwnagotchi/config.toml') diff --git a/pwnagotchi/plugins/default/display-password.py b/pwnagotchi/plugins/default/display-password.py new file mode 100644 index 00000000..5392870d --- /dev/null +++ b/pwnagotchi/plugins/default/display-password.py @@ -0,0 +1,70 @@ +# display-password shows recently cracked passwords on the pwnagotchi display +# +# +############################################################### +# +# Inspired by, and code shamelessly yoinked from +# the pwnagotchi memtemp.py plugin by https://github.com/xenDE +# +############################################################### +from pwnagotchi.ui.components import LabeledValue +from pwnagotchi.ui.view import BLACK +import pwnagotchi.ui.fonts as fonts +import pwnagotchi.plugins as plugins +import pwnagotchi +import logging +import os + + +class DisplayPassword(plugins.Plugin): + __author__ = '@nagy_craig' + __version__ = '1.0.0' + __license__ = 'GPL3' + __description__ = 'A plugin to display recently cracked passwords' + __name__ = 'display-password' + __help__ = """ + Displays recently cracked passwords + """ + __defaults__ = { + 'enabled': False, + } + + def on_loaded(self): + logging.info("display-password loaded") + + def on_ui_setup(self, ui): + with ui._lock(): + if ui.is_waveshare_v2(): + h_pos = (0, 95) + v_pos = (180, 61) + elif ui.is_waveshare_v1(): + h_pos = (0, 95) + v_pos = (170, 61) + elif ui.is_waveshare144lcd(): + h_pos = (0, 92) + v_pos = (78, 67) + elif ui.is_inky(): + h_pos = (0, 83) + v_pos = (165, 54) + elif ui.is_waveshare27inch(): + h_pos = (0, 153) + v_pos = (216, 122) + else: + h_pos = (0, 91) + v_pos = (180, 61) + + if self.options['orientation'] == "vertical": + ui.add_element('display-password', LabeledValue(color=BLACK, label='', value='', position=v_pos, + label_font=fonts.Bold, text_font=fonts.Small)) + else: + # default to horizontal + ui.add_element('display-password', LabeledValue(color=BLACK, label='', value='', position=h_pos, + label_font=fonts.Bold, text_font=fonts.Small)) + + def on_unload(self, ui): + with ui._lock: + ui.remove_element('display-password') + + def on_ui_update(self, ui): + last_line = 'tail -n 1 /root/handshakes/wpa-sec.cracked.potfile | awk -F: \'{print $3 " - " $4}\'' + ui.set('display-password', "%s" % (os.popen(last_line).read().rstrip())) From 83f3222377e427fc265fffdd5653ebd6b86a8ff2 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Mon, 18 Sep 2023 01:17:45 +0200 Subject: [PATCH 36/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- .../plugins/default/display-password.py | 70 ------------------- 1 file changed, 70 deletions(-) delete mode 100644 pwnagotchi/plugins/default/display-password.py diff --git a/pwnagotchi/plugins/default/display-password.py b/pwnagotchi/plugins/default/display-password.py deleted file mode 100644 index 5392870d..00000000 --- a/pwnagotchi/plugins/default/display-password.py +++ /dev/null @@ -1,70 +0,0 @@ -# display-password shows recently cracked passwords on the pwnagotchi display -# -# -############################################################### -# -# Inspired by, and code shamelessly yoinked from -# the pwnagotchi memtemp.py plugin by https://github.com/xenDE -# -############################################################### -from pwnagotchi.ui.components import LabeledValue -from pwnagotchi.ui.view import BLACK -import pwnagotchi.ui.fonts as fonts -import pwnagotchi.plugins as plugins -import pwnagotchi -import logging -import os - - -class DisplayPassword(plugins.Plugin): - __author__ = '@nagy_craig' - __version__ = '1.0.0' - __license__ = 'GPL3' - __description__ = 'A plugin to display recently cracked passwords' - __name__ = 'display-password' - __help__ = """ - Displays recently cracked passwords - """ - __defaults__ = { - 'enabled': False, - } - - def on_loaded(self): - logging.info("display-password loaded") - - def on_ui_setup(self, ui): - with ui._lock(): - if ui.is_waveshare_v2(): - h_pos = (0, 95) - v_pos = (180, 61) - elif ui.is_waveshare_v1(): - h_pos = (0, 95) - v_pos = (170, 61) - elif ui.is_waveshare144lcd(): - h_pos = (0, 92) - v_pos = (78, 67) - elif ui.is_inky(): - h_pos = (0, 83) - v_pos = (165, 54) - elif ui.is_waveshare27inch(): - h_pos = (0, 153) - v_pos = (216, 122) - else: - h_pos = (0, 91) - v_pos = (180, 61) - - if self.options['orientation'] == "vertical": - ui.add_element('display-password', LabeledValue(color=BLACK, label='', value='', position=v_pos, - label_font=fonts.Bold, text_font=fonts.Small)) - else: - # default to horizontal - ui.add_element('display-password', LabeledValue(color=BLACK, label='', value='', position=h_pos, - label_font=fonts.Bold, text_font=fonts.Small)) - - def on_unload(self, ui): - with ui._lock: - ui.remove_element('display-password') - - def on_ui_update(self, ui): - last_line = 'tail -n 1 /root/handshakes/wpa-sec.cracked.potfile | awk -F: \'{print $3 " - " $4}\'' - ui.set('display-password', "%s" % (os.popen(last_line).read().rstrip())) From c3c703d02fd65d21da908bfdd440582db275f332 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Mon, 18 Sep 2023 01:18:01 +0200 Subject: [PATCH 37/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/defaults.toml | 2 -- 1 file changed, 2 deletions(-) diff --git a/pwnagotchi/defaults.toml b/pwnagotchi/defaults.toml index 4c8ec31a..1aed4564 100644 --- a/pwnagotchi/defaults.toml +++ b/pwnagotchi/defaults.toml @@ -40,8 +40,6 @@ main.plugins.pisugar2.enabled = false main.plugins.pisugar2.shutdown = 5 main.plugins.pisugar2.sync_rtc_on_boot = false -main.plugins.display-password.enabled = false - main.plugins.grid.enabled = true main.plugins.grid.report = true main.plugins.grid.exclude = [ From 2b3f620187eb2476d89c7cfaa9c1969df12e6a8c Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Mon, 18 Sep 2023 08:55:12 +0200 Subject: [PATCH 38/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- .../plugins/default/internet-connection.py | 47 +++++++++++++++++++ pwnagotchi/plugins/default/wpa-sec.py | 2 - 2 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 pwnagotchi/plugins/default/internet-connection.py diff --git a/pwnagotchi/plugins/default/internet-connection.py b/pwnagotchi/plugins/default/internet-connection.py new file mode 100644 index 00000000..9d01fcc9 --- /dev/null +++ b/pwnagotchi/plugins/default/internet-connection.py @@ -0,0 +1,47 @@ +import logging +import pwnagotchi.ui.components as components +import pwnagotchi.ui.view as view +import pwnagotchi.ui.fonts as fonts +import pwnagotchi.plugins as plugins +import pwnagotchi +import subprocess + + +class InternetConnectionPlugin(plugins.Plugin): + __author__ = 'adi1708 made by chatGPT' + __version__ = '1.0.0' + __license__ = 'GPL3' + __description__ = 'A plugin that displays the Internet connection status on the pwnagotchi display.' + __name__ = 'InternetConnectionPlugin' + __help__ = """ + A plugin that displays the Internet connection status on the pwnagotchi display. + """ + __dependencies__ = { + 'pip': ['scapy'] + } + __defaults__ = { + 'enabled': False, + } + + def on_loaded(self): + logging.info("Internet Connection Plugin loaded.") + + def on_ui_setup(self, ui): + with ui._lock: + # add a LabeledValue element to the UI with the given label and value + # the position and font can also be specified + ui.add_element('connection_status', components.LabeledValue(color=view.BLACK, label='Internet:', value='', + position=(0, 50), label_font=fonts.Small, + text_font=fonts.Small)) + + def on_ui_update(self, ui): + with ui._lock: + # check if there is an active Internet connection + try: + # use the 'ping' command to check if we can reach a well-known website + output = subprocess.check_output(['ping', '-c', '1', 'google.com']) + # if the command was successful, it means there is an active Internet connection + ui.set('connection_status', 'Connected') + except subprocess.CalledProcessError: + # if the command failed, it means there is no active Internet connection + ui.set('connection_status', 'Disconnected') diff --git a/pwnagotchi/plugins/default/wpa-sec.py b/pwnagotchi/plugins/default/wpa-sec.py index 6b6163b1..bb65db44 100644 --- a/pwnagotchi/plugins/default/wpa-sec.py +++ b/pwnagotchi/plugins/default/wpa-sec.py @@ -43,7 +43,6 @@ class WpaSec(plugins.Plugin): except requests.exceptions.RequestException as req_e: raise req_e - def _download_from_wpasec(self, output, timeout=30): """ Downloads the results from wpasec and safes them to output @@ -65,7 +64,6 @@ class WpaSec(plugins.Plugin): except OSError as os_e: raise os_e - def on_loaded(self): """ Gets called when the plugin gets loaded From 3df462d046a324b31ffd52c3485dab8a5cd058f2 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Mon, 18 Sep 2023 08:55:34 +0200 Subject: [PATCH 39/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/defaults.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pwnagotchi/defaults.toml b/pwnagotchi/defaults.toml index 1aed4564..297f5bcb 100644 --- a/pwnagotchi/defaults.toml +++ b/pwnagotchi/defaults.toml @@ -40,6 +40,8 @@ main.plugins.pisugar2.enabled = false main.plugins.pisugar2.shutdown = 5 main.plugins.pisugar2.sync_rtc_on_boot = false +main.plugins.internet-connection.enabled = false + main.plugins.grid.enabled = true main.plugins.grid.report = true main.plugins.grid.exclude = [ From 18cbb4a11ab41a0964c5aff2e96e2561196c646b Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Mon, 18 Sep 2023 09:00:49 +0200 Subject: [PATCH 40/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/internet-connection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pwnagotchi/plugins/default/internet-connection.py b/pwnagotchi/plugins/default/internet-connection.py index 9d01fcc9..3b5cacd9 100644 --- a/pwnagotchi/plugins/default/internet-connection.py +++ b/pwnagotchi/plugins/default/internet-connection.py @@ -31,7 +31,7 @@ class InternetConnectionPlugin(plugins.Plugin): # add a LabeledValue element to the UI with the given label and value # the position and font can also be specified ui.add_element('connection_status', components.LabeledValue(color=view.BLACK, label='Internet:', value='', - position=(0, 50), label_font=fonts.Small, + position=(0, 30), label_font=fonts.Small, text_font=fonts.Small)) def on_ui_update(self, ui): From 5fc1df72417402520c9b4b55e27a3506cedf49db Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Mon, 18 Sep 2023 09:15:43 +0200 Subject: [PATCH 41/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/internet-connection.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pwnagotchi/plugins/default/internet-connection.py b/pwnagotchi/plugins/default/internet-connection.py index 3b5cacd9..4904f1cf 100644 --- a/pwnagotchi/plugins/default/internet-connection.py +++ b/pwnagotchi/plugins/default/internet-connection.py @@ -30,7 +30,7 @@ class InternetConnectionPlugin(plugins.Plugin): with ui._lock: # add a LabeledValue element to the UI with the given label and value # the position and font can also be specified - ui.add_element('connection_status', components.LabeledValue(color=view.BLACK, label='Internet:', value='', + ui.add_element('connection_status', components.LabeledValue(color=view.BLACK, label='', value='', position=(0, 30), label_font=fonts.Small, text_font=fonts.Small)) @@ -41,7 +41,7 @@ class InternetConnectionPlugin(plugins.Plugin): # use the 'ping' command to check if we can reach a well-known website output = subprocess.check_output(['ping', '-c', '1', 'google.com']) # if the command was successful, it means there is an active Internet connection - ui.set('connection_status', 'Connected') + ui.set('connection_status', ' connected') except subprocess.CalledProcessError: # if the command failed, it means there is no active Internet connection - ui.set('connection_status', 'Disconnected') + ui.set('connection_status', ' disconnected') From 833e298063f64e35ecea3268ed495b2309d0ad7d Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Mon, 18 Sep 2023 09:17:01 +0200 Subject: [PATCH 42/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- .../plugins/default/internet-connection.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/pwnagotchi/plugins/default/internet-connection.py b/pwnagotchi/plugins/default/internet-connection.py index 4904f1cf..86c8c3df 100644 --- a/pwnagotchi/plugins/default/internet-connection.py +++ b/pwnagotchi/plugins/default/internet-connection.py @@ -35,13 +35,12 @@ class InternetConnectionPlugin(plugins.Plugin): text_font=fonts.Small)) def on_ui_update(self, ui): - with ui._lock: - # check if there is an active Internet connection - try: - # use the 'ping' command to check if we can reach a well-known website - output = subprocess.check_output(['ping', '-c', '1', 'google.com']) - # if the command was successful, it means there is an active Internet connection - ui.set('connection_status', ' connected') - except subprocess.CalledProcessError: - # if the command failed, it means there is no active Internet connection - ui.set('connection_status', ' disconnected') + # check if there is an active Internet connection + try: + # use the 'ping' command to check if we can reach a well-known website + output = subprocess.check_output(['ping', '-c', '1', 'google.com']) + # if the command was successful, it means there is an active Internet connection + ui.set('connection_status', ' connected') + except subprocess.CalledProcessError: + # if the command failed, it means there is no active Internet connection + ui.set('connection_status', ' disconnected') From 8e509d9601a965457f1a33c4a5f9b5b97ba44891 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Mon, 18 Sep 2023 09:21:24 +0200 Subject: [PATCH 43/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/internet-connection.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pwnagotchi/plugins/default/internet-connection.py b/pwnagotchi/plugins/default/internet-connection.py index 86c8c3df..53c68ebd 100644 --- a/pwnagotchi/plugins/default/internet-connection.py +++ b/pwnagotchi/plugins/default/internet-connection.py @@ -40,7 +40,7 @@ class InternetConnectionPlugin(plugins.Plugin): # use the 'ping' command to check if we can reach a well-known website output = subprocess.check_output(['ping', '-c', '1', 'google.com']) # if the command was successful, it means there is an active Internet connection - ui.set('connection_status', ' connected') + ui.set('connection_status', 'connected') except subprocess.CalledProcessError: # if the command failed, it means there is no active Internet connection - ui.set('connection_status', ' disconnected') + ui.set('connection_status', 'disconnected') From d02b7c9851d89e255374668e47b672537c8dee3b Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Mon, 18 Sep 2023 09:23:07 +0200 Subject: [PATCH 44/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/internet-connection.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pwnagotchi/plugins/default/internet-connection.py b/pwnagotchi/plugins/default/internet-connection.py index 53c68ebd..279d086a 100644 --- a/pwnagotchi/plugins/default/internet-connection.py +++ b/pwnagotchi/plugins/default/internet-connection.py @@ -44,3 +44,7 @@ class InternetConnectionPlugin(plugins.Plugin): except subprocess.CalledProcessError: # if the command failed, it means there is no active Internet connection ui.set('connection_status', 'disconnected') + + def on_unload(self, ui): + with ui._lock: + ui.remove_element('connection_status') From 76a7ea1739c5e94851b5a77853723e24094eca5f Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Mon, 18 Sep 2023 09:23:58 +0200 Subject: [PATCH 45/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/internet-connection.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pwnagotchi/plugins/default/internet-connection.py b/pwnagotchi/plugins/default/internet-connection.py index 279d086a..73d4f13d 100644 --- a/pwnagotchi/plugins/default/internet-connection.py +++ b/pwnagotchi/plugins/default/internet-connection.py @@ -24,7 +24,7 @@ class InternetConnectionPlugin(plugins.Plugin): } def on_loaded(self): - logging.info("Internet Connection Plugin loaded.") + logging.info("[Internet-Connection] plugin loaded.") def on_ui_setup(self, ui): with ui._lock: @@ -47,4 +47,5 @@ class InternetConnectionPlugin(plugins.Plugin): def on_unload(self, ui): with ui._lock: + logging.info("[Internet-Connection] plugin unloaded") ui.remove_element('connection_status') From 9b42c8e246524e94b24043f7bda0b4cb1ff6a4a9 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Mon, 18 Sep 2023 09:26:50 +0200 Subject: [PATCH 46/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/bettercap.py | 2 +- pwnagotchi/plugins/default/fix_services.py | 13 ------------- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/pwnagotchi/bettercap.py b/pwnagotchi/bettercap.py index 5e2eb689..d681a1a9 100644 --- a/pwnagotchi/bettercap.py +++ b/pwnagotchi/bettercap.py @@ -99,7 +99,7 @@ class Client(object): except OSError: sleep_time = min_sleep + max_sleep*random.random() logging.warning('connection to the bettercap endpoint failed...') - pwnagotchi.restart("AUTO") + pwnagotchi.reboot() continue def run(self, command, verbose_errors=True): diff --git a/pwnagotchi/plugins/default/fix_services.py b/pwnagotchi/plugins/default/fix_services.py index 43131037..3dc800a1 100644 --- a/pwnagotchi/plugins/default/fix_services.py +++ b/pwnagotchi/plugins/default/fix_services.py @@ -193,19 +193,6 @@ class FixServices(plugins.Plugin): except Exception as err: logging.error("[Fix_Services monstart]: %s" % repr(err)) - # Look for pattern 5 - elif len(self.pattern5.findall(other_other_last_lines)) >= 8: - logging.info("[Fix_Services] bettercap is down, restarting!") - if hasattr(agent, 'view'): - display = agent.view() - display.set('status', 'Rebooting now!') - display.update(force=True) - try: - logging.info("[Fix_Services rebooting now]") - pwnagotchi.reboot() - except Exception as err: - logging.error("[Fix_Services monstart]: %s" % repr(err)) - else: print("logs look good") From a1b927d179cc6a4275ece0ba355499186ab7e40e Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Mon, 18 Sep 2023 09:30:54 +0200 Subject: [PATCH 47/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/bettercap.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pwnagotchi/bettercap.py b/pwnagotchi/bettercap.py index d681a1a9..243e00a6 100644 --- a/pwnagotchi/bettercap.py +++ b/pwnagotchi/bettercap.py @@ -100,7 +100,6 @@ class Client(object): sleep_time = min_sleep + max_sleep*random.random() logging.warning('connection to the bettercap endpoint failed...') pwnagotchi.reboot() - continue def run(self, command, verbose_errors=True): while True: From 1111a26f311e1041fb8d789d5b1d7b98fa8e65ef Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Mon, 18 Sep 2023 09:31:55 +0200 Subject: [PATCH 48/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/fix_services.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pwnagotchi/plugins/default/fix_services.py b/pwnagotchi/plugins/default/fix_services.py index 3dc800a1..9ff4cba3 100644 --- a/pwnagotchi/plugins/default/fix_services.py +++ b/pwnagotchi/plugins/default/fix_services.py @@ -38,7 +38,6 @@ class FixServices(plugins.Plugin): self.pattern2 = re.compile(r'wifi error while hopping to channel') self.pattern3 = re.compile(r'Firmware has halted or crashed') self.pattern4 = re.compile(r'error 400: could not find interface wlan0mon') - self.pattern5 = re.compile(r'waiting for bettercap API to be available') self.isReloadingMon = False self.connection = None self.LASTTRY = 0 From 3fb0a3697f918fcc22b8c5c9527377e60fe277e7 Mon Sep 17 00:00:00 2001 From: Jeroen Oudshoorn Date: Mon, 18 Sep 2023 09:40:06 +0200 Subject: [PATCH 49/49] v2.4.1 Signed-off-by: Jeroen Oudshoorn --- pwnagotchi/plugins/default/internet-connection.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pwnagotchi/plugins/default/internet-connection.py b/pwnagotchi/plugins/default/internet-connection.py index 73d4f13d..25adc78a 100644 --- a/pwnagotchi/plugins/default/internet-connection.py +++ b/pwnagotchi/plugins/default/internet-connection.py @@ -8,8 +8,8 @@ import subprocess class InternetConnectionPlugin(plugins.Plugin): - __author__ = 'adi1708 made by chatGPT' - __version__ = '1.0.0' + __author__ = 'adi1708, edited by jayofelony' + __version__ = '1.0.1' __license__ = 'GPL3' __description__ = 'A plugin that displays the Internet connection status on the pwnagotchi display.' __name__ = 'InternetConnectionPlugin'