Add qvm-pci --add-class option for adding all devices of given class
This should reduce code duplication in most of initial setup like places - currently firstboot and live image setup.
This commit is contained in:
parent
520b546d75
commit
c337494ba6
@ -23,6 +23,10 @@ OPTIONS
|
|||||||
List VM PCI devices
|
List VM PCI devices
|
||||||
-a, --add
|
-a, --add
|
||||||
Add a PCI device to specified VM
|
Add a PCI device to specified VM
|
||||||
|
-C, --add-class
|
||||||
|
Add all devices of given class:
|
||||||
|
net - network interfaces,
|
||||||
|
usb - USB controllers
|
||||||
-d, --delete
|
-d, --delete
|
||||||
Remove a PCI device from specified VM
|
Remove a PCI device from specified VM
|
||||||
|
|
||||||
|
@ -27,6 +27,25 @@ import subprocess
|
|||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
from qubes.qubes import vmm
|
from qubes.qubes import vmm
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
def find_devices_of_class(klass):
|
||||||
|
p = subprocess.Popen(["/sbin/lspci", "-mm", "-n"], stdout=subprocess.PIPE)
|
||||||
|
result = p.communicate()
|
||||||
|
retcode = p.returncode
|
||||||
|
if retcode != 0:
|
||||||
|
print "ERROR when executing lspci!"
|
||||||
|
raise IOError
|
||||||
|
|
||||||
|
rx_netdev = re.compile(r"^([0-9][0-9]:[0-9][0-9].[0-9]) \"{}".format(
|
||||||
|
klass))
|
||||||
|
for dev in str(result[0]).splitlines():
|
||||||
|
match = rx_netdev.match(dev)
|
||||||
|
if match is not None:
|
||||||
|
dev_bdf = match.group(1)
|
||||||
|
assert dev_bdf is not None
|
||||||
|
yield dev_bdf
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
@ -39,6 +58,9 @@ def main():
|
|||||||
parser.add_option ("-l", "--list", action="store_true", dest="do_list", default=False)
|
parser.add_option ("-l", "--list", action="store_true", dest="do_list", default=False)
|
||||||
parser.add_option ("-a", "--add", action="store_true", dest="do_add", default=False)
|
parser.add_option ("-a", "--add", action="store_true", dest="do_add", default=False)
|
||||||
parser.add_option ("-d", "--delete", action="store_true", dest="do_delete", default=False)
|
parser.add_option ("-d", "--delete", action="store_true", dest="do_delete", default=False)
|
||||||
|
parser.add_option("-C", "--add-class", action="store_true",
|
||||||
|
dest="do_add_class", default=False,
|
||||||
|
help="Add all devices of given class (net, usb)")
|
||||||
parser.add_option ("--offline-mode", dest="offline_mode",
|
parser.add_option ("--offline-mode", dest="offline_mode",
|
||||||
action="store_true", default=False,
|
action="store_true", default=False,
|
||||||
help="Offline mode")
|
help="Offline mode")
|
||||||
@ -49,14 +71,15 @@ def main():
|
|||||||
|
|
||||||
vmname = args[0]
|
vmname = args[0]
|
||||||
|
|
||||||
if options.do_list + options.do_add + options.do_delete > 1:
|
if options.do_list + options.do_add + options.do_delete + \
|
||||||
print >> sys.stderr, "Only one of -l -a -d is allowed!"
|
options.do_add_class > 1:
|
||||||
exit (1)
|
print >> sys.stderr, "Only one of -l -a -d -C is allowed!"
|
||||||
|
exit(1)
|
||||||
|
|
||||||
if options.offline_mode:
|
if options.offline_mode:
|
||||||
vmm.offline_mode = True
|
vmm.offline_mode = True
|
||||||
|
|
||||||
if options.do_add or options.do_delete:
|
if options.do_add or options.do_delete or options.add_class:
|
||||||
qvm_collection = QubesVmCollection()
|
qvm_collection = QubesVmCollection()
|
||||||
qvm_collection.lock_db_for_writing()
|
qvm_collection.lock_db_for_writing()
|
||||||
qvm_collection.load()
|
qvm_collection.load()
|
||||||
@ -81,6 +104,24 @@ def main():
|
|||||||
qvm_collection.save()
|
qvm_collection.save()
|
||||||
qvm_collection.unlock_db()
|
qvm_collection.unlock_db()
|
||||||
|
|
||||||
|
elif options.do_add_class:
|
||||||
|
if len(args) < 2:
|
||||||
|
print >> sys.stderr, "You must specify the PCI device class to add"
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
klass = args[1]
|
||||||
|
|
||||||
|
if klass == 'net':
|
||||||
|
devs = find_devices_of_class("02")
|
||||||
|
elif klass == 'usb':
|
||||||
|
devs = find_devices_of_class("0c03")
|
||||||
|
else:
|
||||||
|
print >> sys.stderr, "Supported classes: net, usb"
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
for dev in devs:
|
||||||
|
vm.pci_add(dev)
|
||||||
|
|
||||||
elif options.do_delete:
|
elif options.do_delete:
|
||||||
if len (args) < 2:
|
if len (args) < 2:
|
||||||
print >> sys.stderr, "You must specify the PCI device to delete"
|
print >> sys.stderr, "You must specify the PCI device to delete"
|
||||||
|
Loading…
Reference in New Issue
Block a user