/usr/share/virt-manager/virtinst/devicehostdev.py is in virtinst 1:1.5.1-0ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | #
# Copyright 2009, 2013 Red Hat, Inc.
# Cole Robinson <crobinso@redhat.com>
#
# 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 .device import VirtualDevice
from .nodedev import NodeDevice
from .xmlbuilder import XMLProperty
class VirtualHostDevice(VirtualDevice):
virtual_device_type = VirtualDevice.VIRTUAL_DEV_HOSTDEV
def set_from_nodedev(self, nodedev):
"""
@use_full_usb: If set, and nodedev is USB, specify both
vendor and product. Used if user requests bus/add on virt-install
command line, or if virt-manager detects a dup USB device
and we need to differentiate
"""
if nodedev.device_type == NodeDevice.CAPABILITY_TYPE_PCI:
self.type = "pci"
self.domain = nodedev.domain
self.bus = nodedev.bus
self.slot = nodedev.slot
self.function = nodedev.function
elif nodedev.device_type == NodeDevice.CAPABILITY_TYPE_USBDEV:
self.type = "usb"
self.vendor = nodedev.vendor_id
self.product = nodedev.product_id
count = 0
for dev in self.conn.fetch_all_nodedevs():
if (dev.device_type == NodeDevice.CAPABILITY_TYPE_USBDEV and
dev.vendor_id == self.vendor and
dev.product_id == self.product):
count += 1
if not count:
raise RuntimeError(_("Could not find USB device "
"(vendorId: %s, productId: %s)")
% (self.vendor, self.product))
if count > 1:
self.bus = nodedev.bus
self.device = nodedev.device
elif nodedev.device_type == nodedev.CAPABILITY_TYPE_NET:
founddev = None
for checkdev in self.conn.fetch_all_nodedevs():
if checkdev.name == nodedev.parent:
founddev = checkdev
break
self.set_from_nodedev(founddev)
elif nodedev.device_type == nodedev.CAPABILITY_TYPE_SCSIDEV:
self.type = "scsi"
self.scsi_adapter = "scsi_host%s" % nodedev.host
self.scsi_bus = nodedev.bus
self.scsi_target = nodedev.target
self.scsi_unit = nodedev.lun
self.managed = False
else:
raise ValueError(_("Unknown node device type %s") % nodedev)
def pretty_name(self):
def dehex(val):
if val.startswith("0x"):
val = val[2:]
return val
def safeint(val, fmt="%.3d"):
try:
int(val)
except Exception:
return str(val)
return fmt % int(val)
label = self.type.upper()
if self.vendor and self.product:
label += " %s:%s" % (dehex(self.vendor), dehex(self.product))
elif self.bus and self.device:
label += " %s:%s" % (safeint(self.bus), safeint(self.device))
elif self.bus and self.slot and self.function and self.domain:
label += (" %s:%s:%s.%s" %
(dehex(self.domain), dehex(self.bus),
dehex(self.slot), dehex(self.function)))
return label
_XML_PROP_ORDER = ["mode", "type", "managed", "vendor", "product",
"domain", "bus", "slot", "function"]
mode = XMLProperty("./@mode", default_cb=lambda s: "subsystem")
type = XMLProperty("./@type")
def _get_default_managed(self):
return self.conn.is_xen() and "no" or "yes"
managed = XMLProperty("./@managed", is_yesno=True,
default_cb=_get_default_managed)
vendor = XMLProperty("./source/vendor/@id")
product = XMLProperty("./source/product/@id")
device = XMLProperty("./source/address/@device")
bus = XMLProperty("./source/address/@bus")
def _get_default_domain(self):
if self.type == "pci":
return "0x0"
return None
domain = XMLProperty("./source/address/@domain",
default_cb=_get_default_domain)
function = XMLProperty("./source/address/@function")
slot = XMLProperty("./source/address/@slot")
driver_name = XMLProperty("./driver/@name")
rom_bar = XMLProperty("./rom/@bar", is_onoff=True)
# type=scsi handling
scsi_adapter = XMLProperty("./source/adapter/@name")
scsi_bus = XMLProperty("./source/address/@bus", is_int=True)
scsi_target = XMLProperty("./source/address/@target", is_int=True)
scsi_unit = XMLProperty("./source/address/@unit", is_int=True)
VirtualHostDevice.register_type()
|