From b336655a79f3717f91dfdf57345c96f78e012e31 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Fri, 27 Dec 2019 17:53:27 +0800 Subject: [PATCH] Brand new module installer script The new module installer script completely changes the way how module installer zips are structured. More info will come later in docs. The new installer script also supports installing sepolicy.rule to persist partitions in order to make the module work on the next boot. --- scripts/module_installer.sh | 157 +++++++++++++++++++++++------------- scripts/util_functions.sh | 92 ++++++++++++--------- 2 files changed, 154 insertions(+), 95 deletions(-) diff --git a/scripts/module_installer.sh b/scripts/module_installer.sh index 6dbe11d30..bb41d59bc 100644 --- a/scripts/module_installer.sh +++ b/scripts/module_installer.sh @@ -1,12 +1,15 @@ #!/sbin/sh -TMPDIR=/dev/tmp -MOUNTPATH=/dev/magisk_img +################# +# Initialization +################# -# Default permissions umask 022 -# Initial cleanup +# Global vars +TMPDIR=/dev/tmp +PERSISTDIR=/sbin/.magisk/mirror/persist + rm -rf $TMPDIR 2>/dev/null mkdir -p $TMPDIR @@ -20,9 +23,27 @@ require_new_magisk() { exit 1 } -########################################################################################## +is_legacy_script() { + unzip -l "$ZIPFILE" install.sh | grep -q install.sh + return $? +} + +print_modname() { + local len + len=`echo -n $MODNAME | wc -c` + len=$((len + 2)) + local pounds=`printf "%${len}s" | tr ' ' '*'` + ui_print "$pounds" + ui_print " $MODNAME " + ui_print "$pounds" + ui_print "*******************" + ui_print " Powered by Magisk " + ui_print "*******************" +} + +############## # Environment -########################################################################################## +############## OUTFD=$2 ZIPFILE=$3 @@ -30,13 +51,9 @@ ZIPFILE=$3 mount /data 2>/dev/null # Load utility functions -if [ -f /data/adb/magisk/util_functions.sh ]; then - . /data/adb/magisk/util_functions.sh - NVBASE=/data/adb - [ $MAGISK_VER_CODE -gt 18100 ] || require_new_magisk -else - require_new_magisk -fi +[ -f /data/adb/magisk/util_functions.sh ] || require_new_magisk +. /data/adb/magisk/util_functions.sh +[ $MAGISK_VER_CODE -gt 18100 ] || require_new_magisk # Preperation for flashable zips setup_flashable @@ -50,80 +67,104 @@ api_level_arch_detect # Setup busybox and binaries $BOOTMODE && boot_actions || recovery_actions -########################################################################################## +############## # Preparation -########################################################################################## +############## -# Extract common files -unzip -oj "$ZIPFILE" module.prop install.sh uninstall.sh 'common/*' -d $TMPDIR >&2 - -[ ! -f $TMPDIR/install.sh ] && abort "! Unable to extract zip file!" -# Load install script -. $TMPDIR/install.sh +# Extract prop file +unzip -o "$ZIPFILE" module.prop -d $TMPDIR >&2 +[ ! -f $TMPDIR/module.prop ] && abort "! Unable to extract zip file!" $BOOTMODE && MODDIRNAME=modules_update || MODDIRNAME=modules MODULEROOT=$NVBASE/$MODDIRNAME - MODID=`grep_prop id $TMPDIR/module.prop` MODPATH=$MODULEROOT/$MODID - -print_modname - -ui_print "******************************" -ui_print "Powered by Magisk (@topjohnwu)" -ui_print "******************************" - -########################################################################################## -# Install -########################################################################################## +MODNAME=`grep_prop name $TMPDIR/module.prop` # Create mod paths rm -rf $MODPATH 2>/dev/null mkdir -p $MODPATH -on_install +########## +# Install +########## -# Remove placeholder -rm -f $MODPATH/system/placeholder 2>/dev/null +if is_legacy_script; then + unzip -oj "$ZIPFILE" module.prop install.sh uninstall.sh 'common/*' -d $TMPDIR >&2 -# Custom uninstaller -[ -f $TMPDIR/uninstall.sh ] && cp -af $TMPDIR/uninstall.sh $MODPATH/uninstall.sh + # Load install script + . $TMPDIR/install.sh -# Auto Mount -$SKIPMOUNT && touch $MODPATH/skip_mount + # Callbacks + print_modname + on_install -# prop files -$PROPFILE && cp -af $TMPDIR/system.prop $MODPATH/system.prop + # Custom uninstaller + [ -f $TMPDIR/uninstall.sh ] && cp -af $TMPDIR/uninstall.sh $MODPATH/uninstall.sh -# Module info -cp -af $TMPDIR/module.prop $MODPATH/module.prop -if $BOOTMODE; then - # Update info for Magisk Manager - mktouch $NVBASE/modules/$MODID/update - cp -af $TMPDIR/module.prop $NVBASE/modules/$MODID/module.prop + # Skip mount + $SKIPMOUNT && touch $MODPATH/skip_mount + + # prop file + $PROPFILE && cp -af $TMPDIR/system.prop $MODPATH/system.prop + + # Module info + cp -af $TMPDIR/module.prop $MODPATH/module.prop + + # post-fs-data scripts + $POSTFSDATA && cp -af $TMPDIR/post-fs-data.sh $MODPATH/post-fs-data.sh + + # service scripts + $LATESTARTSERVICE && cp -af $TMPDIR/service.sh $MODPATH/service.sh + + ui_print "- Setting permissions" + set_permissions +else + print_modname + + ui_print "- Extracting module files" + unzip -o "$ZIPFILE" -d $MODPATH >&2 + + # Default permissions + set_perm_recursive $MODPATH 0 0 0755 0644 + + # Load customization script + [ -f $MODPATH/customize.sh ] && . $MODPATH/customize.sh fi -# post-fs-data mode scripts -$POSTFSDATA && cp -af $TMPDIR/post-fs-data.sh $MODPATH/post-fs-data.sh - -# service mode scripts -$LATESTARTSERVICE && cp -af $TMPDIR/service.sh $MODPATH/service.sh - # Handle replace folders for TARGET in $REPLACE; do + ui_print "- Replace target: $TARGET" mktouch $MODPATH$TARGET/.replace done -ui_print "- Setting permissions" -set_permissions +if $BOOTMODE; then + # Update info for Magisk Manager + mktouch $NVBASE/modules/$MODID/update + cp -af $MODPATH/module.prop $NVBASE/modules/$MODID/module.prop +fi -########################################################################################## +# Copy over custom sepolicy rules +if [ -f $MODPATH/sepolicy.rule -a -e $PERSISTDIR ]; then + ui_print "- Installing custom sepolicy patch" + PERSISTMOD=$PERSISTDIR/magisk/$MODID + mkdir -p $PERSISTMOD + cp -af $MODPATH/sepolicy.rule $PERSISTMOD/sepolicy.rule +fi + +# Remove stuffs that don't belong to modules +rm -rf \ +$MODPATH/system/placeholder $MODPATH/customize.sh \ +$MODPATH/META-INF $MODPATH/README.md $MODPATH/.git* \ +2>/dev/null + +############## # Finalizing -########################################################################################## +############## cd / $BOOTMODE || recovery_cleanup -rm -rf $TMPDIR $MOUNTPATH +rm -rf $TMPDIR ui_print "- Done" exit 0 diff --git a/scripts/util_functions.sh b/scripts/util_functions.sh index e9a5fdb56..dd7e5610c 100644 --- a/scripts/util_functions.sh +++ b/scripts/util_functions.sh @@ -5,27 +5,8 @@ # ######################################### -########## -# Presets -########## - #MAGISK_VERSION_STUB -# Detect whether in boot mode -[ -z $BOOTMODE ] && BOOTMODE=false -$BOOTMODE || ps | grep zygote | grep -qv grep && BOOTMODE=true -$BOOTMODE || ps -A 2>/dev/null | grep zygote | grep -qv grep && BOOTMODE=true - -# Presets -MAGISKTMP=/sbin/.magisk -NVBASE=/data/adb -[ -z $TMPDIR ] && TMPDIR=/dev/tmp - -# Bootsigner related stuff -BOOTSIGNERCLASS=a.a -BOOTSIGNER="/system/bin/dalvikvm -Xnodex2oat -Xnoimage-dex2oat -cp \$APK \$BOOTSIGNERCLASS" -BOOTSIGNED=false - ################### # Helper Functions ################### @@ -128,15 +109,15 @@ recovery_actions() { } recovery_cleanup() { - export PATH=$OLD_PATH - [ -z $OLD_LD_LIB ] || export LD_LIBRARY_PATH=$OLD_LD_LIB - [ -z $OLD_LD_PRE ] || export LD_PRELOAD=$OLD_LD_PRE - [ -z $OLD_LD_CFG ] || export LD_CONFIG_FILE=$OLD_LD_CFG ui_print "- Unmounting partitions" umount -l /system_root 2>/dev/null umount -l /system 2>/dev/null umount -l /vendor 2>/dev/null umount -l /dev/random 2>/dev/null + export PATH=$OLD_PATH + [ -z $OLD_LD_LIB ] || export LD_LIBRARY_PATH=$OLD_LD_LIB + [ -z $OLD_LD_PRE ] || export LD_PRELOAD=$OLD_LD_PRE + [ -z $OLD_LD_CFG ] || export LD_CONFIG_FILE=$OLD_LD_CFG } ####################### @@ -165,19 +146,29 @@ find_block() { return 1 } -mount_part() { - $BOOTMODE && return +# mount_name +mount_name() { local PART=$1 - local POINT=/${PART} + local POINT=$2 + local FLAG=$3 [ -L $POINT ] && rm -f $POINT - mkdir $POINT 2>/dev/null + mkdir -p $POINT 2>/dev/null is_mounted $POINT && return - ui_print "- Mounting $PART" - mount -o ro $POINT 2>/dev/null + ui_print "- Mounting $POINT" + # First try mounting with fstab + mount $FLAG $POINT 2>/dev/null if ! is_mounted $POINT; then - local BLOCK=`find_block $PART$SLOT` - mount -o ro $BLOCK $POINT + local BLOCK=`find_block $PART` + mount $FLAG $BLOCK $POINT fi +} + +mount_ro_ensure() { + # We handle ro partitions only in recovery + $BOOTMODE && return + local PART=$1$SLOT + local POINT=/$1 + mount_name $PART $POINT '-o ro' is_mounted $POINT || abort "! Cannot mount $POINT" } @@ -190,7 +181,8 @@ mount_partitions() { fi [ -z $SLOT ] || ui_print "- Current boot slot: $SLOT" - mount_part system + # Mount ro partitions + mount_ro_ensure system if [ -f /system/init.rc ]; then SYSTEM_ROOT=true [ -L /system_root ] && rm -f /system_root @@ -201,8 +193,20 @@ mount_partitions() { grep ' / ' /proc/mounts | grep -qv 'rootfs' || grep -q ' /system_root ' /proc/mounts \ && SYSTEM_ROOT=true || SYSTEM_ROOT=false fi - [ -L /system/vendor ] && mount_part vendor + [ -L /system/vendor ] && mount_ro_ensure vendor $SYSTEM_ROOT && ui_print "- Device is system-as-root" + + # Persist partitions for module install in recovery + if ! $BOOTMODE && [ ! -z $PERSISTDIR ]; then + # Try to mount persist + PERSISTDIR=/persist + mount_name persist /persist + if ! is_mounted /persist; then + # Fallback to cache + mount_name cache /cache + is_mounted /cache && PERSISTDIR=/cache || PERSISTDIR= + fi + fi } get_flags() { @@ -293,8 +297,8 @@ patch_dtbo_image() { return 1 } +# Common installation script for flash_script.sh and addon.d.sh patch_boot_image() { - # Common installation script for flash_script.sh (updater-script) and addon.d.sh SOURCEDMODE=true cd $MAGISKBIN @@ -448,8 +452,22 @@ request_zip_size_check() { boot_actions() { return; } -######## -# Setup -######## +########## +# Presets +########## + +# Detect whether in boot mode +[ -z $BOOTMODE ] && ps | grep zygote | grep -qv grep && BOOTMODE=true +[ -z $BOOTMODE ] && ps -A 2>/dev/null | grep zygote | grep -qv grep && BOOTMODE=true +[ -z $BOOTMODE ] && BOOTMODE=false + +MAGISKTMP=/sbin/.magisk +NVBASE=/data/adb +[ -z $TMPDIR ] && TMPDIR=/dev/tmp + +# Bootsigner related stuff +BOOTSIGNERCLASS=a.a +BOOTSIGNER="/system/bin/dalvikvm -Xnodex2oat -Xnoimage-dex2oat -cp \$APK \$BOOTSIGNERCLASS" +BOOTSIGNED=false resolve_vars