import os
import re
-import uuid
import tempfile
-import time
from collections import namedtuple
import parted
from image_creator.rsync import Rsync
from image_creator.util import get_command
from image_creator.util import FatalError
+from image_creator.util import try_fail_repeat
findfs = get_command('findfs')
-truncate = get_command('truncate')
dd = get_command('dd')
dmsetup = get_command('dmsetup')
losetup = get_command('losetup')
}
-class BundleVolume():
+class BundleVolume(object):
+ """This class can be used to create an image out of the running system"""
def __init__(self, out, meta):
+ """Create an instance of the BundleVolume class."""
self.out = out
self.meta = meta
if not os.path.exists(dev):
return
- dmsetup('remove', dev.split('/dev/mapper/')[1])
- time.sleep(0.1)
+ try_fail_repeat(dmsetup, 'remove', dev.split('/dev/mapper/')[1])
def _mount(self, target, devs):
mpoints.sort()
for mpoint in reversed(mpoints):
- umount(mpoint)
+ try_fail_repeat(umount, mpoint)
def _to_exclude(self):
excluded = ['/tmp', '/var/tmp']
'/boot/grub/menu.lst',
'/boot/grub/grub.conf']
- orig = dict(map(lambda p: (p.number, blkid( '-s', 'UUID', '-o',
+ orig = dict(map(lambda p: (p.number, blkid('-s', 'UUID', '-o',
'value', p.path).stdout.strip()), self.disk.partitions))
for f in map(lambda f: target + f, files):
self._unmap_partition(dev)
losetup('-d', loop)
- def create_image(self):
+ def create_image(self, image):
+ """Given an image filename, this method will create an image out of the
+ running system.
+ """
- image = '/mnt/%s.diskdump' % uuid.uuid4().hex
-
- disk_size = self.disk.device.getLength() * self.disk.device.sectorSize
+ size = self.disk.device.getLength() * self.disk.device.sectorSize
# Create sparse file to host the image
- truncate("-s", "%d" % disk_size, image)
+ fd = os.open(image, os.O_WRONLY | os.O_CREAT)
+ try:
+ os.ftruncate(fd, size)
+ finally:
+ os.close(fd)
self._create_partition_table(image)