From 9430ed66cd6bc1f80442f051d31b5e535387bb7b Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Mon, 19 Jun 2017 00:15:44 +0800 Subject: [PATCH] Add addon.d survival script --- build.py | 21 +++++- scripts/addon.d.sh | 100 ++++++++++++++++++++++++++++ scripts/flash_script.sh | 133 ++++---------------------------------- scripts/util_functions.sh | 121 ++++++++++++++++++++++++++++++++++ 4 files changed, 252 insertions(+), 123 deletions(-) create mode 100644 scripts/addon.d.sh create mode 100644 scripts/util_functions.sh diff --git a/build.py b/build.py index 72b692af0..5aafa6d1c 100755 --- a/build.py +++ b/build.py @@ -160,23 +160,40 @@ def zip_main(args): zip_with_msg(zipf, source, target) # Scripts + # flash_script.sh source = os.path.join('scripts', 'flash_script.sh') - with open(source, 'r') as flash_script: + with open(source, 'r') as script: # Add version info into flash script - update_binary = flash_script.read().replace( + update_binary = script.read().replace( 'MAGISK_VERSION_STUB', 'Magisk v{} Installer'.format(args.versionString)) target = os.path.join('META-INF', 'com', 'google', 'android', 'update-binary') print('zip: ' + source + ' -> ' + target) zipf.writestr(target, update_binary) + # addon.d.sh + source = os.path.join('scripts', 'addon.d.sh') + with open(source, 'r') as script: + # Add version info addon.d.sh + addond = script.read().replace( + 'MAGISK_VERSION_STUB', 'Magisk v{} addon.d'.format(args.versionString)) + target = os.path.join('addon.d', '99-magisk.sh') + print('zip: ' + source + ' -> ' + target) + zipf.writestr(target, addond) + # updater-script target = os.path.join('META-INF', 'com', 'google', 'android', 'updater-script') print('zip: ' + target) zipf.writestr(target, '#MAGISK\n') + # init.magisk.rc source = os.path.join('scripts', 'init.magisk.rc') target = os.path.join('common', 'init.magisk.rc') zip_with_msg(zipf, source, target) + # boot_patch.sh source = os.path.join('scripts', 'boot_patch.sh') target = os.path.join('common', 'boot_patch.sh') zip_with_msg(zipf, source, target) + # util_functions.sh + source = os.path.join('scripts', 'util_functions.sh') + target = os.path.join('common', 'util_functions.sh') + zip_with_msg(zipf, source, target) # Prebuilts for chromeos in ['futility', 'kernel_data_key.vbprivk', 'kernel.keyblock']: diff --git a/scripts/addon.d.sh b/scripts/addon.d.sh new file mode 100644 index 000000000..0b21aaabe --- /dev/null +++ b/scripts/addon.d.sh @@ -0,0 +1,100 @@ +#!/sbin/sh +########################################################################################## +# +# Magisk Survival Script for ROMs with addon.d support +# by topjohnwu +# +# Inspired by 99-flashafterupdate.sh of osm0sis @ xda-developers +# +########################################################################################## + +. /tmp/backuptool.functions + +main() { + # Magisk binaries + MAGISKBIN=/data/magisk + # This script always run in recovery + BOOTMODE=false + + # Wait for post addon.d processes to finish + sleep 5 + + mount -o ro /system 2>/dev/null + mount /data 2>/dev/null + + if [ ! -d $MAGISKBIN ]; then + echo "! Cannot find Magisk binaries!" + exit 1 + fi + + # Load all functions + . $MAGISKBIN/util_functions.sh + + [ -f /system/build.prop ] || abort "! /system could not be mounted!" + + ui_print "************************" + ui_print "* MAGISK_VERSION_STUB" + ui_print "************************" + + # Check if system root is installed and remove + remove_system_su + # Prefer bin in /system + export PATH=/system/bin:/system/xbin + # Clear out possible lib paths, let the binary find them itself + export LD_LIBRARY_PATH= + # Temporarily block out all custom recovery binaries/libs + mv /sbin /sbin_tmp + + find_boot_image + [ -z $BOOTIMAGE ] && abort "! Unable to detect boot image" + ui_print "- Found Boot Image: $BOOTIMAGE" + + SOURCEDMODE=true + cd $MAGISKBIN + + # Source the boot patcher + . $MAGISKBIN/boot_patch.sh $BOOTIMAGE + + [ -f stock_boot* ] && rm -f /data/stock_boot* 2>/dev/null + + ui_print "- Flashing new boot image" + if [ -L "$BOOTIMAGE" ]; then + dd if=new-boot.img of="$BOOTIMAGE" bs=4096 + else + cat new-boot.img /dev/zero | dd of="$BOOTIMAGE" bs=4096 + fi + rm -f new-boot.img + + cd / + + mv /sbin_tmp /sbin + ui_print "- Unmounting partitions" + umount -l /system + + ui_print "- Done" + exit 0 +} + +case "$1" in + backup) + # Stub + ;; + restore) + # Stub + ;; + pre-backup) + # Stub + ;; + post-backup) + # Stub + ;; + pre-restore) + # Stub + ;; + post-restore) + # Get the FD for ui_print + OUTFD=`ps | grep -v grep | grep -oE "update(.*)" | cut -d" " -f3` + # Run the main function in a parallel subshell + (main) & + ;; +esac diff --git a/scripts/flash_script.sh b/scripts/flash_script.sh index 6e7b05e61..3c5bf72f3 100644 --- a/scripts/flash_script.sh +++ b/scripts/flash_script.sh @@ -52,127 +52,13 @@ rm -rf $TMPDIR 2>/dev/null mkdir -p $INSTALLER $BUSYBOX unzip -o "$ZIP" -d $INSTALLER -########################################################################################## -# Functions -########################################################################################## - -ui_print() { - if $BOOTMODE; then - echo "$1" - else - echo -n -e "ui_print $1\n" >> /proc/self/fd/$OUTFD - echo -n -e "ui_print\n" >> /proc/self/fd/$OUTFD - fi -} - -getvar() { - local VARNAME=$1 - local VALUE=$(eval echo \$"$VARNAME"); - for FILE in /dev/.magisk /data/.magisk /cache/.magisk /system/.magisk; do - if [ -z "$VALUE" ]; then - LINE=$(cat $FILE 2>/dev/null | grep "$VARNAME=") - if [ ! -z "$LINE" ]; then - VALUE=${LINE#*=} - fi - fi - done - eval $VARNAME=\$VALUE -} - -find_boot_image() { - if [ -z "$BOOTIMAGE" ]; then - for PARTITION in kern-a android_boot kernel boot lnx; do - BOOTIMAGE=`find /dev/block -iname "$PARTITION" | head -n 1` - [ ! -z $BOOTIMAGE ] && break - done - fi - # Recovery fallback - if [ -z "$BOOTIMAGE" ]; then - for FSTAB in /etc/*fstab*; do - BOOTIMAGE=`grep -E '\b/boot\b' $FSTAB | grep -oE '/dev/[a-zA-Z0-9_./-]*'` - [ ! -z $BOOTIMAGE ] && break - done - fi - [ -L "$BOOTIMAGE" ] && BOOTIMAGE=`readlink $BOOTIMAGE` -} - -is_mounted() { - if [ ! -z "$2" ]; then - cat /proc/mounts | grep $1 | grep $2, >/dev/null - else - cat /proc/mounts | grep $1 >/dev/null - fi - return $? -} - -mount_image() { - if [ ! -d "$2" ]; then - mount -o rw,remount rootfs / - mkdir -p "$2" 2>/dev/null - $BOOTMODE && mount -o ro,remount rootfs / - [ ! -d "$2" ] && return 1 - fi - if ! is_mounted "$2"; then - LOOPDEVICE= - for LOOP in 0 1 2 3 4 5 6 7; do - if ! is_mounted "$2"; then - LOOPDEVICE=/dev/block/loop$LOOP - [ -e $LOOPDEVICE ] || mknod $LOOPDEVICE b 7 $LOOP 2>/dev/null - losetup $LOOPDEVICE "$1" && mount -t ext4 -o loop $LOOPDEVICE "$2" - if is_mounted "$2"; then - ui_print "- Mounting $1 to $2" - break; - fi - fi - done - fi -} - -grep_prop() { - REGEX="s/^$1=//p" - shift - FILES=$@ - if [ -z "$FILES" ]; then - FILES='/system/build.prop' - fi - cat $FILES 2>/dev/null | sed -n "$REGEX" | head -n 1 -} - -remove_system_su() { - if [ -f /system/bin/su -o -f /system/xbin/su ] && [ ! -f /su/bin/su ]; then - ui_print "! System installed root detected, mount rw :(" - mount -o rw,remount /system - # SuperSU - if [ -e /system/bin/.ext/.su ]; then - mv -f /system/bin/app_process32_original /system/bin/app_process32 2>/dev/null - mv -f /system/bin/app_process64_original /system/bin/app_process64 2>/dev/null - mv -f /system/bin/install-recovery_original.sh /system/bin/install-recovery.sh 2>/dev/null - cd /system/bin - if [ -e app_process64 ]; then - ln -sf app_process64 app_process - else - ln -sf app_process32 app_process - fi - fi - rm -rf /system/.pin /system/bin/.ext /system/etc/.installed_su_daemon /system/etc/.has_su_daemon \ - /system/xbin/daemonsu /system/xbin/su /system/xbin/sugote /system/xbin/sugote-mksh /system/xbin/supolicy \ - /system/bin/app_process_init /system/bin/su /cache/su /system/lib/libsupol.so /system/lib64/libsupol.so \ - /system/su.d /system/etc/install-recovery.sh /system/etc/init.d/99SuperSUDaemon /cache/install-recovery.sh \ - /system/.supersu /cache/.supersu /data/.supersu \ - /system/app/Superuser.apk /system/app/SuperSU /cache/Superuser.apk 2>/dev/null - fi -} - -abort() { - ui_print "$1" - mv /sbin_tmp /sbin 2>/dev/null - exit 1 -} - ########################################################################################## # Detection ########################################################################################## +# Load all fuctions +. $COMMONDIR/util_functions.sh + ui_print "************************" ui_print "* MAGISK_VERSION_STUB" ui_print "************************" @@ -248,6 +134,14 @@ cp -af $BINDIR/. $COMMONDIR/. $MAGISKBIN chmod -R 755 $MAGISKBIN chcon -hR u:object_r:system_file:s0 $MAGISKBIN +# addon.d +if [ -d /system/addon.d ]; then + ui_print "- Adding addon.d survival script" + mount -o rw,remount /system + cp $INSTALLER/addon.d/99-magisk.sh /system/addon.d/99-magisk.sh + chmod 755 /system/addon.d/99-magisk.sh +fi + ########################################################################################## # Magisk Image ########################################################################################## @@ -315,10 +209,7 @@ if [ -f chromeos ]; then mv new-boot.img.signed new-boot.img fi -if is_mounted /data; then - rm -f /data/stock_boot* 2>/dev/null - mv stock_boot* /data 2>/dev/null -fi +[ -f stock_boot* ] && rm -f /data/stock_boot* 2>/dev/null ui_print "- Flashing new boot image" if [ -L "$BOOTIMAGE" ]; then diff --git a/scripts/util_functions.sh b/scripts/util_functions.sh new file mode 100644 index 000000000..95f1b5f04 --- /dev/null +++ b/scripts/util_functions.sh @@ -0,0 +1,121 @@ +########################################################################################## +# +# Magisk General Utility Functions +# by topjohnwu +# +# Used in flash_script.sh and addon.d.sh +# +########################################################################################## + +ui_print() { + if $BOOTMODE; then + echo "$1" + else + echo -n -e "ui_print $1\n" >> /proc/self/fd/$OUTFD + echo -n -e "ui_print\n" >> /proc/self/fd/$OUTFD + fi +} + +getvar() { + local VARNAME=$1 + local VALUE=$(eval echo \$"$VARNAME"); + for FILE in /dev/.magisk /data/.magisk /cache/.magisk /system/.magisk; do + if [ -z "$VALUE" ]; then + LINE=$(cat $FILE 2>/dev/null | grep "$VARNAME=") + if [ ! -z "$LINE" ]; then + VALUE=${LINE#*=} + fi + fi + done + eval $VARNAME=\$VALUE +} + +find_boot_image() { + if [ -z "$BOOTIMAGE" ]; then + for PARTITION in kern-a android_boot kernel boot lnx; do + BOOTIMAGE=`find /dev/block -iname "$PARTITION" | head -n 1` + [ ! -z $BOOTIMAGE ] && break + done + fi + # Recovery fallback + if [ -z "$BOOTIMAGE" ]; then + for FSTAB in /etc/*fstab*; do + BOOTIMAGE=`grep -E '\b/boot\b' $FSTAB | grep -oE '/dev/[a-zA-Z0-9_./-]*'` + [ ! -z $BOOTIMAGE ] && break + done + fi + [ -L "$BOOTIMAGE" ] && BOOTIMAGE=`readlink $BOOTIMAGE` +} + +is_mounted() { + if [ ! -z "$2" ]; then + cat /proc/mounts | grep $1 | grep $2, >/dev/null + else + cat /proc/mounts | grep $1 >/dev/null + fi + return $? +} + +mount_image() { + if [ ! -d "$2" ]; then + mount -o rw,remount rootfs / + mkdir -p "$2" 2>/dev/null + $BOOTMODE && mount -o ro,remount rootfs / + [ ! -d "$2" ] && return 1 + fi + if ! is_mounted "$2"; then + LOOPDEVICE= + for LOOP in 0 1 2 3 4 5 6 7; do + if ! is_mounted "$2"; then + LOOPDEVICE=/dev/block/loop$LOOP + [ -e $LOOPDEVICE ] || mknod $LOOPDEVICE b 7 $LOOP 2>/dev/null + losetup $LOOPDEVICE "$1" && mount -t ext4 -o loop $LOOPDEVICE "$2" + if is_mounted "$2"; then + ui_print "- Mounting $1 to $2" + break; + fi + fi + done + fi +} + +grep_prop() { + REGEX="s/^$1=//p" + shift + FILES=$@ + if [ -z "$FILES" ]; then + FILES='/system/build.prop' + fi + cat $FILES 2>/dev/null | sed -n "$REGEX" | head -n 1 +} + +remove_system_su() { + if [ -f /system/bin/su -o -f /system/xbin/su ] && [ ! -f /su/bin/su ]; then + ui_print "! System installed root detected, mount rw :(" + mount -o rw,remount /system + # SuperSU + if [ -e /system/bin/.ext/.su ]; then + mv -f /system/bin/app_process32_original /system/bin/app_process32 2>/dev/null + mv -f /system/bin/app_process64_original /system/bin/app_process64 2>/dev/null + mv -f /system/bin/install-recovery_original.sh /system/bin/install-recovery.sh 2>/dev/null + cd /system/bin + if [ -e app_process64 ]; then + ln -sf app_process64 app_process + else + ln -sf app_process32 app_process + fi + fi + rm -rf /system/.pin /system/bin/.ext /system/etc/.installed_su_daemon /system/etc/.has_su_daemon \ + /system/xbin/daemonsu /system/xbin/su /system/xbin/sugote /system/xbin/sugote-mksh /system/xbin/supolicy \ + /system/bin/app_process_init /system/bin/su /cache/su /system/lib/libsupol.so /system/lib64/libsupol.so \ + /system/su.d /system/etc/install-recovery.sh /system/etc/init.d/99SuperSUDaemon /cache/install-recovery.sh \ + /system/.supersu /cache/.supersu /data/.supersu \ + /system/app/Superuser.apk /system/app/SuperSU /cache/Superuser.apk 2>/dev/null + fi +} + +abort() { + ui_print "$1" + mv /sbin_tmp /sbin 2>/dev/null + exit 1 +}