- self.g = guestfs.GuestFS()
- self.g.add_drive_opts(self.device, readonly=0)
-
- #self.g.set_trace(1)
- #self.g.set_verbose(1)
-
- self.guestfs_enabled = False
-
- def enable(self):
- """Enable a newly created DiskDevice"""
-
- self.progressbar = progress_generator("VM lauch: ")
- self.progressbar.next()
- eh = self.g.set_event_callback(self.progress_callback, guestfs.EVENT_PROGRESS)
- self.g.launch()
- self.guestfs_enabled = True
- self.g.delete_event_callback(eh)
- if self.progressbar is not None:
- self.progressbar.send(100)
- self.progressbar = None
-
- roots = self.g.inspect_os()
- if len(roots) == 0:
- raise FatalError("No operating system found")
- if len(roots) > 1:
- raise FatalError("Multiple operating systems found")
-
- self.root = roots[0]
- self.ostype = self.g.inspect_get_type(self.root)
- self.distro = self.g.inspect_get_distro(self.root)
-
- def destroy(self):
- """Destroy this DiskDevice instance."""
-
- if self.guestfs_enabled:
- self.g.umount_all()
- self.g.sync()
-
- # Close the guestfs handler if open
- self.g.close()
-
- def progress_callback(self, ev, eh, buf, array):
- position = array[2]
- total = array[3]
-
- self.progressbar.send((position * 100)//total)
-
- if position == total:
- self.progressbar = None
-
- def mount(self):
- """Mount all disk partitions in a correct order."""
- mps = self.g.inspect_get_mountpoints(self.root)
-
- # Sort the keys to mount the fs in a correct order.
- # / should be mounted befor /boot, etc
- 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:
- self.g.mount(dev, mp)
- except RuntimeError as msg:
- print "%s (ignored)" % msg
-
- def umount(self):
- """Umount all mounted filesystems."""
- self.g.umount_all()
-
- def shrink(self):
- """Shrink the disk.
-
- This is accomplished by shrinking the last filesystem in the
- disk and then updating the partition table. The new disk size
- (in bytes) is returned.