Support specify addr family and different arches for codenames in apt-sync.py

Signed-off-by: Harry Chen <i@harrychen.xyz>
This commit is contained in:
Harry Chen 2023-12-03 18:03:13 +08:00
parent 0707089bdb
commit ddea9a858b

View File

@ -1,12 +1,10 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import hashlib import hashlib
import traceback import traceback
import json
import os import os
import re import re
import shutil import shutil
import subprocess as sp import subprocess as sp
import tempfile
import argparse import argparse
import bz2 import bz2
import gzip import gzip
@ -14,14 +12,22 @@ import lzma
import time import time
from email.utils import parsedate_to_datetime from email.utils import parsedate_to_datetime
from pathlib import Path from pathlib import Path
from typing import List, Dict, Set, Tuple, IO from typing import List, Dict, Tuple
import requests import requests
import socket
APT_SYNC_USER_AGENT = os.getenv("APT_SYNC_USER_AGENT", "APT-Mirror-Tool/1.0") APT_SYNC_USER_AGENT = os.getenv("APT_SYNC_USER_AGENT", "APT-Mirror-Tool/1.0")
requests.utils.default_user_agent = lambda: APT_SYNC_USER_AGENT requests.utils.default_user_agent = lambda: APT_SYNC_USER_AGENT
# set preferred address family
import requests.packages.urllib3.util.connection as urllib3_cn
USE_ADDR_FAMILY = os.getenv('USE_ADDR_FAMILY', '').strip().lower()
if USE_ADDR_FAMILY != '':
assert USE_ADDR_FAMILY in ['ipv4', 'ipv6'], "USE_ADDR_FAMILY must be either ipv4 or ipv6"
urllib3_cn.allowed_gai_family = lambda: socket.AF_INET if USE_ADDR_FAMILY == 'ipv4' else socket.AF_INET6
OS_TEMPLATE = { OS_TEMPLATE = {
'ubuntu-lts': ["bionic", "focal", "jammy"], 'ubuntu-lts': ["bionic", "focal", "jammy"],
'debian-current': ["buster", "bullseye", "bookworm"], 'debian-current': ["buster", "bullseye", "bookworm"],
@ -311,20 +317,35 @@ def main():
help='print package files to be deleted only') help='print package files to be deleted only')
args = parser.parse_args() args = parser.parse_args()
# generate lists of os codenames
os_list = args.os_version.split(',') os_list = args.os_version.split(',')
check_args("os_version", os_list) check_args("os_version", os_list)
os_list = replace_os_template(os_list)
# generate lists of components
component_list = args.component.split(',') component_list = args.component.split(',')
check_args("component", component_list) check_args("component", component_list)
arch_list = args.arch.split(',')
check_args("arch", arch_list)
os_list = replace_os_template(os_list) # generate arch list for each os codename
if ';' in args.arch:
# specify arches for each os
arch_lists = []
for arches in args.arch.split(';'):
arch_list = arches.split(',')
check_args("arch", arch_list)
arch_lists.append(arch_list)
assert len(arch_lists) == len(os_list), "arches must be specified for each os"
else:
# use same arches for all os
arch_list = args.arch.split(',')
check_args("arch", arch_list)
arch_lists = [arch_list] * len(os_list)
args.working_dir.mkdir(parents=True, exist_ok=True) args.working_dir.mkdir(parents=True, exist_ok=True)
failed = [] failed = []
deb_set = {} deb_set = {}
for os in os_list: for os, arch_list in zip(os_list, arch_lists):
for comp in component_list: for comp in component_list:
for arch in arch_list: for arch in arch_list:
if apt_mirror(args.base_url, os, comp, arch, args.working_dir, deb_set=deb_set) != 0: if apt_mirror(args.base_url, os, comp, arch, args.working_dir, deb_set=deb_set) != 0: