OpenWrt – Blame information for rev 4
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
4 | office | 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 | local dualflagmtd=$4 |
||
25 | |||
26 | # keep sure its unbound |
||
27 | losetup --detach-all || { |
||
28 | echo Failed to detach all loop devices. Skip this try. |
||
29 | reboot -f |
||
30 | } |
||
31 | |||
32 | # use the first found directory in the tar archive |
||
33 | local board_dir=$(tar tf $tar_file | grep -m 1 '^sysupgrade-.*/$') |
||
34 | board_dir=${board_dir%/} |
||
35 | |||
36 | echo "flashing kernel to $kernel" |
||
37 | tar xf $tar_file ${board_dir}/kernel -O >$kernel |
||
38 | |||
39 | echo "flashing rootfs to ${rootfs}" |
||
40 | tar xf $tar_file ${board_dir}/root -O >"${rootfs}" |
||
41 | |||
42 | # a padded rootfs is needed for overlay fs creation |
||
43 | local offset=$(tar xf $tar_file ${board_dir}/root -O | wc -c) |
||
44 | [ $offset -lt 65536 ] && { |
||
45 | echo Wrong size for rootfs: $offset |
||
46 | sleep 10 |
||
47 | reboot -f |
||
48 | } |
||
49 | |||
50 | # Mount loop for rootfs_data |
||
51 | local loopdev="$(losetup -f)" |
||
52 | losetup -o $offset $loopdev $rootfs || { |
||
53 | echo "Failed to mount looped rootfs_data." |
||
54 | sleep 10 |
||
55 | reboot -f |
||
56 | } |
||
57 | |||
58 | echo "Format new rootfs_data at position ${offset}." |
||
59 | mkfs.ext4 -F -L rootfs_data $loopdev |
||
60 | mkdir /tmp/new_root |
||
61 | mount -t ext4 $loopdev /tmp/new_root && { |
||
62 | echo "Saving config to rootfs_data at position ${offset}." |
||
63 | cp -v /tmp/sysupgrade.tgz /tmp/new_root/ |
||
64 | umount /tmp/new_root |
||
65 | } |
||
66 | |||
67 | # flashing successful, toggle the dualflag |
||
68 | case "$rootfs" in |
||
69 | "/dev/mmcblk0p5") |
||
70 | printf "\xff" >$dualflagmtd |
||
71 | ;; |
||
72 | "/dev/mmcblk0p8") |
||
73 | printf "\x01" >$dualflagmtd |
||
74 | ;; |
||
75 | esac |
||
76 | |||
77 | # Cleanup |
||
78 | losetup -d $loopdev >/dev/null 2>&1 |
||
79 | sync |
||
80 | umount -a |
||
81 | reboot -f |
||
82 | } |
||
83 | |||
84 | zyxel_do_upgrade() { |
||
85 | local tar_file="$1" |
||
86 | local board=$(board_name) |
||
87 | local rootfs="$(zyxel_get_rootfs)" |
||
88 | local kernel= |
||
89 | |||
90 | [ -b "${rootfs}" ] || return 1 |
||
91 | case "$board" in |
||
92 | zyxel,nbg6817) |
||
93 | local dualflagmtd="$(find_mtd_part 0:DUAL_FLAG)" |
||
94 | [ -b $dualflagmtd ] || return 1 |
||
95 | |||
96 | case "$rootfs" in |
||
97 | "/dev/mmcblk0p5") |
||
98 | # booted from the primary partition set |
||
99 | # write to the alternative set |
||
100 | kernel="/dev/mmcblk0p7" |
||
101 | rootfs="/dev/mmcblk0p8" |
||
102 | ;; |
||
103 | "/dev/mmcblk0p8") |
||
104 | # booted from the alternative partition set |
||
105 | # write to the primary set |
||
106 | kernel="/dev/mmcblk0p4" |
||
107 | rootfs="/dev/mmcblk0p5" |
||
108 | ;; |
||
109 | *) |
||
110 | return 1 |
||
111 | ;; |
||
112 | esac |
||
113 | ;; |
||
114 | *) |
||
115 | return 1 |
||
116 | ;; |
||
117 | esac |
||
118 | |||
119 | zyxel_do_flash $tar_file $kernel $rootfs $dualflagmtd |
||
120 | |||
121 | return 0 |
||
122 | } |