ipq806x: request the first free loop device dynamically for the nbg6817 sysupgrade
[openwrt/staging/kaloz.git] / target / linux / ipq806x / base-files / lib / upgrade / zyxel.sh
index fc48cb1d025c2f092b72236e3a8c489184cfd844..cf2acfcc174d5d08e9a50f9e5fca63a19d7fcb9b 100644 (file)
@@ -19,9 +19,8 @@ zyxel_get_rootfs() {
 
 zyxel_do_flash() {
        local tar_file=$1
-       local board=$2
-       local kernel=$3
-       local rootfs=$4
+       local kernel=$2
+       local rootfs=$3
 
        # keep sure its unbound
        losetup --detach-all || {
@@ -29,14 +28,18 @@ zyxel_do_flash() {
                reboot -f
        }
 
-       echo "flashing kernel to /dev/${kernel}"
-       tar xf $tar_file sysupgrade-$board/kernel -O >/dev/$kernel
+       # use the first found directory in the tar archive
+       local board_dir=$(tar tf $tar_file | grep -m 1 '^sysupgrade-.*/$')
+       board_dir=${board_dir%/}
+
+       echo "flashing kernel to $kernel"
+       tar xf $tar_file ${board_dir}/kernel -O >$kernel
 
        echo "flashing rootfs to ${rootfs}"
-       tar xf $tar_file sysupgrade-$board/root -O >"${rootfs}"
+       tar xf $tar_file ${board_dir}/root -O >"${rootfs}"
 
        # a padded rootfs is needed for overlay fs creation
-       local offset=$(tar xf $tar_file sysupgrade-$board/root -O | wc -c)
+       local offset=$(tar xf $tar_file ${board_dir}/root -O | wc -c)
        [ $offset -lt 65536 ] && {
                echo Wrong size for rootfs: $offset
                sleep 10
@@ -44,23 +47,24 @@ zyxel_do_flash() {
        }
 
        # Mount loop for rootfs_data
-       losetup -o $offset /dev/loop0 "${rootfs}" || {
+       local loopdev="$(losetup -f)"
+       losetup -o $offset $loopdev $rootfs || {
                echo "Failed to mount looped rootfs_data."
                sleep 10
                reboot -f
        }
 
        echo "Format new rootfs_data at position ${offset}."
-       mkfs.ext4 -F -L rootfs_data /dev/loop0
+       mkfs.ext4 -F -L rootfs_data $loopdev
        mkdir /tmp/new_root
-       mount -t ext4 /dev/loop0 /tmp/new_root && {
+       mount -t ext4 $loopdev /tmp/new_root && {
                echo "Saving config to rootfs_data at position ${offset}."
                cp -v /tmp/sysupgrade.tgz /tmp/new_root/
                umount /tmp/new_root
        }
 
        # Cleanup
-       losetup -d /dev/loop0 >/dev/null 2>&1
+       losetup -d $loopdev >/dev/null 2>&1
        sync
        umount -a
        reboot -f
@@ -68,20 +72,31 @@ zyxel_do_flash() {
 
 zyxel_do_upgrade() {
        local tar_file="$1"
-       local board=$(cat /tmp/sysinfo/board_name)
+       local board=$(board_name)
        local rootfs="$(zyxel_get_rootfs)"
        local kernel=
 
        [ -b "${rootfs}" ] || return 1
        case "$board" in
-       nbg6817)
-               kernel=mmcblk0p4
+       zyxel,nbg6817)
+               case "$rootfs" in
+                       "/dev/mmcblk0p5")
+                               kernel="/dev/mmcblk0p4"
+                       ;;
+                       "/dev/mmcblk0p8")
+                               kernel="/dev/mmcblk0p7"
+                       ;;
+                       *)
+                               return 1
+                       ;;
+               esac
                ;;
        *)
                return 1
+               ;;
        esac
 
-       zyxel_do_flash $tar_file $board $kernel $rootfs
+       zyxel_do_flash $tar_file $kernel $rootfs
 
        return 0
 }