2016-04-11 06:21:07 +00:00
log (){
2018-03-02 20:08:24 +00:00
date +"[%T] $*" | tee -a "${LOG_FILE}"
2016-04-11 06:21:07 +00:00
}
2016-05-04 14:51:41 +00:00
export -f log
2016-04-11 06:21:07 +00:00
bootstrap(){
2017-01-23 12:44:03 +00:00
local ARCH
ARCH=$(dpkg --print-architecture)
2016-04-11 06:21:07 +00:00
export http_proxy=${APT_PROXY}
if [ "$ARCH" != "armhf" ]; then
2016-05-27 10:54:56 +00:00
local BOOTSTRAP_CMD=qemu-debootstrap
2016-04-11 06:21:07 +00:00
else
2016-05-27 10:54:56 +00:00
local BOOTSTRAP_CMD=debootstrap
2016-04-11 06:21:07 +00:00
fi
2018-03-02 20:08:24 +00:00
capsh --drop=cap_setfcap -- "${BOOTSTRAP_CMD}" --components=main,contrib,non-free \
2017-05-10 12:08:02 +00:00
--arch armhf \
--keyring "${STAGE_DIR}/files/raspberrypi.gpg" \
2018-10-11 15:29:31 +00:00
"$1" "$2" "$3" || true
2018-10-15 08:12:13 +00:00
if [ -d "$2/debootstrap" ]; then
rmdir "$2/debootstrap"
fi
2016-04-11 06:21:07 +00:00
}
2016-05-04 14:51:41 +00:00
export -f bootstrap
2016-04-11 06:21:07 +00:00
copy_previous(){
2017-01-23 12:44:03 +00:00
if [ ! -d "${PREV_ROOTFS_DIR}" ]; then
2016-04-11 06:21:07 +00:00
echo "Previous stage rootfs not found"
false
fi
2017-01-23 12:44:03 +00:00
mkdir -p "${ROOTFS_DIR}"
2017-03-30 16:51:23 +00:00
rsync -aHAXx --exclude var/cache/apt/archives "${PREV_ROOTFS_DIR}/" "${ROOTFS_DIR}/"
2016-04-11 06:21:07 +00:00
}
2016-05-04 14:51:41 +00:00
export -f copy_previous
2016-04-11 06:21:07 +00:00
unmount(){
if [ -z "$1" ]; then
DIR=$PWD
else
DIR=$1
fi
2017-01-23 12:44:03 +00:00
while mount | grep -q "$DIR"; do
local LOCS
LOCS=$(mount | grep "$DIR" | cut -f 3 -d ' ' | sort -r)
2016-04-11 06:21:07 +00:00
for loc in $LOCS; do
2017-01-23 12:44:03 +00:00
umount "$loc"
2016-04-11 06:21:07 +00:00
done
done
}
2016-05-04 14:51:41 +00:00
export -f unmount
unmount_image(){
sync
sleep 1
2017-01-23 12:44:03 +00:00
local LOOP_DEVICES
LOOP_DEVICES=$(losetup -j "${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}"
2016-05-27 10:54:56 +00:00
fi
2017-01-23 12:44:03 +00:00
done
2016-05-04 14:51:41 +00:00
}
export -f unmount_image
2016-04-11 06:21:07 +00:00
on_chroot() {
2017-01-23 12:44:03 +00:00
if ! mount | grep -q "$(realpath "${ROOTFS_DIR}"/proc)"; then
mount -t proc proc "${ROOTFS_DIR}/proc"
2016-04-11 06:21:07 +00:00
fi
2017-01-23 12:44:03 +00:00
if ! mount | grep -q "$(realpath "${ROOTFS_DIR}"/dev)"; then
mount --bind /dev "${ROOTFS_DIR}/dev"
2016-04-11 06:21:07 +00:00
fi
2016-04-16 14:02:48 +00:00
2017-01-23 12:44:03 +00:00
if ! mount | grep -q "$(realpath "${ROOTFS_DIR}"/dev/pts)"; then
mount --bind /dev/pts "${ROOTFS_DIR}/dev/pts"
2016-04-16 14:02:48 +00:00
fi
2016-04-11 06:21:07 +00:00
2017-01-23 12:44:03 +00:00
if ! mount | grep -q "$(realpath "${ROOTFS_DIR}"/sys)"; then
mount --bind /sys "${ROOTFS_DIR}/sys"
2016-04-11 06:21:07 +00:00
fi
2018-11-07 19:41:35 +00:00
capsh --drop=cap_setfcap "--chroot=${ROOTFS_DIR}/" -- -e "$@"
2016-04-11 06:21:07 +00:00
}
2016-05-04 14:51:41 +00:00
export -f on_chroot
2016-04-11 06:21:07 +00:00
update_issue() {
2017-01-23 12:44:03 +00:00
local GIT_HASH
GIT_HASH=$(git rev-parse HEAD)
2019-02-18 09:22:58 +00:00
echo -e "FRCVision ${IMG_VERSION} built on ${IMG_DATE}\nGenerated using pi-gen, https://github.com/allwpilib/FRCVision-pi-gen, ${GIT_HASH}, ${1}" > "${ROOTFS_DIR}/etc/rpi-issue"
2016-04-11 06:21:07 +00:00
}
2016-05-04 14:51:41 +00:00
export -f update_issue
2017-01-23 12:44:03 +00:00