def check_inspection(self, support_threading): if not support_threading: return False try: # Check we can open the Python guestfs module. from guestfs import GuestFS g = GuestFS() # Check for the first version which fixed Python GIL bug. version = g.version() if version["major"] == 1: # major must be 1 if version["minor"] == 8: if version["release"] >= 6: # >= 1.8.6 return True elif version["minor"] == 10: if version["release"] >= 1: # >= 1.10.1 return True elif version["minor"] == 11: if version["release"] >= 2: # >= 1.11.2 return True elif version["minor"] >= 12: # >= 1.12, 1.13, etc. return True except: pass return False
def check_inspection(self): try: # Check we can open the Python guestfs module. from guestfs import GuestFS # pylint: disable=import-error g = GuestFS(close_on_exit=False) return bool(getattr(g, "add_libvirt_dom", None)) except Exception: return False
def check_inspection(self): try: # Check we can open the Python guestfs module. from guestfs import GuestFS # pylint: disable=import-error GuestFS(close_on_exit=False) return True except: return False
def _process(self, conn, vm, vmuuid): if re.search(r"^guestfs-", vm.get_name()): logging.debug("ignore libvirt/guestfs temporary VM %s", vm.get_name()) return g = GuestFS() prettyvm = conn.get_uri() + ":" + vm.get_name() ignore = vmuuid disks = [] for disk in vm.get_disk_devices(): if (disk.path and (disk.type == "block" or disk.type == "file") and not disk.device == "cdrom"): disks.append(disk) if not disks: logging.debug("%s: nothing to inspect", prettyvm) return # Add the disks. Note they *must* be added with readonly flag set. for disk in disks: path = disk.path driver_type = disk.driver_type if not (os.path.exists(path) and os.access(path, os.R_OK)): logging.debug("%s: cannot access '%s', skipping inspection", prettyvm, path) return g.add_drive_opts(path, readonly=1, format=driver_type) g.launch() # Inspect the operating system. roots = g.inspect_os() if len(roots) == 0: logging.debug("%s: no operating systems found", prettyvm) return # Arbitrarily pick the first root device. root = roots[0] # Inspection results. typ = g.inspect_get_type(root) # eg. "linux" distro = g.inspect_get_distro(root) # eg. "fedora" major_version = g.inspect_get_major_version(root) # eg. 14 minor_version = g.inspect_get_minor_version(root) # eg. 0 hostname = g.inspect_get_hostname(root) # string product_name = g.inspect_get_product_name(root) # string product_variant = g.inspect_get_product_variant(root) # string # For inspect_list_applications and inspect_get_icon we # require that the guest filesystems are mounted. However # don't fail if this is not possible (I'm looking at you, # FreeBSD). filesystems_mounted = False try: # Mount up the disks, like guestfish --ro -i. # Sort keys by length, shortest first, so that we end up # mounting the filesystems in the correct order. mps = list(g.inspect_get_mountpoints(root)) def compare(a, b): if len(a[0]) > len(b[0]): return 1 elif len(a[0]) == len(b[0]): return 0 else: return -1 mps.sort(compare) for mp_dev in mps: try: g.mount_ro(mp_dev[1], mp_dev[0]) except: logging.exception( "%s: exception mounting %s on %s " "(ignored)", prettyvm, mp_dev[1], mp_dev[0]) filesystems_mounted = True except: logging.exception("%s: exception while mounting disks (ignored)", prettyvm) icon = None apps = None if filesystems_mounted: # string containing PNG data icon = g.inspect_get_icon(root, favicon=0, highquality=1) if icon == "": icon = None # Inspection applications. apps = g.inspect_list_applications(root) # Force the libguestfs handle to close right now. del g # Log what we found. logging.debug("%s: detected operating system: %s %s %d.%d (%s)", prettyvm, typ, distro, major_version, minor_version, product_name) logging.debug("hostname: %s", hostname) if icon: logging.debug("icon: %d bytes", len(icon)) if apps: logging.debug("# apps: %d", len(apps)) data = vmmInspectionData() data.type = str(type) data.distro = str(distro) data.major_version = int(major_version) data.minor_version = int(minor_version) data.hostname = str(hostname) data.product_name = str(product_name) data.product_variant = str(product_variant) data.icon = icon data.applications = list(apps) self._set_vm_inspection_data(vm, data)
def _process(self, conn, vm): if re.search(r"^guestfs-", vm.get_name()): logging.debug("ignore libvirt/guestfs temporary VM %s", vm.get_name()) return None g = GuestFS(close_on_exit=False) prettyvm = conn.get_uri() + ":" + vm.get_name() g.add_libvirt_dom(vm.get_backend(), readonly=1) g.launch() # Inspect the operating system. roots = g.inspect_os() if len(roots) == 0: logging.debug("%s: no operating systems found", prettyvm) return None # Arbitrarily pick the first root device. root = roots[0] # Inspection results. typ = g.inspect_get_type(root) # eg. "linux" distro = g.inspect_get_distro(root) # eg. "fedora" major_version = g.inspect_get_major_version(root) # eg. 14 minor_version = g.inspect_get_minor_version(root) # eg. 0 hostname = g.inspect_get_hostname(root) # string product_name = g.inspect_get_product_name(root) # string product_variant = g.inspect_get_product_variant(root) # string # For inspect_list_applications and inspect_get_icon we # require that the guest filesystems are mounted. However # don't fail if this is not possible (I'm looking at you, # FreeBSD). filesystems_mounted = False try: # Mount up the disks, like guestfish --ro -i. # Sort keys by length, shortest first, so that we end up # mounting the filesystems in the correct order. mps = list(g.inspect_get_mountpoints(root)) def compare(a, b): if len(a[0]) > len(b[0]): return 1 elif len(a[0]) == len(b[0]): return 0 else: return -1 mps.sort(compare) for mp_dev in mps: try: g.mount_ro(mp_dev[1], mp_dev[0]) except: logging.exception("%s: exception mounting %s on %s " "(ignored)", prettyvm, mp_dev[1], mp_dev[0]) filesystems_mounted = True except: logging.exception("%s: exception while mounting disks (ignored)", prettyvm) icon = None apps = None if filesystems_mounted: # string containing PNG data icon = g.inspect_get_icon(root, favicon=0, highquality=1) if icon == "": icon = None # Inspection applications. apps = g.inspect_list_applications(root) # Force the libguestfs handle to close right now. del g # Log what we found. logging.debug("%s: detected operating system: %s %s %d.%d (%s)", prettyvm, typ, distro, major_version, minor_version, product_name) logging.debug("hostname: %s", hostname) if icon: logging.debug("icon: %d bytes", len(icon)) if apps: logging.debug("# apps: %d", len(apps)) data = vmmInspectionData() data.type = str(type) data.distro = str(distro) data.major_version = int(major_version) data.minor_version = int(minor_version) data.hostname = str(hostname) data.product_name = str(product_name) data.product_variant = str(product_variant) data.icon = icon data.applications = list(apps) data.error = False return data
def __init__(self, disk_path): self._root = None self._handler = GuestFS() self.disk_path = disk_path