135 lines
5.3 KiB
Python
135 lines
5.3 KiB
Python
#!/usr/bin/env python3
|
||
|
||
# ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹
|
||
# SPDX-License-Identifier: GPL-2.0
|
||
# Copyright (c) 2023 Ricardo Pardini <ricardo@pardini.net>
|
||
# This file is a part of the Armbian Build Framework https://github.com/armbian/build/
|
||
# ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹
|
||
import json
|
||
import logging
|
||
import os
|
||
|
||
import sys
|
||
|
||
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||
|
||
from common import armbian_utils
|
||
|
||
# Prepare logging
|
||
armbian_utils.setup_logging()
|
||
log: logging.Logger = logging.getLogger("repo-reprepro")
|
||
|
||
# This is called like this:
|
||
# /usr/bin/python3 /armbian/lib/tools/info/repo-reprero.py /armbian/output/info/debs-to-repo-info.json /armbian/output/info/reprepro /armbian/output/info/reprepro/conf
|
||
|
||
debs_info_json_path = sys.argv[1]
|
||
reprepro_script_output_dir = sys.argv[2]
|
||
reprepro_conf_output_dir = sys.argv[3]
|
||
|
||
reprepro_conf_distributions_fn = os.path.join(reprepro_conf_output_dir, f"distributions")
|
||
reprepro_conf_options_fn = os.path.join(reprepro_conf_output_dir, f"options")
|
||
reprepro_output_script_fn = os.path.join(reprepro_script_output_dir, f"reprepro.sh")
|
||
|
||
# From the environment...
|
||
gpg_keyid = armbian_utils.get_from_env("REPO_GPG_KEYID")
|
||
|
||
# read the json file
|
||
with open(debs_info_json_path) as f:
|
||
artifact_debs = json.load(f)
|
||
|
||
# Now aggregate all repo_targets and their artifacts.
|
||
# This will be used to generate the reprepro config file.
|
||
repo_targets: dict[str, list] = {}
|
||
for artifact in artifact_debs:
|
||
one_repo_target = artifact["repo_target"]
|
||
if one_repo_target not in repo_targets:
|
||
repo_targets[one_repo_target] = []
|
||
repo_targets[one_repo_target].append(artifact)
|
||
|
||
# for each target
|
||
log.info(f"Generating repo config...")
|
||
|
||
all_distro_lines: list[str] = []
|
||
for one_repo_target in repo_targets:
|
||
distro_dict: dict[str, str] = {}
|
||
distro_dict["Origin"] = f"Armbian origin {one_repo_target}"
|
||
distro_dict["Label"] = f"Armbian label {one_repo_target}"
|
||
distro_dict["Codename"] = f"{one_repo_target}"
|
||
distro_dict["Suite"] = f"{one_repo_target}"
|
||
distro_dict["Architectures"] = "amd64 armhf arm64 riscv64"
|
||
distro_dict["Components"] = "main"
|
||
distro_dict["Description"] = f"Apt repository for Armbian"
|
||
if (gpg_keyid is not None) and (gpg_keyid != ""):
|
||
log.warning(f'Using REPO_GPG_KEYID from environment: {gpg_keyid}')
|
||
distro_dict["SignWith"] = gpg_keyid
|
||
else:
|
||
log.warning(f"Didn't get REPO_GPG_KEYID from environment. Will not sign the repo.")
|
||
|
||
for key in distro_dict:
|
||
all_distro_lines.append(f"{key}: {distro_dict[key]}")
|
||
all_distro_lines.append("")
|
||
|
||
# create the reprerepo distributions file for the target
|
||
with open(reprepro_conf_distributions_fn, "w") as f:
|
||
for line in all_distro_lines:
|
||
log.info(f"| {line}")
|
||
f.write(f"{line}\n")
|
||
log.info(f"Wrote {reprepro_conf_distributions_fn}")
|
||
|
||
options: list[str] = []
|
||
options.append("verbose")
|
||
|
||
# create the reprerepo options file for the target
|
||
with open(reprepro_conf_options_fn, "w") as f:
|
||
for option in options:
|
||
f.write(f"{option}\n")
|
||
log.info(f"Wrote {reprepro_conf_options_fn}")
|
||
|
||
# Prepare the reprepro-invoking bash script
|
||
bash_lines = [
|
||
"#!/bin/bash",
|
||
'set -e',
|
||
'set -o pipefail',
|
||
'mkdir -p "${REPO_CONF_LOCATION}"',
|
||
'cp -rv "${REPREPRO_INFO_DIR}/conf"/* "${REPO_CONF_LOCATION}"/',
|
||
# run clearvanished
|
||
'echo "reprepro clearvanished..."',
|
||
'reprepro -b "${REPO_LOCATION}" --delete clearvanished || echo "clearvanished failed"',
|
||
# run reprepro check
|
||
'echo "reprepro initial check..."',
|
||
'reprepro -b "${REPO_LOCATION}" check || echo "initial check failed"'
|
||
]
|
||
|
||
# Copy the config files to the repo dir (from REPREPRO_INFO_DIR/conf to REPO_CONF_LOCATION script-side)
|
||
|
||
for one_repo_target in repo_targets:
|
||
artifacts = repo_targets[one_repo_target]
|
||
log.info(f"Artifacts for target '{one_repo_target}': {len(artifacts)}")
|
||
all_debs_to_include: list[str] = []
|
||
# for each artifact
|
||
for artifact in artifacts:
|
||
# for each deb
|
||
for key in artifact["debs"]:
|
||
deb = artifact["debs"][key]
|
||
relative_deb_path = deb["relative_deb_path"]
|
||
all_debs_to_include.append(relative_deb_path)
|
||
|
||
all_debs_to_include_quoted = ['"${INCOMING_DEBS_DIR}/' + x + '"' for x in all_debs_to_include]
|
||
|
||
if len(all_debs_to_include) > 0:
|
||
# add all debs to the repop
|
||
cmds = ["reprepro", "-b", '"${REPO_LOCATION}"', "--component", "main", "includedeb", one_repo_target] + all_debs_to_include_quoted
|
||
bash_lines.append(f"echo 'reprepro importing {len(all_debs_to_include_quoted)} debs for target {one_repo_target}...' ")
|
||
bash_lines.append(" ".join(cmds))
|
||
|
||
# Always export at the end
|
||
export_cmds = ["reprepro", "-b", '"${REPO_LOCATION}"', "export"]
|
||
bash_lines.append(f"echo 'reprepro exporting...' ")
|
||
bash_lines.append(" ".join(export_cmds))
|
||
|
||
with open(reprepro_output_script_fn, "w") as f:
|
||
for line in bash_lines:
|
||
f.write(f"{line}\n")
|
||
|
||
log.info(f"Wrote {reprepro_output_script_fn}")
|