burrow-pi-img/scripts/common
Daniel F. Dickinson 3f2ff883c3 Allow customizing exports (images) and document
There are use cases where pi-gen can be useful that need different
image generation that the current defaults.  Rather than force such
users to require carrying modified versions of the default exports,
allow users to specify alternate exports (e.g. instead of export-image
and export-noobs, or in addition to these).  We do this using a
mechanism similar to STAGE_LIST, except that the lists of images are
per-stage and default to paying attention to the presence of
EXPORT_IMAGE and EXPORT_NOOBS as is currently the case.

Signed-off-by: Daniel F. Dickinson <cshored@thecshore.com>
2020-01-16 09:59:52 -05:00

127 lines
2.9 KiB
Plaintext

log (){
date +"[%T] $*" | tee -a "${LOG_FILE}"
}
export -f log
bootstrap(){
local BOOTSTRAP_CMD=debootstrap
local BOOTSTRAP_ARGS=()
export http_proxy=${APT_PROXY}
if [ "$(dpkg --print-architecture)" != "armhf" ] && [ "$(dpkg --print-architecture)" != "aarch64" ]; then
BOOTSTRAP_CMD=qemu-debootstrap
fi
BOOTSTRAP_ARGS+=(--arch armhf)
BOOTSTRAP_ARGS+=(--components "main,contrib,non-free")
BOOTSTRAP_ARGS+=(--keyring "${STAGE_DIR}/files/raspberrypi.gpg")
BOOTSTRAP_ARGS+=("$@")
printf -v BOOTSTRAP_STR '%q ' "${BOOTSTRAP_ARGS[@]}"
setarch linux32 capsh --drop=cap_setfcap -- -c "'${BOOTSTRAP_CMD}' $BOOTSTRAP_STR" || true
if [ -d "$2/debootstrap" ]; then
rmdir "$2/debootstrap"
fi
}
export -f bootstrap
copy_previous(){
if [ ! -d "${PREV_ROOTFS_DIR}" ]; then
echo "Previous stage rootfs not found"
false
fi
mkdir -p "${ROOTFS_DIR}"
rsync -aHAXx --exclude var/cache/apt/archives "${PREV_ROOTFS_DIR}/" "${ROOTFS_DIR}/"
}
export -f copy_previous
unmount(){
if [ -z "$1" ]; then
DIR=$PWD
else
DIR=$1
fi
while mount | grep -q "$DIR"; do
local LOCS
LOCS=$(mount | grep "$DIR" | cut -f 3 -d ' ' | sort -r)
for loc in $LOCS; do
umount "$loc"
done
done
}
export -f unmount
unmount_image(){
sync
sleep 1
local LOOP_DEVICES
LOOP_DEVICES=$(losetup --list | grep "$(basename "${1}")" | cut -f1 -d' ')
for LOOP_DEV in ${LOOP_DEVICES}; do
if [ -n "${LOOP_DEV}" ]; then
local MOUNTED_DIR
MOUNTED_DIR=$(mount | grep "$(basename "${LOOP_DEV}")" | head -n 1 | cut -f 3 -d ' ')
if [ -n "${MOUNTED_DIR}" ] && [ "${MOUNTED_DIR}" != "/" ]; then
unmount "$(dirname "${MOUNTED_DIR}")"
fi
sleep 1
losetup -d "${LOOP_DEV}"
fi
done
}
export -f unmount_image
on_chroot() {
if ! mount | grep -q "$(realpath "${ROOTFS_DIR}"/proc)"; then
mount -t proc proc "${ROOTFS_DIR}/proc"
fi
if ! mount | grep -q "$(realpath "${ROOTFS_DIR}"/dev)"; then
mount --bind /dev "${ROOTFS_DIR}/dev"
fi
if ! mount | grep -q "$(realpath "${ROOTFS_DIR}"/dev/pts)"; then
mount --bind /dev/pts "${ROOTFS_DIR}/dev/pts"
fi
if ! mount | grep -q "$(realpath "${ROOTFS_DIR}"/sys)"; then
mount --bind /sys "${ROOTFS_DIR}/sys"
fi
setarch linux32 capsh --drop=cap_setfcap "--chroot=${ROOTFS_DIR}/" -- -e "$@"
}
export -f on_chroot
update_issue() {
echo -e "Raspberry Pi reference ${IMG_DATE}\nGenerated using ${PI_GEN}, ${PI_GEN_REPO}, ${GIT_HASH}, ${1}" > "${ROOTFS_DIR}/etc/rpi-issue"
}
export -f update_issue
get_stage_export() {
local stage_dir="$1"
local stage_var
stage_var="$(echo "$(basename "$1")"|tr '\- :/' '_')"
local export_list_var
export_list_var="\$${stage_var}"_EXPORT_LIST
eval EXPORT_LIST="$export_list_var"
if [ -z "${EXPORT_LIST}" ]; then
if [ -e "$stage_dir"/EXPORT_IMAGE ]; then
EXPORT_LIST="export-image"
fi
if [ -e "$stage_dir"/EXPORT_NOOBS ]; then
EXPORT_LIST="${EXPORT_LIST} export-noobs"
fi
fi
EXPORT_STAGE="$(basename "$1")"
export EXPORT_STAGE
export EXPORT_LIST
}
export -f get_stage_export