#!/usr/bin/env python3 import hashlib import traceback import json import os import shutil import subprocess as sp import tempfile import argparse from pathlib import Path from typing import List OS_TEMPLATE = { 'ubuntu-current': ["trusty", "xenial", "bionic", "eoan"], 'ubuntu-lts': ["trusty", "xenial", "bionic"], 'debian-current': ["jessie", "stretch", "buster"], } apt_download = Path(__file__).parent / "helpers" / "apt-download-binary" if not apt_download.is_file(): raise OSError(f"File not found: {apt_download}") def check_args(prop: str, lst: List[str]): for s in lst: if len(s)==0 or ' ' in s: raise ValueError(f"Invalid item in {prop}: {repr(s)}") def replace_os_template(os_list: List[str]) -> List[str]: ret = [] for i in os_list: if i.startswith('@'): ret.extend(OS_TEMPLATE[i[1:]]) else: ret.append(i) return ret def main(): parser = argparse.ArgumentParser() parser.add_argument("base_url", type=str, help="base URL") parser.add_argument("os_version", type=str, help="e.g. buster,@ubuntu-lts") parser.add_argument("component", type=str, help="e.g. multiverse,contrib") parser.add_argument("arch", type=str, help="e.g. i386,amd64") parser.add_argument("working_dir", type=Path, help="working directory") parser.add_argument("--delete", action='store_true', help='delete unreferenced package files') args = parser.parse_args() os_list = args.os_version.split(',') check_args("os_version", os_list) component_list = args.component.split(',') check_args("component", component_list) arch_list = args.arch.split(',') check_args("arch", arch_list) os_list = replace_os_template(os_list) args.working_dir.mkdir(parents=True, exist_ok=True) filelist = tempfile.mkstemp() for os in os_list: for comp in component_list: for arch in arch_list: shell_args = [ str(apt_download.absolute()), args.base_url, os, comp, arch, str(args.working_dir.absolute()), filelist[1] ] print(shell_args) sp.run(shell_args) if args.delete: pass #TODO if __name__ == "__main__": main()