blob: 861a664ac5c1cbcf270df0963aea716a2072909b [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
Dan Pasanen8320eb12018-01-26 10:26:47 -060011export ADDOND_VERSION=1
12
Marko Man2d218732017-09-12 02:24:39 +020013DEBUG=0
14
Andrew Dodd0c209012013-09-28 15:34:25 -040015# Preserve /system/addon.d in /tmp/addon.d
16preserve_addon_d() {
maxwen1c2e98d2017-09-15 17:13:48 +020017 rm -rf /tmp/addon.d/
Andrew Dodd0c209012013-09-28 15:34:25 -040018 mkdir -p /tmp/addon.d/
LuK1337ae517382020-01-20 16:09:50 +000019 cp -a $S/addon.d/* /tmp/addon.d/
Dan Pasanen8320eb12018-01-26 10:26:47 -060020 # Discard any scripts that aren't at least our version level
Davide Garberi87b84972020-01-19 12:21:00 +010021 for f in /tmp/addon.d/*sh; do
Dan Pasanen8320eb12018-01-26 10:26:47 -060022 SCRIPT_VERSION=$(grep "^# ADDOND_VERSION=" $f | cut -d= -f2)
23 if [ -z "$SCRIPT_VERSION" ]; then
24 SCRIPT_VERSION=1
25 fi
26 if [ $SCRIPT_VERSION -lt $ADDOND_VERSION ]; then
27 rm $f
28 fi
29 done
Andrew Dodd0c209012013-09-28 15:34:25 -040030 chmod 755 /tmp/addon.d/*.sh
31}
32
33# Restore /system/addon.d in /tmp/addon.d
34restore_addon_d() {
LuK1337ae517382020-01-20 16:09:50 +000035 cp -a /tmp/addon.d/* $S/addon.d/
Andrew Dodd0c209012013-09-28 15:34:25 -040036 rm -rf /tmp/addon.d/
37}
38
maxwen1c2e98d2017-09-15 17:13:48 +020039# Restore only if backup has the expected major and minor version
Andrew Dodd0c209012013-09-28 15:34:25 -040040check_prereq() {
maxwen1c2e98d2017-09-15 17:13:48 +020041 if [ ! -f /tmp/build.prop ]; then
42 # this will block any backups made before 8 cause file was not copied before
43 echo "Not restoring files from incompatible version: $V"
44 exit 127
45 fi
46 if ( ! grep -q "^ro.build.version.release=$V.*" /tmp/build.prop ); then
47 echo "Not restoring files from incompatible version: $V"
48 exit 127
49 fi
Andrew Dodd0c209012013-09-28 15:34:25 -040050}
51
52check_blacklist() {
LuK1337ae517382020-01-20 16:09:50 +000053 if [ -f $S/addon.d/blacklist ];then
maxwen1c2e98d2017-09-15 17:13:48 +020054 ## Discard any known bad backup scripts
Davide Garberie8c83a92020-01-19 19:28:55 +010055 for f in /$1/addon.d/*sh; do
maxwen1c2e98d2017-09-15 17:13:48 +020056 s=$(md5sum $f | awk {'print $1'})
LuK1337ae517382020-01-20 16:09:50 +000057 grep -q $s $S/addon.d/blacklist && rm -f $f
maxwen1c2e98d2017-09-15 17:13:48 +020058 done
Andrew Dodd0c209012013-09-28 15:34:25 -040059 fi
60}
61
62# Execute /system/addon.d/*.sh scripts with $1 parameter
63run_stage() {
maxwen1c2e98d2017-09-15 17:13:48 +020064 for script in $(find /tmp/addon.d/ -name '*.sh' |sort -n); do
65 if [ $DEBUG -eq 1 ]; then
66 echo run_stage $script $1
67 fi
68 $script $1
69 done
Andrew Dodd0c209012013-09-28 15:34:25 -040070}
71
Davide Garberi9717dfa2019-09-24 20:18:11 +020072determine_system_mount() {
73 if grep -q -e"^$SYSDEV" /proc/mounts; then
74 umount $(grep -e"^$SYSDEV" /proc/mounts | cut -d" " -f2)
75 fi
76
77 if [ -d /mnt/system ]; then
78 SYSMOUNT="/mnt/system"
79 elif [ -d /system_root ]; then
80 SYSMOUNT="/system_root"
81 else
82 SYSMOUNT="/system"
83 fi
84
85 export S=$SYSMOUNT/system
86}
87
88mount_system() {
89 mount -t $SYSFS $SYSDEV $SYSMOUNT -o rw,discard
90}
91
92unmount_system() {
93 umount $SYSMOUNT
94}
95
96determine_system_mount
97
Andrew Dodd0c209012013-09-28 15:34:25 -040098case "$1" in
99 backup)
maxwen1c2e98d2017-09-15 17:13:48 +0200100 # make sure we dont start with any leftovers
101 rm -rf $C
LuK1337ae517382020-01-20 16:09:50 +0000102 cp $S/bin/backuptool.functions /tmp
103 cp $S/build.prop /tmp
Davide Garberi9717dfa2019-09-24 20:18:11 +0200104 mount_system
Andrew Dodd0c209012013-09-28 15:34:25 -0400105 mkdir -p $C
maxwen1c2e98d2017-09-15 17:13:48 +0200106 #check_prereq
LuK1337ae517382020-01-20 16:09:50 +0000107 check_blacklist $S
Andrew Dodd0c209012013-09-28 15:34:25 -0400108 preserve_addon_d
109 run_stage pre-backup
110 run_stage backup
111 run_stage post-backup
Davide Garberi9717dfa2019-09-24 20:18:11 +0200112 unmount_system
Andrew Dodd0c209012013-09-28 15:34:25 -0400113 ;;
114 restore)
LuK1337ae517382020-01-20 16:09:50 +0000115 cp $S/bin/backuptool.functions /tmp
Davide Garberi9717dfa2019-09-24 20:18:11 +0200116 mount_system
Andrew Dodd0c209012013-09-28 15:34:25 -0400117 check_prereq
LuK1337ae517382020-01-20 16:09:50 +0000118 check_blacklist /tmp
Andrew Dodd0c209012013-09-28 15:34:25 -0400119 run_stage pre-restore
120 run_stage restore
121 run_stage post-restore
122 restore_addon_d
123 rm -rf $C
124 sync
Davide Garberi9717dfa2019-09-24 20:18:11 +0200125 unmount_system
Andrew Dodd0c209012013-09-28 15:34:25 -0400126 ;;
127 *)
128 echo "Usage: $0 {backup|restore}"
129 exit 1
130esac
131
132exit 0