100 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.4 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+=("$@")
 | |
| 
 | |
| 	setarch linux32 capsh --drop=cap_setfcap -- "${BOOTSTRAP_CMD}" "${BOOTSTRAP_ARGS[@]}" || 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
 |