|
|
@@ -38,53 +38,16 @@ nand_find_ubi() {
|
|
|
done
|
|
|
}
|
|
|
|
|
|
-nand_restore_config() {
|
|
|
- sync
|
|
|
- local ubidev=$( nand_find_ubi $CI_UBIPART )
|
|
|
- local ubivol="$( nand_find_volume $ubidev rootfs_data )"
|
|
|
- [ ! "$ubivol" ] &&
|
|
|
- ubivol="$( nand_find_volume $ubidev rootfs )"
|
|
|
- mkdir /tmp/new_root
|
|
|
- if ! mount -t ubifs /dev/$ubivol /tmp/new_root; then
|
|
|
- echo "mounting ubifs $ubivol failed"
|
|
|
- rmdir /tmp/new_root
|
|
|
- return 1
|
|
|
- fi
|
|
|
- mv "$1" "/tmp/new_root/sysupgrade.tgz"
|
|
|
- umount /tmp/new_root
|
|
|
- sync
|
|
|
- rmdir /tmp/new_root
|
|
|
-}
|
|
|
-
|
|
|
-nand_upgrade_ubinized() {
|
|
|
- local upgrade_image="$1"
|
|
|
- local conf_tar="$2"
|
|
|
- local save_config="$3"
|
|
|
- local mtdnum="$( find_mtd_index "$CI_UBIPART" )"
|
|
|
- if [ ! "$mtdnum" ]; then
|
|
|
- echo "cannot find mtd device $CI_UBIPART"
|
|
|
- return 1;
|
|
|
- fi
|
|
|
- local mtddev="/dev/mtd${mtdnum}"
|
|
|
- ubidetach -p "${mtddev}" || true
|
|
|
- sync
|
|
|
- ubiformat "${mtddev}" -y -f "$upgrade_image"
|
|
|
- ubiattach -p "${mtddev}"
|
|
|
- sync
|
|
|
- if [ -f "$conf_tar" -a "$save_config" -eq 1 ]; then
|
|
|
- nand_restore_config "$conf_tar"
|
|
|
- fi
|
|
|
- return 0;
|
|
|
+get_magic_long() {
|
|
|
+ dd if="$1" skip=$2 bs=4 count=1 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"'
|
|
|
}
|
|
|
|
|
|
-# get the first 4 bytes (magic) of a given file starting at offset in hex format
|
|
|
-get_magic_long_at() {
|
|
|
- dd if="$2" skip=$1 bs=$CI_BLKSZ count=1 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"'
|
|
|
+get_magic_long_tar() {
|
|
|
+ ( tar xf $1 $2 -O | dd bs=4 count=1 | hexdump -v -n 4 -e '1/1 "%02x"') 2> /dev/null
|
|
|
}
|
|
|
|
|
|
-identify() {
|
|
|
- local block;
|
|
|
- local magic=$( get_magic_long_at ${2:-0} "$1" )
|
|
|
+identify_magic() {
|
|
|
+ local magic=$1
|
|
|
case "$magic" in
|
|
|
"55424923")
|
|
|
echo "ubi"
|
|
|
@@ -107,36 +70,52 @@ identify() {
|
|
|
esac
|
|
|
}
|
|
|
|
|
|
-nand_upgrade_combined_ubi() {
|
|
|
- local kernel_image="$1"
|
|
|
- local kernel_length=0
|
|
|
- local rootfs_image="$2"
|
|
|
- local rootfs_length=`ls -la $rootfs_image | awk '{ print $5}')`
|
|
|
- local conf_tar="$3"
|
|
|
- local has_env="${4:-0}"
|
|
|
|
|
|
- local root_fs="$( identify "$rootfs_image" )"
|
|
|
- local mtdnum="$( find_mtd_index "$CI_UBIPART" )"
|
|
|
- local has_kernel=0
|
|
|
-
|
|
|
- [ -z "$kernel_image" ] || {
|
|
|
- has_kernel=1
|
|
|
- kernel_length=`ls -la $kernel_image | awk '{ print $5}')`
|
|
|
- echo "kernel length $kernel_length"
|
|
|
- }
|
|
|
- [ "$has_kernel" = 0 ] || echo "kernel is inside ubi"
|
|
|
- echo "rootfs type $root_fs, length $rootfs_length"
|
|
|
+identify() {
|
|
|
+ identify_magic $(get_magic_long "$1" "${2:-0}")
|
|
|
+}
|
|
|
+
|
|
|
+identify_tar() {
|
|
|
+ identify_magic $(get_magic_long_tar "$1" "$2")
|
|
|
+}
|
|
|
|
|
|
+nand_restore_config() {
|
|
|
+ sync
|
|
|
+ local ubidev=$( nand_find_ubi $CI_UBIPART )
|
|
|
+ local ubivol="$( nand_find_volume $ubidev rootfs_data )"
|
|
|
+ [ ! "$ubivol" ] &&
|
|
|
+ ubivol="$( nand_find_volume $ubidev rootfs )"
|
|
|
+ mkdir /tmp/new_root
|
|
|
+ if ! mount -t ubifs /dev/$ubivol /tmp/new_root; then
|
|
|
+ echo "mounting ubifs $ubivol failed"
|
|
|
+ rmdir /tmp/new_root
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+ mv "$1" "/tmp/new_root/sysupgrade.tgz"
|
|
|
+ umount /tmp/new_root
|
|
|
+ sync
|
|
|
+ rmdir /tmp/new_root
|
|
|
+}
|
|
|
+
|
|
|
+nand_upgrade_prepare_ubi() {
|
|
|
+ local rootfs_length="$1"
|
|
|
+ local rootfs_type="$1"
|
|
|
+ local has_kernel="${2:-0}"
|
|
|
+ local has_env="${3:-0}"
|
|
|
+
|
|
|
+ local mtdnum="$( find_mtd_index "$CI_UBIPART" )"
|
|
|
if [ ! "$mtdnum" ]; then
|
|
|
echo "cannot find ubi mtd partition $CI_UBIPART"
|
|
|
return 1
|
|
|
fi
|
|
|
+
|
|
|
local ubidev="$( nand_find_ubi "$CI_UBIPART" )"
|
|
|
if [ ! "$ubidev" ]; then
|
|
|
ubiattach -m "$mtdnum"
|
|
|
sync
|
|
|
ubidev="$( nand_find_ubi "$CI_UBIPART" )"
|
|
|
fi
|
|
|
+
|
|
|
if [ ! "$ubidev" ]; then
|
|
|
ubiformat /dev/mtd$mtdnum -y
|
|
|
ubiattach -m "$mtdnum"
|
|
|
@@ -147,6 +126,7 @@ nand_upgrade_combined_ubi() {
|
|
|
ubimkvol /dev/$ubidev -n 1 -N ubootenv2 -s 1MiB
|
|
|
}
|
|
|
fi
|
|
|
+
|
|
|
local kern_ubivol="$( nand_find_volume $ubidev kernel )"
|
|
|
local root_ubivol="$( nand_find_volume $ubidev rootfs )"
|
|
|
local data_ubivol="$( nand_find_volume $ubidev rootfs_data )"
|
|
|
@@ -162,15 +142,9 @@ nand_upgrade_combined_ubi() {
|
|
|
fi
|
|
|
|
|
|
# kill volumes
|
|
|
- if [ "$kern_ubivol" ]; then
|
|
|
- ubirmvol /dev/$ubidev -N kernel || true
|
|
|
- fi
|
|
|
- if [ "$root_ubivol" ]; then
|
|
|
- ubirmvol /dev/$ubidev -N rootfs || true
|
|
|
- fi
|
|
|
- if [ "$data_ubivol" ]; then
|
|
|
- ubirmvol /dev/$ubidev -N rootfs_data || true
|
|
|
- fi
|
|
|
+ [ "$kern_ubivol" ] && ubirmvol /dev/$ubidev -N kernel || true
|
|
|
+ [ "$root_ubivol" ] && ubirmvol /dev/$ubidev -N rootfs || true
|
|
|
+ [ "$data_ubivol" ] && ubirmvol /dev/$ubidev -N rootfs_data || true
|
|
|
|
|
|
# update kernel
|
|
|
if [ "$has_kernel" = "1" ]; then
|
|
|
@@ -182,7 +156,7 @@ nand_upgrade_combined_ubi() {
|
|
|
|
|
|
# update rootfs
|
|
|
local root_size_param
|
|
|
- if [ "$root_fs" = "ubifs" ]; then
|
|
|
+ if [ "$rootfs_type" = "ubifs" ]; then
|
|
|
root_size_param="-m"
|
|
|
else
|
|
|
root_size_param="-s $rootfs_length"
|
|
|
@@ -193,78 +167,82 @@ nand_upgrade_combined_ubi() {
|
|
|
fi
|
|
|
|
|
|
# create rootfs_data for non-ubifs rootfs
|
|
|
- if [ "$root_fs" != "ubifs" ]; then
|
|
|
+ if [ "$rootfs_type" != "ubifs" ]; then
|
|
|
if ! ubimkvol /dev/$ubidev -N rootfs_data -m; then
|
|
|
echo "cannot initialize rootfs_data volume"
|
|
|
return 1
|
|
|
fi
|
|
|
fi
|
|
|
sync
|
|
|
-
|
|
|
- if [ "$has_kernel" = "1" ]; then
|
|
|
- local kern_ubivol="$( nand_find_volume $ubidev kernel )"
|
|
|
- ubiupdatevol /dev/$kern_ubivol -s $kernel_length $kernel_image
|
|
|
- fi
|
|
|
-
|
|
|
- local root_ubivol="$( nand_find_volume $ubidev rootfs )"
|
|
|
- ubiupdatevol /dev/$root_ubivol -s $rootfs_length $rootfs_image
|
|
|
- if [ -f "$conf_tar" ]; then
|
|
|
- nand_restore_config "$conf_tar"
|
|
|
- fi
|
|
|
- echo "sysupgrade successfull"
|
|
|
return 0
|
|
|
}
|
|
|
|
|
|
-nand_do_upgrade_stage1() {
|
|
|
- local board_name="$1"
|
|
|
- local tar_file="$2"
|
|
|
- local kernel_file=""
|
|
|
- local kernel_file=""
|
|
|
-
|
|
|
- tar xzf $tar_file -C /tmp/
|
|
|
- [ -f "/tmp/sysupgrade-$board_name/CONTROL" ] || {
|
|
|
- echo "failed to find /tmp/sysupgrade-$board_name/CONTROL"
|
|
|
- return 1
|
|
|
- }
|
|
|
+nand_do_upgrade_success() {
|
|
|
+ local conf_tar="/tmp/sysupgrade.tgz"
|
|
|
+
|
|
|
+ sync
|
|
|
+ [ -f "$conf_tar" ] && nand_restore_config "$conf_tar"
|
|
|
+ echo "sysupgrade successfull"
|
|
|
+ reboot -f
|
|
|
+}
|
|
|
|
|
|
- kernel_file=/tmp/sysupgrade-$board_name/kernel
|
|
|
- [ -f "$kernel_file" ] || {
|
|
|
- echo "$kernel_file is missing"
|
|
|
- return 1
|
|
|
- }
|
|
|
+nand_upgrade_ubinized() {
|
|
|
+ local ubi_file="$1"
|
|
|
+ local mtdnum="$(find_mtd_index "$CI_UBIPART")"
|
|
|
|
|
|
- rootfs_file=/tmp/sysupgrade-$board_name/root
|
|
|
- [ -f "$rootfs_file" ] || {
|
|
|
- echo "$rootfs_file is missing"
|
|
|
- return 1
|
|
|
- }
|
|
|
-
|
|
|
- echo -n /tmp/sysupgrade-$board_name > /tmp/sysupgrade-nand-folder
|
|
|
- cp /sbin/upgraded /tmp/
|
|
|
+ if [ ! "$mtdnum" ]; then
|
|
|
+ echo "cannot find mtd device $CI_UBIPART"
|
|
|
+ return 1;
|
|
|
+ fi
|
|
|
|
|
|
- return 0
|
|
|
+ local mtddev="/dev/mtd${mtdnum}"
|
|
|
+ ubidetach -p "${mtddev}" || true
|
|
|
+ sync
|
|
|
+ ubiformat "${mtddev}" -y -f "${ubi_file}"
|
|
|
+ ubiattach -p "${mtddev}"
|
|
|
+ nand_do_upgrade_success
|
|
|
}
|
|
|
|
|
|
nand_do_upgrade_stage2() {
|
|
|
- rootfs_file=$1/root
|
|
|
- kernel_file=$1/kernel
|
|
|
- config_file=$1/config
|
|
|
+ [ "$(identify $1)" == "ubi" ] && nand_upgrade_ubinized $1
|
|
|
|
|
|
- [ -f $config_file ] || config_file=""
|
|
|
+ local tar_file="$1"
|
|
|
+ local board_name="$(cat /tmp/sysinfo/board_name)"
|
|
|
+ local kernel_mtd="$(find_mtd_index kernel)"
|
|
|
|
|
|
- . $1/CONTROL
|
|
|
+ local kernel_length=`(tar xf $tar_file sysupgrade-$board_name/kernel -O | wc -c) 2> /dev/null`
|
|
|
+ local rootfs_length=`(tar xf $tar_file sysupgrade-$board_name/root -O | wc -c) 2> /dev/null`
|
|
|
+ local ubi_length=`(tar xf $tar_file sysupgrade-$board_name/ubi -O | wc -c) 2> /dev/null`
|
|
|
+
|
|
|
+ local rootfs_type="$(identify_tar "$tar_file" root)"
|
|
|
+
|
|
|
+ local has_kernel=1
|
|
|
+ local has_env=0
|
|
|
|
|
|
- [ "$UBI_KERNEL" = "1" ] || {
|
|
|
- mtd write $kernel_file kernel
|
|
|
- kernel_file=""
|
|
|
+ [ "kernel_length" = 0 -o -z "$kernel_mtd" ] || {
|
|
|
+ tar xf $tar_file sysupgrade-$board_name/kernel -O | mtd write - kernel
|
|
|
}
|
|
|
- nand_upgrade_combined_ubi "$kernel_file" "$rootfs_file" "$conf_tar" "$UBI_ENV"
|
|
|
- reboot -f
|
|
|
+ [ "kernel_length" = 0 -o ! -z "$kernel_mtd" ] && has_kernel=0
|
|
|
+
|
|
|
+ nand_upgrade_prepare_ubi "$rootfs_length" "$rootfs_type" "$has_kernel" "$has_env"
|
|
|
+
|
|
|
+ local ubidev="$( nand_find_ubi "$CI_UBIPART" )"
|
|
|
+ [ "$has_kernel" = "1" ] && {
|
|
|
+ local kern_ubivol="$(nand_find_volume $ubidev kernel)"
|
|
|
+ tar xf $tar_file sysupgrade-$board_name/kernel -O | \
|
|
|
+ ubiupdatevol /dev/$kern_ubivol -s $kern_length -
|
|
|
+ }
|
|
|
+
|
|
|
+ local root_ubivol="$(nand_find_volume $ubidev rootfs)"
|
|
|
+ tar xf $tar_file sysupgrade-$board_name/root -O | \
|
|
|
+ ubiupdatevol /dev/$root_ubivol -s $rootfs_length -
|
|
|
+
|
|
|
+ nand_do_upgrade_success
|
|
|
}
|
|
|
|
|
|
-nand_do_upgrade() {
|
|
|
+nand_upgrade_stage2() {
|
|
|
[ $1 = "nand" ] && {
|
|
|
- [ -d "$2" ] && {
|
|
|
+ [ -f "$2" ] && {
|
|
|
touch /tmp/sysupgrade
|
|
|
|
|
|
killall -9 telnetd
|
|
|
@@ -291,13 +269,29 @@ nand_do_upgrade() {
|
|
|
}
|
|
|
|
|
|
nand_upgrade_stage1() {
|
|
|
- [ -f /tmp/sysupgrade-nand-folder ] && {
|
|
|
- folder="$(cat /tmp/sysupgrade-nand-folder)"
|
|
|
- [ "$SAVE_CONFIG" = 1 -a -f "$CONF_TAR" ] &&
|
|
|
- cp $CONF_TAR $folder/config
|
|
|
+ [ -f /tmp/sysupgrade-nand-path ] && {
|
|
|
+ path="$(cat /tmp/sysupgrade-nand-path)"
|
|
|
+ [ "$SAVE_CONFIG" != 1 -a -f "$CONF_TAR" ] &&
|
|
|
+ rm $CONF_TAR
|
|
|
|
|
|
- ubus call system nandupgrade "{\"folder\": \"$folder\" }"
|
|
|
+ ubus call system nandupgrade "{\"path\": \"$path\" }"
|
|
|
exit 0
|
|
|
}
|
|
|
}
|
|
|
append sysupgrade_pre_upgrade nand_upgrade_stage1
|
|
|
+
|
|
|
+nand_do_platform_check() {
|
|
|
+ local board_name="$1"
|
|
|
+ local tar_file="$2"
|
|
|
+ local control_length=`(tar xf $tar_file sysupgrade-$board_name/CONTROL -O | wc -c) 2> /dev/null`
|
|
|
+
|
|
|
+ [ "$control_length" = 0 -a "$(identify $2)" != "ubi" ] && {
|
|
|
+ echo "Invalid sysupgrade file."
|
|
|
+ return 1
|
|
|
+ }
|
|
|
+
|
|
|
+ echo -n $2 > /tmp/sysupgrade-nand-path
|
|
|
+ cp /sbin/upgraded /tmp/
|
|
|
+
|
|
|
+ return 0
|
|
|
+}
|