diff --git a/pwnagotchi/grid.py b/pwnagotchi/grid.py index a76c269d..b4abe77a 100644 --- a/pwnagotchi/grid.py +++ b/pwnagotchi/grid.py @@ -13,10 +13,9 @@ API_ADDRESS = "http://127.0.0.1:8666/api/v1" def is_connected(): try: # check DNS - host = socket.gethostbyname('api.pwnagotchi.ai') - if host: - # check connectivity itself - socket.create_connection((host, 443), timeout=30) + host = 'https://api.opwngrid.xyz/api/v1/uptime' + r = requests.get(host, headers=None, timeout=(30.0, 60.0)) + if r.json().get('isUp'): return True except: pass diff --git a/pwnagotchi/plugins/default/fix_services.py b/pwnagotchi/plugins/default/fix_services.py index 76d4fda2..987044f5 100644 --- a/pwnagotchi/plugins/default/fix_services.py +++ b/pwnagotchi/plugins/default/fix_services.py @@ -15,12 +15,12 @@ from pwnagotchi.ui.view import BLACK import pwnagotchi.ui.fonts as fonts -class Fix_Services(plugins.Plugin): +class Fix_BRCMF(plugins.Plugin): __author__ = 'xBits' __version__ = '0.1.1' __license__ = 'GPL3' __description__ = 'Fix blindness, firmware crashes and brain not being loaded' - __name__ = 'Fix_Services' + __name__ = 'Fix_BRCMF' __help__ = """ Reload brcmfmac module when blindbug is detected, instead of rebooting. Adapted from WATCHDOG. """ @@ -43,19 +43,20 @@ class Fix_Services(plugins.Plugin): self._status = "--" self._count = 0 + def on_loaded(self): """ Gets called when the plugin gets loaded """ self._status = "ld" - logging.info("[Fix_Services] plugin loaded.") + logging.info("[FixBRCMF] plugin loaded.") def on_ready(self, agent): last_lines = ''.join(list(TextIOWrapper(subprocess.Popen(['journalctl', '-n10', '-k'], - stdout=subprocess.PIPE).stdout))[-10:]) + stdout=subprocess.PIPE).stdout))[-10:]) try: cmd_output = subprocess.check_output("ip link show wlan0mon", shell=True) - logging.info("[Fix_Services ip link show wlan0mon]: %s" % repr(cmd_output)) + logging.info("[FixBRCMF ip link show wlan0mon]: %s" % repr(cmd_output)) if ",UP," in str(cmd_output): logging.info("wlan0mon is up.") self._status = "up" @@ -66,35 +67,35 @@ class Fix_Services(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('[FixBRCMF] Blind-Bug detected. Restarting.\n%s' % repr(last_lines)) try: self._tryTurningItOffAndOnAgain(agent) except Exception as err: - logging.warning("[Fix_Services turnOffAndOn] %s" % repr(err)) + logging.warning("[FixBRCMF turnOffAndOn] %s" % repr(err)) else: - logging.info("[Fix_Services] Logs look good, too:\n%s" % last_lines) + logging.info("[FixBRCMF] Logs look good, too:\n%s" % last_lines) self._status = "" except Exception as err: - logging.error("[Fix_Services ip link show wlan0mon]: %s" % repr(err)) + logging.error("[FixBRCMF ip link show wlan0mon]: %s" % repr(err)) try: self._status = "xx" self._tryTurningItOffAndOnAgain(agent) except Exception as err: - logging.error("[Fix_Services OffNOn]: %s" % repr(err)) + logging.error("[FixBRCMF OffNOn]: %s" % repr(err)) # bettercap sys_log event # search syslog events for the brcmf channel fail, and reset when it shows up # apparently this only gets messages from bettercap going to syslog, not from syslog def on_bcap_sys_log(self, agent, event): if re.search('wifi error while hopping to channel', event['data']['Message']): - logging.info("[Fix_Services]SYSLOG MATCH: %s" % event['data']['Message']) - logging.info("[Fix_Services]**** restarting wifi.recon") + logging.info("[FixBRCMF]SYSLOG MATCH: %s" % event['data']['Message']) + logging.info("[FixBRCMF]**** restarting wifi.recon") try: result = agent.run("wifi.recon off; wifi.recon on") if result["success"]: - logging.info("[Fix_Services] wifi.recon flip: success!") + logging.info("[FixBRCMF] wifi.recon flip: success!") if hasattr(agent, 'view'): display = agent.view() if display: display.update(force=True, new_data={"status": "Wifi recon flipped!", @@ -102,38 +103,37 @@ class Fix_Services(plugins.Plugin): else: print("Wifi recon flipped") else: - logging.warning("[Fix_Services] wifi.recon flip: FAILED: %s" % repr(result)) + logging.warning("[FixBRCMF] wifi.recon flip: FAILED: %s" % repr(result)) except Exception as err: - logging.error("[Fix_Services]SYSLOG wifi.recon flip fail: %s" % err) + logging.error("[FixBRCMF]SYSLOG wifi.recon flip fail: %s" % err) def on_epoch(self, agent, epoch, epoch_data): last_lines = ''.join(list(TextIOWrapper(subprocess.Popen(['journalctl', '-n10', '-k'], stdout=subprocess.PIPE).stdout))[-10:]) other_last_lines = ''.join(list(TextIOWrapper(subprocess.Popen(['journalctl', '-n10'], stdout=subprocess.PIPE).stdout))[-10:]) - other_other_last_lines = ''.join( - list(TextIOWrapper(subprocess.Popen(['tail', '-n10', '/var/log/pwnagotchi.log'], - stdout=subprocess.PIPE).stdout))[-10:]) + other_other_last_lines = ''.join(list(TextIOWrapper(subprocess.Popen(['tail', '-n10', '/var/log/pwnagotchi.log'], + stdout=subprocess.PIPE).stdout))[-10:]) # don't check if we ran a reset recently - logging.debug("[Fix_Services]**** epoch") + logging.debug("[FixBRCMF]**** epoch") if time.time() - self.LASTTRY > 180: # get last 10 lines display = None - logging.debug("[Fix_Services]**** checking") + logging.debug("[FixBRCMF]**** checking") # Look for pattern 1 if len(self.pattern.findall(last_lines)) >= 3: - logging.info("[Fix_Services]**** Should trigger a reload of the wlan0mon device:\n%s" % last_lines) + logging.info("[FixBRCMF]**** Should trigger a reload of the wlan0mon device:\n%s" % last_lines) if hasattr(agent, 'view'): display = agent.view() display.set('status', 'Blind-Bug detected. Restarting.') display.update(force=True) - logging.info('[Fix_Services] Blind-Bug detected. Restarting.') + logging.info('[FixBRCMF] Blind-Bug detected. Restarting.') try: self._tryTurningItOffAndOnAgain(agent) except Exception as err: - logging.warning("[Fix_Services] TTOAOA: %s" % repr(err)) + logging.warning("[FixBRCMF] TTOAOA: %s" % repr(err)) # Look for pattern 2 elif len(self.pattern2.findall(other_last_lines)) >= 5: @@ -141,12 +141,12 @@ class Fix_Services(plugins.Plugin): display = agent.view() display.set('status', 'Wifi channel stuck. Restarting recon.') display.update(force=True) - logging.info('[Fix_Services] Wifi channel stuck. Restarting recon.') + logging.info('[FixBRCMF] Wifi channel stuck. Restarting recon.') try: result = agent.run("wifi.recon off; wifi.recon on") if result["success"]: - logging.info("[Fix_Services] wifi.recon flip: success!") + logging.info("[FixBRCMF] wifi.recon flip: success!") if display: display.update(force=True, new_data={"status": "Wifi recon flipped!", "brcmfmac_status": self._status, @@ -154,14 +154,14 @@ class Fix_Services(plugins.Plugin): else: print("Wifi recon flipped\nthat was easy!") else: - logging.warning("[Fix_Services] wifi.recon flip: FAILED: %s" % repr(result)) + logging.warning("[FixBRCMF] wifi.recon flip: FAILED: %s" % repr(result)) except Exception as err: - logging.error("[Fix_Services wifi.recon flip] %s" % repr(err)) + logging.error("[FixBRCMF wifi.recon flip] %s" % repr(err)) # Look for pattern 3 elif len(self.pattern3.findall(other_other_last_lines)) >= 1: - logging.info("[Fix_Services] Firmware has halted or crashed. Restarting wlan0mon.") + logging.info("[FixBRCMF] Firmware has halted or crashed. Restarting wlan0mon.") if hasattr(agent, 'view'): display = agent.view() display.set('status', 'Firmware has halted or crashed. Restarting wlan0mon.') @@ -170,13 +170,13 @@ class Fix_Services(plugins.Plugin): # Run the monstart command to restart wlan0mon cmd_output = subprocess.check_output("monstart", shell=True) self._status = "up" - logging.info("[Fix_Services monstart]: %s" % repr(cmd_output)) + logging.info("[FixBRCMF monstart]: %s" % repr(cmd_output)) except Exception as err: - logging.error("[Fix_Services monstart]: %s" % repr(err)) + logging.error("[FixBRCMF monstart]: %s" % repr(err)) # Look for pattern 3 elif len(self.pattern3.findall(other_other_last_lines)) >= 1: - logging.info("[Fix_Services] wlan0 is down!") + logging.info("[FixBRCMF] wlan0 is down!") if hasattr(agent, 'view'): display = agent.view() display.set('status', 'Restarting wlan0 now!') @@ -185,9 +185,9 @@ class Fix_Services(plugins.Plugin): # Run the monstart command to restart wlan0mon cmd_output = subprocess.check_output("ifconfig wlan0 up && monstart", shell=True) self._status = "up" - logging.info("[Fix_Services monstart]: %s" % repr(cmd_output)) + logging.info("[FixBRCMF monstart]: %s" % repr(cmd_output)) except Exception as err: - logging.error("[Fix_Services monstart]: %s" % repr(err)) + logging.error("[FixBRCMF monstart]: %s" % repr(err)) else: print("logs look good") @@ -216,7 +216,7 @@ class Fix_Services(plugins.Plugin): # avoid overlapping restarts, but allow it if it's been a while # (in case the last attempt failed before resetting "isReloadingMon") if self.isReloadingMon and (time.time() - self.LASTTRY) < 180: - logging.info("[Fix_Services] Duplicate attempt ignored") + logging.info("[FixBRCMF] Duplicate attempt ignored") else: self.isReloadingMon = True self.LASTTRY = time.time() @@ -242,7 +242,7 @@ class Fix_Services(plugins.Plugin): # is it up? try: cmd_output = subprocess.check_output("ip link show wlan0mon", shell=True) - logging.info("[Fix_Services ip link show wlan0mon]: %s" % repr(cmd_output)) + logging.info("[FixBRCMF ip link show wlan0mon]: %s" % repr(cmd_output)) if ",UP," in str(cmd_output): logging.info("wlan0mon is up. Skip reset?") # not reliable, so don't skip just yet @@ -250,33 +250,33 @@ class Fix_Services(plugins.Plugin): # self.isReloadingMon = False # return except Exception as err: - logging.error("[Fix_Services ip link show wlan0mon]: %s" % repr(err)) + logging.error("[FixBRCMF ip link show wlan0mon]: %s" % repr(err)) try: result = connection.run("wifi.recon off") if "success" in result: - self.logPrintView("info", "[Fix_Services] wifi.recon off: %s!" % repr(result), + self.logPrintView("info", "[FixBRCMF] wifi.recon off: %s!" % repr(result), display, {"status": "Wifi recon paused!", "face": faces.COOL}) time.sleep(2) else: - self.logPrintView("warning", "[Fix_Services] wifi.recon off: FAILED: %s" % repr(result), + self.logPrintView("warning", "[FixBRCMF] wifi.recon off: FAILED: %s" % repr(result), display, {"status": "Recon was busted (probably)", "face": random.choice((faces.BROKEN, faces.DEBUG))}) except Exception as err: - logging.error("[Fix_Services wifi.recon off] error %s" % (repr(err))) + logging.error("[FixBRCMF wifi.recon off] error %s" % (repr(err))) - logging.info("[Fix_Services] recon paused. Now trying wlan0mon reload") + logging.info("[FixBRCMF] recon paused. Now trying wlan0mon reload") try: cmd_output = subprocess.check_output("monstop", shell=True) self._status = "dn" - self.logPrintView("info", "[Fix_Services] wlan0mon down and deleted: %s" % cmd_output, + self.logPrintView("info", "[FixBRCMF] wlan0mon down and deleted: %s" % cmd_output, display, {"status": "wlan0mon d-d-d-down!", "face": faces.BORED}) except Exception as nope: - logging.error("[Fix_Services delete wlan0mon] %s" % nope) + logging.error("[FixBRCMF delete wlan0mon] %s" % nope) pass - logging.debug("[Fix_Services] Now trying modprobe -r") + logging.debug("[FixBRCMF] Now trying modprobe -r") # Try this sequence 3 times until it is reloaded # @@ -287,7 +287,7 @@ class Fix_Services(plugins.Plugin): try: # unload the module cmd_output = subprocess.check_output("sudo modprobe -r brcmfmac", shell=True) - self.logPrintView("info", "[Fix_Services] unloaded brcmfmac", display, + self.logPrintView("info", "[FixBRCMF] unloaded brcmfmac", display, {"status": "Turning it off #%d" % tries, "face": faces.SMART}) self._status = "ul" time.sleep(1 + tries) @@ -307,41 +307,39 @@ class Fix_Services(plugins.Plugin): "monstart", shell=True) self.logPrintView("info", - "[Fix_Services interface add wlan0mon] worked #%d: %s" % ( - tries, cmd_output)) + "[FixBRCMF interface add wlan0mon] worked #%d: %s" % (tries, cmd_output)) self._status = "up" time.sleep(tries + 5) try: # 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("[FixBRCMF set wifi.interface wlan0mon] worked: %s" % repr(result)) self._status = "" self._count = self._count + 1 time.sleep(1) # stop looping and get back to recon break else: - logging.info( - "[Fix_Services set wifi.interfaceface wlan0mon] failed? %s" % repr(result)) + logging.info("[FixBRCMF set wifi.interfaceface wlan0mon] failed? %s" % repr(result)) except Exception as err: logging.info( - "[Fix_Services set wifi.interface wlan0mon] except: %s" % (repr(result), repr(err))) + "[FixBRCMF set wifi.interface wlan0mon] except: %s" % (repr(result), repr(err))) except Exception as cerr: # if not display: print("failed loading wlan0mon attempt #%d: %s" % (tries, repr(cerr))) except Exception as err: # from modprobe if not display: print("Failed reloading brcmfmac") - logging.error("[Fix_Services] Failed reloading brcmfmac %s" % repr(err)) + logging.error("[FixBRCMF] Failed reloading brcmfmac %s" % repr(err)) except Exception as nope: # from modprobe -r # fails if already unloaded, so probably fine - logging.error("[Fix_Services #%d modprobe -r] %s" % (tries, repr(nope))) - if not display: print("[Fix_Services #%d modprobe -r] %s" % (tries, repr(nope))) + logging.error("[FixBRCMF #%d modprobe -r] %s" % (tries, repr(nope))) + if not display: print("[FixBRCMF #%d modprobe -r] %s" % (tries, repr(nope))) pass tries = tries + 1 if tries < 3: - logging.info("[Fix_Services] wlan0mon didn't make it. trying again") + logging.info("[FixBRCMF] 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 @@ -352,14 +350,14 @@ class Fix_Services(plugins.Plugin): "face": faces.INTENSE}) else: print("And back on again...") - logging.info("[Fix_Services] wlan0mon back up") + logging.info("[FixBRCMF] wlan0mon back up") else: self.LASTTRY = time.time() time.sleep(8 + tries * 2) # give it a bit before restarting recon in bettercap self.isReloadingMon = False - logging.info("[Fix_Services] re-enable recon") + logging.info("[FixBRCMF] re-enable recon") try: result = connection.run("wifi.clear; wifi.recon on") @@ -371,15 +369,15 @@ class Fix_Services(plugins.Plugin): "face": faces.HAPPY}) else: print("I can see again") - logging.info("[Fix_Services] wifi.recon on %s" % repr(result)) + logging.info("[FixBRCMF] wifi.recon on %s" % repr(result)) 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("[FixBRCMF] wifi.recon did not start up: %s" % repr(result)) self.LASTTRY = time.time() - 300 # failed, so try again ASAP self.isReloadingMon = False except Exception as err: - logging.error("[Fix_Services wifi.recon on] %s" % repr(err)) + logging.error("[FixBRCMF wifi.recon on] %s" % repr(err)) # called to setup the ui elements def on_ui_setup(self, ui): @@ -405,16 +403,15 @@ class Fix_Services(plugins.Plugin): def on_unload(self, ui): try: ui.remove_element('brcmfmac_status') - logging.info("[Fix_Services] unloaded") + logging.info("[FixBRCMF] unloaded") except Exception as err: - logging.info("[Fix_Services] unload err %s " % repr(err)) + logging.info("[FixBRCMF] unload err %s " % repr(err)) pass - # run from command line to brute force a reload if __name__ == "__main__": print("Performing brcmfmac reload and restart wlan0mon in 5 seconds...") - fb = Fix_Services() + fb = Fix_BRCMF() data = {'Message': "kernel: brcmfmac: brcmf_cfg80211_nexmon_set_channel: Set Channel failed: chspec=1234"} event = {'data': data} @@ -424,5 +421,5 @@ if __name__ == "__main__": time.sleep(2) print("3 seconds") time.sleep(3) - fb.on_epoch(agent, event, None) - # fb._tryTurningItOffAndOnAgain(agent) + # fb.on_epoch(agent, event, None) + fb._tryTurningItOffAndOnAgain(agent) \ No newline at end of file