If /system is empty, /tmp/addon.d/ will not exist, "*sh" won't be expanded, md5sum will not generate any output and the variable $s will be empty. Therefore grep, which will receive only one arg, will start to read the standard input and never exit, causing the installation to never end. Fix this checking whether we have files to read or not. Change-Id: I656eab42e54b3f81da8c5ac81374b9deddcf8484
117 lines
2.4 KiB
Bash
Executable File
117 lines
2.4 KiB
Bash
Executable File
#!/sbin/sh
|
|
#
|
|
# Backup and restore addon /system files
|
|
#
|
|
|
|
export C=/tmp/backupdir
|
|
export S=/system
|
|
export V=14.1
|
|
|
|
# Scripts in /system/addon.d expect to find backuptool.functions in /tmp
|
|
cp -f /tmp/install/bin/backuptool.functions /tmp
|
|
|
|
# Preserve /system/addon.d in /tmp/addon.d
|
|
preserve_addon_d() {
|
|
if [ -d /system/addon.d/ ]; then
|
|
mkdir -p /tmp/addon.d/
|
|
cp -a /system/addon.d/* /tmp/addon.d/
|
|
chmod 755 /tmp/addon.d/*.sh
|
|
fi
|
|
}
|
|
|
|
# Restore /system/addon.d from /tmp/addon.d
|
|
restore_addon_d() {
|
|
if [ -d /tmp/addon.d/ ]; then
|
|
mkdir -p /system/addon.d/
|
|
cp -a /tmp/addon.d/* /system/addon.d/
|
|
rm -rf /tmp/addon.d/
|
|
fi
|
|
}
|
|
|
|
# Proceed only if /system is the expected major and minor version
|
|
check_prereq() {
|
|
# If there is no build.prop file the partition is probably empty.
|
|
if [ ! -r /system/build.prop ]; then
|
|
return 0
|
|
fi
|
|
if ( ! grep -q "^ro.cm.version=$V.*" /system/build.prop ); then
|
|
echo "Not backing up files from incompatible version: $V"
|
|
return 0
|
|
fi
|
|
return 1
|
|
}
|
|
|
|
check_blacklist() {
|
|
if [ -f /system/addon.d/blacklist -a -d /$1/addon.d/ ]; then
|
|
## Discard any known bad backup scripts
|
|
cd /$1/addon.d/
|
|
for f in *sh; do
|
|
[ -f $f ] || continue
|
|
s=$(md5sum $f | cut -c-32)
|
|
grep -q $s /system/addon.d/blacklist && rm -f $f
|
|
done
|
|
fi
|
|
}
|
|
|
|
check_whitelist() {
|
|
found=0
|
|
if [ -f /system/addon.d/whitelist ];then
|
|
## forcefully keep any version-independent stuff
|
|
cd /$1/addon.d/
|
|
for f in *sh; do
|
|
s=$(md5sum $f | cut -c-32)
|
|
grep -q $s /system/addon.d/whitelist
|
|
if [ $? -eq 0 ]; then
|
|
found=1
|
|
else
|
|
rm -f $f
|
|
fi
|
|
done
|
|
fi
|
|
return $found
|
|
}
|
|
|
|
# Execute /system/addon.d/*.sh scripts with $1 parameter
|
|
run_stage() {
|
|
if [ -d /tmp/addon.d/ ]; then
|
|
for script in $(find /tmp/addon.d/ -name '*.sh' |sort -n); do
|
|
$script $1
|
|
done
|
|
fi
|
|
}
|
|
|
|
case "$1" in
|
|
backup)
|
|
mkdir -p $C
|
|
if check_prereq; then
|
|
if check_whitelist system; then
|
|
exit 127
|
|
fi
|
|
fi
|
|
check_blacklist system
|
|
preserve_addon_d
|
|
run_stage pre-backup
|
|
run_stage backup
|
|
run_stage post-backup
|
|
;;
|
|
restore)
|
|
if check_prereq; then
|
|
if check_whitelist tmp; then
|
|
exit 127
|
|
fi
|
|
fi
|
|
check_blacklist tmp
|
|
run_stage pre-restore
|
|
run_stage restore
|
|
run_stage post-restore
|
|
restore_addon_d
|
|
rm -rf $C
|
|
sync
|
|
;;
|
|
*)
|
|
echo "Usage: $0 {backup|restore}"
|
|
exit 1
|
|
esac
|
|
|
|
exit 0
|