#!/usr/bin/python2 # # The Qubes OS Project, http://www.qubes-os.org # # Copyright (C) 2010 Marek Marczykowski # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # from qubes.qubes import QubesVmCollection from optparse import OptionParser import subprocess import os import sys def main(): usage = "usage: %prog -l [options] \n"\ "usage: %prog -a [options] \n"\ "usage: %prog -d [options] \n"\ "List/set VM PCI devices." parser = OptionParser (usage) 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 ("-d", "--delete", action="store_true", dest="do_delete", default=False) (options, args) = parser.parse_args () if (len (args) < 1): parser.error ("You must provide at least the vmname!") vmname = args[0] if options.do_list + options.do_add + options.do_delete > 1: print >> sys.stderr, "Only one of -l -a -d is allowed!" exit (1) if options.do_add or options.do_delete: qvm_collection = QubesVmCollection() qvm_collection.lock_db_for_writing() qvm_collection.load() else: qvm_collection = QubesVmCollection() qvm_collection.lock_db_for_reading() qvm_collection.load() qvm_collection.unlock_db() vm = qvm_collection.get_vm_by_name(vmname) if vm is None or vm.qid not in qvm_collection: print >> sys.stderr, "A VM with the name '{0}' does not exist in the system.".format(vmname) exit(1) if options.do_add: if len (args) < 2: print >> sys.stderr, "You must specify the PCI device to add" exit (1) pci = args[1] if not os.path.exists('/sys/bus/pci/devices/0000:%s' % pci): print >> sys.stderr, "Invalid PCI device: %s" % pci exit(1) if vm.pcidevs.count(pci) == 0: vm.pcidevs.append(pci) if vm.is_running(): print >>sys.stderr, "NOTICE: Changes will be seen by VM after VM restart" qvm_collection.save() qvm_collection.unlock_db() elif options.do_delete: if len (args) < 2: print >> sys.stderr, "You must specify the PCI device to delete" exit (1) pci = args[1] if vm.pcidevs.count(pci) > 0: vm.pcidevs.remove(pci) if vm.is_running(): print >>sys.stderr, "NOTICE: Changes will be seen by VM after VM restart" qvm_collection.save() qvm_collection.unlock_db() else: # do_list print str(vm.pcidevs) main()