distribution/packages/jelos/sources/scripts/system-upgrade
fewtarius 7c5704a7c9
Update behavior change
* This change alters system update behavior adding an additional check to ensure a release hash is available before sending an update available signal or attempting to fetch an update.  This allows the JELOS team to pause updates for certain devices when they may not be necessary or to pause support without breaking future update ability.
2023-11-21 13:02:19 +00:00

168 lines
4.6 KiB
Bash
Executable file

#!/bin/bash
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS)
. /etc/profile
ORGANIZATION="${GIT_ORGANIZATION}"
BRANCH="$(get_setting updates.branch)"
case ${BRANCH} in
dev)
PROJECT="${GIT_REPO}-dev"
;;
*)
PROJECT="${GIT_REPO}"
;;
esac
FORCE="$(get_setting updates.force)"
GIT_REPO="https://github.com/${ORGANIZATION}/${PROJECT}"
GIT_API="https://api.github.com/repos/${ORGANIZATION}/${PROJECT}"
UPDATE_PATH="/storage/.update"
EXTENSION="tar"
function check_network() {
GW=$(ip route | awk '/eth0/ {a=$0} END{print $1}')
if [[ ${GW} =~ [0-9] ]]
then
echo true
else
echo false
fi
}
get_available() {
echo $(df | awk '/'$1'/ {printf $4; exit}')
}
get_size() {
echo $(df | awk '/'$1'/ {printf $2; exit}')
}
check_space() {
MYSIZE="$(get_$1 $2)"
VOLNAME="$3"
REQUIRED="$4"
if [ "${MYSIZE}" -lt "${REQUIRED}" ]
then
NEEDED=$(( (${REQUIRED} - ${MYSIZE} ) / 1024 ))
echo -e "There is not enough free space available ${VOLNAME} to install this update. Free up an additional ${NEEDED}MB, or reflash the newer version."
echo "Exiting in 5 seconds..." && sleep 5
exit 1
fi
}
get_changelog() {
echo "Fetching change log."
echo -e "Change Log" >/storage/.cache/changelog
lynx --dump "${GIT_REPO}/releases/latest" 2>/dev/null | awk '/Contributors|Assets [0-9]/ {exit}; /Change Log/{p++;if(p==1){next}}p;' >>/storage/.cache/changelog
if [ ! "$?" = "0" ]
then
echo "Unable to fetch the change log, please ensure you have a network connection." >>/storage/.cache/changelog
fi
}
get_release_list() {
DATA=($(curl -H 'Cache-Control: no-cache' -Ls "${GIT_API}/releases" 2>/dev/null | python -c "import sys, json; data=json.load(sys.stdin); print(\"\\n\".join([str(data[i]['tag_name']) for i in range(10)]))"))
if [ ! -z "${DATA}" ]
then
printf "%s\n" "${DATA[@]}"
else
echo "Unable to fetch releases."
fi
}
function cleanup() {
if [ -e "/tmp/release.data" ]
then
rm -f /tmp/release.data
fi
}
###
### Check for passed arguments. If we receive changelog, fetch it. If we receive a version, force install it.
###
case ${1} in
changelog)
get_changelog >/dev/null 2>&1
exit 0
;;
releases)
get_release_list
exit 0
;;
[0-9][0-9]*)
LATEST_RELEASE_TAG=${1}
FORCE=1
;;
esac
ONLINE_STATUS=$(check_network)
if [ ! "${ONLINE_STATUS}" == true ]
then
echo "System not online, cannot continue..."
echo "Exiting in 5 seconds..." && sleep 5
exit 0
fi
echo -e "=> ${OS_NAME} UPGRADE UTILITY"
# Check storage
check_space size flash boot 2048000 2>/dev/null
if [ "$(mountpoint -q /storage/roms)" ]
then
check_space available .update GAMES 4096000 2>/dev/null
fi
if [ -z "${LATEST_RELEASE_TAG}" ]
then
curl -o /tmp/release.data -H 'Cache-Control: no-cache' -Ls "${GIT_API}/releases"
LATEST_RELEASE_TAG=$(cat /tmp/release.data | python -c "import sys, json; print(json.load(sys.stdin)[0]['tag_name'])")
UPDATE_PACKAGE=$((grep "${OS_NAME}-${HW_DEVICE}.${HW_ARCH}.*tar.sha256" /tmp/release.data >/dev/null 2>&1 && echo true ) || echo false)
if [ "${OS_VERSION}" -ge "${LATEST_RELEASE_TAG}" ] \
&& [ ! "${FORCE}" == "1" ] \
|| [ ! "${UPDATE_PACKAGE}" == "true" ]
then
cleanup
echo "No new updates are available..."
echo "Exiting in 5 seconds..." && sleep 5
exit 0
fi
fi
echo -e "\nFetching: ${OS_NAME}-${HW_DEVICE}.${HW_ARCH}-${LATEST_RELEASE_TAG}.${EXTENSION}"
curl -Lo "${UPDATE_PATH}/${OS_NAME}-${HW_DEVICE}.${HW_ARCH}-${LATEST_RELEASE_TAG}.${EXTENSION}" "${GIT_REPO}/releases/download/${LATEST_RELEASE_TAG}/${OS_NAME}-${HW_DEVICE}.${HW_ARCH}-${LATEST_RELEASE_TAG}.tar"
echo -e "Fetching: ${OS_NAME}-${HW_DEVICE}.${HW_ARCH}-${LATEST_RELEASE_TAG}.${EXTENSION}.sha256"
curl -Lo "${UPDATE_PATH}/${OS_NAME}-${HW_DEVICE}.${HW_ARCH}-${LATEST_RELEASE_TAG}.${EXTENSION}.sha256" "${GIT_REPO}/releases/download/${LATEST_RELEASE_TAG}/${OS_NAME}-${HW_DEVICE}.${HW_ARCH}-${LATEST_RELEASE_TAG}.tar.sha256"
echo -e "\nVerifying download, please wait..."
# Verify
MYSUM=$(sha256sum ${UPDATE_PATH}/${OS_NAME}-${HW_DEVICE}.${HW_ARCH}-${LATEST_RELEASE_TAG}.${EXTENSION} | awk '{print $1}')
DLSUM=$(cat ${UPDATE_PATH}/${OS_NAME}-${HW_DEVICE}.${HW_ARCH}-${LATEST_RELEASE_TAG}.${EXTENSION}.sha256 | awk '{print $1}')
if [ ! "${MYSUM}" == "${DLSUM}" ]
then
echo "Verification failed, cleaning up and exiting..."
rm -f ${UPDATE_PATH}/*
sleep 5
clear
exit 1
else
echo "Verification successful..."
fi
get_changelog
if [ "${FORCE}" == "1" ]
then
set_setting updates.force 0
fi
echo -e "\nRebooting to complete OS upgrade..."
sync
sleep 3
reboot