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