mirror of https://github.com/OpenIPC/composer.git
Add sysupgrade for gk7205v200_axiostv project
parent
92216d1c15
commit
aab95ac3c2
|
@ -0,0 +1,344 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# OpenIPC.org | v.20220831
|
||||
#
|
||||
|
||||
scr_version=1.0.9
|
||||
|
||||
args=" $@"
|
||||
|
||||
set -e
|
||||
|
||||
LOCK_FILE=/tmp/sysupgrade.lock
|
||||
|
||||
echo_c() {
|
||||
# 31 red, 32 green, 33 yellow, 34 blue, 35 magenta, 36 cyan, 37 white, 38 grey
|
||||
[ -z "$HASERLVER" ] && t="\e[1;$1m$2\e[0m" || t="$2"
|
||||
echo -e "$t"
|
||||
}
|
||||
|
||||
die() {
|
||||
echo_c 31 "$1 Aborting."
|
||||
reboot_system
|
||||
}
|
||||
|
||||
check_soc() {
|
||||
[ "1" = "$skip_soc" ] && echo "Skip SoC validation" && return 0
|
||||
[ "$1" = "$soc" ] && echo "SoC OK" && return 0
|
||||
die "Wrong SoC!"
|
||||
}
|
||||
|
||||
compare_versions() {
|
||||
[ "1" = "$skip_ver" ] && echo "Skip version checking" && return 1
|
||||
[ "$1" = "$2" ] && echo_c 32 "Same version, nothing to update" && return 0
|
||||
echo_c 32 "New version, going to update" && return 1
|
||||
}
|
||||
|
||||
do_update_kernel() {
|
||||
x=$1
|
||||
[ -z "$x" ] && x="/tmp/uImage.$soc"
|
||||
echo_c 33 "\nKernel"
|
||||
echo "Update kernel from $x"
|
||||
[ ! -f "$x" ] && die "File $x not found"
|
||||
check_soc "$(od -j 32 -N 32 -S 1 -A n "$x" | cut -d- -f3)"
|
||||
compare_versions "$kernel_version" "$(get_kernel_version "$x")" && return 0
|
||||
flashcp -v "$x" "$kernel_device"
|
||||
echo_c 32 "Kernel updated to $(get_kernel_version "$kernel_device")"
|
||||
unset x
|
||||
}
|
||||
|
||||
do_update_rootfs() {
|
||||
x=$1
|
||||
[ -z "$x" ] && x="/tmp/rootfs.squashfs.$soc"
|
||||
echo_c 33 "\nRootFS"
|
||||
echo "Update rootfs from $x"
|
||||
[ ! -f "$x" ] && die "File ${x} not found"
|
||||
y=/tmp/rootfs
|
||||
if mkdir -p "$y" && loop=$(losetup -f) && losetup "$loop" "$x" && mount "$loop" "$y"; then
|
||||
check_soc "$(head -1 ${y}/etc/hostname | cut -d- -f2)"
|
||||
compare_versions "$system_version" "$(get_system_version "$y")" && return 0
|
||||
umount "$y" && rm -rf "$y" && losetup -d "$loop"
|
||||
else
|
||||
die "Unable to mount $y!"
|
||||
fi
|
||||
unset y
|
||||
|
||||
flashcp -v "$x" "$(get_device "rootfs")"
|
||||
echo_c 32 "RootFS updated to $(get_system_version "")"
|
||||
unset x
|
||||
}
|
||||
|
||||
do_wipe_overlay() {
|
||||
echo_c 33 "\nOverlayFS"
|
||||
echo "Erase overlay partition"
|
||||
flash_eraseall -j "$(get_device "rootfs_data")"
|
||||
}
|
||||
|
||||
download_firmware() {
|
||||
echo_c 33 "\nFirmware"
|
||||
osr=$(get_system_build)
|
||||
build="-"
|
||||
[ -n "${osr}" ] && [ "lite" != "${osr}" ] && build="${build}${osr}-"
|
||||
[ -z "$url" ] && url="https://github.com/OpenIPC/firmware/releases/download/latest/openipc.${soc}${build}br.tgz"
|
||||
echo "Download from $url"
|
||||
[ -z "$HASERLVER" ] && progress="-#" || progress="-s"
|
||||
[ "$(curl -o /dev/null -s -w '%{http_code}\n' "$url")" = "000" ] && die "Check your network!"
|
||||
curl --connect-timeout 30 -s -m 60 -L "$url" ${progress} -o - | gzip -d | tar xf - -C /tmp && echo_c 32 "Received and unpacked" || die "Cannot retrieve $url"
|
||||
if [ "1" != "$skip_md5" ]; then
|
||||
(cd /tmp && md5sum -s -c *.md5sum) || die "Wrong checksum!"
|
||||
fi
|
||||
}
|
||||
|
||||
free_resources() {
|
||||
# echo_c 37 "\nStop services, unload modules"
|
||||
# killall majestic crond klogd ntpd rngd syslogd >/dev/null 2>&1 || true
|
||||
# "load_$vendor" -r >/dev/null 2>&1 || true
|
||||
#
|
||||
echo_c 37 "\nStop services, sync and fresh memory"
|
||||
for proc in majestic crond klogd ntpd rngd syslogd ax-agent ffmpeg; do
|
||||
echo -n "Killing $proc "
|
||||
while [ -n "$(pidof $proc)" ]; do
|
||||
killall $proc >/dev/null 2>&1 || true
|
||||
sleep 0.1
|
||||
echo -n "."
|
||||
done
|
||||
echo ". OK"
|
||||
done
|
||||
sync
|
||||
echo 3 >/proc/sys/vm/drop_caches
|
||||
|
||||
echo_c 34 "\nUptime:"
|
||||
uptime
|
||||
|
||||
echo_c 34 "\nMemory"
|
||||
free
|
||||
}
|
||||
|
||||
sync_time() {
|
||||
echo_c 37 "\nSynchronizing time"
|
||||
ntpd -Nnq
|
||||
echo_c 33 "$(date)"
|
||||
}
|
||||
|
||||
self_update() {
|
||||
if echo "${args}" | grep -E "\-(k|r|w|url)" >/dev/null 2>&1; then
|
||||
sync_time
|
||||
echo -e "\nChecking for sysupgrade update..."
|
||||
curl -s -k -L -o /tmp/sysupgrade "https://raw.githubusercontent.com/OpenIPC/firmware/master/general/overlay/usr/sbin/sysupgrade"
|
||||
if [ -f /tmp/sysupgrade ] && grep -q "#!/bin/sh" /tmp/sysupgrade; then
|
||||
dstv=$(grep scr_version /tmp/sysupgrade | head -1 | cut -f 2 -d '=')
|
||||
if ! [ "${scr_version}" = "${dstv}" ]; then
|
||||
echo "A new version is available, trying to activate updated script..."
|
||||
chmod +x /tmp/sysupgrade
|
||||
echo -e "Done. Restarting...\n"
|
||||
exec /tmp/sysupgrade ${args}
|
||||
exit 1
|
||||
else
|
||||
echo "Same version. No update required."
|
||||
fi
|
||||
else
|
||||
echo -e "\nVersion checking failed, proceeding with the installed version."
|
||||
fi
|
||||
else
|
||||
echo -e "\nOffline operations."
|
||||
fi
|
||||
}
|
||||
|
||||
check_sdcard() {
|
||||
echo_c 33 "\nUnmounting SD card"
|
||||
stoplist="autoupdate-kernel.img autoupdate-rootfs.img autoupdate-uboot.img"
|
||||
while [ -n "$(mount | grep /mnt/mmc)" ]; do
|
||||
_d=$(mount | grep /mnt/mmc | tail -1 | awk '{print $3}')
|
||||
echo_c 34 "$_d"
|
||||
for _f in $stoplist; do
|
||||
echo "- checking for ${_d}/${_f}"
|
||||
if [ -f "${_d}/${_f}" ]; then
|
||||
echo_c 31 "\nCannot upgrade! Recovery file ${_d}/${_f} found on the mounted SD card!"
|
||||
echo_c 37 "Please remove the card from the slot and restart sysupgrade."
|
||||
exit 1
|
||||
fi
|
||||
done; unset _f
|
||||
umount $_d
|
||||
done; unset _d
|
||||
}
|
||||
|
||||
create_lock() {
|
||||
if [ -f $LOCK_FILE ]; then
|
||||
echo_c 31 "\nAnother sysupgrade process is already running!"
|
||||
exit 1
|
||||
fi
|
||||
touch $LOCK_FILE
|
||||
}
|
||||
|
||||
get_device() {
|
||||
echo -n "/dev/$(grep "\"$1\"" /proc/mtd | cut -d: -f1)"
|
||||
}
|
||||
|
||||
get_kernel_version() {
|
||||
echo -n "0x$(xxd -l 4 -s 8 -p "$1" | xargs)"
|
||||
}
|
||||
|
||||
get_system_info() {
|
||||
vendor=$(ipcinfo --vendor)
|
||||
soc=$(fw_printenv -n soc) || die "SoC is not defined in U-Boot environment"
|
||||
kernel_device=$(get_device "kernel")
|
||||
kernel_version=$(get_kernel_version "$kernel_device")
|
||||
system_version=$(get_system_version "")
|
||||
}
|
||||
|
||||
get_system_version() {
|
||||
grep "GITHUB_VERSION" "$1/etc/os-release" | head -1 | cut -d= -f2 | sed 's/"//g'
|
||||
}
|
||||
|
||||
get_system_build() {
|
||||
grep "BUILD_OPTION" "/etc/os-release" | head -1 | cut -d= -f2
|
||||
}
|
||||
|
||||
print_sysinfo() {
|
||||
get_system_info
|
||||
echo_c 33 "OpenIPC System Updater v${scr_version}"
|
||||
echo_c 36 "\nVendor\t$vendor\nSoC\t$soc\nKernel\t$kernel_version\nRootFS\t$system_version"
|
||||
}
|
||||
|
||||
print_usage() {
|
||||
echo "
|
||||
Usage: $0 [options]
|
||||
Where:
|
||||
-k Update kernel from online repository.
|
||||
-r Update rootfs from online repository.
|
||||
-w Update Web UI to development version.
|
||||
--url=[URL] Custom URL to update from (.tgz format).
|
||||
--kernel=[FILE] Update kernel from file (uImage format).
|
||||
--rootfs=[FILE] Update rootfs from file (squashfs format).
|
||||
--force_md5 Do not validate MD5 hash.
|
||||
--force_soc Do not validate processor.
|
||||
--force_ver Do not validate release version.
|
||||
--force_all Do not validate anything.
|
||||
-n, --wipe_overlay Wipe overlay partition.
|
||||
-x, --no_reboot Do not reboot after updating.
|
||||
-z, --no_update Do not update self.
|
||||
-h, --help Display this help and exit.
|
||||
"
|
||||
}
|
||||
|
||||
reboot_system() {
|
||||
if [ "1" = "$skip_reboot" ]; then
|
||||
echo_c 33 "\nYou asked me not to reboot, so I won't."
|
||||
echo_c 31 "Although a reboot is required to apply the changes."
|
||||
echo_c 37 "Please reboot the camera manually whenever possible."
|
||||
rm $LOCK_FILE
|
||||
exit 1
|
||||
else
|
||||
echo_c 37 "\nUnconditional reboot"
|
||||
reboot -d 1 -f
|
||||
fi
|
||||
}
|
||||
|
||||
for i in "$@"; do
|
||||
case $i in
|
||||
--force_all)
|
||||
skip_md5=1
|
||||
skip_soc=1
|
||||
skip_ver=1
|
||||
shift
|
||||
;;
|
||||
--force_md5)
|
||||
skip_md5=1
|
||||
shift
|
||||
;;
|
||||
--force_soc)
|
||||
skip_soc=1
|
||||
shift
|
||||
;;
|
||||
--force_ver)
|
||||
skip_ver=1
|
||||
shift
|
||||
;;
|
||||
-h | --help)
|
||||
print_sysinfo
|
||||
print_usage
|
||||
exit 0
|
||||
;;
|
||||
-k)
|
||||
update_kernel=1
|
||||
remote_update=1
|
||||
shift
|
||||
;;
|
||||
--kernel=*)
|
||||
update_kernel=1
|
||||
kernel_file="${i#*=}"
|
||||
shift
|
||||
;;
|
||||
-n | --wipe_overlay)
|
||||
clear_overlay=1
|
||||
shift
|
||||
;;
|
||||
-r)
|
||||
update_rootfs=1
|
||||
remote_update=1
|
||||
shift
|
||||
;;
|
||||
--rootfs=*)
|
||||
update_rootfs=1
|
||||
rootfs_file="${i#*=}"
|
||||
shift
|
||||
;;
|
||||
--url=*)
|
||||
url="${i#*=}"
|
||||
shift
|
||||
;;
|
||||
-x | --no_reboot)
|
||||
skip_reboot=1
|
||||
shift
|
||||
;;
|
||||
-w)
|
||||
update_webui=1
|
||||
shift
|
||||
;;
|
||||
-z | --no_update)
|
||||
skip_selfupdate=1
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
print_sysinfo
|
||||
echo_c 37 "\nUnknown option: $1"
|
||||
print_usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
print_sysinfo
|
||||
|
||||
[ "1" != "$clear_overlay" ] &&
|
||||
[ "1" != "$update_kernel" ] &&
|
||||
[ "1" != "$update_rootfs" ] &&
|
||||
[ "1" != "$update_webui" ] &&
|
||||
echo_c 37 "\nTry '$(basename "$0") --help' for options." &&
|
||||
exit 0
|
||||
|
||||
[ "1" != "$skip_selfupdate" ] && self_update
|
||||
|
||||
if [ "1" = "$update_webui" ]; then
|
||||
if [ "1" = "$update_rootfs" ]; then
|
||||
update_webui=0
|
||||
echo_c 31 "\nCannot update Web UI along with RootFS!"
|
||||
echo_c 37 "Please update RootFS then reboot the camera and re-run $0 -w to update Web UI in a separate run."
|
||||
sleep 5
|
||||
fi
|
||||
fi
|
||||
|
||||
check_sdcard
|
||||
|
||||
create_lock
|
||||
free_resources
|
||||
|
||||
[ "1" = "$remote_update" ] && download_firmware
|
||||
[ "1" = "$update_kernel" ] && do_update_kernel "$kernel_file"
|
||||
[ "1" = "$update_rootfs" ] && do_update_rootfs "$rootfs_file"
|
||||
[ "1" = "$clear_overlay" ] && do_wipe_overlay
|
||||
[ "1" = "$update_webui" ] && updatewebui.sh -b dev
|
||||
|
||||
reboot_system
|
||||
|
||||
exit 0
|
Loading…
Reference in New Issue