This will silence warnings from `mount` about `/etc/fstab` having changed since the last time the `systemd-fstab-generator` was run. It's not true, since it's immutable, but the warning comes up on Raspberry Pis without an RTC.
138 lines
2.4 KiB
Bash
Executable File
138 lines
2.4 KiB
Bash
Executable File
#!/bin/sh
|
|
# vim: set sw=4 ts=4 sts=4 et :
|
|
|
|
cleanup() {
|
|
cd /
|
|
if [ -n "${workdir}" ] && [ "${workdir}" != / ]; then
|
|
rm -rf "${workdir}"
|
|
fi
|
|
unset workdir
|
|
}
|
|
|
|
die() {
|
|
rc=$?
|
|
if [ $rc -eq 0 ]; then
|
|
rc=1
|
|
fi
|
|
error "$@"
|
|
exit $rc
|
|
}
|
|
|
|
error() {
|
|
if [ $# -eq 1 ]; then
|
|
echo "$1" >&2
|
|
elif [ $# -gt 1 ]; then
|
|
printf "$@" >&2
|
|
fi
|
|
}
|
|
|
|
extract_update() {
|
|
zstd -dc update.tar.zstd | tar -x \
|
|
|| die 'Could not extract update source'
|
|
sha256sum -c digests \
|
|
|| die 'Invalid update source: checksum mismatch'
|
|
}
|
|
|
|
fetch_update() {
|
|
wget -O update.tar.zstd "$1"
|
|
}
|
|
|
|
get_root() {
|
|
set -- $(cat /proc/cmdline)
|
|
while [ $# -gt 0 ]; do
|
|
case "$1" in
|
|
root=*)
|
|
_root=${1#root=}
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
echo $(findfs "${_root}")
|
|
}
|
|
|
|
get_partlabel() {
|
|
blkid -o value -s PARTLABEL "$1"
|
|
}
|
|
|
|
help() {
|
|
usage
|
|
}
|
|
|
|
info() {
|
|
if [ $# -eq 1 ]; then
|
|
echo "$1" >&2
|
|
elif [ $# -gt 1 ]; then
|
|
printf "$@" >&2
|
|
fi
|
|
}
|
|
|
|
usage() {
|
|
printf 'usage: %s source_url\n' "${0##*/}"
|
|
}
|
|
|
|
while [ $# -gt 0 ]; do
|
|
case "$1" in
|
|
--help)
|
|
help
|
|
exit 0
|
|
;;
|
|
*)
|
|
if [ -z "${source_url}" ]; then
|
|
source_url="$1"
|
|
else
|
|
usage >&2
|
|
exit 2
|
|
fi
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
if [ -z "${source_url}" ]; then
|
|
usage >&2
|
|
exit 2
|
|
fi
|
|
|
|
root=$(get_root)
|
|
partlabel=$(get_partlabel "${root}")
|
|
|
|
case "${partlabel}" in
|
|
rootfs-a)
|
|
newpartlabel=rootfs-b
|
|
;;
|
|
rootfs-b)
|
|
newpartlabel=rootfs-a
|
|
;;
|
|
*)
|
|
die \
|
|
'Unsupported system configuration: invalid rootfs partition label: %s\n' \
|
|
"${partlabel}" >&2
|
|
esac
|
|
newroot=$(findfs PARTLABEL="${newpartlabel}")
|
|
if [ -z "${newroot}" ]; then
|
|
die 'Could not find partition with label %s\n' "${partlabel}"
|
|
fi
|
|
info 'Current rootfs: %s (%s)\n' "${partlabel}" "${root}"
|
|
info 'New rootfs: %s (%s)\n' "${newpartlabel}" "${newroot}"
|
|
|
|
trap cleanup INT TERM QUIT EXIT
|
|
workdir=$(mktemp -d)
|
|
cd "${workdir}"
|
|
|
|
systemctl daemon-reload
|
|
|
|
fetch_update "${source_url}" || die 'Failed to fetch update source'
|
|
extract_update || die 'Failed to extact update source'
|
|
./install "${newroot}" || die 'Error installing system update'
|
|
|
|
printf 'Do you want to reboot now? [y/N] '
|
|
read confirm
|
|
case "${confirm}" in
|
|
[yY]|[yY][eE][sS])
|
|
systemctl reboot
|
|
;;
|
|
*)
|
|
info 'A reboot is required to complete the update'
|
|
;;
|
|
esac
|