From 8f2aee0a12287966842df28dcca183944d528f9b Mon Sep 17 00:00:00 2001 From: David P Date: Wed, 25 Aug 2021 10:34:59 -0400 Subject: sync with archiso v48 archiso: 8559657 (HEAD -> master, tag: v58, origin/master, origin/HEAD) Merge branch 'changelog/58' fbe48dd (origin/changelog/58) Add changelog for v58 087ee83 Merge remote-tracking branch 'nl6720/fix-unbound-variables-in-_validate_options' d2315bc mkarchiso: error out of iso and netboot build modes if no boot modes are specified f3959d6 mkarchiso: split out build mode specific checks from _validate_options to _validate_requirements_buildmode_* 8d18d8f mkarchiso: fix unbound variable errors in _validate_options parabolaiso: * improve armv7h bootstrap validation * specify on which architecture we are in _make_custom_airootfs Signed-off-by: David P --- parabolaiso/mkparabolaiso | 290 +++++++++++++++++++++++----------------------- 1 file changed, 144 insertions(+), 146 deletions(-) (limited to 'parabolaiso/mkparabolaiso') diff --git a/parabolaiso/mkparabolaiso b/parabolaiso/mkparabolaiso index 9abbba4..73c215e 100755 --- a/parabolaiso/mkparabolaiso +++ b/parabolaiso/mkparabolaiso @@ -329,7 +329,7 @@ _make_custom_airootfs() { install -d -m 0755 -o 0 -g 0 -- "${pacstrap_dir}" if [[ -d "${profile}/airootfs" ]]; then - _msg_info "Copying custom airootfs files..." + _msg_info "Copying custom ${arch} airootfs files..." cp -af --no-preserve=ownership,mode -- "${profile}/airootfs/." "${pacstrap_dir}" # Set ownership and mode for files and directories for filename in "${!file_permissions[@]}"; do @@ -887,7 +887,7 @@ _validate_requirements_airootfs_image_type_erofs() { fi } -_validate_requirements_buildmode_all() { +_validate_common_requirements_buildmode_all() { if ! command -v pacman &> /dev/null; then (( validation_error=validation_error+1 )) _msg_error "Validating build mode '${_buildmode}': pacman is not available on this host. Install 'pacman'!" 0 @@ -903,36 +903,142 @@ _validate_requirements_buildmode_all() { } _validate_requirements_buildmode_bootstrap() { - _validate_requirements_buildmode_all + local bootstrap_pkg_list_from_file=() + + if [[ "${arch}" == "dual" ]]; then + # Check if packages for the bootstrap image are specified for each architecture + for bootstrap_packages in ${bootstrap_packages_dual}; do + if [[ "${bootstrap_packages##*/}" == "bootstrap_packages.both" ]]; then + if [[ -e "${bootstrap_packages}" ]]; then + mapfile -t bootstrap_pkg_list_from_file < \ + <(sed '/^[[:blank:]]*#.*/d;s/#.*//;/^[[:blank:]]*$/d' "${bootstrap_packages}") + bootstrap_pkg_list+=("${bootstrap_pkg_list_from_file[@]}") + if (( ${#bootstrap_pkg_list_from_file[@]} < 1 )); then + (( validation_error=validation_error+1 )) + _msg_error "No package specified in '${bootstrap_packages}'." 0 + fi + else + (( validation_error=validation_error+1 )) + _msg_error "Bootstrap packages file '${bootstrap_packages}' does not exist." 0 + fi + elif [[ -e "${bootstrap_packages}" ]]; then + mapfile -t "bootstrap_pkg_list_from_file_${bootstrap_packages##*.}" < \ + <(sed '/^[[:blank:]]*#.*/d;s/#.*//;/^[[:blank:]]*$/d' "${bootstrap_packages}") + eval "bootstrap_pkg_list_${bootstrap_packages##*.}+=(\${bootstrap_pkg_list_from_file_${bootstrap_packages##*.}[@]})" + fi + done + else + # Check if packages for the bootstrap image are specified + if [[ -e "${bootstrap_packages}" ]]; then + mapfile -t bootstrap_pkg_list_from_file < \ + <(sed '/^[[:blank:]]*#.*/d;s/#.*//;/^[[:blank:]]*$/d' "${bootstrap_packages}") + bootstrap_pkg_list+=("${bootstrap_pkg_list_from_file[@]}") + if (( ${#bootstrap_pkg_list_from_file[@]} < 1 )); then + (( validation_error=validation_error+1 )) + _msg_error "No package specified in '${bootstrap_packages}'." 0 + fi + else + (( validation_error=validation_error+1 )) + _msg_error "Bootstrap packages file '${bootstrap_packages}' does not exist." 0 + fi + fi + + _validate_common_requirements_buildmode_all if ! command -v bsdtar &> /dev/null; then (( validation_error=validation_error+1 )) _msg_error "Validating build mode '${_buildmode}': bsdtar is not available on this host. Install 'libarchive'!" 0 fi if [[ "${arch}" == "armv7h" ]] && [[ ! "$(uname -m)" == armv7? ]]; then - if ! command -v qemu-arm-static &> /dev/null; then - (( validation_error=validation_error+1 )) - _msg_error "Validating build mode '${_buildmode}': qemu-arm-static is not available on this host. Install 'qemu-user-static'!" 0 - fi if [[ ! -e "/usr/lib/binfmt.d/qemu-arm.conf" ]]; then (( validation_error=validation_error+1 )) _msg_error "Validating build mode '${_buildmode}': qemu-user-static-binfmt is not available on this host. Install 'qemu-user-static-binfmt'!" 0 fi - if command -v rc-service &> /dev/null; then - if ! rc-service binfmt status &> /dev/null; then - (( validation_error=validation_error+1 )) - _msg_error "Validating build mode '${_buildmode}': binfmt is not available on this host. Start the binfmt service!" 0 + # Make sure that qemu-static is set up with binfmt_misc + if [[ -z $(grep -l -xF \ + -e "interpreter /usr/bin/qemu-arm-static" \ + -r -- /proc/sys/fs/binfmt_misc 2>/dev/null \ + | xargs -r grep -xF 'enabled') ]] + then + (( validation_error=validation_error+1 )) + _msg_error "Validating build mode '${_buildmode}': binfmt is not available on this host. Start the binfmt service!" 0 + fi + fi +} + +_validate_common_requirements_buildmode_iso_netboot() { + local bootmode + local pkg_list_from_file=() + + # Check if the package list file exists and read packages from it + if [[ "${arch}" == "dual" ]]; then + # Check if the package list files exist and read packages from them for each architecture + for packages in ${packages_dual}; do + if [[ "${packages##*/}" == "packages.both" ]]; then + if [[ -e "${packages}" ]]; then + mapfile -t pkg_list_from_file < <(sed '/^[[:blank:]]*#.*/d;s/#.*//;/^[[:blank:]]*$/d' "${packages}") + pkg_list+=("${pkg_list_from_file[@]}") + if (( ${#pkg_list_from_file[@]} < 1 )); then + (( validation_error=validation_error+1 )) + _msg_error "Packages file '${packages}' does not exist." 0 + fi + else + (( validation_error=validation_error+1 )) + _msg_error "Packages file '${packages}' does not exist." 0 + fi + elif [[ -e "${packages}" ]]; then + mapfile -t "pkg_list_from_file_${packages##*.}" < <(sed '/^[[:blank:]]*#.*/d;s/#.*//;/^[[:blank:]]*$/d' "${packages}") + eval "pkg_list_${packages##*.}+=(\${pkg_list_from_file_${packages##*.}[@]})" fi - elif command -v systemctl &> /dev/null; then - if ! systemctl status systemd-binfmt &> /dev/null; then + done + else + # Check if the package list file exists and read packages from it + if [[ -e "${packages}" ]]; then + mapfile -t pkg_list_from_file < <(sed '/^[[:blank:]]*#.*/d;s/#.*//;/^[[:blank:]]*$/d' "${packages}") + pkg_list+=("${pkg_list_from_file[@]}") + if (( ${#pkg_list_from_file[@]} < 1 )); then (( validation_error=validation_error+1 )) - _msg_error "Validating build mode '${_buildmode}': binfmt is not available on this host. Start the systemd-binfmt service!" 0 + _msg_error "Packages file '${packages}' does not exist." 0 fi + else + (( validation_error=validation_error+1 )) + _msg_error "Packages file '${packages}' does not exist." 0 fi fi + + # Check if the specified bootmodes are supported + if (( ${#bootmodes[@]} < 1 )); then + (( validation_error=validation_error+1 )) + _msg_error "No boot modes specified in '${profile}/profiledef.sh'." 0 + fi + for bootmode in "${bootmodes[@]}"; do + if typeset -f "_make_bootmode_${bootmode}" &> /dev/null; then + if typeset -f "_validate_requirements_bootmode_${bootmode}" &> /dev/null; then + "_validate_requirements_bootmode_${bootmode}" + else + _msg_warning "Function '_validate_requirements_bootmode_${bootmode}' does not exist. Validating the requirements of '${bootmode}' boot mode will not be possible." + fi + else + (( validation_error=validation_error+1 )) + _msg_error "${bootmode} is not a valid boot mode!" 0 + fi + done + + # Check if the specified airootfs_image_type is supported + if typeset -f "_mkairootfs_${airootfs_image_type}" &> /dev/null; then + if typeset -f "_validate_requirements_airootfs_image_type_${airootfs_image_type}" &> /dev/null; then + "_validate_requirements_airootfs_image_type_${airootfs_image_type}" + else + _msg_warning "Function '_validate_requirements_airootfs_image_type_${airootfs_image_type}' does not exist. Validating the requirements of '${airootfs_image_type}' airootfs image type will not be possible." + fi + else + (( validation_error=validation_error+1 )) + _msg_error "Unsupported image type: '${airootfs_image_type}'" 0 + fi } _validate_requirements_buildmode_iso() { - _validate_requirements_buildmode_all + _validate_common_requirements_buildmode_iso_netboot + _validate_common_requirements_buildmode_all if ! command -v awk &> /dev/null; then (( validation_error=validation_error+1 )) _msg_error "Validating build mode '${_buildmode}': awk is not available on this host. Install 'awk'!" 0 @@ -940,7 +1046,27 @@ _validate_requirements_buildmode_iso() { } _validate_requirements_buildmode_netboot() { - _validate_requirements_buildmode_all + local _override_cert_list=() + + if [[ "${sign_netboot_artifacts}" == "y" ]]; then + # Check if the certificate files exist + for _cert in "${cert_list[@]}"; do + if [[ -e "${_cert}" ]]; then + _override_cert_list+=("$(realpath -- "${_cert}")") + else + (( validation_error=validation_error+1 )) + _msg_error "File '${_cert}' does not exist." 0 + fi + done + cert_list=("${_override_cert_list[@]}") + # Check if there are at least two certificate files + if (( ${#cert_list[@]} < 2 )); then + (( validation_error=validation_error+1 )) + _msg_error "Two certificates are required for codesigning, but '${cert_list[*]}' is provided." 0 + fi + fi + _validate_common_requirements_buildmode_iso_netboot + _validate_common_requirements_buildmode_all if ! command -v openssl &> /dev/null; then (( validation_error=validation_error+1 )) _msg_error "Validating build mode '${_buildmode}': openssl is not available on this host. Install 'openssl'!" 0 @@ -1195,112 +1321,9 @@ _read_profile() { # Validate set options _validate_options() { - local validation_error=0 bootmode _cert _buildmode - local pkg_list_from_file=() - # shellcheck disable=SC2034 - local pkg_list_from_file_i686=() - # shellcheck disable=SC2034 - local pkg_list_from_file_x86_64=() - local bootstrap_pkg_list_from_file=() - # shellcheck disable=SC2034 - local bootstrap_pkg_list_from_file_i686=() - # shellcheck disable=SC2034 - local bootstrap_pkg_list_from_file_x86_64=() - local _override_cert_list=() + local validation_error=0 _buildmode _msg_info "Validating options..." - if [[ "${arch}" == "dual" ]]; then - # Check if the package list files exist and read packages from them for each architecture - # shellcheck disable=SC2128 - for packages in ${packages_dual}; do - if [[ "${packages##*/}" == "packages.both" ]]; then - if [[ -e "${packages}" ]]; then - mapfile -t pkg_list_from_file < <(sed '/^[[:blank:]]*#.*/d;s/#.*//;/^[[:blank:]]*$/d' "${packages}") - pkg_list+=("${pkg_list_from_file[@]}") - if (( ${#pkg_list_from_file} < 1 )); then - (( validation_error=validation_error+1 )) - _msg_error "Packages file '${packages}' does not exist." 0 - fi - else - (( validation_error=validation_error+1 )) - _msg_error "Packages file '${packages}' does not exist." 0 - fi - elif [[ -e "${packages}" ]]; then - mapfile -t "pkg_list_from_file_${packages##*.}" < <(sed '/^[[:blank:]]*#.*/d;s/#.*//;/^[[:blank:]]*$/d' "${packages}") - eval "pkg_list_${packages##*.}+=(\${pkg_list_from_file_${packages##*.}[@]})" - fi - done - - # Check if packages for the bootstrap image are specified for each architecture - if [[ "${buildmodes[*]}" == *bootstrap* ]]; then - for bootstrap_packages in ${bootstrap_packages_dual}; do - if [[ "${bootstrap_packages##*/}" == "bootstrap_packages.both" ]]; then - if [[ -e "${bootstrap_packages}" ]]; then - mapfile -t bootstrap_pkg_list_from_file < \ - <(sed '/^[[:blank:]]*#.*/d;s/#.*//;/^[[:blank:]]*$/d' "${bootstrap_packages}") - bootstrap_pkg_list+=("${bootstrap_pkg_list_from_file[@]}") - if (( ${#bootstrap_pkg_list_from_file} < 1 )); then - (( validation_error=validation_error+1 )) - _msg_error "No package specified in '${bootstrap_packages}'." 0 - fi - else - (( validation_error=validation_error+1 )) - _msg_error "Bootstrap packages file '${bootstrap_packages}' does not exist." 0 - fi - elif [[ -e "${bootstrap_packages}" ]]; then - mapfile -t "bootstrap_pkg_list_from_file_${bootstrap_packages##*.}" < \ - <(sed '/^[[:blank:]]*#.*/d;s/#.*//;/^[[:blank:]]*$/d' "${bootstrap_packages}") - eval "bootstrap_pkg_list_${bootstrap_packages##*.}+=(\${bootstrap_pkg_list_from_file_${bootstrap_packages##*.}[@]})" - fi - done - fi - else - # Check if the package list file exists and read packages from it - if [[ -e "${packages}" ]]; then - mapfile -t pkg_list_from_file < <(sed '/^[[:blank:]]*#.*/d;s/#.*//;/^[[:blank:]]*$/d' "${packages}") - pkg_list+=("${pkg_list_from_file[@]}") - if (( ${#pkg_list_from_file} < 1 )); then - (( validation_error=validation_error+1 )) - _msg_error "Packages file '${packages}' does not exist." 0 - fi - else - (( validation_error=validation_error+1 )) - _msg_error "Packages file '${packages}' does not exist." 0 - fi - - # Check if packages for the bootstrap image are specified - if [[ "${buildmodes[*]}" == *bootstrap* ]]; then - if [[ -e "${bootstrap_packages}" ]]; then - mapfile -t bootstrap_pkg_list_from_file < \ - <(sed '/^[[:blank:]]*#.*/d;s/#.*//;/^[[:blank:]]*$/d' "${bootstrap_packages}") - bootstrap_pkg_list+=("${bootstrap_pkg_list_from_file[@]}") - if (( ${#bootstrap_pkg_list_from_file} < 1 )); then - (( validation_error=validation_error+1 )) - _msg_error "No package specified in '${bootstrap_packages}'." 0 - fi - else - (( validation_error=validation_error+1 )) - _msg_error "Bootstrap packages file '${bootstrap_packages}' does not exist." 0 - fi - fi - fi - if [[ "${sign_netboot_artifacts}" == "y" ]]; then - # Check if the certificate files exist - for _cert in "${cert_list[@]}"; do - if [[ -e "${_cert}" ]]; then - _override_cert_list+=("$(realpath -- "${_cert}")") - else - (( validation_error=validation_error+1 )) - _msg_error "File '${_cert}' does not exist." 0 - fi - done - cert_list=("${_override_cert_list[@]}") - # Check if there are at least two certificate files - if (( "${#cert_list[@]}" < 2 )); then - (( validation_error=validation_error+1 )) - _msg_error "Two certificates are required for codesigning, but '${cert_list[*]}' is provided." 0 - fi - fi # Check if pacman configuration file exists if [[ ! -e "${pacman_conf}" ]]; then (( validation_error=validation_error+1 )) @@ -1321,31 +1344,6 @@ _validate_options() { fi done - # Check if the specified bootmodes are supported - for bootmode in "${bootmodes[@]}"; do - if typeset -f "_make_bootmode_${bootmode}" &> /dev/null; then - if typeset -f "_validate_requirements_bootmode_${bootmode}" &> /dev/null; then - "_validate_requirements_bootmode_${bootmode}" - else - _msg_warning "Function '_validate_requirements_bootmode_${bootmode}' does not exist. Validating the requirements of '${bootmode}' boot mode will not be possible." - fi - else - (( validation_error=validation_error+1 )) - _msg_error "${bootmode} is not a valid boot mode!" 0 - fi - done - # Check if the specified airootfs_image_type is supported - if typeset -f "_mkairootfs_${airootfs_image_type}" &> /dev/null; then - if typeset -f "_validate_requirements_airootfs_image_type_${airootfs_image_type}" &> /dev/null; then - "_validate_requirements_airootfs_image_type_${airootfs_image_type}" - else - _msg_warning "Function '_validate_requirements_airootfs_image_type_${airootfs_image_type}' does not exist. Validating the requirements of '${airootfs_image_type}' airootfs image type will not be possible." - fi - else - (( validation_error=validation_error+1 )) - _msg_error "Unsupported image type: '${airootfs_image_type}'" 0 - fi - if (( validation_error )); then _msg_error "${validation_error} errors were encountered while validating the profile. Aborting." 1 fi @@ -1356,7 +1354,7 @@ _validate_options() { _set_overrides() { # Set variables that have command line overrides [[ ! -v override_buildmodes ]] || buildmodes=("${override_buildmodes[@]}") - if (( "${#buildmodes[@]}" < 1 )); then + if (( ${#buildmodes[@]} < 1 )); then buildmodes+=('iso') fi if [[ -v override_work_dir ]]; then -- cgit v1.2.2