Skip to content

Commit 46626fb

Browse files
committed
q-dev: fixes corner cases in attach/assign
1 parent 7ec56ae commit 46626fb

File tree

2 files changed

+22
-23
lines changed

2 files changed

+22
-23
lines changed

qubesadmin/device_protocol.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1194,7 +1194,7 @@ def devices(self) -> List[DeviceInfo]:
11941194
if self.device_id == "0000:0000::?******":
11951195
return result
11961196
for dev in self.backend_domain.devices[self.devclass]:
1197-
if dev.device_id == self.device_id:
1197+
if self.matches(dev):
11981198
result.append(dev)
11991199
return result
12001200

qubesadmin/tools/qvm_device.py

+21-22
Original file line numberDiff line numberDiff line change
@@ -248,10 +248,12 @@ def detach_device(args):
248248
vm.devices[args.devclass].detach(assignment)
249249
elif args.device:
250250
assignment = DeviceAssignment(device)
251-
for ass in (vm.devices[args.devclass].get_attached_devices()):
251+
no_device_detached = True
252+
for ass in vm.devices[args.devclass].get_attached_devices():
252253
if assignment.matches(ass.device):
253254
vm.devices[args.devclass].detach(ass)
254-
else:
255+
no_device_detached = False
256+
if no_device_detached:
255257
raise qubesadmin.exc.QubesException(f"{device} is not attached.")
256258
else:
257259
for ass in (vm.devices[args.devclass].get_attached_devices()):
@@ -292,23 +294,15 @@ def assign_device(args):
292294

293295

294296
def _print_attach_hint(assignment, vm):
295-
if assignment.port_id == '*':
296-
return
297-
298-
try:
299-
plugged = assignment.backend_domain.devices[
300-
assignment.devclass][assignment.port_id]
301-
except KeyError:
302-
return
303-
304-
if isinstance(plugged, UnknownDevice):
305-
return
306-
307297
attached = vm.devices[assignment.devclass].get_attached_devices()
308-
if assignment.matches(plugged) and plugged not in attached:
298+
ports = [f"\tqvm-{assignment.devclass} attach {vm} "
299+
f"{assignment.backend_domain}:{dev.port_id}"
300+
for dev in assignment.devices
301+
if dev not in attached and not isinstance(dev, UnknownDevice)]
302+
303+
if ports:
309304
print("Assigned. To attach you can now restart domain or run: \n"
310-
f"\tqvm-{assignment.devclass} attach {vm} "
311-
f"{assignment.backend_domain}:{assignment.port_id}")
305+
"\n".join(ports))
312306

313307

314308
def is_on_deny_list(device, dest):
@@ -379,10 +373,15 @@ def _unassign_and_show_message(assignment, vm, args):
379373
Helper for informing a user.
380374
"""
381375
vm.devices[args.devclass].unassign(assignment)
382-
if assignment.attached and not args.quiet:
383-
print("Unassigned. To detach you can now restart domain or run: \n"
384-
f"\tqvm-{assignment.devclass} detach {vm} "
385-
f"{assignment.backend_domain}:{assignment.port_id}")
376+
377+
attached = vm.devices[assignment.devclass].get_attached_devices()
378+
ports = [f"\tqvm-{assignment.devclass} detach {vm} "
379+
f"{assignment.backend_domain}:{dev.port_id}"
380+
for dev in assignment.devices if dev in attached]
381+
382+
if ports and not args.quiet:
383+
print("Unassigned. To detach you can now restart domain or run: \n",
384+
"\n".join(ports))
386385

387386

388387
def info_device(args):
@@ -517,7 +516,7 @@ def get_parser(device_class=None):
517516
action=DeviceAction, allow_unknown=True)
518517
assign_parser.add_argument(metavar='BACKEND:DEVICE_ID',
519518
dest='device',
520-
action=DeviceAction)
519+
action=DeviceAction, allow_unknown=True)
521520
unassign_parser.add_argument(metavar='BACKEND:DEVICE_ID',
522521
dest='device',
523522
nargs=argparse.OPTIONAL,

0 commit comments

Comments
 (0)