Skip to content

Commit e09010e

Browse files
committed
q-dev: backend_name
1 parent efb572e commit e09010e

File tree

3 files changed

+42
-19
lines changed

3 files changed

+42
-19
lines changed

qubes/api/admin.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -1321,12 +1321,15 @@ async def vm_device_assign(self, endpoint, untrusted_payload):
13211321
await self.dest.devices[devclass].assign(assignment)
13221322
self.app.save()
13231323

1324-
def load_device_info(self, devclass) -> DeviceInfo:
1324+
def load_device_info(self, devclass) -> VirtualDevice:
13251325
# qrexec already verified that no strange characters are in self.arg
13261326
_dev = VirtualDevice.from_qarg(self.arg, devclass, self.app.domains)
13271327
# load all info, may raise KeyError, either on domain or port_id
1328-
return self.app.domains[
1329-
_dev.backend_domain].devices[devclass][_dev.port_id]
1328+
try:
1329+
return self.app.domains[
1330+
_dev.backend_domain].devices[devclass][_dev.port_id]
1331+
except KeyError:
1332+
return _dev
13301333

13311334
# Assign/Unassign action can modify only persistent state of running VM.
13321335
# For this reason, write=True

qubes/device_protocol.py

+31-13
Original file line numberDiff line numberDiff line change
@@ -238,29 +238,35 @@ def __init__(self, backend_domain, port_id, devclass):
238238
self.__devclass = devclass
239239

240240
def __hash__(self):
241-
return hash((self.backend_domain.name, self.port_id, self.devclass))
241+
return hash((self.backend_name, self.port_id, self.devclass))
242242

243243
def __eq__(self, other):
244244
if isinstance(other, Port):
245245
return (
246-
self.backend_domain == other.backend_domain and
247-
self.port_id == other.port_id and
248-
self.devclass == other.devclass
246+
self.backend_name == other.backend_name and
247+
self.port_id == other.port_id and
248+
self.devclass == other.devclass
249249
)
250250
return False
251251

252252
def __lt__(self, other):
253253
if isinstance(other, Port):
254-
return (self.backend_domain.name, self.devclass, self.port_id) < \
255-
(other.backend_domain.name, other.devclass, other.port_id)
254+
return (self.backend_name, self.devclass, self.port_id) < \
255+
(self.backend_name, other.devclass, other.port_id)
256256
raise TypeError(f"Comparing instances of 'Port' and '{type(other)}' "
257257
"is not supported")
258258

259259
def __repr__(self):
260-
return f"{self.backend_domain.name}+{self.port_id}"
260+
return f"{self.backend_name}+{self.port_id}"
261261

262262
def __str__(self):
263-
return f"{self.backend_domain.name}:{self.port_id}"
263+
return f"{self.backend_name}:{self.port_id}"
264+
265+
@property
266+
def backend_name(self) -> str:
267+
if self.backend_domain is not None:
268+
return self.backend_domain.name
269+
return "*"
264270

265271
@classmethod
266272
def from_qarg(
@@ -304,7 +310,7 @@ def port_id(self) -> str:
304310
return self.__port_id
305311

306312
@property
307-
def backend_domain(self) -> QubesVM:
313+
def backend_domain(self) -> Optional[QubesVM]:
308314
""" Which domain exposed this port. (immutable)"""
309315
return self.__backend_domain
310316

@@ -367,6 +373,13 @@ def backend_domain(self):
367373
return self.port.backend_domain
368374
return '*'
369375

376+
@property
377+
def backend_name(self):
378+
if self.port != '*':
379+
return self.port.backend_name
380+
return '*'
381+
382+
370383
@property
371384
def port_id(self):
372385
if self.port != '*' and self.port.port_id is not None:
@@ -478,7 +491,8 @@ def _parse(
478491
) -> 'VirtualDevice':
479492
if backend is None:
480493
backend_name, identity = representation.split(sep, 1)
481-
backend = get_domain(backend_name)
494+
if backend_name != '*':
495+
backend = get_domain(backend_name)
482496
else:
483497
identity = representation
484498
port_id, _, devid = identity.partition(':')
@@ -1070,15 +1084,19 @@ def __lt__(self, other):
10701084

10711085
@property
10721086
def backend_domain(self):
1073-
return self.virtual_device.port.backend_domain
1087+
return self.virtual_device.backend_domain
1088+
1089+
@property
1090+
def backend_name(self) -> str:
1091+
return self.virtual_device.backend_name
10741092

10751093
@property
10761094
def port_id(self):
1077-
return self.virtual_device.port.port_id
1095+
return self.virtual_device.port_id
10781096

10791097
@property
10801098
def devclass(self):
1081-
return self.virtual_device.port.devclass
1099+
return self.virtual_device.devclass
10821100

10831101
@property
10841102
def device_id(self):

qubes/vm/__init__.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -310,11 +310,13 @@ def load_extras(self):
310310
del options['identity']
311311
else:
312312
identity = node.get('identity', '*')
313+
backend_name = node.get('backend-domain', None)
314+
backend = self.app.domains[backend_name] \
315+
if backend_name else None
313316
device_assignment = qubes.device_protocol.DeviceAssignment(
314317
qubes.device_protocol.VirtualDevice(
315318
qubes.device_protocol.Port(
316-
backend_domain=self.app.domains[
317-
node.get('backend-domain')],
319+
backend_domain=backend,
318320
port_id=node.get('id', '*'),
319321
devclass=devclass,
320322
),
@@ -377,7 +379,7 @@ def __xml__(self):
377379
devices.set('class', devclass)
378380
for assignment in self.devices[devclass].get_assigned_devices():
379381
node = lxml.etree.Element('device')
380-
node.set('backend-domain', assignment.backend_domain.name)
382+
node.set('backend-domain', str(assignment.backend_name))
381383
node.set('id', assignment.port_id)
382384
node.set('mode', assignment.mode.value)
383385
identity = assignment.device_id or '*'

0 commit comments

Comments
 (0)