+ def was_oldstable(self, limit):
+ suite = self.suite_to_codename(self.settings['distribution'])
+ # this check is only for debian
+ if not self.debian_info.valid(suite):
+ return False
+ return suite == self.debian_info.old(limit)
+
+ def was_stable(self, limit):
+ suite = self.suite_to_codename(self.settings['distribution'])
+ # this check is only for debian
+ if not self.debian_info.valid(suite):
+ return False
+ return suite == self.debian_info.stable(limit)
+
+ def debootstrap(self, rootdir): # pylint: disable=too-many-statements
+ msg = "(%s)" % self.settings['variant'] if self.settings['variant'] else ''
+ self.message(
+ 'Debootstrapping %s [%s] %s' % (
+ self.settings['distribution'], self.settings['arch'], msg))
+
+ include = self.settings['package']
+
+ if not self.settings['foreign'] and not self.settings['no-acpid']:
+ include.append('acpid')
+
+ if self.settings['grub']:
+ if self.settings['use-uefi']:
+ include.extend(self._efi_packages())
+ else:
+ include.append('grub-pc')
+
+ if not self.settings['no-kernel']:
+ if self.settings['kernel-package']:
+ kernel_image = self.settings['kernel-package']
+ else:
+ if self.settings['arch'] == 'i386':
+ # wheezy (which became oldstable on 04/25/2015) used '486'
+ if self.was_oldstable(datetime.date(2015, 4, 26)):
+ kernel_arch = '486'
+ else:
+ kernel_arch = '586'
+ elif self.settings['arch'] == 'armhf':
+ kernel_arch = 'armmp'
+ else:
+ kernel_arch = self.settings['arch']
+ kernel_image = 'linux-image-%s' % kernel_arch
+ include.append(kernel_image)
+
+ if self.settings['sudo'] and 'sudo' not in include:
+ include.append('sudo')
+
+ args = ['debootstrap', '--arch=%s' % self.settings['arch']]
+
+ if self.settings['package']:
+ args.append(
+ '--include=%s' % ','.join(include))
+ if self.settings['foreign']:
+ args.append('--foreign')
+ if self.settings['debootstrapopts']:
+ for opt in self.settings['debootstrapopts']:
+ for part in opt.split(' '):
+ args.append('--%s' % part)
+ elif self.settings['variant']:
+ args.append('--variant')
+ args.append(self.settings['variant'])
+ args += [self.settings['distribution'],
+ rootdir, self.settings['mirror']]
+ logging.debug(" ".join(args))
+ self.runcmd(args)
+ if self.settings['foreign']:
+ # set a noninteractive debconf environment for secondstage
+ env = {
+ "DEBIAN_FRONTEND": "noninteractive",
+ "DEBCONF_NONINTERACTIVE_SEEN": "true",
+ "LC_ALL": "C"
+ }
+ # add the mapping to the complete environment.
+ env.update(os.environ)
+ # First copy the binfmt handler over
+ self.message('Setting up binfmt handler')
+ shutil.copy(self.settings['foreign'], '%s/usr/bin/' % rootdir)
+ # Next, run the package install scripts etc.
+ self.message('Running debootstrap second stage')
+ self.runcmd(['chroot', rootdir,
+ '/debootstrap/debootstrap', '--second-stage'],
+ env=env)
+
+ def set_hostname(self, rootdir):
+ hostname = self.settings['hostname']
+ with open(os.path.join(rootdir, 'etc', 'hostname'), 'w') as f:
+ f.write('%s\n' % hostname)
+
+ etc_hosts = os.path.join(rootdir, 'etc', 'hosts')
+ 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:
+ pass
+
+ def create_fstab(self, rootdir, rootdev, roottype, bootdev, boottype): # pylint: disable=too-many-arguments
+ def fsuuid(device):
+ if 'freebsd' in os.sys.platform:
+ out = self.runcmd(['grub-probe', '-d', device, '-t', 'fs_uuid'])
+ return "/dev/ufsid/%s" % out.strip()
+ else:
+ out = self.runcmd(['blkid', '-c', '/dev/null', '-o', 'value',
+ '-s', 'UUID', device])
+ return "UUID=%s" % out.splitlines()[0].strip()
+
+ if rootdev:
+ rootdevstr = fsuuid(rootdev)
+ else:
+ rootdevstr = '/dev/sda1'
+
+ if bootdev and not self.settings['use-uefi']:
+ bootdevstr = fsuuid(bootdev)
+ else:
+ bootdevstr = None
+
+ fstab = os.path.join(rootdir, 'etc', 'fstab')
+ with open(fstab, 'w') as f:
+ if 'freebsd' in os.sys.platform:
+ f.write('proc /proc linprocfs rw 0 0\n')
+ f.write('sys /sys linsysfs rw 0 0\n')
+ f.write('fdesc /dev/fd fdescfs rw 0 0\n')
+ else:
+ f.write('proc /proc proc defaults 0 0\n')
+ f.write('%s / %s rw 0 1\n' % (rootdevstr, roottype))
+ if bootdevstr:
+ f.write('%s /boot %s errors=remount-ro 0 2\n' % (bootdevstr, boottype))
+ if self.settings['swap'] > 0:
+ f.write("/dev/sda3 swap swap defaults 0 0\n")
+ elif self.settings['swap'] > 0:
+ f.write("/dev/sda2 swap swap defaults 0 0\n")
+
+ def install_debs(self, rootdir):
+ if not self.settings['custom-package']:
+ return
+ self.message('Installing custom packages')
+ tmp = os.path.join(rootdir, 'tmp', 'install_debs')
+ os.mkdir(tmp)
+ for deb in self.settings['custom-package']:
+ shutil.copy(deb, tmp)
+ filenames = [os.path.join('/tmp/install_debs', os.path.basename(deb))
+ for deb in self.settings['custom-package']]
+ out, err, _ = \
+ self.runcmd_unchecked(['chroot', rootdir, 'dpkg', '-i'] + filenames)
+ logging.debug('stdout:\n%s', out)
+ logging.debug('stderr:\n%s', err)
+ out = self.runcmd(['chroot', rootdir,
+ 'apt-get', '-f', '--no-remove', 'install'])
+ logging.debug('stdout:\n%s', out)
+ shutil.rmtree(tmp)
+
+ def cleanup_apt_cache(self, rootdir):
+ out = self.runcmd(['chroot', rootdir, 'apt-get', 'clean'])
+ logging.debug('stdout:\n%s', out)