Added
Link Here
|
1 |
--- src/networkmonitor.py 2021-07-26 01:29:17.438831000 +0300 |
2 |
+++ src/networkmonitor.py 2021-07-26 02:10:01.817245000 +0300 |
3 |
@@ -6,8 +6,7 @@ |
4 |
import ipaddress |
5 |
|
6 |
import gi |
7 |
-gi.require_version('NM', '1.0') |
8 |
-from gi.repository import GLib, Gio, GObject, NM |
9 |
+from gi.repository import GLib, GObject |
10 |
|
11 |
import prefs |
12 |
import util |
13 |
@@ -32,34 +31,19 @@ |
14 |
def __init__(self): |
15 |
GObject.Object.__init__(self) |
16 |
logging.debug("Starting network monitor") |
17 |
- self.nm_client = None |
18 |
self.device = None |
19 |
- self.current_iface = None |
20 |
- self.online = False |
21 |
+ self.online = True |
22 |
|
23 |
- self.signals_connected = False |
24 |
self.details_idle_id = 0 |
25 |
|
26 |
- self.initing = True |
27 |
- self.gio_monitor = Gio.NetworkMonitor.get_default() |
28 |
- NM.Client.new_async(None, self.nm_client_acquired); |
29 |
+ self.reload_state() |
30 |
|
31 |
- def nm_client_acquired(self, source, res, data=None): |
32 |
- try: |
33 |
- self.nm_client = NM.Client.new_finish(res) |
34 |
- self.nm_client.connect("notify::connectivity", self.nm_client_connectivity_changed) |
35 |
- self.signals_connected = True |
36 |
- self.reload_state() |
37 |
+ prefs.prefs_settings.connect("changed", self.on_prefs_changed) |
38 |
|
39 |
- prefs.prefs_settings.connect("changed", self.on_prefs_changed) |
40 |
+ self.emit("ready") |
41 |
|
42 |
- self.initing = False |
43 |
- self.emit("ready") |
44 |
- except GLib.Error as e: |
45 |
- logging.critical("NetworkMonitor: Could not create NM Client: %s" % e.message) |
46 |
- |
47 |
def ready(self): |
48 |
- return self.nm_client != None |
49 |
+ return True |
50 |
|
51 |
def on_prefs_changed(self, settings, key, data=None): |
52 |
new_main_port = prefs.get_port() |
53 |
@@ -68,7 +52,7 @@ |
54 |
|
55 |
emit = False |
56 |
|
57 |
- if self.device == None or self.device.get_iface() != new_iface: |
58 |
+ if self.device != new_iface: |
59 |
self.reload_state() |
60 |
return |
61 |
|
62 |
@@ -83,100 +67,37 @@ |
63 |
self.emit_details_changed() |
64 |
|
65 |
def reload_state(self): |
66 |
- if self.nm_client == None: |
67 |
- return |
68 |
+ new_device = self.get_preferred_or_default_iface() |
69 |
|
70 |
- old_online = self.online |
71 |
- new_device = None |
72 |
- new_iface = self.get_preferred_or_default_iface() |
73 |
- |
74 |
- if new_iface: |
75 |
- new_device = self.nm_client.get_device_by_iface(new_iface) |
76 |
- |
77 |
need_restart = False |
78 |
|
79 |
- if new_device == None or new_iface == None: |
80 |
- self.device = None |
81 |
- self.current_iface = None |
82 |
- self.online = False |
83 |
- need_restart = True |
84 |
- elif new_device != self.device or new_iface != self.current_iface: |
85 |
+ if new_device == None or new_device != self.device: |
86 |
self.device = new_device |
87 |
- self.current_iface = new_iface |
88 |
need_restart = True |
89 |
|
90 |
- self.online = self.check_online() |
91 |
- |
92 |
- if old_online != self.online: |
93 |
- need_restart = True |
94 |
- |
95 |
self.main_port = prefs.get_port() |
96 |
self.auth_port = prefs.get_auth_port() |
97 |
|
98 |
- if self.initing: |
99 |
- return |
100 |
- |
101 |
if need_restart: |
102 |
self.emit_state_changed() |
103 |
logging.debug("Current network changed (%s), connectivity: %s" % (prefs.get_preferred_iface(), str(self.online))) |
104 |
|
105 |
- def check_online(self): |
106 |
- if self.device == None or self.current_iface == None: |
107 |
- return False |
108 |
- |
109 |
- try: |
110 |
- reqd_states = (NM.ConnectivityState.LIMITED, NM.ConnectivityState.FULL) |
111 |
- |
112 |
- return self.device.get_connectivity(GLib.SYSDEF_AF_INET) in reqd_states or \ |
113 |
- self.device.get_connectivity(GLib.SYSDEF_AF_INET6) in reqd_states |
114 |
- except AttributeError: |
115 |
- # libnm < 1.16 |
116 |
- conn = self.device.get_active_connection() |
117 |
- if conn: |
118 |
- config = conn.get_ip4_config() |
119 |
- if config: |
120 |
- gateway = config.get_gateway() |
121 |
- try: |
122 |
- connectable = Gio.NetworkAddress.parse(gateway, 53) |
123 |
- return self.gio_monitor.can_reach(connectable, None) |
124 |
- except Exception as e: |
125 |
- return False |
126 |
- |
127 |
- def nm_client_connectivity_changed(self, client, pspec, data=None): |
128 |
- logging.debug("NM client connectivity prop changed: %s" % client.props.connectivity) |
129 |
- self.reload_state() |
130 |
- |
131 |
def stop(self): |
132 |
logging.debug("Stopping network monitor") |
133 |
- try: |
134 |
- self.nm_client.disconnect_by_func(self.nm_client_connectivity_changed) |
135 |
- except: |
136 |
- pass |
137 |
|
138 |
- self.nm_client = None |
139 |
- |
140 |
- def get_interface_names(self): |
141 |
- names = [] |
142 |
- for device in self.nm_client.get_devices(): |
143 |
- names.append(device.get_ip_iface()) |
144 |
- |
145 |
- return names |
146 |
- |
147 |
def get_ips(self): |
148 |
return util.IPAddresses(self.get_ipv4(), self.get_ipv6()) |
149 |
|
150 |
def get_ipv4(self): |
151 |
if self.device != None: |
152 |
- con = self.device.get_active_connection() |
153 |
+ interface_addresses = netifaces.interfaces() |
154 |
+ if not self.device in netifaces.interfaces(): |
155 |
+ return None |
156 |
+ interface_addresses = netifaces.ifaddresses(self.device) |
157 |
+ if not netifaces.AF_INET in interface_addresses: |
158 |
+ return None |
159 |
+ return interface_addresses[netifaces.AF_INET][0]['addr'] |
160 |
|
161 |
- if con != None: |
162 |
- ip4c = con.get_ip4_config() |
163 |
- if ip4c != None: |
164 |
- addrs = ip4c.get_addresses() |
165 |
- |
166 |
- if addrs != []: |
167 |
- return addrs[0].get_address() |
168 |
- |
169 |
return "0.0.0.0" |
170 |
|
171 |
def get_ipv6(self): |
172 |
@@ -184,16 +105,14 @@ |
173 |
return None |
174 |
|
175 |
if self.device != None: |
176 |
- con = self.device.get_active_connection() |
177 |
+ interface_addresses = netifaces.interfaces() |
178 |
+ if not self.device in netifaces.interfaces(): |
179 |
+ return None |
180 |
+ interface_addresses = netifaces.ifaddresses(self.device) |
181 |
+ if not netifaces.AF_INET6 in interface_addresses: |
182 |
+ return None |
183 |
+ return interface_addresses[netifaces.AF_INET6][0]['addr'] |
184 |
|
185 |
- if con != None: |
186 |
- ip6c = con.get_ip6_config() |
187 |
- if ip6c != None: |
188 |
- addrs = ip6c.get_addresses() |
189 |
- |
190 |
- if addrs != []: |
191 |
- return addrs[0].get_address() |
192 |
- |
193 |
return None |
194 |
|
195 |
def get_preferred_or_default_iface(self): |
196 |
@@ -206,35 +125,34 @@ |
197 |
|
198 |
if iface != "auto": |
199 |
for dev in self.get_devices(): |
200 |
- if dev.get_iface() == iface: |
201 |
+ if dev == iface: |
202 |
return iface |
203 |
|
204 |
logging.warning("Preferred interface (%s) not available.") |
205 |
return None |
206 |
|
207 |
def get_current_iface(self): |
208 |
- return self.current_iface |
209 |
+ return self.device |
210 |
|
211 |
def get_default_interface(self): |
212 |
- con = self.nm_client.get_primary_connection() |
213 |
+ return self.get_devices()[0] |
214 |
|
215 |
- if con != None: |
216 |
- return con.get_devices()[0].get_iface() |
217 |
- |
218 |
- return None |
219 |
- |
220 |
def get_devices(self): |
221 |
devices = [] |
222 |
|
223 |
- for device in self.nm_client.get_devices(): |
224 |
- if device.get_device_type() in (NM.DeviceType.ETHERNET, NM.DeviceType.WIFI): |
225 |
+ for device in netifaces.interfaces(): |
226 |
+ if device == "lo0": |
227 |
+ continue |
228 |
+ addrs = netifaces.ifaddresses(device) |
229 |
+ if netifaces.AF_LINK not in addrs: |
230 |
+ continue |
231 |
+ if netifaces.AF_INET in addrs or netifaces.AF_INET6 in addrs: |
232 |
devices.append(device) |
233 |
|
234 |
return devices |
235 |
|
236 |
- # TODO: Do this with libnm |
237 |
def same_subnet(self, other_ips): |
238 |
- net = netifaces.ifaddresses(self.device.get_ip_iface()) |
239 |
+ net = netifaces.ifaddresses(self.device) |
240 |
|
241 |
addresses = net[netifaces.AF_INET] |
242 |
for address in addresses: |
243 |
@@ -265,7 +183,7 @@ |
244 |
def emit_details_changed(self): |
245 |
def cb(data=None): |
246 |
if self.device != None: |
247 |
- iface = self.device.get_iface() |
248 |
+ iface = self.device |
249 |
else: |
250 |
iface = "none" |
251 |
|