Skip to content

Commit 51d2106

Browse files
committed
fix: connectivity check
Signed-off-by: Brian Ketelsen <bketelsen@gmail.com>
1 parent 2eeebb3 commit 51d2106

File tree

1 file changed

+61
-10
lines changed

1 file changed

+61
-10
lines changed

snow_first_setup/views/conn_check.py

Lines changed: 61 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424

2525
logger = logging.getLogger("FirstSetup::Conn_Check")
2626

27+
# Host to test actual internet connectivity
28+
CONNECTIVITY_CHECK_HOST = "gnome.org"
29+
2730

2831
@Gtk.Template(resource_path="/org/frostyard/FirstSetup/gtk/conn-check.ui")
2932
class VanillaConnCheck(Adw.Bin):
@@ -35,18 +38,21 @@ class VanillaConnCheck(Adw.Bin):
3538
__network_monitor = None
3639
__active = False
3740
__already_skipped = False
41+
__checking = False
3842

3943
def __init__(self, window, **kwargs):
4044
super().__init__(**kwargs)
4145
self.__window = window
4246

4347
self.__network_monitor = Gio.NetworkMonitor.get_default()
4448

45-
self.__network_monitor.connect("network-changed", self.__check_network_status)
49+
self.__network_monitor.connect("network-changed", self.__on_network_changed)
4650
self.btn_settings.connect("clicked", self.__on_btn_settings_clicked)
4751

4852
def set_page_active(self):
4953
self.__active = True
54+
# Disable next button until we verify connectivity
55+
self.__window.set_ready(False)
5056
self.__check_network_status()
5157

5258
def set_page_inactive(self):
@@ -55,26 +61,71 @@ def set_page_inactive(self):
5561
def finish(self):
5662
return True
5763

58-
def __check_network_status(self, *args):
64+
def __on_network_changed(self, monitor, network_available):
65+
"""Called when network state changes."""
5966
if not self.__active:
6067
return
68+
# Disable next button immediately and recheck
69+
GLib.idle_add(self.__window.set_ready, False)
70+
self.__check_network_status()
71+
72+
def __check_network_status(self):
73+
"""Check actual internet connectivity asynchronously."""
74+
if self.__checking:
75+
return
76+
self.__checking = True
6177

62-
if self.__network_monitor.get_connectivity() == Gio.NetworkConnectivity.FULL:
63-
self.__set_network_connected()
64-
self.__window.set_ready(True)
65-
else:
66-
self.__set_network_disconnected()
67-
self.__window.set_ready(False)
78+
# First do a quick check - if no network route at all, fail fast
79+
if self.__network_monitor.get_connectivity() == Gio.NetworkConnectivity.LOCAL:
80+
self.__checking = False
81+
GLib.idle_add(self.__set_network_disconnected)
82+
GLib.idle_add(self.__window.set_ready, False)
83+
return
84+
85+
# Do actual reachability test in background
86+
thread = threading.Thread(target=self.__do_connectivity_check)
87+
thread.daemon = True
88+
thread.start()
89+
90+
def __do_connectivity_check(self):
91+
"""Perform actual connectivity test to verify internet access."""
92+
try:
93+
address = Gio.NetworkAddress.new(CONNECTIVITY_CHECK_HOST, 443)
94+
can_reach = self.__network_monitor.can_reach(address, None)
95+
96+
if can_reach:
97+
GLib.idle_add(self.__handle_connected)
98+
else:
99+
GLib.idle_add(self.__handle_disconnected)
100+
except Exception as e:
101+
logger.warning(f"Connectivity check failed: {e}")
102+
GLib.idle_add(self.__handle_disconnected)
103+
finally:
104+
self.__checking = False
105+
106+
def __handle_connected(self):
107+
"""Handle successful connectivity check."""
108+
if not self.__active:
109+
return
110+
self.__set_network_connected()
111+
self.__window.set_ready(True)
112+
113+
def __handle_disconnected(self):
114+
"""Handle failed connectivity check."""
115+
if not self.__active:
116+
return
117+
self.__set_network_disconnected()
118+
self.__window.set_ready(False)
68119

69120
def __set_network_disconnected(self):
70-
logger.info("Internet connection available.")
121+
logger.info("Internet connection not available.")
71122
self.status_page.set_icon_name("network-wired-disconnected-symbolic")
72123
self.status_page.set_title(_("No Internet Connection!"))
73124
self.status_page.set_description(_("First Setup requires an active internet connection"))
74125
self.btn_settings.set_visible(True)
75126

76127
def __set_network_connected(self):
77-
logger.info("Internet connection not avaiable.")
128+
logger.info("Internet connection available.")
78129
self.status_page.set_icon_name("emblem-default-symbolic")
79130
self.status_page.set_title(_("Connection available"))
80131
self.status_page.set_description(_("You have a working internet connection"))

0 commit comments

Comments
 (0)