]> git.siccegge.de Git - forks/vmdebootstrap.git/commitdiff
Merge branch 'richardmaw/tarball-option' into tar-no-kernel
authorRichard Maw <richard.maw@codethink.co.uk>
Thu, 11 Oct 2012 09:20:09 +0000 (10:20 +0100)
committerRichard Maw <richard.maw@codethink.co.uk>
Thu, 11 Oct 2012 09:20:09 +0000 (10:20 +0100)
1  2 
vmdebootstrap

diff --combined vmdebootstrap
index 98211646f54968e8fa7335f375abdf185a728b91,e32c7bb0cf3ae35044a0e31660d80f51d39de0ca..5b4c62bf4b5360f557a08f54b1dfbb3b2bbdea34
@@@ -37,6 -37,8 +37,8 @@@ class VmDebootstrap(cliapp.Application)
                                 'create a disk image of size SIZE (%default)',
                                 metavar='SIZE',
                                 default='1G')
+         self.settings.string(['tarball'], "tar up the disk's contents in FILE",
+                              metavar='FILE')
          self.settings.string(['mirror'],
                               'use MIRROR as package source (%default)',
                               metavar='URL',
@@@ -53,7 -55,6 +55,7 @@@
                                    'install package in DEB file onto system '
                                      '(not from mirror)',
                                    metavar='DEB')
 +        self.settings.boolean(['no-kernel'], 'do not install a linux package')
          self.settings.boolean(['enable-dhcp'], 'enable DHCP on eth0')
          self.settings.string(['root-password'], 'set root password',
                               metavar='PASSWORD')
                                  'to sudo group')
  
      def process_args(self, args):
-         if not self.settings['image']:
-             raise cliapp.AppException('You must give image filename.')
-         if not self.settings['size']:
-             raise cliapp.AppException('You must give image size.')
+         if not self.settings['image'] and not self.settings['tarball']:
+             raise cliapp.AppException('You must give disk image filename, '
+                                       'or tarball filename')
+         if self.settings['image'] and not self.settings['size']:
+             raise cliapp.AppException('If disk image is specified, '
+                                       'You must give image size.')
  
          self.remove_dirs = []
          self.mount_points = []
  
          try:
-             self.create_empty_image()
-             self.partition_image()
-             self.install_mbr()
-             rootdev = self.setup_kpartx()
-             self.mkfs(rootdev)
-             rootdir = self.mount(rootdev)
+             if self.settings['image']:
+                 self.create_empty_image()
+                 self.partition_image()
+                 self.install_mbr()
+                 rootdev = self.setup_kpartx()
+                 self.mkfs(rootdev)
+                 rootdir = self.mount(rootdev)
+             else:
+                 rootdir = self.mkdtemp()
              self.debootstrap(rootdir)
              self.set_hostname(rootdir)
              self.create_fstab(rootdir)
              self.create_users(rootdir)
              self.remove_udev_persistent_rules(rootdir)
              self.setup_networking(rootdir)
-             self.install_extlinux(rootdev, rootdir)
+             if self.settings['image']:
+                 self.install_extlinux(rootdev, rootdir)
              self.customize(rootdir)
+             if self.settings['tarball']:
+                 self.create_tarball(rootdir)
          except BaseException, e:
              self.message('EEEK! Something bad happened...')
              self.cleanup_system()
      def debootstrap(self, rootdir):
          self.message('Debootstrapping')
  
 -        if self.settings['arch'] == 'i386':
 -            kernel_arch = '686'
 -        else:
 -            kernel_arch = self.settings['arch']
 -        kernel_image = 'linux-image-2.6-%s' % kernel_arch
 +        include = self.settings['package']
 +
 +        if not self.settings['no-kernel']:
 +            if self.settings['arch'] == 'i386':
 +                kernel_arch = '686'
 +            else:
 +                kernel_arch = self.settings['arch']
 +            kernel_image = 'linux-image-2.6-%s' % kernel_arch
 +            include.append(kernel_image)
  
 -        include = [kernel_image] + self.settings['package']
          if self.settings['sudo'] and 'sudo' not in include:
              include.append('sudo')
  
@@@ -347,10 -353,11 +357,11 @@@ append initrd=%(initrd)s root=UUID=%(uu
  
          self.message('Cleaning up')
  
-         for mount_point in self.mount_points:
-             self.runcmd(['umount', mount_point], ignore_fail=True)
+         if self.settings['image']:
+             for mount_point in self.mount_points:
+                 self.runcmd(['umount', mount_point], ignore_fail=True)
  
-         self.runcmd(['kpartx', '-d', self.settings['image']], ignore_fail=True)
+             self.runcmd(['kpartx', '-d', self.settings['image']], ignore_fail=True)
          
          for dirname in self.remove_dirs:
              shutil.rmtree(dirname)
              with open('/dev/tty', 'w') as tty:
                  cliapp.runcmd([script, rootdir], stdout=tty, stderr=tty)
  
+     def create_tarball(self, rootdir):
+         # Create a tarball of the disk's contents
+         # shell out to runcmd since it more easily handles rootdir
+         self.message('Creating tarball of disk contents')
+         self.runcmd(['tar', '-cf', self.settings['tarball'], '-C', rootdir, '.'])
  
  if __name__ == '__main__':
      VmDebootstrap().run()