X-Git-Url: https://git.siccegge.de//index.cgi?a=blobdiff_plain;f=vmdebootstrap;h=4bf8cfded88a287bc341fb77d4a0264a0f1aa9a2;hb=3106a9b2ea2a7778d1394a2c4b7e46ccbc39e6d7;hp=7847c2331f3027fc9ad19fdc9994fa3688ef7ad1;hpb=ab4157ff0a9481a1ed647f1f7177f11448f16792;p=forks%2Fvmdebootstrap.git diff --git a/vmdebootstrap b/vmdebootstrap index 7847c23..4bf8cfd 100755 --- a/vmdebootstrap +++ b/vmdebootstrap @@ -15,6 +15,7 @@ # along with this program. If not, see . import cliapp +import crypt import logging import os import re @@ -28,32 +29,35 @@ class VmDebootstrap(cliapp.Application): def add_settings(self): default_arch = 'amd64' - self.settings.add_boolean_setting(['verbose'], - 'report what is going on') - self.settings.add_string_setting(['image'], - 'put created disk image in FILE', - metavar='FILE') - self.settings.add_bytesize_setting(['size'], - 'create a disk image of size SIZE ' - '(%default)', - metavar='SIZE', - default='1G') - self.settings.add_string_setting(['mirror'], - 'use MIRROR as package source ' - '(%default)', - metavar='URL', - default='http://cdn.debian.net/debian/') - self.settings.add_string_setting(['arch'], - 'architecture to use ' - '(%default)', - metavar='ARCH', - default=default_arch) - self.settings.add_string_setting(['distribution'], - 'release to use (%default)', - metavar='NAME', - default='stable') - self.settings.add_string_list_setting(['package'], - 'install PACKAGE onto system') + self.settings.boolean(['verbose'], 'report what is going on') + self.settings.string(['image'], 'put created disk image in FILE', + metavar='FILE') + self.settings.bytesize(['size'], + 'create a disk image of size SIZE (%default)', + metavar='SIZE', + default='1G') + self.settings.string(['mirror'], + 'use MIRROR as package source (%default)', + metavar='URL', + default='http://cdn.debian.net/debian/') + self.settings.string(['arch'], 'architecture to use (%default)', + metavar='ARCH', + default=default_arch) + self.settings.string(['distribution'], + 'release to use (%default)', + metavar='NAME', + default='stable') + self.settings.string_list(['package'], 'install PACKAGE onto system') + self.settings.boolean(['enable-dhcp'], 'enable DHCP on eth0') + self.settings.string(['root-password'], 'set root password', + metavar='PASSWORD') + self.settings.string(['customize'], + 'run SCRIPT after setting up system', + metavar='SCRIPT') + self.settings.string(['hostname'], + 'set name to HOSTNAME (%default)', + metavar='HOSTNAME', + default='debian') def process_args(self, args): if not self.settings['image']: @@ -72,8 +76,12 @@ class VmDebootstrap(cliapp.Application): self.mkfs(rootdev) rootdir = self.mount(rootdev) self.debootstrap(rootdir) + self.set_hostname(rootdir) self.set_root_password(rootdir) + self.remove_udev_persistent_rules(rootdir) + self.setup_networking(rootdir) self.install_extlinux(rootdev, rootdir) + self.customize(rootdir) except: self.cleanup() raise @@ -91,7 +99,7 @@ class VmDebootstrap(cliapp.Application): **kwargs) out, err = p.communicate(stdin) if p.returncode != 0: - msg = 'command failed: %s\n%s' % (argv, err) + msg = 'command failed: %s\n%s\n%s' % (argv, out, err) logging.error(msg) if not ignore_fail: raise cliapp.AppException(msg) @@ -161,9 +169,45 @@ class VmDebootstrap(cliapp.Application): rootdir, self.settings['mirror']]) + def set_hostname(self, rootdir): + hostname = self.settings['hostname'] + f = open(os.path.join(rootdir, 'etc', 'hostname'), 'w') + f.write(hostname) + f.close() + def set_root_password(self, rootdir): - self.message('Removing root password') - self.runcmd(['chroot', rootdir, 'passwd', '-d', 'root']) + if self.settings['root-password']: + self.message('Setting root password') + encrypted = crypt.crypt(self.settings['root-password'], '..') + self.runcmd(['chroot', rootdir, 'usermod', '-p', encrypted, + 'root']) + else: + self.message('Locking root password') + self.runcmd(['chroot', rootdir, 'passwd', '-l', 'root']) + + def remove_udev_persistent_rules(self, rootdir): + self.message('Removing udev persistent cd and net rules') + for x in ['70-persistent-cd.rules', '70-persistent-net.rules']: + pathname = os.path.join(rootdir, 'etc', 'udev', 'rules.d', x) + if os.path.exists(pathname): + logging.debug('rm %s' % pathname) + os.remove(pathname) + else: + logging.debug('not removing non-existent %s' % pathname) + + def setup_networking(self, rootdir): + self.message('Setting up networking') + + f = open(os.path.join(rootdir, 'etc', 'network', 'interfaces'), 'w') + f.write('auto lo\n') + f.write('iface lo inet loopback\n') + + if self.settings['enable-dhcp']: + f.write('\n') + f.write('allow-hotplug eth0\n') + f.write('iface eth0 inet dhcp\n') + + f.close() def install_extlinux(self, rootdev, rootdir): self.message('Installing extlinux') @@ -193,7 +237,7 @@ timeout 1 label linux kernel %(kernel)s -append initrd=%(initrd)s root=UUID=%(uuid)s ro +append initrd=%(initrd)s root=UUID=%(uuid)s ro quiet ''' % { 'kernel': kernel_image, 'initrd': initrd_image, @@ -218,6 +262,12 @@ append initrd=%(initrd)s root=UUID=%(uuid)s ro for dirname in self.remove_dirs: shutil.rmtree(dirname) + def customize(self, rootdir): + script = self.settings['customize'] + if script: + self.message('Running customize script %s' % script) + self.runcmd([script, rootdir]) + if __name__ == '__main__': VmDebootstrap().run()