X-Git-Url: https://git.siccegge.de//index.cgi?a=blobdiff_plain;f=vmdebootstrap;h=64614ad8c5f91442a5e71b7579b38ee8e97d3a9b;hb=12e25b3d3ecaf97d7b0648530ebf3e959302c8fd;hp=19eaecb752567904618f010e4785cfd72adb614e;hpb=658547cbc2bb2630311f2ffd5f20f56fcc080875;p=forks%2Fvmdebootstrap.git diff --git a/vmdebootstrap b/vmdebootstrap index 19eaecb..64614ad 100755 --- a/vmdebootstrap +++ b/vmdebootstrap @@ -1,5 +1,5 @@ #!/usr/bin/python -# Copyright 2011, 2012 Lars Wirzenius +# Copyright 2011-2013 Lars Wirzenius # Copyright 2012 Codethink Limited # # This program is free software: you can redistribute it and/or modify @@ -23,9 +23,10 @@ import re import shutil import subprocess import tempfile +import time -__version__ = '0.1.0' +__version__ = '0.3' class VmDebootstrap(cliapp.Application): @@ -51,7 +52,10 @@ class VmDebootstrap(cliapp.Application): 'set up foreign debootstrap environment using provided program (ie binfmt handler)') self.settings.string(['variant'], 'select debootstrap variant it not using the default') - self.settings.boolean(['no-extlinux'], 'do not install extlinux') + self.settings.boolean( + ['extlinux'], + 'install extlinux?', + default=True) self.settings.string(['tarball'], "tar up the disk's contents in FILE", metavar='FILE') self.settings.string(['mirror'], @@ -96,6 +100,9 @@ class VmDebootstrap(cliapp.Application): self.settings.boolean(['sudo'], 'install sudo, and if user is created, add them ' 'to sudo group') + self.settings.string(['owner'], + 'the user who will own the image when the build ' + 'is complete.') def process_args(self, args): if not self.settings['image'] and not self.settings['tarball']: @@ -109,7 +116,10 @@ class VmDebootstrap(cliapp.Application): self.mount_points = [] try: + rootdev = None roottype = 'ext4' + bootdev = None + boottype = None if self.settings['image']: self.create_empty_image() self.partition_image() @@ -139,7 +149,7 @@ class VmDebootstrap(cliapp.Application): self.setup_networking(rootdir) self.customize(rootdir) if self.settings['image']: - if not self.settings['no-extlinux']: + if self.settings['extlinux']: self.install_extlinux(rootdev, rootdir) self.optimize_image(rootdir) @@ -149,8 +159,12 @@ class VmDebootstrap(cliapp.Application): if self.settings['tarball']: self.create_tarball(rootdir) + + if self.settings['owner']: + self.chown(rootdir) except BaseException, e: self.message('EEEK! Something bad happened...') + self.message(e) self.cleanup_system() raise else: @@ -217,7 +231,7 @@ class VmDebootstrap(cliapp.Application): self.runcmd(['install-mbr', self.settings['image']]) def setup_kpartx(self): - out = self.runcmd(['kpartx', '-av', self.settings['image']]) + out = self.runcmd(['kpartx', '-avs', self.settings['image']]) if self.settings['bootsize']: bootindex = 0 rootindex = 1 @@ -285,13 +299,16 @@ class VmDebootstrap(cliapp.Application): f.write('%s\n' % hostname) etc_hosts = os.path.join(rootdir, 'etc', 'hosts') - with open(etc_hosts, 'r') as f: - data = f.read() - with open(etc_hosts, 'w') as f: - for line in data.splitlines(): - if line.startswith('127.0.0.1'): - line += ' %s' % hostname - f.write('%s\n' % line) + try: + with open(etc_hosts, 'r') as f: + data = f.read() + with open(etc_hosts, 'w') as f: + for line in data.splitlines(): + if line.startswith('127.0.0.1'): + line += ' %s' % hostname + f.write('%s\n' % line) + except IOError, e: + pass def create_fstab(self, rootdir, rootdev, roottype, bootdev, boottype): def fsuuid(device): @@ -466,10 +483,15 @@ append initrd=%(initrd)s root=UUID=%(uuid)s ro %(kserial)s if self.settings['image']: for i in xrange(len(self.mount_points) - 1, -1, -1): mount_point = self.mount_points[i] - self.runcmd(['umount', mount_point], ignore_fail=True) + try: + self.runcmd(['umount', mount_point], ignore_fail=False) + except cliapp.AppException: + logging.debug("umount failed, sleeping and trying again") + time.sleep(5) + self.runcmd(['umount', mount_point], ignore_fail=False) self.runcmd(['kpartx', '-d', self.settings['image']], ignore_fail=True) - + for dirname in self.remove_dirs: shutil.rmtree(dirname) @@ -486,6 +508,13 @@ append initrd=%(initrd)s root=UUID=%(uuid)s ro %(kserial)s self.message('Creating tarball of disk contents') self.runcmd(['tar', '-cf', self.settings['tarball'], '-C', rootdir, '.']) + def chown(self, rootdir): + # Change image owner after completed build + self.message("Changing owner to %s" % self.settings["owner"]) + subprocess.call(["chown", + self.settings["owner"], + self.settings["image"]]) + if __name__ == '__main__': VmDebootstrap(version=__version__).run()