+ if ! [ -r "${PACKAGES_FILE}" ] ; then
+ echo "Error: ${PACKAGES_FILE} (inside chroot) not found, exiting." >&2
+ exit 1
+ else
+ $APTUPDATE
+
+ # shellcheck disable=SC2086,SC2046
+ DEBIAN_FRONTEND=$DEBIAN_FRONTEND $APTINSTALL $(grep -v '^#' "${PACKAGES_FILE}") $GRMLPACKAGES
+ fi
+ fi
+}
+# }}}
+
+# install extra packages {{{
+extrapackages() {
+ if [ "$EXTRAPACKAGES" = 'yes' ] ; then
+ PACKAGELIST=$(find /etc/debootstrap/extrapackages -type f -name '*.deb')
+ if [ -n "$PACKAGELIST" ]; then
+ # shellcheck disable=SC2086
+ dpkg -i $PACKAGELIST
+ # run apt again to resolve any deps
+ DEBIAN_FRONTEND=$DEBIAN_FRONTEND $APTINSTALL
+ fi
+ fi
+}
+# }}}
+
+# check if the specified Debian package exists
+package_exists() {
+ output=$(apt-cache show "$1" 2>/dev/null)
+ [ -n "$output" ]
+ return $?
+}
+
+
+# determine the kernel version postfix
+get_kernel_version() {
+ # do not override $KERNEL if set via config file
+ if [ -n "$KERNEL" ] ; then
+ echo "$KERNEL"
+ return 0
+ fi
+
+ local KARCH
+
+ # shellcheck disable=SC2153
+ case "$ARCH" in
+ i386)
+ KARCH='686-pae'
+ ;;
+ amd64)
+ KARCH='amd64'
+ ;;
+ arm64)
+ KARCH='arm64'
+ ;;
+ *)
+ echo "Only i386, amd64 and arm64 are currently supported" >&2
+ return 1
+ esac
+
+ local KPACKAGE
+ KPACKAGE=linux-image-"${KPREFIX}${KARCH}"
+ if package_exists "$KPACKAGE"; then
+ echo "${KPREFIX}${KARCH}"
+ return 0
+ fi
+
+ echo "Expected kernel package $KPACKAGE not found" >&2
+ return 1
+}
+
+# install kernel packages {{{
+kernel() {
+ if [ -n "$NOKERNEL" ] ; then
+ echo "Skipping installation of kernel packages as requested via --nokernel"
+ return 0
+ fi
+
+ $APTUPDATE
+ KVER=$(get_kernel_version)
+ if [ -n "$KVER" ] ; then
+ # note: install busybox to be able to debug initramfs
+ KERNELPACKAGES="linux-image-$KVER linux-headers-$KVER busybox firmware-linux-free"
+ # only add firmware-linux if we have non-free as a component
+ if expr "$COMPONENTS" : '.*non-free' >/dev/null ; then
+ KERNELPACKAGES="$KERNELPACKAGES firmware-linux"
+ fi
+ # shellcheck disable=SC2086
+ DEBIAN_FRONTEND=$DEBIAN_FRONTEND $APTINSTALL $KERNELPACKAGES
+ else
+ echo "Warning: Could not find a kernel for your system. Your system won't be able to boot itself!"
+ fi
+}
+# }}}
+
+# reconfigure packages {{{
+reconfigure() {
+ if [ -n "$RECONFIGURE" ] ; then
+ for package in $RECONFIGURE ; do
+ if dpkg --list "$package" >/dev/null 2>&1 | grep -q '^ii' ; then
+ DEBIAN_FRONTEND=$DEBIAN_FRONTEND dpkg-reconfigure "$package" || \
+ echo "Warning: $package does not exist, can not reconfigure it."
+ fi
+ done
+ fi
+}
+# }}}
+
+# set password of user root {{{
+passwords()
+{
+ if [ -n "$NOPASSWORD" ] ; then
+ echo "Skip setting root password as requested."
+ return 0
+ fi
+
+ echo "Activating shadow passwords."
+ shadowconfig on
+
+ CHPASSWD_OPTION=
+ if chpasswd --help 2>&1 | grep -q -- '-m,' ; then
+ CHPASSWD_OPTION='-m'
+ fi
+
+ if [ -n "$ROOTPASSWORD" ] ; then
+ echo root:"$ROOTPASSWORD" | chpasswd $CHPASSWD_OPTION
+ export ROOTPASSWORD=''
+ else
+ a='1'
+ b='2'
+ echo "Setting password for user root:"
+ while [ "$a" != "$b" ] ; do
+ printf "Enter new UNIX password for user root: "
+ askpass
+ a="$resp"
+ unset resp
+ echo
+ printf "Retype new UNIX password for user root: "
+ askpass
+ b="$resp"
+ unset resp
+ echo
+ if [ "$a" != "$b" ] ; then
+ echo "Sorry, passwords do not match. Retry."
+ a='1'
+ b='2'
+ else
+ echo root:"$a" | chpasswd $CHPASSWD_OPTION
+ unset a
+ unset b
+ fi
+ done
+ fi
+}
+# }}}