7c5704a7c9
* 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.
168 lines
4.6 KiB
Bash
Executable file
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
|