2017-07-01 23:09:19 -04:00
|
|
|
bootstrap() {
|
2017-01-23 07:44:03 -05:00
|
|
|
local ARCH
|
|
|
|
ARCH=$(dpkg --print-architecture)
|
2016-04-11 02:21:07 -04:00
|
|
|
|
|
|
|
if [ "$ARCH" != "armhf" ]; then
|
2016-05-27 06:54:56 -04:00
|
|
|
local BOOTSTRAP_CMD=qemu-debootstrap
|
2016-04-11 02:21:07 -04:00
|
|
|
else
|
2016-05-27 06:54:56 -04:00
|
|
|
local BOOTSTRAP_CMD=debootstrap
|
2016-04-11 02:21:07 -04:00
|
|
|
fi
|
|
|
|
|
2016-11-14 18:55:45 -05:00
|
|
|
capsh --drop=cap_setfcap -- -c "${BOOTSTRAP_CMD} --components=main,contrib,non-free \
|
2017-05-10 08:08:02 -04:00
|
|
|
--arch armhf \
|
|
|
|
--keyring "${STAGE_DIR}/files/raspberrypi.gpg" \
|
2017-06-20 11:17:12 -04:00
|
|
|
$1 $2 $3" || rmdir "$2/debootstrap"
|
2016-04-11 02:21:07 -04:00
|
|
|
}
|
2016-05-04 10:51:41 -04:00
|
|
|
export -f bootstrap
|
2016-04-11 02:21:07 -04:00
|
|
|
|
2017-07-01 23:09:19 -04:00
|
|
|
copy_previous() {
|
2017-01-23 07:44:03 -05:00
|
|
|
if [ ! -d "${PREV_ROOTFS_DIR}" ]; then
|
2016-04-11 02:21:07 -04:00
|
|
|
echo "Previous stage rootfs not found"
|
|
|
|
false
|
|
|
|
fi
|
2017-01-23 07:44:03 -05:00
|
|
|
mkdir -p "${ROOTFS_DIR}"
|
2017-03-30 12:51:23 -04:00
|
|
|
rsync -aHAXx --exclude var/cache/apt/archives "${PREV_ROOTFS_DIR}/" "${ROOTFS_DIR}/"
|
2016-04-11 02:21:07 -04:00
|
|
|
}
|
2016-05-04 10:51:41 -04:00
|
|
|
export -f copy_previous
|
2016-04-11 02:21:07 -04:00
|
|
|
|
2017-07-01 23:09:19 -04:00
|
|
|
unmount() {
|
2016-04-11 02:21:07 -04:00
|
|
|
if [ -z "$1" ]; then
|
|
|
|
DIR=$PWD
|
|
|
|
else
|
|
|
|
DIR=$1
|
|
|
|
fi
|
|
|
|
|
2017-01-23 07:44:03 -05:00
|
|
|
while mount | grep -q "$DIR"; do
|
|
|
|
local LOCS
|
|
|
|
LOCS=$(mount | grep "$DIR" | cut -f 3 -d ' ' | sort -r)
|
2016-04-11 02:21:07 -04:00
|
|
|
for loc in $LOCS; do
|
2017-01-23 07:44:03 -05:00
|
|
|
umount "$loc"
|
2016-04-11 02:21:07 -04:00
|
|
|
done
|
|
|
|
done
|
|
|
|
}
|
2016-05-04 10:51:41 -04:00
|
|
|
export -f unmount
|
|
|
|
|
2017-07-01 23:09:19 -04:00
|
|
|
unmount_image() {
|
2016-05-04 10:51:41 -04:00
|
|
|
sync
|
|
|
|
sleep 1
|
2017-01-23 07:44:03 -05: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 06:54:56 -04:00
|
|
|
fi
|
2017-01-23 07:44:03 -05:00
|
|
|
done
|
2016-05-04 10:51:41 -04:00
|
|
|
}
|
|
|
|
export -f unmount_image
|
2016-04-11 02:21:07 -04:00
|
|
|
|
|
|
|
on_chroot() {
|
2017-01-23 07:44:03 -05:00
|
|
|
if ! mount | grep -q "$(realpath "${ROOTFS_DIR}"/proc)"; then
|
|
|
|
mount -t proc proc "${ROOTFS_DIR}/proc"
|
2016-04-11 02:21:07 -04:00
|
|
|
fi
|
|
|
|
|
2017-01-23 07:44:03 -05:00
|
|
|
if ! mount | grep -q "$(realpath "${ROOTFS_DIR}"/dev)"; then
|
|
|
|
mount --bind /dev "${ROOTFS_DIR}/dev"
|
2016-04-11 02:21:07 -04:00
|
|
|
fi
|
2016-04-16 10:02:48 -04:00
|
|
|
|
2017-01-23 07:44:03 -05:00
|
|
|
if ! mount | grep -q "$(realpath "${ROOTFS_DIR}"/dev/pts)"; then
|
|
|
|
mount --bind /dev/pts "${ROOTFS_DIR}/dev/pts"
|
2016-04-16 10:02:48 -04:00
|
|
|
fi
|
2016-04-11 02:21:07 -04:00
|
|
|
|
2017-01-23 07:44:03 -05:00
|
|
|
if ! mount | grep -q "$(realpath "${ROOTFS_DIR}"/sys)"; then
|
|
|
|
mount --bind /sys "${ROOTFS_DIR}/sys"
|
2016-04-11 02:21:07 -04:00
|
|
|
fi
|
|
|
|
|
2017-01-23 07:44:03 -05:00
|
|
|
capsh --drop=cap_setfcap "--chroot=${ROOTFS_DIR}/" -- "$@"
|
2016-04-11 02:21:07 -04:00
|
|
|
}
|
2016-05-04 10:51:41 -04:00
|
|
|
export -f on_chroot
|
2016-04-11 02:21:07 -04:00
|
|
|
|