#!/usr/bin/env bash set -e; ### # Settings ### # These can all be changed via environment variables. clone_url="${clone_url:-https://github.com/bitnami/minideb.git}"; image_version="${image_version:-buster}"; apply_patch_raspbian="${apply_patch_raspbian:-true}"; setup_proxy="${setup_proxy:-true}"; proxy_address="${proxy_address:-http://172.16.230.100:3142}"; ############################################################################### target_directory="${1}"; # Ref https://stackoverflow.com/a/911213/1460422 if [ -t 1 ] || [[ ! -z "${FORCE_COLOUR}" ]]; then ################### # From lantern.sh # RS="\033[0m" # reset HC="\033[1m" # hicolor LC="\033[2m" # locolor / dim ################### fi if [[ -z "${target_directory}" ]]; then echo "Usage:" >&2; echo " $0 {target_directory}" >&2; echo "" >&2; echo "" >&2; exit 0; fi if [[ "${UID}" -ne "0" ]]; then echo "Error: This script must be run as root (as we need to chroot to complete the setup)" >&2; echo "Additional information: You ran this script as ${USER} with uid ${UID}, but we expected uid 0" >&2; exit 1; fi if [[ ! -d "${target_directory}" ]]; then mkdir -p "${target_directory}"; fi target_directory="$(realpath "${target_directory}")"; ############################################################################### run_in_chroot() { if [[ ! -d "${temp_dir_postprocess}" ]] || [[ -z "${temp_dir_postprocess}" ]]; then echo "Error: Target directory '${temp_dir_postprocess}' does not exist, so can't chroot into it." >&2; echo "Additional Information: You tried to run '${*}'" >&2; return 1; fi chroot "${temp_dir_postprocess}" "$@"; } log_msg() { echo -e "\n${HC}>>>${RS} ${LC}[ ${SECONDS} ]${RS} $*\n" } ############################################################################### # Make sure the current directory is the location of this script to simplify matters cd "$(dirname "$(readlink -f "$0")")"; config_dir="${PWD}"; temp_dir="$(mktemp --tmpdir -d "minideb-build-XXXXXXX")"; temp_dir_postprocess="${temp_dir}/minideb-${image_version}"; temp_dir_build="$(mktemp -d "${config_dir}/minideb-tmp-XXXXXXX")"; on_exit() { rm -rf "${temp_dir}"; if [[ -e "${temp_dir_build}" ]]; then rm -rf "${temp_dir_build}"; fi } trap on_exit EXIT; ############################################################################### log_msg "Cloning minideb"; git clone "${clone_url}" "${temp_dir}/minideb"; cd "${temp_dir}/minideb"; if [[ "${apply_patch_raspbian}" == "true" ]]; then log_msg "Applying Raspbian patch"; git apply "${config_dir}/minideb-raspbian.patch"; fi log_msg "Building minideb base image"; # Must be run as root time TMPDIR="${temp_dir_build}" make "${image_version}"; cp -r "${temp_dir}/minideb/build" "${temp_dir}/build"; filename_tar="$(find "${temp_dir}/build" -name '*.tar' -print -quit)"; log_msg "Unpacking resulting tar archive"; mkdir "${temp_dir_postprocess}"; tar -xf "${filename_tar}" -C "${temp_dir_postprocess}"; # We're finished with minideb now rm -rf "${temp_dir}/minideb"; ############################################################################### if [[ "${setup_proxy}" == "true" ]]; then log_msg "Applying apt proxy settings"; echo "Acquire::http { Proxy \"${proxy_address}\"; }" | run_in_chroot tee /etc/apt/apt.conf.d/proxy fi # # Fix /dev/null - ref https://unix.stackexchange.com/a/146639/64687 # run_in_chroot rm -f /dev/null; # run_in_chroot mknod -m 666 /dev/null c 1 3; # run_in_chroot mknod -m 666 /dev/zero c 1 5 # run_in_chroot chown root:root /dev/null /dev/zero # run_in_chroot install_packages gnupg; log_msg "Adding aptosaurus GPG key"; # Add apt.starbeamrainbowlabs.com # No need to apt update, because install_packages will do this for us # Ref https://github.com/bitnami/minideb/blob/6c039b8/mkimage#L181-L206 # Also ref https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=851774 gpg_key_url="https://apt.starbeamrainbowlabs.com/aptosaurus.asc"; echo "deb http://apt.starbeamrainbowlabs.com/ /" | run_in_chroot tee /etc/apt/sources.list.d/sbrl.list; curl -sSL "${gpg_key_url}" | run_in_chroot sh -c 'cat >/etc/apt/trusted.gpg.d/sbrl-aptosaurus.asc'; ############################################################################### # Repack the tar file log_msg "Repacking archive"; cd "${temp_dir_postprocess}" || { echo "Failed to cd to unpacked archive directory"; exit 1; }; tar -caf "${target_directory}/minideb.tar.gz" .; cp "${filename_tar}.log" "${target_directory}/minideb.log"; cp "${filename_tar}.manifest" "${target_directory}/minideb.manifest"; log_msg "Written result to ${target_directory}:"; ls -htFl "${target_directory}";