From 6b4833d9881a61b41b8a627569fae5ae082743e5 Mon Sep 17 00:00:00 2001
From: j1nx
Date: Fri, 27 May 2022 20:08:11 +0200
Subject: [PATCH] Switch balena phal skill over to general wifi phal plugin
---
.../0001-Adapt-and-port-to-wifi-plugin.patch | 280 ++++++++++++++++++
1 file changed, 280 insertions(+)
create mode 100644 buildroot-external/package/python-ovos-phal-plugin-balena-wifi/0001-Adapt-and-port-to-wifi-plugin.patch
diff --git a/buildroot-external/package/python-ovos-phal-plugin-balena-wifi/0001-Adapt-and-port-to-wifi-plugin.patch b/buildroot-external/package/python-ovos-phal-plugin-balena-wifi/0001-Adapt-and-port-to-wifi-plugin.patch
new file mode 100644
index 00000000..87c73777
--- /dev/null
+++ b/buildroot-external/package/python-ovos-phal-plugin-balena-wifi/0001-Adapt-and-port-to-wifi-plugin.patch
@@ -0,0 +1,280 @@
+From 6b34ebccc767f33d060ed40b5c46ebb4ee34ca2f Mon Sep 17 00:00:00 2001
+From: Aditya Mehra
+Date: Fri, 27 May 2022 18:12:21 +0930
+Subject: [PATCH] Adapt and port to wifi plugin
+
+---
+ ovos_PHAL_plugin_balena_wifi/__init__.py | 197 +++++++++++------------
+ 1 file changed, 91 insertions(+), 106 deletions(-)
+
+diff --git a/ovos_PHAL_plugin_balena_wifi/__init__.py b/ovos_PHAL_plugin_balena_wifi/__init__.py
+index 0a0f64d..8f80c0d 100644
+--- a/ovos_PHAL_plugin_balena_wifi/__init__.py
++++ b/ovos_PHAL_plugin_balena_wifi/__init__.py
+@@ -1,102 +1,98 @@
+-from os.path import join, dirname
++import random
++from os.path import dirname, join
++from time import sleep
+
+ import pexpect
+-import random
+-import subprocess
+ from mycroft_bus_client.message import Message, dig_for_message
+ from ovos_plugin_manager.phal import PHALPlugin
+-from ovos_utils import create_daemon
+-from ovos_utils.enclosure.api import EnclosureAPI
+ from ovos_utils.gui import GUIInterface
+ from ovos_utils.log import LOG
+-from ovos_utils.network_utils import is_connected
+-from time import sleep
+
+
+ class BalenaWifiSetupPlugin(PHALPlugin):
+ def __init__(self, bus=None, config=None):
+ super().__init__(bus=bus, name="ovos-PHAL-plugin-balena-wifi", config=config)
+- self.monitoring = False
++ self.gui = GUIInterface(bus=self.bus, skill_id=self.name)
++ self.client_active = False
++ self.client_id = None
++ self.registered = False
+ self.in_setup = False
+- self.connected = False
++
+ self.wifi_process = None
+- self.debug = False # dev setting, VERY VERBOSE DIALOGS
++ self.debug = True # dev setting, VERY VERBOSE DIALOGS
+ self.ssid = "OVOS"
+ self.pswd = None
+- self.grace_period = 45
+- self.time_between_checks = 30 # seconds
+- self.mycroft_ready = False
+ self.wifi_command = "sudo /usr/local/sbin/wifi-connect --portal-ssid {ssid}"
+ if self.pswd:
+ self.wifi_command += " --portal-passphrase {pswd}"
+ self.color = "#FF0000"
+- self.stop_on_internet = False
+- self.timeout_after_internet = 90
+-
+- self.bus.on("mycroft.internet.connected", self.handle_internet_connected)
+-
+- self.enclosure = EnclosureAPI(bus=self.bus, skill_id=self.name)
+- self.gui = GUIInterface(bus=self.bus, skill_id=self.name)
+- self.start_internet_check()
+-
+- # internet watchdog
+- def start_internet_check(self):
+- create_daemon(self._watchdog)
+-
+- def stop_internet_check(self):
+- self.monitoring = False
+-
+- def _watchdog(self):
+- try:
+- self.monitoring = True
+- LOG.info("Wifi watchdog started")
+- output = subprocess.check_output("nmcli connection show",
+- shell=True).decode("utf-8")
+- if "wifi" in output:
+- LOG.info("Detected previously configured wifi, starting "
+- "grace period to allow it to connect")
+- sleep(self.grace_period)
+- while self.monitoring:
+- if self.in_setup:
+- sleep(1) # let setup do it's thing
+- continue
+-
+- if not is_connected():
+- LOG.info("NO INTERNET")
+- if not self.is_connected_to_wifi():
+- LOG.info("LAUNCH SETUP")
+- try:
+- self.launch_wifi_setup() # blocking
+- except Exception as e:
+- LOG.exception(e)
+- else:
+- LOG.warning("CONNECTED TO WIFI, BUT NO INTERNET!!")
+-
+- sleep(self.time_between_checks)
+- except Exception as e:
+- LOG.error("Wifi watchdog crashed unexpectedly")
+- LOG.exception(e)
+-
+- # wifi setup
+- @staticmethod
+- def get_wifi_ssid():
+- SSID = None
+- try:
+- SSID = subprocess.check_output(["iwgetid", "-r"]).strip()
+- except subprocess.CalledProcessError:
+- # If there is no connection subprocess throws a 'CalledProcessError'
+- pass
+- return SSID
+-
+- @staticmethod
+- def is_connected_to_wifi():
+- return BalenaWifiSetupPlugin.get_wifi_ssid() is not None
+-
+- def launch_wifi_setup(self):
+- if not self.in_setup:
+- self.bus.emit(Message("ovos.wifi.setup.started"))
+- self.stop_setup()
++
++ # WIFI Plugin Registeration and Activation Specific Events
++ self.bus.on("ovos.phal.wifi.plugin.stop.setup.event", self.handle_stop_setup)
++ self.bus.on("ovos.phal.wifi.plugin.client.registered", self.handle_registered)
++ self.bus.on("ovos.phal.wifi.plugin.client.deregistered", self.handle_deregistered)
++ self.bus.on("ovos.phal.wifi.plugin.client.registration.failure", self.handle_registration_failure)
++
++ # Try Register the Client with WIFI Plugin on Startup
++ self.register_client()
++
++ # Wifi Plugin Registeration Handling
++ def register_client(self):
++ self.bus.emit(Message("ovos.phal.wifi.plugin.register.client", {
++ "client": self.name,
++ "type": "Remote",
++ "display_text": "On Mobile Setup",
++ "has_gui": True,
++ "requires_input": False
++ }))
++
++ def handle_registered(self, message=None):
++ get_client = message.data.get("client", "")
++ if get_client == self.name:
++ get_id = message.data.get("id", "")
++ self.client_id = get_id
++ self.registered = True
++ self.bus.on(f"ovos.phal.wifi.plugin.activate.{self.client_id}", self.handle_activate_client_request)
++ self.bus.on(f"ovos.phal.wifi.plugin.deactivate.{self.client_id}", self.handle_deactivate_client_request)
++ LOG.info(f"Client Registered with WIFI Plugin: {self.client_id}")
++
++ def handle_deregistered(self, message=None):
++ self.registered = False
++ self.bus.remove(f"ovos.phal.wifi.plugin.activate.{self.client_id}", self.handle_active_client_request)
++ self.bus.remove(f"ovos.phal.wifi.plugin.deactivate.{self.client_id}", self.handle_deactivate_client_request)
++ self.client_id = None
++
++ def handle_registration_failure(self, message=None):
++ if not self.registered:
++ error = message.data.get("error", "")
++ LOG.info(f"Registration Failure: {error}")
++ # Try to Register the Client with WIFI Plugin Again
++ self.register_client()
++
++ def handle_activate_client_request(self, message=None):
++ LOG.info("Balena Wifi Plugin Activated")
++ self.client_active = True
++ self.display_network_setup()
++
++ def handle_deactivate_client_request(self, message=None):
++ LOG.info("Balena Wifi Plugin Deactivated")
++ self.cleanup_wifi_process()
++ self.client_active = False
++ self.gui.release()
++
++ def request_deactivate(self, message=None):
++ self.bus.emit(Message("ovos.phal.wifi.plugin.remove.active.client", {
++ "client": "ovos-PHAL-plugin-balena-wifi"}))
++ LOG.info("Balena Wifi Plugin Deactivation Requested")
++
++ def display_network_setup(self):
++ LOG.info("Balena Wifi In Network Setup")
++ if self.in_setup:
++ # Always start with a clean slate
++ self.cleanup_wifi_process()
++
+ self.in_setup = True
++
+ self.wifi_process = pexpect.spawn(
+ self.wifi_command.format(ssid=self.ssid)
+ )
+@@ -180,24 +176,16 @@ def launch_wifi_setup(self):
+ except Exception as e:
+ LOG.exception(e)
+ break
+- self.stop_setup()
++ self.handle_stop_setup()
++
+ if restart:
+ # handle bugs in balena, sometimes it fails to come back up
+ # seems to happen on
+ # Error: Getting access points failed
+- self.launch_wifi_setup()
++ self.display_network_setup()
+ elif self.debug:
+ self.speak_dialog("debug_end_setup")
+
+- # bus events
+- def handle_internet_connected(self, message=None):
+- """System came online later after booting."""
+- self.enclosure.mouth_reset()
+- # sync clock as soon as we have internet
+- self.bus.emit(Message("system.ntp.sync"))
+- self.stop_setup() # just in case
+- self.gui.release()
+-
+ # GUI events
+ def prompt_to_join_ap(self, message=None):
+ """Provide instructions for setting up wifi."""
+@@ -215,18 +203,11 @@ def prompt_to_select_network(self, message=None):
+
+ def report_setup_complete(self, message=None):
+ """Wifi setup complete, network is connected."""
+- # once first connected to internet increase time between checks
+- self.connected = True
+- self.time_between_checks = self.timeout_after_internet
+- # stop watchdog on internet connection
+- if self.stop_on_internet:
+- self.monitoring = False
+ self.manage_setup_display("setup-completed", "status")
+ # allow GUI to linger around for a bit, will block the wifi setup loop
+ sleep(5)
+- self.bus.emit(Message("ovos.wifi.setup.completed"))
+- # pairing skill should take over now
+- self.gui.release()
++ self.client_active = False
++ self.request_deactivate()
+
+ def report_setup_failed(self, message=None):
+ """Wifi setup failed"""
+@@ -234,6 +215,8 @@ def report_setup_failed(self, message=None):
+ self.speak_dialog("debug_wifi_error")
+ # allow GUI to linger around for a bit, will block the wifi setup loop
+ sleep(2)
++ self.in_setup = False
++ self.display_network_setup()
+
+ def manage_setup_display(self, state, page_type):
+ self.gui.clear()
+@@ -268,7 +251,8 @@ def manage_setup_display(self, state, page_type):
+ self.gui.show_page(page, override_animations=True)
+
+ # cleanup
+- def stop_setup(self):
++ def cleanup_wifi_process(self):
++ self.in_setup = False
+ if self.wifi_process is not None:
+ try:
+ if self.wifi_process.isalive():
+@@ -289,13 +273,14 @@ def stop_setup(self):
+ LOG.debug('wifi setup exited gracefully.')
+ except Exception as e:
+ LOG.exception(e)
+- self.wifi_process = None
+- self.in_setup = False
+-
++ else:
++ return
++
++ def handle_stop_setup(self, message=None):
++ self.request_deactivate()
++
+ def shutdown(self):
+- self.monitoring = False
+- self.bus.remove("mycroft.internet.connected", self.handle_internet_connected)
+- self.stop_setup()
++ self.handle_stop_setup()
+ super().shutdown()
+
+ # speech