satip-axe/fs-add/sbin/upgrade-fw

148 lines
3.8 KiB
Bash
Executable File

#!/bin/sh
FILE="$1"
DOWNLOAD=""
MTDDEV="/dev/mtd3"
SAFEFILE="/root/new.fw"
CHECKSTR="Linux-2.6.32.42_stm24_0208-idl4k"
GITHUB1="https://api.github.com/repos/perexg/satip-axe/releases"
if test "$PWD" != "/root" -a "$PWD" != "/"; then
echo "Run this utility from / or /root directory"
exit 1
fi
if test "$FILE" = "-h" -o "$FILE" = "--help"; then
echo "Usage: $0 FIRMWARE"
exit 1
fi
if ! test -r "$FILE"; then
if test -z "$FILE"; then
echo "Trying to fetch the list of available firmware files:"
else
echo "Trying to fetch the URL for the firmware:"
fi
if ! wget -q -O /root/list.json "$GITHUB1"; then
echo "FAILED"
exit 1
fi
cat /root/list.json | grep -E '("name"|"browser_download_url")' | \
grep -v -E '"name":.*.tgz' | \
while IFS="\n" read line
do
case "$line" in
\ *\"name\":*)
name=$(echo "$line" | cut -d '"' -f 4)
;;
\ *\"browser_download_url\":*)
fw=$(echo "$line" | cut -d '/' -f 9 | cut -d '"' -f 1 | cut -d '.' -f 1)
fw="$fw.fw"
if test -z "$FILE"; then
printf "%-40s : %s\n" "$name" "$fw"
else
if test "$FILE" = "$fw"; then
f=$(echo "$line" | cut -d '"' -f 4)
echo "$f" > /root/url.txt
printf " %s\n" "$f"
fi
fi
name=''
;;
esac
done
rm /root/list.json
if test -z "$FILE"; then
exit 0
fi
if test -r /root/url.txt; then
DOWNLOAD=$(cat /root/url.txt)
fi
fi
if test -n "$DOWNLOAD"; then
echo "Downloading $FILE from $DOWNLOAD to $SAFEFILE:"
if ! wget -O - "$DOWNLOAD" | tar xOzf - "$FILE" > "$SAFEFILE"; then
echo "Unable to fetch firmware file $DOWNLOAD / $FILE"
exit 1
fi
if ! test -r "$SAFEFILE"; then
echo "Unable to fetch firmware file $DOWNLOAD / $FILE"
exit 1
fi
FILESIZE=$(stat -c "%s" "$SAFEFILE")
if test -z "$FILESIZE" -o $FILESIZE -le 0; then
echo "Download failed (wrong file size)!"
else
echo "Downloaded firmware $FILE (file $SAFEFILE size $FILESIZE bytes)..."
fi
FILE="$SAFEFILE"
fi
if ! grep "$CHECKSTR" "$FILE" > /dev/null; then
echo "$FILE does not appear to be the satip-axe firmware!"
exit 1
fi
if test "$FILE" != "$SAFEFILE"; then
if ! cp "$FILE" "$SAFEFILE"; then
echo "Copy error..."
exit 1
fi
fi
echo "Preparing to flash - killing minisatip, unmounting USB sticks"
umount /media/*
touch /tmp/nosatip
killall -9 minisatip
sync ; sync
sleep 3
first=true
second=true
while test 1 -eq 1; do
FILESIZE=$(stat -c "%s" "$SAFEFILE")
if test -z "$FILESIZE" -o $FILESIZE -le 0; then
echo "Unable to determine file size for $SAFEFILE"
exit 1
fi
echo "Verifying... Dumping current flash contents."
nanddump -f "$SAFEFILE.old" -l "$FILESIZE" "$MTDDEV"
FILESIZE2=$(stat -c "%s" "$SAFEFILE.old")
if test "$FILESIZE" -gt "$FILESIZE2"; then
echo "Unable to verify (file sizes does not match - $FILESIZE > $FILESIZE2)"
exit 1
fi
if ! dd if=/dev/null seek="$FILESIZE" bs=1 of="$SAFEFILE.old" 2> /dev/null; then
echo "DD truncate failed"
exit 1
fi
FILESIZE2=$(stat -c "%s" "$SAFEFILE.old")
if test "$FILESIZE" != "$FILESIZE2"; then
echo "Unable to verify (file sizes does not match - $FILESIZE != $FILESIZE2)"
exit 1
fi
result=$(diff "$SAFEFILE.old" "$SAFEFILE")
if test -z "$result"; then
echo "Verify OK. Flash write successful."
echo "Type 'reboot' now..."
rm -f "$SAFEFILE" "$SAFEFILE.old"
exit 0
fi
rm -f "$FILESIZE.old"
if test "$first" != "true"; then
echo "** Flash contents do not match. **"
if test "$second" != "true"; then
echo "** Flashing failed. Consider to use an USB stick to recover. **"
fi
echo -n "Repeat the flash write? Use 'Ctrl-C' to abort or Enter to repeat: "
read i
second=
fi
echo "Flashing..."
nandwrite2 -p "$MTDDEV" "$SAFEFILE"
first=
done