aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/common
blob: 4ff9a9655f0935197c6108e0360c7861e21174ba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
log (){
	date +"[%T] $*" | tee -a "${LOG_FILE}"
}
export -f log

bootstrap(){
	local BOOTSTRAP_CMD=debootstrap
	local BOOTSTRAP_ARGS=()

	#export http_proxy=${APT_PROXY}

	# qemu-debootstrap is deprecated. Please use regular debootstrap directly
	#
	# if [ "$(dpkg --print-architecture)" !=  "armhf" ] && [ "$(dpkg --print-architecture)" !=  "arm64" ]; then
	#	 BOOTSTRAP_CMD=qemu-debootstrap
	# fi

	BOOTSTRAP_ARGS+=(--arch ${TARGET_ARCH})
	BOOTSTRAP_ARGS+=(--include gnupg)
	BOOTSTRAP_ARGS+=(--components "main,contrib,non-free")
	if [ "${USE_RASPI_SOURCE}" = "1" ]; then
		BOOTSTRAP_ARGS+=(--keyring "${STAGE_DIR}/files/raspberrypi.gpg")
	fi
	BOOTSTRAP_ARGS+=("$@")
	printf -v BOOTSTRAP_STR '%q ' "${BOOTSTRAP_ARGS[@]}"

	capsh --drop=cap_setfcap -- -c "'${BOOTSTRAP_CMD}' $BOOTSTRAP_STR" || true

	if [ -d "$2/debootstrap" ] && ! rmdir "$2/debootstrap"; then
		cp "$2/debootstrap/debootstrap.log" "${STAGE_WORK_DIR}"
		log "bootstrap failed: please check ${STAGE_WORK_DIR}/debootstrap.log"
		return 1
	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

    # run as root 'dpkg-reconfigure locales' enable 'en_US.UTF-8'
    # perhaps run as root 'update-locale LC_MEASUREMENT=en_US.UTF-8 LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8'
    export LC_MEASUREMENT=en_US.UTF-8
    export LC_ALL=en_US.UTF-8
    export LANG=en_US.UTF-8

	setarch linux32 capsh --drop=cap_setfcap "--chroot=${ROOTFS_DIR}/" -- -e "$@"
}
export -f on_chroot

print_issue() {
    echo "GNU/Linux ${IMG_DATE} UTC"
    if [ -n "${CUSTOM_NAME}" -a -n "${CUSTOM_VERSION}" ]; then
        echo "${CUSTOM_NAME} version ${CUSTOM_VERSION}"
    fi
    echo "Generated using ${PI_GEN}, ${PI_GEN_REPO}, ${GIT_HASH}, ${1}"

    if [ -f "$ROOTFS_DIR/usr/share/doc/raspberrypi-kernel/changelog.Debian.gz" ]; then
        firmware=$(zgrep "firmware as of" \
            "$ROOTFS_DIR/usr/share/doc/raspberrypi-kernel/changelog.Debian.gz" | \
            head -n1 | sed  -n 's|.* \([^ ]*\)$|\1|p')
        printf "\nFirmware: https://github.com/raspberrypi/firmware/tree/%s\n" "$firmware"

        kernel="$(curl -s -L "https://github.com/raspberrypi/firmware/raw/$firmware/extra/git_hash")"
        printf "Kernel: https://github.com/raspberrypi/linux/tree/%s\n" "$kernel"

        uname="$(curl -s -L "https://github.com/raspberrypi/firmware/raw/$firmware/extra/uname_string7")"
        printf "Uname string: %s\n" "$uname"
    fi

    printf "\nPackages:\n"
    dpkg -l --root "$ROOTFS_DIR"
}
export -f print_issue