treewide: when copying a backup file always specify dest name
[openwrt/openwrt.git] / target / linux / ipq806x / base-files / lib / upgrade / zyxel.sh
index 7d0ab973566c6d50bd485e7cc946e09a19cb1135..a86389c549229ecab6e525b54ef7ce5aa4c1cec8 100644 (file)
@@ -19,9 +19,9 @@ 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
+       local dualflagmtd=$4
 
        # keep sure its unbound
        losetup --detach-all || {
@@ -29,14 +29,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 +48,34 @@ 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/
+               cp -v "$CONF_TAR" "/tmp/new_root/$BACKUP_FILE"
                umount /tmp/new_root
        }
 
+       # flashing successful, toggle the dualflag
+       case "$rootfs" in
+               "/dev/mmcblk0p5")
+                       printf "\xff" >$dualflagmtd
+                       ;;
+               "/dev/mmcblk0p8")
+                       printf "\x01" >$dualflagmtd
+                       ;;
+       esac
+
        # Cleanup
-       losetup -d /dev/loop0 >/dev/null 2>&1
+       losetup -d $loopdev >/dev/null 2>&1
        sync
        umount -a
        reboot -f
@@ -74,13 +89,22 @@ zyxel_do_upgrade() {
 
        [ -b "${rootfs}" ] || return 1
        case "$board" in
-       nbg6817)
+       zyxel,nbg6817)
+               local dualflagmtd="$(find_mtd_part 0:DUAL_FLAG)"
+               [ -b $dualflagmtd ] || return 1
+
                case "$rootfs" in
                        "/dev/mmcblk0p5")
-                               kernel=mmcblk0p4
+                               # booted from the primary partition set
+                               # write to the alternative set
+                               kernel="/dev/mmcblk0p7"
+                               rootfs="/dev/mmcblk0p8"
                        ;;
                        "/dev/mmcblk0p8")
-                               kernel=mmcblk0p7
+                               # booted from the alternative partition set
+                               # write to the primary set
+                               kernel="/dev/mmcblk0p4"
+                               rootfs="/dev/mmcblk0p5"
                        ;;
                        *)
                                return 1
@@ -92,7 +116,7 @@ zyxel_do_upgrade() {
                ;;
        esac
 
-       zyxel_do_flash $tar_file $board $kernel $rootfs
+       zyxel_do_flash $tar_file $kernel $rootfs $dualflagmtd
 
        return 0
 }