blob: 73a31fca01a716411366e29f53ac46d5393db53f [file] [log] [blame]
Andrew Dodd0c209012013-09-28 15:34:25 -04001#!/sbin/sh
2#
3# Backup and restore addon /system files
4#
5
6export C=/tmp/backupdir
Davide Garberi9717dfa2019-09-24 20:18:11 +02007export SYSDEV="$(readlink -nf "$2")"
8export SYSFS="$3"
micky3877d554ae2023-07-20 16:21:18 +02009export V=13
Andrew Dodd0c209012013-09-28 15:34:25 -040010
Marko Man2d218732017-09-12 02:24:39 +020011DEBUG=0
12
Alessandro Astone09bec2c2020-12-29 18:38:28 +010013export ADDOND_VERSION=3
14
15# Partitions to mount for backup/restore in V3
16export all_V3_partitions="vendor product system_ext"
17
18get_script_version() {
19 version=$(grep "^# ADDOND_VERSION=" $1 | cut -d= -f2)
20 [ -z "$version" ] && version=1
21 echo $version
22}
23
Andrew Dodd0c209012013-09-28 15:34:25 -040024# Preserve /system/addon.d in /tmp/addon.d
25preserve_addon_d() {
maxwen1c2e98d2017-09-15 17:13:48 +020026 rm -rf /tmp/addon.d/
Andrew Dodd0c209012013-09-28 15:34:25 -040027 mkdir -p /tmp/addon.d/
LuK1337ae517382020-01-20 16:09:50 +000028 cp -a $S/addon.d/* /tmp/addon.d/
Andrew Dodd0c209012013-09-28 15:34:25 -040029 chmod 755 /tmp/addon.d/*.sh
30}
31
32# Restore /system/addon.d in /tmp/addon.d
33restore_addon_d() {
LuK1337ae517382020-01-20 16:09:50 +000034 cp -a /tmp/addon.d/* $S/addon.d/
Andrew Dodd0c209012013-09-28 15:34:25 -040035 rm -rf /tmp/addon.d/
36}
37
maxwen1c2e98d2017-09-15 17:13:48 +020038# Restore only if backup has the expected major and minor version
Andrew Dodd0c209012013-09-28 15:34:25 -040039check_prereq() {
z3DD3r31285e52020-03-04 18:07:40 +030040 # If there is no build.prop file the partition is probably empty.
41if [ ! -r $S/build.prop ]; then
42 echo "Backup/restore is not possible. Partition is probably empty"
z3DD3r8ca31e62020-03-04 12:42:10 +030043 return 1
z3DD3r31285e52020-03-04 18:07:40 +030044fi
45 if ( ! grep -q "^ro.build.version.release=$V.*" /tmp/build.prop ); then
46 echo "Backup/restore is not possible. Incompatible ROM version: $V"
47 return 2
48 fi
49 return 0
Andrew Dodd0c209012013-09-28 15:34:25 -040050}
51
Alessandro Astone09bec2c2020-12-29 18:38:28 +010052# Execute /system/addon.d/*.sh scripts with each $@ parameter
53run_stages() {
maxwen1c2e98d2017-09-15 17:13:48 +020054 for script in $(find /tmp/addon.d/ -name '*.sh' |sort -n); do
55 if [ $DEBUG -eq 1 ]; then
56 echo run_stage $script $1
57 fi
Alessandro Astone09bec2c2020-12-29 18:38:28 +010058 v=$(get_script_version $script)
59 if [ $v -ge 3 ]; then
60 mount_extra $all_V3_partitions
61 else
62 umount_extra $all_V3_partitions
63 fi
64
65 for stage in $@; do
66 if [ $v -ge 3 ]; then
67 $script $stage
68 else
Alessandro Astonec0272172021-03-26 12:52:38 +010069 ADDOND_VERSION= $script $stage
Alessandro Astone09bec2c2020-12-29 18:38:28 +010070 fi
71 done
maxwen1c2e98d2017-09-15 17:13:48 +020072 done
Andrew Dodd0c209012013-09-28 15:34:25 -040073}
74
Alessandro Astone09bec2c2020-12-29 18:38:28 +010075#####################
76### Mount helpers ###
77#####################
Davide Garberi9717dfa2019-09-24 20:18:11 +020078determine_system_mount() {
79 if grep -q -e"^$SYSDEV" /proc/mounts; then
80 umount $(grep -e"^$SYSDEV" /proc/mounts | cut -d" " -f2)
81 fi
82
83 if [ -d /mnt/system ]; then
84 SYSMOUNT="/mnt/system"
85 elif [ -d /system_root ]; then
86 SYSMOUNT="/system_root"
87 else
88 SYSMOUNT="/system"
89 fi
90
91 export S=$SYSMOUNT/system
92}
93
94mount_system() {
95 mount -t $SYSFS $SYSDEV $SYSMOUNT -o rw,discard
96}
97
98unmount_system() {
99 umount $SYSMOUNT
100}
101
Alessandro Astone09bec2c2020-12-29 18:38:28 +0100102get_block_for_mount_point() {
103 grep -v "^#" /etc/recovery.fstab | grep " $1 " | tail -n1 | tr -s ' ' | cut -d' ' -f1
104}
105
106find_block() {
107 local name="$1"
108 local fstab_entry=$(get_block_for_mount_point "/$name")
109 # P-SAR hacks
110 [ -z "$fstab_entry" ] && [ "$name" = "system" ] && fstab_entry=$(get_block_for_mount_point "/")
111 [ -z "$fstab_entry" ] && [ "$name" = "system" ] && fstab_entry=$(get_block_for_mount_point "/system_root")
112
113 local dev
114 if [ "$DYNAMIC_PARTITIONS" = "true" ]; then
115 if [ -n "$fstab_entry" ]; then
116 dev="${BLK_PATH}/${fstab_entry}"
117 else
118 dev="${BLK_PATH}/${name}"
119 fi
120 else
121 if [ -n "$fstab_entry" ]; then
122 dev="$fstab_entry"
123 else
124 dev="${BLK_PATH}/${name}"
125 fi
126 fi
127
128 if [ -b "$dev" ]; then
129 echo "$dev"
130 fi
131}
132
Davide Garberi9717dfa2019-09-24 20:18:11 +0200133determine_system_mount
134
Alessandro Astone09bec2c2020-12-29 18:38:28 +0100135DYNAMIC_PARTITIONS=$(getprop ro.boot.dynamic_partitions)
Tim Zimmermannba085cd2021-05-08 16:17:18 +0200136if [ "$DYNAMIC_PARTITIONS" = "true" ]; then
137 BLK_PATH="/dev/block/mapper"
138else
139 BLK_PATH=$(dirname "$SYSDEV")
140fi
Alessandro Astone09bec2c2020-12-29 18:38:28 +0100141
142mount_extra() {
143 for partition in $@; do
144 mnt_point="/$partition"
Alessandro Astone99ffae92021-04-02 00:18:16 +0200145 mountpoint "$mnt_point" >/dev/null 2>&1 && continue
146 [ -L "$SYSMOUNT/$partition" ] && continue
Alessandro Astone09bec2c2020-12-29 18:38:28 +0100147
148 blk_dev=$(find_block "$partition")
149 if [ -e "$blk_dev" ]; then
150 [ "$DYNAMIC_PARTITIONS" = "true" ] && blockdev --setrw "$blk_dev"
151 mkdir -p "$mnt_point"
152 mount -o rw "$blk_dev" "$mnt_point"
153 fi
154 done
155}
156
157umount_extra() {
158 for partition in $@; do
159 umount -l "/$partition" 2>/dev/null
160 done
161}
162
Andrew Dodd0c209012013-09-28 15:34:25 -0400163case "$1" in
164 backup)
maxwen1c2e98d2017-09-15 17:13:48 +0200165 # make sure we dont start with any leftovers
166 rm -rf $C
LuK1337ae517382020-01-20 16:09:50 +0000167 cp $S/bin/backuptool.functions /tmp
168 cp $S/build.prop /tmp
Davide Garberi9717dfa2019-09-24 20:18:11 +0200169 mount_system
z3DD3r31285e52020-03-04 18:07:40 +0300170 if check_prereq; then
171 mkdir -p $C
172 preserve_addon_d
Alessandro Astone09bec2c2020-12-29 18:38:28 +0100173 run_stages pre-backup backup post-backup
z3DD3r31285e52020-03-04 18:07:40 +0300174 fi
Davide Garberi9717dfa2019-09-24 20:18:11 +0200175 unmount_system
Andrew Dodd0c209012013-09-28 15:34:25 -0400176 ;;
177 restore)
LuK1337ae517382020-01-20 16:09:50 +0000178 cp $S/bin/backuptool.functions /tmp
Davide Garberi9717dfa2019-09-24 20:18:11 +0200179 mount_system
z3DD3r31285e52020-03-04 18:07:40 +0300180 if check_prereq; then
Alessandro Astone09bec2c2020-12-29 18:38:28 +0100181 run_stages pre-restore restore post-restore
182 umount_extra $all_V3_partitions
z3DD3r31285e52020-03-04 18:07:40 +0300183 restore_addon_d
184 rm -rf $C
185 sync
186 fi
Davide Garberi9717dfa2019-09-24 20:18:11 +0200187 unmount_system
Andrew Dodd0c209012013-09-28 15:34:25 -0400188 ;;
189 *)
190 echo "Usage: $0 {backup|restore}"
191 exit 1
192esac
193
194exit 0