@@ -248,10 +248,12 @@ def detach_device(args):
248
248
vm .devices [args .devclass ].detach (assignment )
249
249
elif args .device :
250
250
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 ():
252
253
if assignment .matches (ass .device ):
253
254
vm .devices [args .devclass ].detach (ass )
254
- else :
255
+ no_device_detached = False
256
+ if no_device_detached :
255
257
raise qubesadmin .exc .QubesException (f"{ device } is not attached." )
256
258
else :
257
259
for ass in (vm .devices [args .devclass ].get_attached_devices ()):
@@ -292,23 +294,15 @@ def assign_device(args):
292
294
293
295
294
296
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
-
307
297
attached = vm .devices [assignment .devclass ].get_attached_devices ()
308
- if assignment .matches (plugged ) and plugged not in attached :
298
+ ports = [f"\t qvm-{ 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 :
309
304
print ("Assigned. To attach you can now restart domain or run: \n "
310
- f"\t qvm-{ assignment .devclass } attach { vm } "
311
- f"{ assignment .backend_domain } :{ assignment .port_id } " )
305
+ "\n " .join (ports ))
312
306
313
307
314
308
def is_on_deny_list (device , dest ):
@@ -379,10 +373,15 @@ def _unassign_and_show_message(assignment, vm, args):
379
373
Helper for informing a user.
380
374
"""
381
375
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"\t qvm-{ 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"\t qvm-{ 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 ))
386
385
387
386
388
387
def info_device (args ):
@@ -517,7 +516,7 @@ def get_parser(device_class=None):
517
516
action = DeviceAction , allow_unknown = True )
518
517
assign_parser .add_argument (metavar = 'BACKEND:DEVICE_ID' ,
519
518
dest = 'device' ,
520
- action = DeviceAction )
519
+ action = DeviceAction , allow_unknown = True )
521
520
unassign_parser .add_argument (metavar = 'BACKEND:DEVICE_ID' ,
522
521
dest = 'device' ,
523
522
nargs = argparse .OPTIONAL ,
0 commit comments