def debootstrap(rootfs, arch=system_arch(), suite='wily', include=[]): sources = crawl_sources(arch, suite) foreign = arch != system_arch() cmd = 'debootstrap --arch={} --variant={} {} {} {} {} {}'.format( arch, 'minbase', '--foreign' if foreign else '', '--include={}'.format(','.join(include)) if include else '', suite, rootfs, primary_mirror(sources) ) print(cmd) shell.bash(cmd)
def crawl_sources(arch, suite): mirrors = [ # Debian 'http://ftp.pt.debian.org/debian/', # Ubuntu # 'http://archive.ubuntu.com/ubuntu', # 'http://mirrors.fe.up.pt/ubuntu', 'http://pt.archive.ubuntu.com/ubuntu', # Ubuntu arm 'http://ports.ubuntu.com/ubuntu-ports', # Ubuntu extra 'http://archive.canonical.com/ubuntu', 'http://extras.ubuntu.com/ubuntu', ] sources = OrderedDict() # Get distributions for mirror in mirrors: sources[mirror] = OrderedDict() content = shell.stdout('wget -qO- {}/dists'.format(mirror)) regex = r'<a href="({}[a-zA-Z0-9-]*)/">'.format(suite) for distribution in re.findall(regex, content, re.M): sources[mirror][distribution] = [] # Get components for mirror, distributions in sources.items(): for distribution, components in distributions.items(): content = shell.stdout('wget -qO- {}/dists/{}/Release'.format(mirror, distribution)) regex = r'([a-zA-Z0-9-]+)/binary-{}/Release$'.format(arch) for component in re.findall(regex, content, re.M): if component not in components: components.append(component) # Cleanup for mirror, distributions in dict(sources).items(): for distribution, components in dict(distributions).items(): if any(sub in distribution for sub in ['-proposed', '-backports']): del distributions[distribution] continue for component in list(components): if not shell.bash('wget -qO/dev/null {}/dists/{}/{}/binary-{}/Release'.format(mirror, distribution, component, arch)): components.remove(component) if not components: del distributions[distribution] if not distributions: del sources[mirror] return sources