248 lines
6.5 KiB
Shell
248 lines
6.5 KiB
Shell
#!/system/bin/sh
|
||
|
||
SKIPUNZIP=1
|
||
|
||
# Module configuration
|
||
module_id="meta-mm"
|
||
module_data_dir="/data/adb/magic_mount"
|
||
metamodule_link="/data/adb/metamodule"
|
||
|
||
ui_print "- File integrity check"
|
||
|
||
# Extract all files to temporary directory
|
||
if ! unzip -o "${ZIPFILE}" -d "${TMPDIR}" >/dev/null 2>&1; then
|
||
abort "! Failed to extract ZIP file"
|
||
fi
|
||
|
||
# Verify checksums
|
||
(
|
||
cd "${TMPDIR}" || abort "! Failed to change directory to TMPDIR"
|
||
|
||
if [ ! -f "checksums" ]; then
|
||
abort "! checksums file not found in package"
|
||
fi
|
||
|
||
if sha256sum -c -s "checksums" >/dev/null 2>&1; then
|
||
ui_print " ✓ File integrity verification passed"
|
||
else
|
||
abort "! File integrity check failed - package may be corrupted"
|
||
fi
|
||
) || abort "! Integrity check process failed"
|
||
|
||
ui_print "- Detecting device architecture..."
|
||
|
||
# Detect architecture using ro.product.cpu.abi
|
||
ABI=$(getprop ro.product.cpu.abi)
|
||
|
||
if [ -z "$ABI" ]; then
|
||
abort "! Failed to detect device architecture"
|
||
fi
|
||
|
||
ui_print " Detected ABI: $ABI"
|
||
|
||
# Select the correct binary based on architecture
|
||
case "$ABI" in
|
||
arm64-v8a)
|
||
ui_print " ✓ Selected architecture: ARM64"
|
||
ARCH_BINARY="mm_arm64"
|
||
;;
|
||
armeabi-v7a)
|
||
ui_print " ✓ Selected architecture: ARMv7"
|
||
ARCH_BINARY="mm_armv7"
|
||
;;
|
||
x86_64)
|
||
ui_print " ✓ Selected architecture: x86_64"
|
||
ARCH_BINARY="mm_amd64"
|
||
;;
|
||
*)
|
||
abort "! Unsupported architecture: $ABI"
|
||
;;
|
||
esac
|
||
|
||
ui_print "- Installing architecture-specific binary"
|
||
|
||
# Verify the selected binary exists
|
||
if [ ! -f "$TMPDIR/bin/$ARCH_BINARY" ]; then
|
||
abort "! Binary not found: $ARCH_BINARY"
|
||
fi
|
||
|
||
# Ensure MODPATH exists
|
||
mkdir -p "$MODPATH" || abort "! Failed to create module directory"
|
||
|
||
# Install the binary
|
||
if ! cp "$TMPDIR/bin/$ARCH_BINARY" "$MODPATH/mmd"; then
|
||
abort "! Failed to install binary"
|
||
fi
|
||
|
||
# Set executable permissions
|
||
if ! chmod 755 "$MODPATH/mmd"; then
|
||
abort "! Failed to set binary permissions"
|
||
fi
|
||
|
||
ui_print " ✓ Installed $ARCH_BINARY as magic_mount"
|
||
|
||
ui_print "- Configuring module properties"
|
||
|
||
# Modify module.prop with correct module ID and metamodule flag
|
||
if ! sed -i "s|^id=.*|id=$module_id|" "$TMPDIR/module.prop"; then
|
||
abort "! Failed to set module ID"
|
||
fi
|
||
|
||
if ! sed -i "s|^metamodule=.*|metamodule=1|" "$TMPDIR/module.prop"; then
|
||
abort "! Failed to set metamodule flag"
|
||
fi
|
||
|
||
ui_print " ✓ Module ID: $module_id"
|
||
|
||
ui_print "- Installing module files"
|
||
|
||
# Define files to install
|
||
module_files="
|
||
module.prop
|
||
"
|
||
|
||
# Scripts that need executable permissions
|
||
executable_scripts="
|
||
metainstall.sh
|
||
metauninstall.sh
|
||
metamount.sh
|
||
uninstall.sh
|
||
"
|
||
|
||
# Directories to copy recursively
|
||
module_dirs="
|
||
webroot
|
||
"
|
||
|
||
# Copy regular module files
|
||
for f in ${module_files}; do
|
||
if [ ! -f "$TMPDIR/$f" ]; then
|
||
ui_print " ! Warning: $f not found, skipping"
|
||
continue
|
||
fi
|
||
|
||
if ! cp "$TMPDIR/$f" "$MODPATH/$f"; then
|
||
abort "! Failed to copy $f"
|
||
fi
|
||
|
||
chmod 0644 "$MODPATH/$f" || abort "! Failed to set permissions for $f"
|
||
ui_print " ✓ Installed: $f"
|
||
done
|
||
|
||
# Copy executable scripts
|
||
for f in ${executable_scripts}; do
|
||
if [ ! -f "$TMPDIR/$f" ]; then
|
||
ui_print " ! Warning: $f not found, skipping"
|
||
continue
|
||
fi
|
||
|
||
if ! cp "$TMPDIR/$f" "$MODPATH/$f"; then
|
||
abort "! Failed to copy $f"
|
||
fi
|
||
|
||
chmod 0755 "$MODPATH/$f" || abort "! Failed to set permissions for $f"
|
||
ui_print " ✓ Installed: $f (executable)"
|
||
done
|
||
|
||
# Copy directories
|
||
for d in ${module_dirs}; do
|
||
if [ ! -d "$TMPDIR/$d" ]; then
|
||
ui_print " ! Warning: $d not found, skipping"
|
||
continue
|
||
fi
|
||
|
||
if ! cp -r "$TMPDIR/$d" "$MODPATH/"; then
|
||
abort "! Failed to copy directory $d"
|
||
fi
|
||
|
||
ui_print " ✓ Installed: $d/"
|
||
done
|
||
|
||
if [ "x$KSU" = "xtrue" ] && [ "x$APATCH" = "xtrue" ]; then
|
||
abort "err"
|
||
elif [ "x$KSU" = "xtrue" ]; then
|
||
AOK="KSU"
|
||
echo "AOK=KSU" > "$MODPATH/aok"
|
||
elif [ "x$APATCH" = "xtrue" ]; then
|
||
AOK="APATCH"
|
||
ui_print "AOK=APATCH" > "$MODPATH/aok"
|
||
else
|
||
abort "err"
|
||
fi
|
||
|
||
ui_print "- Initializing configuration"
|
||
|
||
# Create data directory
|
||
if ! mkdir -p "$module_data_dir"; then
|
||
abort "! Failed to create data directory"
|
||
fi
|
||
|
||
# Install default configuration only if it doesn't exist
|
||
if [ ! -f "$module_data_dir/mm.conf" ]; then
|
||
if [ -f "$TMPDIR/mm.conf" ]; then
|
||
if ! cp "$TMPDIR/mm.conf" "$module_data_dir/mm.conf"; then
|
||
abort "! Failed to install default configuration"
|
||
fi
|
||
chmod 0644 "$module_data_dir/mm.conf"
|
||
ui_print " ✓ Installed default configuration"
|
||
else
|
||
ui_print " ! Warning: Default config not found"
|
||
fi
|
||
else
|
||
ui_print " ℹ Existing configuration preserved"
|
||
fi
|
||
if [ "$AOK" = "APATCH" ]; then
|
||
sed -i '/^[[:space:]]*umount=true[[:space:]]*$/d' "$module_data_dir/mm.conf"
|
||
fi
|
||
|
||
ui_print "- Managing metamodule status"
|
||
|
||
# Check if metamodule symlink exists and points to a different module
|
||
if [ -L "$metamodule_link" ]; then
|
||
metamodule_path=$(realpath "$metamodule_link" 2>/dev/null)
|
||
|
||
if [ -n "$metamodule_path" ]; then
|
||
metamodule_id=$(basename "$metamodule_path")
|
||
|
||
if [ "$metamodule_id" != "$module_id" ]; then
|
||
ui_print " Switching from $metamodule_id to $module_id"
|
||
|
||
# Mark old metamodule for removal
|
||
if [ -f "$metamodule_path/module.prop" ]; then
|
||
touch "$metamodule_path/remove" 2>/dev/null
|
||
sed -i "s|^metamodule=.*|metamodule=0|" "$metamodule_path/module.prop" 2>/dev/null
|
||
fi
|
||
|
||
# Remove old symlink
|
||
rm -f "$metamodule_link"
|
||
else
|
||
ui_print " ✓ Already active metamodule"
|
||
fi
|
||
fi
|
||
elif [ -e "$metamodule_link" ]; then
|
||
# If it exists but is not a symlink, remove it
|
||
ui_print " Cleaning up invalid metamodule link"
|
||
rm -rf "$metamodule_link"
|
||
fi
|
||
|
||
# Create new metamodule symlink if needed
|
||
if [ ! -e "$metamodule_link" ]; then
|
||
if ln -sf "/data/adb/modules/$module_id" "$metamodule_link"; then
|
||
ui_print " ✓ Activated as metamodule"
|
||
else
|
||
ui_print " ! Warning: Failed to create metamodule link"
|
||
fi
|
||
fi
|
||
|
||
ui_print "- Finalizing installation"
|
||
|
||
ui_print ""
|
||
ui_print "========================================="
|
||
ui_print " Magic Mount Installation Information"
|
||
ui_print "========================================="
|
||
ui_print " Module ID: $module_id"
|
||
ui_print " Architecture: $ABI"
|
||
ui_print " Binary: $ARCH_BINARY"
|
||
ui_print " Data directory: $module_data_dir"
|
||
ui_print "========================================="
|
||
ui_print ""
|