X-Git-Url: https://git.siccegge.de//index.cgi?a=blobdiff_plain;f=vmdebootstrap;h=64614ad8c5f91442a5e71b7579b38ee8e97d3a9b;hb=969da62d6ad1dbd96683645067acef035a79207e;hp=705cdfa407503abeb8c8f1878986b59f9e7cca2b;hpb=b6213b0bbe1d7caf4be112d1b4404ba3443fe986;p=forks%2Fvmdebootstrap.git diff --git a/vmdebootstrap b/vmdebootstrap index 705cdfa..64614ad 100755 --- a/vmdebootstrap +++ b/vmdebootstrap @@ -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']: @@ -142,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) @@ -152,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: @@ -220,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 @@ -288,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): @@ -469,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) @@ -489,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()