Fixes #257 #104 #193 Instead of searching by full path, which is prone to fail, read full list and grep on filename.
		
			
				
	
	
		
			103 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			2.3 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" ]; 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+=("$@")
 | 
						|
 | 
						|
	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
 | 
						|
 | 
						|
	capsh --drop=cap_setfcap "--chroot=${ROOTFS_DIR}/" -- -e "$@"
 | 
						|
}
 | 
						|
export -f on_chroot
 | 
						|
 | 
						|
update_issue() {
 | 
						|
	local GIT_HASH
 | 
						|
	GIT_HASH=$(git rev-parse HEAD)
 | 
						|
	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
 | 
						|
 |