From e403ec4b3e0ae94c703723d328c20e862924fc58 Mon Sep 17 00:00:00 2001 From: Lee Richardson Date: Wed, 24 Aug 2022 17:01:26 -0400 Subject: [PATCH 1/5] System now resumes from sleep on guardian page --- .../components/guardian_home_component.py | 16 +++++++++---- .../key_ceremony_details_component.py | 23 ++++++++++++------- src/electionguard_gui/main_app.py | 13 ++++++++++- .../guardian/guardian-home-component.js | 14 +++++++++++ 4 files changed, 53 insertions(+), 13 deletions(-) diff --git a/src/electionguard_gui/components/guardian_home_component.py b/src/electionguard_gui/components/guardian_home_component.py index ab8746877..23d8bd03e 100644 --- a/src/electionguard_gui/components/guardian_home_component.py +++ b/src/electionguard_gui/components/guardian_home_component.py @@ -49,10 +49,18 @@ def get_key_ceremonies(self) -> dict[str, Any]: return eel_success(js_key_ceremonies) def watch_db_collections(self) -> None: - self._log.debug("Watching database") - db = self._db_service.get_db() - self._db_watcher_service.watch_database(db, None, notify_ui_db_changed) - self._log.debug("exited watching database") + try: + self._log.debug("Watching database") + db = self._db_service.get_db() + self._db_watcher_service.watch_database(db, None, notify_ui_db_changed) + self._log.debug("exited watching database") + except KeyboardInterrupt: + self._log.debug("Keyboard interrupt, exiting watch database") + self._db_watcher_service.stop_watching() + except Exception as e: # pylint: disable=broad-except + self.handle_error(e) + self._db_watcher_service.stop_watching() + # no need to raise exception or return anything, we're in fire-and-forget mode here def stop_watching_db_collections(self) -> None: self._log.debug("Stopping watch database") diff --git a/src/electionguard_gui/components/key_ceremony_details_component.py b/src/electionguard_gui/components/key_ceremony_details_component.py index a9befd9f1..368eb5c94 100644 --- a/src/electionguard_gui/components/key_ceremony_details_component.py +++ b/src/electionguard_gui/components/key_ceremony_details_component.py @@ -70,14 +70,21 @@ def expose(self) -> None: eel.expose(self.stop_watching_key_ceremony) def watch_key_ceremony(self, key_ceremony_id: str) -> None: - db = self._db_service.get_db() - # retrieve and send the key ceremony to the client - self.on_key_ceremony_changed("key_ceremonies", key_ceremony_id) - self._log.debug(f"watching key ceremony '{key_ceremony_id}'") - # start watching for key ceremony changes from guardians - self._db_watcher_service.watch_database( - db, key_ceremony_id, self.on_key_ceremony_changed - ) + try: + db = self._db_service.get_db() + # retrieve and send the key ceremony to the client + self.on_key_ceremony_changed("key_ceremonies", key_ceremony_id) + self._log.debug(f"watching key ceremony '{key_ceremony_id}'") + # start watching for key ceremony changes from guardians + self._db_watcher_service.watch_database( + db, key_ceremony_id, self.on_key_ceremony_changed + ) + except KeyboardInterrupt: + self._log.debug("Keyboard interrupt, exiting watch database") + self._db_watcher_service.stop_watching() + except Exception as e: # pylint: disable=broad-except + self.handle_error(e) + # we're in a fire-and-forget scenario, so no need to raise an exception or return anything def stop_watching_key_ceremony(self) -> None: self._db_watcher_service.stop_watching() diff --git a/src/electionguard_gui/main_app.py b/src/electionguard_gui/main_app.py index 80bef36f3..05b1a98fa 100644 --- a/src/electionguard_gui/main_app.py +++ b/src/electionguard_gui/main_app.py @@ -101,8 +101,19 @@ def start(self) -> None: port = self.config_service.get_port() host = self.config_service.get_host() self.log_service.debug(f"Starting eel port={port} mode={mode} host={host}") - eel.start("index.html", size=(1024, 768), port=port, mode=mode, host=host) + eel.start( + "index.html", + size=(1024, 768), + port=port, + mode=mode, + host=host, + close_callback=self.on_close, + ) + self.log_service.info("Exiting main app normally") except Exception as e: self.log_service.error("error in main app start", e) traceback.print_exc() raise e + + def on_close(self, _page: str, _open_sockets: list) -> None: + self.log_service.info(f"To close the egui app hit Ctrl+C") diff --git a/src/electionguard_gui/web/components/guardian/guardian-home-component.js b/src/electionguard_gui/web/components/guardian/guardian-home-component.js index 5b226d7a2..023637fa3 100644 --- a/src/electionguard_gui/web/components/guardian/guardian-home-component.js +++ b/src/electionguard_gui/web/components/guardian/guardian-home-component.js @@ -2,6 +2,8 @@ import KeyCeremonyList from "../shared/key-ceremony-list-component.js"; import DecryptionList from "./decryption-list-component.js"; import Spinner from "../shared/spinner-component.js"; +const sleepResumeInterval = 2000; + export default { components: { KeyCeremonyList, @@ -13,6 +15,7 @@ export default { loading: true, decryptions: [], keyCeremonies: [], + lastAwakeTime: new Date().getTime(), }; }, methods: { @@ -38,8 +41,18 @@ export default { console.error(result.error); } }, + sleepResumeChecker: function () { + var currentTime = new Date().getTime(); + if (currentTime > this.lastAwakeTime + sleepResumeInterval * 2) { + console.log("system appears to have returned from sleep, refreshing"); + document.location.reload(true); + } + this.lastAwakeTime = currentTime; + }, }, async mounted() { + console.log("start sleepResumeChecker"); + setInterval(this.sleepResumeChecker, sleepResumeInterval); eel.expose(this.keyCeremoniesChanged, "key_ceremonies_changed"); eel.expose(this.decryptionsChanged, "decryptions_changed"); console.log("begin watching for key ceremonies"); @@ -51,6 +64,7 @@ export default { unmounted() { console.log("stop watching key ceremonies"); eel.stop_watching_db_collections(); + clearInterval(this.sleepResumeChecker); }, template: /*html*/ `
From bb5679f9b37dcd132fd3dcf8f33561db02ae6be8 Mon Sep 17 00:00:00 2001 From: Lee Richardson Date: Wed, 24 Aug 2022 17:25:27 -0400 Subject: [PATCH 2/5] fix linting --- src/electionguard_gui/main_app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/electionguard_gui/main_app.py b/src/electionguard_gui/main_app.py index 05b1a98fa..70ecbdfce 100644 --- a/src/electionguard_gui/main_app.py +++ b/src/electionguard_gui/main_app.py @@ -116,4 +116,4 @@ def start(self) -> None: raise e def on_close(self, _page: str, _open_sockets: list) -> None: - self.log_service.info(f"To close the egui app hit Ctrl+C") + self.log_service.info("To close the egui app hit Ctrl+C") From 03edae9b56552371c25d81a0050334580ccbc28c Mon Sep 17 00:00:00 2001 From: Lee Richardson Date: Wed, 24 Aug 2022 17:36:02 -0400 Subject: [PATCH 3/5] Refresh button --- .../guardian/guardian-home-component.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/electionguard_gui/web/components/guardian/guardian-home-component.js b/src/electionguard_gui/web/components/guardian/guardian-home-component.js index 023637fa3..5b0e891b2 100644 --- a/src/electionguard_gui/web/components/guardian/guardian-home-component.js +++ b/src/electionguard_gui/web/components/guardian/guardian-home-component.js @@ -19,6 +19,14 @@ export default { }; }, methods: { + refresh: async function () { + this.loading = true; + this.decryptions = []; + this.keyCeremonies = []; + await this.refreshDecryptions(); + await this.refreshKeyCeremonies(); + this.loading = false; + }, keyCeremoniesChanged: async function () { await this.refreshKeyCeremonies(); }, @@ -68,7 +76,14 @@ export default { }, template: /*html*/ `
-

Guardian Home

+
+
+

Guardian Home

+
+
+ +
+
From ca8f86db847f824596139719781b1cc9f1340172 Mon Sep 17 00:00:00 2001 From: Lee Richardson Date: Wed, 24 Aug 2022 17:45:41 -0400 Subject: [PATCH 4/5] minor fixups per PR --- .../components/key_ceremony_details_component.py | 1 + .../components/guardian/guardian-home-component.js | 14 ++++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/electionguard_gui/components/key_ceremony_details_component.py b/src/electionguard_gui/components/key_ceremony_details_component.py index 368eb5c94..59c270581 100644 --- a/src/electionguard_gui/components/key_ceremony_details_component.py +++ b/src/electionguard_gui/components/key_ceremony_details_component.py @@ -84,6 +84,7 @@ def watch_key_ceremony(self, key_ceremony_id: str) -> None: self._db_watcher_service.stop_watching() except Exception as e: # pylint: disable=broad-except self.handle_error(e) + self._db_watcher_service.stop_watching() # we're in a fire-and-forget scenario, so no need to raise an exception or return anything def stop_watching_key_ceremony(self) -> None: diff --git a/src/electionguard_gui/web/components/guardian/guardian-home-component.js b/src/electionguard_gui/web/components/guardian/guardian-home-component.js index 5b0e891b2..54a5e457d 100644 --- a/src/electionguard_gui/web/components/guardian/guardian-home-component.js +++ b/src/electionguard_gui/web/components/guardian/guardian-home-component.js @@ -21,11 +21,14 @@ export default { methods: { refresh: async function () { this.loading = true; - this.decryptions = []; - this.keyCeremonies = []; - await this.refreshDecryptions(); - await this.refreshKeyCeremonies(); - this.loading = false; + try { + this.decryptions = []; + this.keyCeremonies = []; + await this.refreshDecryptions(); + await this.refreshKeyCeremonies(); + } finally { + this.loading = false; + } }, keyCeremoniesChanged: async function () { await this.refreshKeyCeremonies(); @@ -59,7 +62,6 @@ export default { }, }, async mounted() { - console.log("start sleepResumeChecker"); setInterval(this.sleepResumeChecker, sleepResumeInterval); eel.expose(this.keyCeremoniesChanged, "key_ceremonies_changed"); eel.expose(this.decryptionsChanged, "decryptions_changed"); From f39c5bc82b5aa0bb7fdc1ed6c6b402c484fc0f0d Mon Sep 17 00:00:00 2001 From: Lee Richardson Date: Thu, 25 Aug 2022 18:12:15 -0400 Subject: [PATCH 5/5] Better description --- src/electionguard_gui/main_app.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/electionguard_gui/main_app.py b/src/electionguard_gui/main_app.py index 70ecbdfce..0482c75f3 100644 --- a/src/electionguard_gui/main_app.py +++ b/src/electionguard_gui/main_app.py @@ -116,4 +116,6 @@ def start(self) -> None: raise e def on_close(self, _page: str, _open_sockets: list) -> None: - self.log_service.info("To close the egui app hit Ctrl+C") + self.log_service.info( + "To close the egui app ensure the browser tab is closed and hit Ctrl+C" + )