mirror of
https://github.com/tuna/tunasync-scripts.git
synced 2025-04-20 12:42:50 +00:00
89 lines
2.7 KiB
Python
Executable File
89 lines
2.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
import hashlib
|
|
import traceback
|
|
import json
|
|
import os
|
|
import re
|
|
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"],
|
|
}
|
|
|
|
pattern_os_template = re.compile(r"@\{(.+)\}")
|
|
|
|
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:
|
|
matched = pattern_os_template.search(i)
|
|
if matched:
|
|
for os in OS_TEMPLATE[matched.group(1)]:
|
|
ret.append(pattern_os_template.sub(os, i))
|
|
elif 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()
|
|
failed = []
|
|
|
|
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)
|
|
ret = sp.run(shell_args)
|
|
if ret.returncode != 0:
|
|
failed.append((os, comp, arch))
|
|
if len(failed) > 0:
|
|
print("Failed APT repos: ", failed)
|
|
if args.delete:
|
|
pass #TODO
|
|
|
|
if __name__ == "__main__":
|
|
main()
|