mir3c/squashfs-root/bin/boardupgrade.sh

187 lines
3.5 KiB
Bash
Raw Normal View History

2018-05-25 08:49:31 +00:00
#!/bin/sh
#
. /lib/upgrade/common.sh
klogger(){
local msg1="$1"
local msg2="$2"
if [ "$msg1" = "-n" ]; then
echo -n "$msg2" >> /dev/kmsg 2>/dev/null
else
echo "$msg1" >> /dev/kmsg 2>/dev/null
fi
return 0
}
hndmsg() {
if [ -n "$msg" ]; then
echo "$msg" >> /dev/kmsg 2>/dev/null
if [ `pwd` = "/tmp" ]; then
rm -rf $filename 2>/dev/null
fi
exit 1
fi
}
upgrade_uboot() {
if [ -f uboot.bin ]; then
klogger -n "Burning uboot..."
mtd write uboot.bin Bootloader >& /dev/null
if [ $? -eq 0 ]; then
klogger "Done"
else
klogger "Error"
exit 1
fi
fi
}
upgrade_firmware() {
if [ -f firmware.bin ]; then
klogger -n "Burning firmware..."
mtd -r write firmware.bin OS1 >& /dev/null
if [ $? -eq 0 ]; then
klogger "Done"
else
klogger "Error"
exit 1
fi
fi
}
board_prepare_upgrade() {
wifi down
rmmod mt7628
if [ -f "/etc/init.d/sysapihttpd" ] ;then
/etc/init.d/sysapihttpd stop 2>/dev/null
fi
# gently stop pppd, let it close pppoe session
ifdown wan
timeout=5
while [ $timeout -gt 0 ]; do
pidof pppd >/dev/null || break
sleep 1
let timeout=timeout-1
done
# clean up upgrading environment
# call shutdown scripts with some exceptions
wait_stat=0
klogger "Calling shutdown scripts"
for i in /etc/rc.d/K*; do
# filter out K01reboot-wdt and K99umount
echo "$i" | grep -q '[0-9]\{1,100\}reboot-wdt$'
if [ $? -eq 0 ]
then
klogger "$i skipped"
continue
fi
echo "$i" | grep -q '[0-9]\{1,100\}umount$'
if [ $? -eq 0 ]
then
klogger "$i skipped"
continue
fi
if [ ! -x "$i" ]
then
continue
fi
# wait for high-priority K* scripts to finish
echo "$i" | grep -qE "K9"
if [ $? -eq 0 ]
then
if [ $wait_stat -eq 0 ]
then
wait
sleep 2
wait_stat=1
fi
$i shutdown 2>&1
else
$i shutdown 2>&1 &
fi
done
# try to kill all userspace processes
# at this point the process tree should look like
# init(1)---sh(***)---flash.sh(***)
for i in $(ps w | grep -v "flash.sh" | grep -v "/bin/ash" | grep -v "PID" | awk '{print $1}'); do
if [ $i -gt 100 ]; then
kill -9 $i 2>/dev/null
fi
done
}
board_start_upgrade_led() {
gpio 1 1
gpio 3 1
gpio l 44 2 2 1 0 4000 #led yellow flashing
}
upgrade_write_mtd() {
curr_os=`cat /proc/mtd | grep rootfs -B 1 | head -n 1 | awk '{print $NF}' | cut -b 2-4`
if [ "$curr_os" = "OS1" ]; then
target_os="OS2"
else
target_os="OS1"
fi
[ -f uboot.bin ] && {
klogger "Updating boot..."
mtd write uboot.bin Bootloader
}
[ -f firmware.bin ] && {
klogger "Updating firmware..."
mtd write firmware.bin "$target_os"
}
}
board_system_upgrade() {
local filename=$1
mkxqimage -x $filename
[ "$?" = "0" ] || {
klogger "cannot extract files"
rm -rf $filename
exit 1
}
upgrade_write_mtd
# back up etc and make sure we have enough space ( > 64kb )
etc_size=`du -sh /data/etc | cut -d "." -f 1`
free_size=`df -h | grep -m 1 "/etc" | awk '{print $4}' | cut -d "." -f 1`
if [ "$(($free_size-$etc_size))" -lt "64" ]; then
for file in /data/usr/log/*
do
echo "Remove logfile $file"
rm -rf $file
free_size=`df -h | grep -m 1 "/etc" | awk '{print $4}' | cut -d "." -f 1`
[ "$(($free_size-$etc_size))" -gt "100" ] && break
done
fi
free_size=`df -h | grep -m 1 "/etc" | awk '{print $4}' | cut -d "." -f 1`
if [ "$(($free_size-$etc_size))" -lt "1" ]; then
# do nothing and wait for miracles
echo "etc fucked up"
ls -lRh /data/etc
else
# backup etc
rm -rf /data/etc_bak
cp -prf /etc /data/etc_bak
fi
return 0
}