#!/bedrock/libexec/busybox sh # # Manjaro Linux bootstrap support # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # version 2 as published by the Free Software Foundation. # # Copyright (c) 2016-2019 Daniel Thau # # shellcheck source=src/slash-bedrock/libexec/brl-fetch . /bedrock/share/common-code trap 'fetch_abort "Unexpected error occurred."' EXIT check_supported() { true } speed_test_url() { echo "stable/core/${distro_arch}/core.db.tar.gz" } list_mirrors() { # All mirrors: # Server-side filtered list of mirrors: mirror_list_url='https://repo.manjaro.org' wget -qO- "${mirror_list_url}" | list_links | # Remove the header links, and only list http/https tail -n +5 | grep '^http' } brl_arch_to_distro() { case "${1}" in "x86_64") echo "x86_64" ;; *) abort "brl does not know how to translate arch \"${1}\" to ${distro} format" ;; esac } list_architectures() { echo "x86_64" } default_release() { echo "rolling" } list_releases() { echo "rolling" } setup_pacman() { # Remove auto architecture detection, as it will confuse things like # i686 on an x86_64 box and armv7hl on a aarch64 box. # # Also remove CheckSpace, which sometimes gets confused by Bedrock's # mount setup. sed 's/^Architecture[ \t]*=.*$//' "${1}/etc/pacman.conf" | \ awk -v"a=${distro_arch}" '{print} $0 == "[options]" {print "Architecture = "a}' | \ sed 's/^[ \t]*CheckSpace/# &/' \ > "${1}/etc/pacman.conf-new" mv "${1}/etc/pacman.conf-new" "${1}/etc/pacman.conf" LC_ALL=C chroot "${1}" /usr/bin/update-ca-trust LC_ALL=C chroot "${1}" /usr/bin/pacman-key --init LC_ALL=C chroot "${1}" /usr/bin/pacman-key --populate manjaro archlinux LC_ALL=C chroot "${1}" /usr/bin/pacman-key --refresh-keys if ! grep -q "^Server" "${1}/etc/pacman.d/mirrorlist"; then echo "### Set by Bedrock Linux when acquiring this stratum" >>"${1}/etc/pacman.d/mirrorlist" echo "Server = ${target_mirror}/stable\$repo/\$arch" >>"$1/etc/pacman.d/mirrorlist" fi } fetch() { bootstrap_deps="manjaro-tools-base pacman pacman-mirrors ca-certificates ca-certificates-utils" step "Downloading package information database" wget -O "${bootstrap_dir}/core.db.tar.gz" "${target_mirror}/stable/core/${distro_arch}/core.db.tar.gz" wget -O "${bootstrap_dir}/extra.db.tar.gz" "${target_mirror}/stable/extra/${distro_arch}/extra.db.tar.gz" wget -O "${bootstrap_dir}/community.db.tar.gz" "${target_mirror}/stable/community/${distro_arch}/community.db.tar.gz" step "Decompressing package information database" mkdir -p "${bootstrap_dir}/pacmandb/core" "${bootstrap_dir}/pacmandb/extra" "${bootstrap_dir}/pacmandb/community" ( tar -xv -f "${bootstrap_dir}/core.db.tar.gz" -C "${bootstrap_dir}/pacmandb/core/" tar -xv -f "${bootstrap_dir}/extra.db.tar.gz" -C "${bootstrap_dir}/pacmandb/extra/" tar -xv -f "${bootstrap_dir}/community.db.tar.gz" -C "${bootstrap_dir}/pacmandb/community/" ) | awk 'NR%100==0' | progress_unknown step "Converting distro package information database to brl format" pacmandb_to_brldb "${bootstrap_dir}/pacmandb" "${bootstrap_dir}/brldb" step "Calculating required bootstrap packages" brldb_calculate_required_packages "${bootstrap_dir}/brldb" "${bootstrap_dir}/required_packages" "${bootstrap_deps}" step "Downloading bootstrap packages" # brldb contains repo/filename # files are at mirror/stable/repo/arch/filename checksum_downloads "${cache}/packages/" "$(awk -v"a=${distro_arch}" -v"m=${target_mirror}" '{sub("/", "/"a"/"); print m"/stable/"$0}' "${bootstrap_dir}/required_packages")" step "Extracting bootstrap packages" bootstrap_packages="$(awk -v"d=${cache}/packages/" '{sub(/^.*\//,d);print $1}' "${bootstrap_dir}/required_packages")" extract_pacman_pkgs "${bootstrap_dir}" ${bootstrap_packages} step "Running bootstrap software" # pacstrap mounts devtmpfs (which is shared with the host system) and # chowns files in it based on /etc/passwd and /etc/group. Ensure # system copies of files are used to avoid problematic file ownership # change in /dev. mkdir -p "${target_dir}/etc" cp -a "/etc/passwd" "${target_dir}/etc/passwd" cp -a "/etc/group" "${target_dir}/etc/group" setup_chroot "${bootstrap_dir}" share_cache "packages" "${bootstrap_dir}/target-root/var/cache/pacman/pkg/" # -a to use the api, -P all protocols, -t 1 timeout if it takes longer than 1 second LC_ALL=C chroot "${bootstrap_dir}" pacman-mirrors -a -P all -t 1 # Because there is no default mirrorlist in Manjaro, we have to copy it mkdir -p "${target_dir}/etc/pacman.d" cp "/etc/pacman.d/mirrorlist" "${target_dir}/etc/pacman.d" setup_pacman "${bootstrap_dir}" LC_ALL=C chroot "${bootstrap_dir}" basestrap "/target-root" base step "Configuring" setup_chroot "${target_dir}" setup_pacman "${target_dir}" cp "${cache}/packages/"* "${target_dir}/var/cache/pacman/" if LC_ALL=C chroot "${target_dir}" pacman -Q linux >/dev/null 2>&1; then LC_ALL=C chroot "${target_dir}" pacman --noconfirm -R linux fi }