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
1 #
2 # Copyright (C) 2016 lede-project.org
3 #
4
5 zyxel_get_rootfs() {
6 local rootfsdev
7
8 if read cmdline < /proc/cmdline; then
9 case "$cmdline" in
10 *root=*)
11 rootfsdev="${cmdline##*root=}"
12 rootfsdev="${rootfsdev%% *}"
13 ;;
14 esac
15
16 echo "${rootfsdev}"
17 fi
18 }
19
20 zyxel_do_flash() {
21 local tar_file=$1
22 local kernel=$2
23 local rootfs=$3
24
25 # keep sure its unbound
26 losetup --detach-all || {
27 echo Failed to detach all loop devices. Skip this try.
28 reboot -f
29 }
30
31 # use the first found directory in the tar archive
32 local board_dir=$(tar tf $tar_file | grep -m 1 '^sysupgrade-.*/$')
33 board_dir=${board_dir%/}
34
35 echo "flashing kernel to $kernel"
36 tar xf $tar_file ${board_dir}/kernel -O >$kernel
37
38 echo "flashing rootfs to ${rootfs}"
39 tar xf $tar_file ${board_dir}/root -O >"${rootfs}"
40
41 # a padded rootfs is needed for overlay fs creation
42 local offset=$(tar xf $tar_file ${board_dir}/root -O | wc -c)
43 [ $offset -lt 65536 ] && {
44 echo Wrong size for rootfs: $offset
45 sleep 10
46 reboot -f
47 }
48
49 # Mount loop for rootfs_data
50 local loopdev="$(losetup -f)"
51 losetup -o $offset $loopdev $rootfs || {
52 echo "Failed to mount looped rootfs_data."
53 sleep 10
54 reboot -f
55 }
56
57 echo "Format new rootfs_data at position ${offset}."
58 mkfs.ext4 -F -L rootfs_data $loopdev
59 mkdir /tmp/new_root
60 mount -t ext4 $loopdev /tmp/new_root && {
61 echo "Saving config to rootfs_data at position ${offset}."
62 cp -v /tmp/sysupgrade.tgz /tmp/new_root/
63 umount /tmp/new_root
64 }
65
66 # Cleanup
67 losetup -d $loopdev >/dev/null 2>&1
68 sync
69 umount -a
70 reboot -f
71 }
72
73 zyxel_do_upgrade() {
74 local tar_file="$1"
75 local board=$(board_name)
76 local rootfs="$(zyxel_get_rootfs)"
77 local kernel=
78
79 [ -b "${rootfs}" ] || return 1
80 case "$board" in
81 zyxel,nbg6817)
82 case "$rootfs" in
83 "/dev/mmcblk0p5")
84 kernel="/dev/mmcblk0p4"
85 ;;
86 "/dev/mmcblk0p8")
87 kernel="/dev/mmcblk0p7"
88 ;;
89 *)
90 return 1
91 ;;
92 esac
93 ;;
94 *)
95 return 1
96 ;;
97 esac
98
99 zyxel_do_flash $tar_file $kernel $rootfs
100
101 return 0
102 }