source: trunk/package/base-files/files/lib/upgrade/common.sh @ 17319

Last change on this file since 17319 was 17319, checked in by jow, 7 years ago

[package] base-files: fix sysupgrade get_magic_word() function to return proper values if the first two bytes are identical

File size: 3.9 KB
Line 
1#!/bin/sh
2
3RAM_ROOT=/tmp/root
4
5ldd() { LD_TRACE_LOADED_OBJECTS=1 $*; }
6libs() { ldd $* | awk '{print $3}'; }
7
8install_file() { # <file> [ <file> ... ]
9        for file in "$@"; do
10                dest="$RAM_ROOT/$file"
11                [ -f $file -a ! -f $dest ] && {
12                        dir="$(dirname $dest)"
13                        mkdir -p "$dir"
14                        cp $file $dest
15                }
16        done
17}
18
19install_bin() { # <file> [ <symlink> ... ]
20        src=$1
21        files=$1
22        [ -x "$src" ] && files="$src $(libs $src)"
23        install_file $files
24        shift
25        for link in "$@"; do {
26                dest="$RAM_ROOT/$link"
27                dir="$(dirname $dest)"
28                mkdir -p "$dir"
29                [ -f "$dest" ] || ln -s $src $dest
30        }; done
31}
32
33pivot() { # <new_root> <old_root>
34        mount | grep "on $1 type" 2>&- 1>&- || mount -o bind $1 $1
35        mkdir -p $1$2 $1/proc $1/dev $1/tmp $1/jffs && \
36        mount -o move /proc $1/proc && \
37        pivot_root $1 $1$2 || {
38        umount $1 $1
39                return 1
40        }
41        mount -o move $2/dev /dev
42        mount -o move $2/tmp /tmp
43        mount -o move $2/jffs /jffs 2>&-
44        return 0
45}
46
47run_ramfs() { # <command> [...]
48        install_bin /bin/busybox /bin/ash /bin/sh /bin/mount /bin/umount /sbin/pivot_root /usr/bin/wget /sbin/reboot /bin/sync /bin/dd /bin/grep /bin/cp /bin/mv /bin/tar /usr/bin/md5sum "/usr/bin/[" /bin/vi /bin/ls /bin/cat /usr/bin/awk /usr/bin/hexdump /bin/sleep /bin/zcat /usr/bin/bzcat
49        install_bin /sbin/mtd
50        for file in $RAMFS_COPY_BIN; do
51                install_bin $file
52        done
53        install_file /etc/resolv.conf /etc/functions.sh /lib/upgrade/*.sh $RAMFS_COPY_DATA
54
55        pivot $RAM_ROOT /mnt || {
56                echo "Failed to switch over to ramfs. Please reboot."
57                exit 1
58        }
59
60        mount -o remount,ro /mnt
61        umount -l /mnt
62
63        grep /jffs /proc/mounts > /dev/null && {
64                mount -o remount,ro /jffs
65                umount -l /jffs
66        }
67
68        # spawn a new shell from ramdisk to reduce the probability of cache issues
69        exec /bin/busybox ash -c "$*"
70}
71
72run_hooks() {
73        local arg="$1"; shift
74        for func in "$@"; do
75                eval "$func $arg"
76        done
77}
78
79ask_bool() {
80        local default="$1"; shift;
81        local answer="$default"
82
83        [ "$INTERACTIVE" -eq 1 ] && {
84                case "$default" in
85                        0) echo -n "$* (y/N): ";;
86                        *) echo -n "$* (Y/n): ";;
87                esac
88                read answer
89                case "$answer" in
90                        y*) answer=1;;
91                        n*) answer=0;;
92                        *) answer="$default";;
93                esac
94        }
95        [ "$answer" -gt 0 ]
96}
97
98v() {
99        [ "$VERBOSE" -ge 1 ] && echo "$@"
100}
101
102rootfs_type() {
103        mount | awk '($3 ~ /^\/$/) && ($5 !~ /rootfs/) { print $5 }'
104}
105
106get_image() { # <source> [ <command> ]
107        local from="$1"
108        local conc="$2"
109        local cmd
110
111        case "$from" in
112                http://*|ftp://*) cmd="wget -O- -q";;
113                *) cmd="cat";;
114        esac
115        if [ -z "$conc" ]; then
116                local magic="$(eval $cmd $from | dd bs=2 count=1 2>/dev/null | hexdump -n 2 -e '1/1 "%02x"')"
117                case "$magic" in
118                        1f8b) conc="zcat";;
119                        425a) conc="bzcat";;
120                esac
121        fi
122
123        eval "$cmd $from ${conc:+| $conc}"
124}
125
126get_magic_word() {
127        get_image "$@" | dd bs=2 count=1 2>/dev/null | hexdump -v -n 2 -e '1/1 "%02x"'
128}
129
130refresh_mtd_partitions() {
131        mtd refresh rootfs
132}
133
134jffs2_copy_config() {
135        if grep rootfs_data /proc/mtd >/dev/null; then
136                # squashfs+jffs2
137                mtd -e rootfs_data jffs2write "$CONF_TAR" rootfs_data
138        else
139                # jffs2
140                mtd jffs2write "$CONF_TAR" rootfs
141        fi
142}
143
144default_do_upgrade() {
145        sync
146        if [ "$SAVE_CONFIG" -eq 1 -a -z "$USE_REFRESH" ]; then
147                get_image "$1" | mtd -j "$CONF_TAR" write - "${PART_NAME:-image}"
148        else
149                get_image "$1" | mtd write - "${PART_NAME:-image}"
150        fi
151}
152
153do_upgrade() {
154        v "Performing system upgrade..."
155        if type 'platform_do_upgrade' >/dev/null 2>/dev/null; then
156                platform_do_upgrade "$ARGV"
157        else
158                default_do_upgrade "$ARGV"
159        fi
160
161        [ "$SAVE_CONFIG" -eq 1 -a -n "$USE_REFRESH" ] && {
162                v "Refreshing partitions"
163                if type 'platform_refresh_partitions' >/dev/null 2>/dev/null; then
164                        platform_refresh_partitions
165                else
166                        refresh_mtd_partitions
167                fi
168                if type 'platform_copy_config' >/dev/null 2>/dev/null; then
169                        platform_copy_config
170                else
171                        jffs2_copy_config
172                fi
173        }
174        v "Upgrade completed"
175        [ -n "$DELAY" ] && sleep "$DELAY"
176        ask_bool 1 "Reboot" && {
177                v "Rebooting system..."
178                reboot
179                sleep 5
180                echo b 2>/dev/null >/proc/sysrq-trigger
181        }
182}
Note: See TracBrowser for help on using the repository browser.