Skip to content

Commit 4077b09

Browse files
committed
q-dev: fix event handling
1 parent 8772108 commit 4077b09

File tree

2 files changed

+29
-11
lines changed

2 files changed

+29
-11
lines changed

qubesadmin/device_protocol.py

+14-6
Original file line numberDiff line numberDiff line change
@@ -288,12 +288,17 @@ def from_qarg(
288288
if blind:
289289
get_domain = domains.get_blind
290290
else:
291-
get_domain = domains.get
291+
get_domain = domains.__getitem__
292292
return cls._parse(representation, devclass, get_domain, '+')
293293

294294
@classmethod
295-
def from_str(cls, representation: str, devclass, domains) -> 'Port':
296-
get_domain = domains.get
295+
def from_str(
296+
cls, representation: str, devclass, domains, blind=False
297+
) -> 'Port':
298+
if blind:
299+
get_domain = domains.get_blind
300+
else:
301+
get_domain = domains.__getitem__
297302
return cls._parse(representation, devclass, get_domain, ':')
298303

299304
@classmethod
@@ -450,18 +455,21 @@ def from_qarg(
450455
if blind:
451456
get_domain = domains.get_blind
452457
else:
453-
get_domain = domains.get
458+
get_domain = domains.__getitem__
454459
else:
455460
get_domain = None
456461
return cls._parse(representation, devclass, get_domain, backend, '+')
457462

458463
@classmethod
459464
def from_str(
460465
cls, representation: str, devclass: Optional[str], domains,
461-
backend=None
466+
blind=False, backend=None
462467
) -> 'Device':
463468
if backend is None:
464-
get_domain = domains.get
469+
if blind:
470+
get_domain = domains.get_blind
471+
else:
472+
get_domain = domains.__getitem__
465473
else:
466474
get_domain = None
467475
return cls._parse(representation, devclass, get_domain, backend, ':')

qubesadmin/events/__init__.py

+15-5
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
import qubesadmin.config
2828
import qubesadmin.exc
29+
from qubesadmin.device_protocol import Device, Port
2930

3031

3132
class EventsDispatcher(object):
@@ -229,12 +230,21 @@ def handle(self, subject, event, **kwargs):
229230
self.app.domains.clear_cache(invalidate_name=str(vm))
230231
subject = None
231232
# deserialize known attributes
232-
if event.startswith('device-') and 'device' in kwargs:
233+
if event.startswith('device-'):
233234
try:
234-
devclass = event.split(':', 1)[1]
235-
backend_domain, port_id = kwargs['device'].split(':', 1)
236-
kwargs['device'] = self.app.domains.get_blind(backend_domain)\
237-
.devices[devclass][port_id]
235+
if 'device' in kwargs:
236+
devclass = event.split(':', 1)[1]
237+
device = Device.from_str(
238+
kwargs['device'],
239+
devclass,
240+
self.app.domains,
241+
blind=True)
242+
kwargs['device'] = self.app.domains.get_blind(
243+
device.backend_domain).devices[devclass][device.port_id]
244+
if 'port' in kwargs:
245+
devclass = event.split(':', 1)[1]
246+
kwargs['port'] = Port.from_str(
247+
kwargs['port'], devclass, self.app.domains, blind=True)
238248
except (KeyError, ValueError):
239249
pass
240250
# invalidate cache if needed; call it before other handlers

0 commit comments

Comments
 (0)