mirror of
https://github.com/Magisk-Modules-Repo/MagiskHidePropsConf.git
synced 2024-11-19 14:14:33 +00:00
1368 lines
35 KiB
Bash
1368 lines
35 KiB
Bash
#!/system/bin/sh
|
|
|
|
# MagiskHide Props Config
|
|
# Copyright (c) 2018-2019 Didgeridoohan @ XDA Developers
|
|
# Licence: MIT
|
|
|
|
# ======================== Variables ========================
|
|
MODVERSION=VER_PLACEHOLDER
|
|
MIRRORPATH=$COREPATH/mirror
|
|
LATEFILE=LATE_PLACEHOLDER
|
|
MIRRORLOC=MIRROR_PLACEHOLDER
|
|
CACHELOC=CACHE_PLACEHOLDER
|
|
POSTCHKFILE=$CACHELOC/propsconf_postchk
|
|
RUNFILE=$MODPATH/script_check
|
|
LOGFILE=$CACHELOC/propsconf.log
|
|
LASTLOGFILE=$CACHELOC/propsconf_last.log
|
|
TMPLOGLOC=$CACHELOC/propslogs
|
|
TMPLOGLIST="
|
|
$CACHELOC/magisk.log
|
|
$CACHELOC/magisk.log.bak
|
|
/data/adb/magisk_debug.log
|
|
$CACHELOC/propsconf*
|
|
$MIRRORPATH/system/build.prop
|
|
$MIRRORPATH/vendor/build.prop
|
|
$LATEFILE
|
|
"
|
|
CONFFILELST="
|
|
/sdcard/propsconf_conf
|
|
/data/propsconf_conf
|
|
$CACHELOC/propsconf_conf
|
|
"
|
|
RESETFILE=$CACHELOC/reset_mhpc
|
|
MAGISKLOC=/data/adb/magisk
|
|
# Make sure that the terminal app used actually can see resetprop
|
|
alias resetprop="$MAGISKLOC/magisk resetprop"
|
|
# Finding installed Busybox
|
|
if [ -d "$IMGPATH/busybox-ndk" ]; then
|
|
BBPATH=$(find $IMGPATH/busybox-ndk -name 'busybox')
|
|
else
|
|
BBPATH=$(which busybox)
|
|
fi
|
|
PRINTSLOC=$MODPATH/prints.sh
|
|
PRINTSTMP=$CACHELOC/prints.sh
|
|
PRINTSWWW="https://raw.githubusercontent.com/Magisk-Modules-Repo/MagiskHide-Props-Config/master/common/prints.sh"
|
|
PRINTSDEV="https://raw.githubusercontent.com/Didgeridoohan/Playground/master/prints.sh"
|
|
PRINTFILES=$MODPATH/printfiles
|
|
CSTMPRINTS=/sdcard/printslist
|
|
CSTMFILE=$PRINTFILES/Custom.sh
|
|
BIN=BIN_PLACEHOLDER
|
|
USNFLIST=USNF_PLACEHOLDER
|
|
|
|
# MagiskHide props
|
|
PROPSLIST="
|
|
ro.debuggable
|
|
ro.secure
|
|
ro.build.type
|
|
ro.build.tags
|
|
ro.build.selinux
|
|
"
|
|
|
|
# Safe values
|
|
SAFELIST="
|
|
ro.debuggable=0
|
|
ro.secure=1
|
|
ro.build.type=user
|
|
ro.build.tags=release-keys
|
|
ro.build.selinux=0
|
|
"
|
|
|
|
# Fingerprint props to change
|
|
PRINTPROPS="
|
|
ro.build.fingerprint
|
|
ro.bootimage.build.fingerprint
|
|
ro.vendor.build.fingerprint
|
|
"
|
|
|
|
# Print parts
|
|
PRINTPARTS="
|
|
ro.product.brand
|
|
ro.product.name
|
|
ro.product.device
|
|
ro.build.version.release
|
|
ro.build.id
|
|
ro.build.version.incremental
|
|
"
|
|
|
|
# Additional SafetyNet props
|
|
SNPROPS="
|
|
ro.build.version.security_patch
|
|
"
|
|
|
|
# Additional props
|
|
ADNPROPS="
|
|
ro.build.fingerprint
|
|
ro.vendor.build.fingerprint
|
|
ro.build.description
|
|
"
|
|
|
|
# Values props list
|
|
VALPROPSLIST=$PROPSLIST$PRINTPARTS$SNPROPS$ADNPROPS
|
|
|
|
# Loading module settings
|
|
. $LATEFILE
|
|
|
|
# ======================== General functions ========================
|
|
# Finding file values
|
|
get_file_value() {
|
|
if [ -f "$1" ]; then
|
|
grep $2 $1 | sed "s|.*${2}||" | sed 's|\"||g'
|
|
fi
|
|
}
|
|
|
|
# Log functions
|
|
# Saves the previous log (if available) and creates a new one
|
|
log_start() {
|
|
if [ -f "$LOGFILE" ]; then
|
|
mv -f $LOGFILE $LASTLOGFILE
|
|
fi
|
|
touch $LOGFILE
|
|
echo "***************************************************" >> $LOGFILE 2>&1
|
|
echo "********* MagiskHide Props Config $MODVERSION ********" >> $LOGFILE 2>&1
|
|
echo "***************** By Didgeridoohan ***************" >> $LOGFILE 2>&1
|
|
echo "***************************************************" >> $LOGFILE 2>&1
|
|
log_script_chk "Log start."
|
|
}
|
|
log_handler() {
|
|
if [ "$(id -u)" == 0 ] ; then
|
|
echo "" >> $LOGFILE 2>&1
|
|
echo -e "$(date +"%Y-%m-%d %H:%M:%S:%N") - $1" >> $LOGFILE 2>&1
|
|
fi
|
|
}
|
|
log_print() {
|
|
echo "$1"
|
|
log_handler "$1"
|
|
}
|
|
log_script_chk() {
|
|
log_handler "$1"
|
|
echo -e "$(date +"%m-%d-%Y %H:%M:%S") - $1" >> $RUNFILE 2>&1
|
|
}
|
|
|
|
#Divider
|
|
DIVIDER="${Y}=====================================${N}"
|
|
|
|
# Header
|
|
menu_header() {
|
|
if [ -z "$LOGNAME" ] && [ "$DEVTESTING" == "false" ]; then
|
|
clear
|
|
fi
|
|
if [ "$MODVERSION" == "VER_PLACEHOLDER" ]; then
|
|
VERSIONTXT=""
|
|
else
|
|
VERSIONTXT=$MODVERSION
|
|
fi
|
|
echo ""
|
|
echo "${W}MagiskHide Props Config $VERSIONTXT${N}"
|
|
echo "${W}by Didgeridoohan @ XDA Developers${N}"
|
|
echo ""
|
|
echo $DIVIDER
|
|
echo -e " $1"
|
|
echo $DIVIDER
|
|
}
|
|
|
|
# Get module version
|
|
module_v_ctrl() {
|
|
VERSIONTMP=$(get_file_value $MODPATH/module.prop "version=")
|
|
VERSIONCMP=$(echo $VERSIONTMP | sed 's|v||g' | sed 's|-.*||' | sed 's|\.||g')
|
|
}
|
|
|
|
# Find prop type
|
|
get_prop_type() {
|
|
if [ "$1" == "ro.vendor.build.fingerprint" ]; then
|
|
echo "vendprint"
|
|
else
|
|
echo $1 | sed 's|.*\.||' | sed 's|.*\_||'
|
|
fi
|
|
}
|
|
|
|
# Get left side of =
|
|
get_eq_left() {
|
|
echo $1 | cut -f 1 -d '='
|
|
}
|
|
|
|
# Get right side of =
|
|
get_eq_right() {
|
|
echo $1 | cut -f 2 -d '='
|
|
}
|
|
|
|
# Get first word in fingerprint string
|
|
get_first() {
|
|
case $1 in
|
|
*\ *) echo $1 | sed 's|\ .*||'
|
|
;;
|
|
*=*) get_eq_left "$1"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# Get the device for current fingerprint
|
|
get_device_used() {
|
|
PRINTTMP=$(cat $MODPATH/prints.sh | grep "$1")
|
|
if [ "$PRINTTMP" ]; then
|
|
echo "${C}$(get_eq_left "$PRINTTMP" | sed "s| (.*||")${N}"
|
|
echo ""
|
|
elif [ -s "$CSTMPRINTS" ]; then
|
|
PRINTTMP=$(cat $CSTMPRINTS | grep "$1")
|
|
if [ "$PRINTTMP" ]; then
|
|
echo "${C}$(get_eq_left "$PRINTTMP" | sed "s| (.*||")${N} (from custom list)"
|
|
echo ""
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Get Android version with 3 digits for current fingerprint
|
|
get_android_version() {
|
|
print_parts $1 "var"
|
|
VERTMP=$VARRELEASE
|
|
if [ "${#VERTMP}" -lt 3 ]; then
|
|
until [ "${#VERTMP}" == 3 ]
|
|
do
|
|
VERTMP="$(echo ${VERTMP}0)"
|
|
done
|
|
fi
|
|
echo $VERTMP
|
|
}
|
|
|
|
# Get security patch date for current fingerprint
|
|
get_sec_patch() {
|
|
echo $1 | sed 's|.*\_\_||'
|
|
}
|
|
|
|
# Get the fingerprint for displaying in the ui
|
|
get_print_display() {
|
|
echo $1 | sed 's|\_\_.*||'
|
|
}
|
|
|
|
# Replace file values
|
|
replace_fn() {
|
|
sed -i "s|${1}=${2}|${1}=${3}|" $4
|
|
}
|
|
|
|
# Format user files to remove Windows file endings
|
|
format_file() {
|
|
log_handler "Formating file (${1})."
|
|
# Remove Windows line endings
|
|
sed -i 's/\r$//' $1
|
|
# Check for newline at EOF
|
|
if [ ! -z "$(tail -c 1 "$1")" ]; then
|
|
echo "" >> $1
|
|
fi
|
|
}
|
|
|
|
# Updates placeholders
|
|
placeholder_update() {
|
|
FILEVALUE=$(get_file_value $1 "$2=")
|
|
log_handler "Checking for ${3} in ${1}. Current value is ${FILEVALUE}."
|
|
case $FILEVALUE in
|
|
*PLACEHOLDER*) replace_fn $2 $3 $4 $1
|
|
log_handler "Placeholder ${3} updated to ${4} in ${1}."
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# Check if boot scripts ran during boot
|
|
script_ran_check() {
|
|
POSTCHECK=0
|
|
if [ -f "$RUNFILE" ] && [ "$(grep "post-fs-data.sh module script finished" $RUNFILE)" ]; then
|
|
POSTCHECK=1
|
|
fi
|
|
LATECHECK=0
|
|
if [ -f "$RUNFILE" ] && [ "$(grep "service.sh module script finished" $RUNFILE)" ]; then
|
|
LATECHECK=1
|
|
fi
|
|
}
|
|
|
|
# Check for original prop values
|
|
orig_check() {
|
|
PROPSTMPLIST=$VALPROPSLIST
|
|
ORIGLOAD=0
|
|
for PROPTYPE in $PROPSTMPLIST; do
|
|
PROP=$(get_prop_type $PROPTYPE)
|
|
ORIGPROP=$(echo "ORIG${PROP}" | tr '[:lower:]' '[:upper:]')
|
|
ORIGVALUE="$(echo ${ORIGPROP})"
|
|
if [ "$ORIGVALUE" ]; then
|
|
ORIGLOAD=1
|
|
fi
|
|
done
|
|
}
|
|
|
|
# Load currently set values
|
|
curr_values() {
|
|
for ITEM in $VALPROPSLIST; do
|
|
CURRTMP=$(resetprop -v $ITEM) >> $LOGFILE 2>&1
|
|
TMPPROP=$(get_prop_type $ITEM | tr '[:lower:]' '[:upper:]')
|
|
eval "CURR${TMPPROP}='$CURRTMP'"
|
|
done
|
|
if [ -z "$CURRFINGERPRINT" ]; then
|
|
CURRFINGERPRINT=$(resetprop -v ro.bootimage.build.fingerprint) >> $LOGFILE 2>&1
|
|
if [ -z "$CURRFINGERPRINT" ]; then
|
|
CURRFINGERPRINT=$(resetprop -v ro.vendor.build.fingerprint) >> $LOGFILE 2>&1
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Check if original file values are safe
|
|
orig_safe() {
|
|
replace_fn FILESAFE 0 1 $LATEFILE
|
|
for V in $PROPSLIST; do
|
|
PROP=$(get_prop_type $V)
|
|
FILEPROP=$(echo "CURR${PROP}" | tr '[:lower:]' '[:upper:]')
|
|
FILEVALUE=$(eval "echo \$$FILEPROP")
|
|
log_handler "Checking ${FILEPROP}=${FILEVALUE}"
|
|
safe_props $V $FILEVALUE
|
|
if [ "$SAFE" == 0 ]; then
|
|
log_handler "Prop $V set to triggering value in prop file."
|
|
replace_fn FILESAFE 1 0 $LATEFILE
|
|
else
|
|
if [ -z "$FILEVALUE" ]; then
|
|
log_handler "Could not retrieve value for prop $V."
|
|
elif [ "$SAFE" == 1 ]; then
|
|
log_handler "Prop $V set to \"safe\" value in prop file."
|
|
fi
|
|
fi
|
|
done
|
|
}
|
|
|
|
# Run all value loading functions
|
|
all_values() {
|
|
log_handler "Loading values."
|
|
# Currently set values
|
|
curr_values
|
|
# Module saved values
|
|
. $LATEFILE
|
|
}
|
|
|
|
# Run after updated props/settings
|
|
after_change() {
|
|
if [ "$2" == "file" ]; then
|
|
# Load module settings
|
|
. $LATEFILE
|
|
else
|
|
# Update the reboot variable
|
|
reboot_chk
|
|
# Load all values
|
|
all_values
|
|
# Ask to reboot
|
|
reboot_fn "$1" "$2"
|
|
fi
|
|
}
|
|
|
|
# Run after changing props/settings with configuration file
|
|
after_change_file() {
|
|
# Update the reboot variable
|
|
reboot_chk
|
|
# Load all values
|
|
INPUT=""
|
|
all_values
|
|
# Ask to reboot
|
|
reboot_fn "$1" "$2"
|
|
}
|
|
|
|
# Check if module needs a reboot
|
|
reboot_chk() {
|
|
replace_fn REBOOTCHK 0 1 $LATEFILE
|
|
}
|
|
|
|
# Reset module
|
|
reset_fn() {
|
|
cp -af $MODPATH/propsconf_late $LATEFILE >> $LOGFILE 2>&1
|
|
if [ "$BUILDPROPENB" ] && [ "$BUILDPROPENB" != 1 ]; then
|
|
replace_fn BUILDPROPENB 1 $BUILDPROPENB $LATEFILE
|
|
fi
|
|
if [ "$FINGERPRINTENB" ] && [ "$FINGERPRINTENB" != 1 ]; then
|
|
replace_fn FINGERPRINTENB 1 $FINGERPRINTENB $LATEFILE
|
|
fi
|
|
chmod -v 755 $LATEFILE >> $LOGFILE 2>&1
|
|
placeholder_update $LATEFILE CACHELOC CACHE_PLACEHOLDER "$CACHELOC"
|
|
placeholder_update $LATEFILE COREPATH CORE_PLACEHOLDER "$COREPATH"
|
|
|
|
if [ "$1" != "post" ]; then
|
|
# Update the reboot variable
|
|
reboot_chk
|
|
# Update all prop value variables
|
|
all_values
|
|
fi
|
|
}
|
|
|
|
# Checks for configuration file
|
|
config_file() {
|
|
log_handler "Checking for configuration file."
|
|
CONFFILE=""
|
|
for ITEM in $CONFFILELST; do
|
|
if [ -s "$ITEM" ]; then
|
|
CONFFILE="$ITEM"
|
|
break
|
|
fi
|
|
done
|
|
if [ "$CONFFILE" ]; then
|
|
log_handler "Configuration file detected (${CONFFILE})."
|
|
format_file $CONFFILE
|
|
# Loads custom variables
|
|
. $CONFFILE
|
|
module_v_ctrl
|
|
if [ "$CONFTRANSF" -le $VERSIONCMP ]; then
|
|
# Check if vendor fingerprint is set
|
|
if [ "$CONFVENDPRINT" == "true" ]; then
|
|
log_handler "Using vendor fingerprint"
|
|
CONFFINGERPRINT=$(resetprop -v ro.vendor.build.fingerprint) >> $LOGFILE 2>&1
|
|
fi
|
|
# Updates prop values (including fingerprint)
|
|
PROPSTMPLIST=$PROPSLIST"
|
|
ro.build.fingerprint
|
|
"
|
|
for PROPTYPE in $PROPSTMPLIST; do
|
|
CONFPROP=$(echo "CONF$(get_prop_type $PROPTYPE)" | tr '[:lower:]' '[:upper:]')
|
|
TMPPROP=$(eval "echo \$$CONFPROP")
|
|
if [ "$TMPPROP" ]; then
|
|
log_handler "Checking $PROPTYPE settings."
|
|
if [ "$TMPPROP" != "preserve" ]; then
|
|
if [ "$PROPTYPE" == "ro.build.fingerprint" ]; then
|
|
if [ "$FINGERPRINTENB" == 1 ]; then
|
|
change_print "$PROPTYPE" "$TMPPROP" "file"
|
|
fi
|
|
else
|
|
change_prop "$PROPTYPE" "$TMPPROP" "file"
|
|
fi
|
|
fi
|
|
else
|
|
if [ "$PROPTYPE" == "ro.build.fingerprint" ]; then
|
|
if [ "$FINGERPRINTENB" == 1 ]; then
|
|
reset_print "$PROPTYPE" "file"
|
|
fi
|
|
else
|
|
reset_prop "$PROPTYPE" "file"
|
|
fi
|
|
fi
|
|
done
|
|
|
|
# Updates device simulation options, only if fingerprint editing is enabled
|
|
if [ "$PRINTEDIT" == 1 ]; then
|
|
# Fingerprint parts
|
|
if [ "$CONFDEVSIM" == "true" ]; then
|
|
change_dev_sim "Device simulation" "file"
|
|
for ITEM in $PRINTPARTS; do
|
|
TMPVAR="CONF$(get_prop_type $ITEM | tr '[:lower:]' '[:upper:]')"
|
|
if [ $(eval "echo \$$TMPVAR") == "true" ]; then
|
|
TMPVAL=1
|
|
else
|
|
TMPVAL=0
|
|
fi
|
|
change_sim_prop "Device simulation" "$ITEM" "$TMPVAL" "file"
|
|
done
|
|
fi
|
|
# Device description
|
|
if [ "$CONFDESCRIPTION" == "true" ]; then
|
|
change_sim_descr "Device simulation" 1 "file"
|
|
else
|
|
change_sim_descr "Device simulation" 0 "file"
|
|
fi
|
|
fi
|
|
|
|
# Updates prop file editing
|
|
if [ "$FILESAFE" == 0 ]; then
|
|
if [ "$CONFPROPFILES" == "true" ]; then
|
|
edit_prop_files "file" "" " (configuration file)"
|
|
elif [ "$CONFPROPFILES" == "false" ]; then
|
|
reset_prop_files "file" "" " (configuration file)"
|
|
fi
|
|
fi
|
|
|
|
# Updates custom props
|
|
if [ "$PROPOPTION" != "preserve" ]; then
|
|
if [ "$CONFPROPS" ] || [ "$CONFPROPSPOST" ] || [ "$CONFPROPSLATE" ]; then
|
|
if [ "$PROPOPTION" == "add" ] || [ "$PROPOPTION" == "replace" ]; then
|
|
if [ "$PROPOPTION" == "replace" ]; then
|
|
reset_all_custprop "file"
|
|
fi
|
|
if [ "$CONFPROPS" ]; then
|
|
for ITEM in $CONFPROPS; do
|
|
set_custprop "$(get_eq_left "$ITEM")" "$(get_eq_right "$ITEM")" "default" "file"
|
|
done
|
|
fi
|
|
if [ "$CONFPROPSPOST" ]; then
|
|
for ITEM in $CONFPROPSPOST; do
|
|
set_custprop "$(get_eq_left "$ITEM")" "$(get_eq_right "$ITEM")" "post" "file"
|
|
done
|
|
fi
|
|
if [ "$CONFPROPSLATE" ]; then
|
|
for ITEM in $CONFPROPSLATE; do
|
|
set_custprop "$(get_eq_left "$ITEM")" "$(get_eq_right "$ITEM")" "late" "file"
|
|
done
|
|
fi
|
|
fi
|
|
else
|
|
reset_all_custprop "file"
|
|
fi
|
|
fi
|
|
|
|
# Updates props to delete
|
|
if [ "$DELPROPOPTION" != "preserve" ]; then
|
|
if [ "$CONFDELPROPS" ]; then
|
|
if [ "$DELPROPOPTION" == "add" ] || [ "$DELPROPOPTION" == "replace" ]; then
|
|
if [ "$DELPROPOPTION" == "replace" ]; then
|
|
reset_all_delprop "file"
|
|
fi
|
|
for ITEM in $CONFDELPROPS; do
|
|
set_delprop "$ITEM" "file"
|
|
done
|
|
fi
|
|
else
|
|
reset_all_delprop "file"
|
|
fi
|
|
fi
|
|
|
|
# Updates options
|
|
if [ "$CONFLATE" == "true" ]; then
|
|
OPTLCHNG=1
|
|
TMPTXT="late_start service"
|
|
else
|
|
OPTLCHNG=0
|
|
TMPTXT="post-fs-data"
|
|
fi
|
|
replace_fn OPTIONLATE $OPTIONLATE $OPTLCHNG $LATEFILE
|
|
log_handler "Boot stage is ${TMPTXT}."
|
|
if [ "$CONFCOLOUR" == "true" ]; then
|
|
OPTCCHNG=1
|
|
else
|
|
OPTCCHNG=0
|
|
fi
|
|
replace_fn OPTIONCOLOUR $OPTIONCOLOUR $OPTCCHNG $LATEFILE
|
|
log_handler "Colour $CONFCOLOUR."
|
|
if [ "$CONFWEB" == "true" ]; then
|
|
OPTWCHNG=1
|
|
else
|
|
OPTWCHNG=0
|
|
fi
|
|
replace_fn OPTIONWEB $OPTIONWEB $OPTWCHNG $LATEFILE
|
|
log_handler "Automatic fingerprints list update $CONFWEB."
|
|
else
|
|
log_handler "The configuration file is not compatible with the current module version."
|
|
fi
|
|
|
|
# Deletes the configuration file
|
|
log_handler "Deleting configuration file."
|
|
rm -f $CONFFILE
|
|
log_handler "Configuration file import complete."
|
|
|
|
else
|
|
log_handler "No configuration file."
|
|
fi
|
|
}
|
|
|
|
# Connection test
|
|
test_connection() {
|
|
ping -c 1 -W 1 google.com >> $LOGFILE 2>&1 && CNTTEST="true" || CNTTEST="false"
|
|
}
|
|
|
|
# ======================== Fingerprint functions ========================
|
|
# Set new fingerprint
|
|
print_edit() {
|
|
if [ "$FINGERPRINTENB" == 1 -o "$PRINTMODULE" == 0 ] && [ "$PRINTEDIT" == 1 ]; then
|
|
log_handler "Changing fingerprint."
|
|
if [ "$PRINTVEND" == 1 ]; then
|
|
log_handler "Using vendor fingerprint (for Treble GSI ROMs)."
|
|
PRINTCHNG="$(resetprop ro.vendor.build.fingerprint)"
|
|
# Set device simulation variables
|
|
print_parts "$PRINTCHNG"
|
|
else
|
|
PRINTCHNG="$(echo $MODULEFINGERPRINT | sed 's|\_\_.*||')"
|
|
fi
|
|
for ITEM in $PRINTPROPS; do
|
|
log_handler "Changing/writing $ITEM."
|
|
resetprop -v $ITEM >> $LOGFILE 2>&1
|
|
resetprop -nv $ITEM $PRINTCHNG >> $LOGFILE 2>&1
|
|
done
|
|
# Edit security patch date if included
|
|
if [ "$PRINTVEND" != 1 ]; then
|
|
SECPATCH="$(get_sec_patch $MODULEFINGERPRINT)"
|
|
case "$MODULEFINGERPRINT" in
|
|
*__*)
|
|
if [ "$SECPATCH" ]; then
|
|
log_handler "Updating security patch date to match fingerprint used."
|
|
resetprop -v ro.build.version.security_patch >> $LOGFILE 2>&1
|
|
resetprop -nv ro.build.version.security_patch $SECPATCH >> $LOGFILE 2>&1
|
|
fi
|
|
;;
|
|
esac
|
|
fi
|
|
# Edit device description
|
|
if [ "$DESCRIPTIONSET" == 1 ]; then
|
|
if [ "$SIMDESCRIPTION" ]; then
|
|
log_handler "Changing/writing ro.build.description."
|
|
resetprop -v ro.build.description >> $LOGFILE 2>&1
|
|
resetprop -nv ro.build.description "$SIMDESCRIPTION" >> $LOGFILE 2>&1
|
|
fi
|
|
else
|
|
log_handler "Changing/writing ro.build.description is disabled."
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Create fingerprint files
|
|
print_files() {
|
|
log_print "Creating fingerprint files."
|
|
rm -rf $PRINTFILES >> $LOGFILE 2>&1
|
|
mkdir -pv $PRINTFILES >> $LOGFILE 2>&1
|
|
# Loading prints
|
|
. $PRINTSLOC
|
|
# Saving manufacturers
|
|
log_handler "Saving manufacturers."
|
|
SAVEIFS=$IFS
|
|
IFS=$(echo -en "\n\b")
|
|
for ITEM in $PRINTSLIST; do
|
|
TMPOEMLIST=$(echo "$OEMLIST $(get_first $ITEM)" | sed 's|^[ \t]*||')
|
|
OEMLIST="$TMPOEMLIST"
|
|
done
|
|
IFS=$SAVEIFS
|
|
TMPOEMLIST=$(echo $(printf '%s\n' $OEMLIST | sort -u))
|
|
OEMLIST="$TMPOEMLIST"
|
|
log_handler "Creating files."
|
|
for OEM in $OEMLIST; do
|
|
echo -e "PRINTSLIST=\"" >> $PRINTFILES/${OEM}\.sh
|
|
grep $OEM >> $PRINTFILES/${OEM}\.sh $PRINTSLOC
|
|
echo -e "\"" >> $PRINTFILES/${OEM}\.sh
|
|
done
|
|
# Check for updated fingerprint
|
|
device_print_update "Updating module fingerprint."
|
|
}
|
|
|
|
device_print_update() {
|
|
if [ "$OPTIONUPDATE" == 1 ]; then
|
|
if [ "$FINGERPRINTENB" == 1 -o "$PRINTMODULE" == 0 ] && [ "$PRINTEDIT" == 1 ] && [ "$MODULEFINGERPRINT" ]; then
|
|
TMPDEV="${SIMBRAND}/${SIMNAME}/${SIMDEVICE}"
|
|
for ITEM in $PRINTSLIST; do
|
|
case $ITEM in
|
|
*$TMPDEV*)
|
|
TMPPRINT=$ITEM
|
|
break
|
|
;;
|
|
esac
|
|
done
|
|
log_handler "Checking for updated fingerprint ($TMPDEV)."
|
|
if [ "$TMPDEV" ] && [ "$TMPPRINT" ]; then
|
|
if [ "$MODULEFINGERPRINT" != "$(get_eq_right $TMPPRINT))" ]; then
|
|
log_handler "$1"
|
|
change_print "$1" $(get_eq_right $TMPPRINT) "update"
|
|
replace_fn PRINTCHK 0 1 $LATEFILE
|
|
# Load module values
|
|
. $LATEFILE
|
|
else
|
|
log_handler "No update available."
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Checks and updates the prints list
|
|
download_prints() {
|
|
if [ -z "$LOGNAME" ] && [ "$DEVTESTING" == "false" ]; then
|
|
clear
|
|
fi
|
|
if [ "$1" == "Dev" ]; then
|
|
PRINTSWWW=$PRINTSDEV
|
|
fi
|
|
menu_header "Updating fingerprints list"
|
|
echo ""
|
|
# Testing connection
|
|
log_print "Checking connection."
|
|
test_connection
|
|
# Checking and downloading fingerprints list
|
|
if [ "$CNTTEST" == "true" ]; then
|
|
log_print "Checking list version."
|
|
wget -T 5 -q -O $PRINTSTMP $PRINTSWWW >> $LOGFILE 2>&1
|
|
if [ -s "$PRINTSTMP" ]; then
|
|
LISTVERSION=$(get_file_value $PRINTSTMP "PRINTSV=")
|
|
if [ "$LISTVERSION" ]; then
|
|
if [ "$LISTVERSION" == "Dev" ] || [ "$LISTVERSION" -gt "$(get_file_value $PRINTSLOC "PRINTSV=")" ]; then
|
|
module_v_ctrl
|
|
if [ "$(get_file_value $PRINTSTMP "PRINTSTRANSF=")" -le $VERSIONCMP ]; then
|
|
mv -f $PRINTSTMP $PRINTSLOC >> $LOGFILE 2>&1
|
|
# Updates list version in module.prop
|
|
replace_fn version $VERSIONTMP "${MODVERSION}-v${LISTVERSION}" $MODPATH/module.prop
|
|
log_print "Updated list to v${LISTVERSION}."
|
|
print_files
|
|
else
|
|
rm -f $PRINTSTMP
|
|
log_print "New fingerprints list requires module update."
|
|
fi
|
|
else
|
|
rm -f $PRINTSTMP
|
|
log_print "Fingerprints list up-to-date."
|
|
fi
|
|
else
|
|
rm -f $PRINTSTMP
|
|
log_print "! File not downloaded!"
|
|
log_handler "Couldn't extract list version."
|
|
fi
|
|
elif [ -f "$PRINTSTMP" ]; then
|
|
rm -f $PRINTSTMP
|
|
log_print "! File not downloaded!"
|
|
log_handler "File is empty."
|
|
else
|
|
log_print "! File not downloaded!"
|
|
fi
|
|
else
|
|
log_print "No connection."
|
|
fi
|
|
if [ "$1" == "manual" ]; then
|
|
sleep 2
|
|
else
|
|
sleep 0.5
|
|
fi
|
|
}
|
|
|
|
# Reset the module fingerprint change
|
|
reset_print() {
|
|
log_handler "Resetting device fingerprint to default system value."
|
|
|
|
# Saves new module valueS
|
|
replace_fn MODULEFINGERPRINT "\"$MODULEFINGERPRINT\"" "\"\"" $LATEFILE
|
|
# Updates vendor print setting
|
|
replace_fn PRINTVEND 1 0 $LATEFILE
|
|
# Updates prop change variables in propsconf_late
|
|
replace_fn PRINTEDIT 1 0 $LATEFILE
|
|
# Updates improved hiding setting
|
|
replace_fn SETFINGERPRINT "true" "false" $LATEFILE
|
|
# Updates simulation setting
|
|
replace_fn DEVSIM 1 0 $LATEFILE
|
|
|
|
# Clear out device simulation variables
|
|
print_parts "none"
|
|
|
|
after_change "$1" "$2"
|
|
}
|
|
|
|
# Use fingerprint
|
|
change_print() {
|
|
log_handler "Changing device fingerprint to $2."
|
|
|
|
# Saves new module values
|
|
replace_fn MODULEFINGERPRINT "\"$MODULEFINGERPRINT\"" "\"$2\"" $LATEFILE
|
|
|
|
# Updates prop change variables in propsconf_late
|
|
replace_fn PRINTEDIT 0 1 $LATEFILE
|
|
# Updates improved hiding setting
|
|
replace_fn SETFINGERPRINT "false" "true" $LATEFILE
|
|
|
|
# Set device simulation variables
|
|
print_parts "$2"
|
|
|
|
NEWFINGERPRINT=""
|
|
|
|
if [ "$DEVSIM" == 1 ]; then
|
|
after_change "$1" "$3"
|
|
fi
|
|
}
|
|
|
|
# Use vendor fingerprint
|
|
change_print_vendor() {
|
|
if [ $2 == 1 ]; then
|
|
STATETXT="Enabling"
|
|
TMPVAL=0
|
|
BUILD1="false"
|
|
BUILD2="true"
|
|
else
|
|
STATETXT="Disabling"
|
|
TMPVAL=1
|
|
BUILD1="true"
|
|
BUILD2="false"
|
|
fi
|
|
|
|
log_handler "$STATETXT using the stock vendor fingerprint (for Treble GSI ROMs)."
|
|
|
|
# Enables or disables the setting
|
|
replace_fn PRINTVEND $TMPVAL $2 $LATEFILE
|
|
# Updates prop change variables in propsconf_late
|
|
replace_fn PRINTEDIT $TMPVAL $2 $LATEFILE
|
|
# Clearing out module value
|
|
replace_fn MODULEFINGERPRINT "\"$MODULEFINGERPRINT\"" "\"\"" $LATEFILE
|
|
# Updates improved hiding setting
|
|
replace_fn SETFINGERPRINT $BUILD1 $BUILD2 $LATEFILE
|
|
# Updates simulation setting
|
|
replace_fn DEVSIM $TMPVAL $2 $LATEFILE
|
|
|
|
# Set device simulation variables
|
|
print_parts "$ORIGVENDPRINT"
|
|
|
|
if [ "$DEVSIM" == 1 ]; then
|
|
after_change "$1" "$3"
|
|
fi
|
|
}
|
|
|
|
# Save props values from fingerprint parts
|
|
print_parts() {
|
|
DLIM1=1
|
|
DLIM2=1
|
|
for ITEM in $PRINTPARTS; do
|
|
TMPVALUE=""
|
|
TMPPROP=$(get_prop_type $ITEM | tr '[:lower:]' '[:upper:]')
|
|
if [ $1 != "none" ]; then
|
|
TMPVALUE=$(echo $1 | sed 's|\:user\/release-keys||' | cut -f $DLIM1 -d ':' | cut -f $DLIM2 -d '/')
|
|
eval "VAR${TMPPROP}='$TMPVALUE'"
|
|
fi
|
|
DLIM2=$(($DLIM2 + 1))
|
|
if [ "$DLIM2" == 4 ]; then
|
|
DLIM1=2
|
|
DLIM2=1
|
|
fi
|
|
if [ "$2" != "var" ]; then
|
|
SUBA=$(get_file_value $LATEFILE "SIM${TMPPROP}=")
|
|
replace_fn "SIM${TMPPROP}" "\"$SUBA\"" "\"$TMPVALUE\"" $LATEFILE
|
|
fi
|
|
done
|
|
|
|
VARDESCRIPTION=""
|
|
if [ $1 != "none" ]; then
|
|
VARDESCRIPTION="${VARNAME}-user $VARRELEASE $VARID $VARINCREMENTAL release-keys"
|
|
fi
|
|
if [ "$2" != "var" ]; then
|
|
replace_fn SIMDESCRIPTION "\"$SIMDESCRIPTION\"" "\"$VARDESCRIPTION\"" $LATEFILE
|
|
fi
|
|
# Load module values
|
|
. $LATEFILE
|
|
}
|
|
|
|
# ======================== Device simulation functions ========================
|
|
# Edit the simulation props
|
|
dev_sim_edit() {
|
|
if [ "$FINGERPRINTENB" == 1 -o "$PRINTMODULE" == 0 ] && [ "$PRINTEDIT" == 1 ]; then
|
|
if [ "$DEVSIM" == 1 ]; then
|
|
log_handler "Editing device simulation props."
|
|
for ITEM in $PRINTPARTS; do
|
|
TMPPROP=$(get_prop_type $ITEM | tr '[:lower:]' '[:upper:]')
|
|
TMPENB=$(get_file_value $LATEFILE "${TMPPROP}SET=")
|
|
TMPVALUE=$(get_file_value $LATEFILE "SIM${TMPPROP}=")
|
|
if [ "$TMPENB" == 1 ] && [ "$TMPVALUE" ]; then
|
|
log_handler "Changing/writing $ITEM."
|
|
resetprop -v $ITEM >> $LOGFILE 2>&1
|
|
resetprop -nv $ITEM $TMPVALUE >> $LOGFILE 2>&1
|
|
else
|
|
log_handler "Changing/writing $ITEM is disabled."
|
|
fi
|
|
done
|
|
fi
|
|
fi
|
|
|
|
}
|
|
|
|
# Enable/disable the option
|
|
change_dev_sim() {
|
|
if [ $DEVSIM == 0 ]; then
|
|
STATETXT="Enabling"
|
|
TMPVAL=1
|
|
else
|
|
STATETXT="Disabling"
|
|
TMPVAL=0
|
|
fi
|
|
|
|
log_handler "$STATETXT basic device simulation."
|
|
|
|
# Enables or disables the setting
|
|
replace_fn "DEVSIM" $DEVSIM $TMPVAL $LATEFILE
|
|
|
|
after_change "$1" "$2"
|
|
}
|
|
|
|
# Change if prop should be simulated or not
|
|
change_sim_prop() {
|
|
if [ $3 == 1 ]; then
|
|
STATETXT="enabled"
|
|
else
|
|
STATETXT="disabled"
|
|
fi
|
|
log_handler "Changing device simulation prop $2 to $STATETXT."
|
|
|
|
TMPPROP=$(get_prop_type $2 | tr '[:lower:]' '[:upper:]')
|
|
SUBA=$(get_file_value $LATEFILE "${TMPPROP}SET=")
|
|
|
|
# Saves new value
|
|
replace_fn "${TMPPROP}SET" $SUBA $3 $LATEFILE
|
|
|
|
after_change "$1" "$4"
|
|
}
|
|
|
|
# Change if description should be simulated or not
|
|
change_sim_descr() {
|
|
if [ $2 == 1 ]; then
|
|
STATETXT="enabled"
|
|
else
|
|
STATETXT="disabled"
|
|
fi
|
|
log_handler "Changing device description editing to $STATETXT."
|
|
|
|
# Saves new value
|
|
replace_fn DESCRIPTIONSET $DESCRIPTIONSET $2 $LATEFILE
|
|
|
|
after_change "$1" "$3"
|
|
}
|
|
|
|
# ======================== Props files functions ========================
|
|
# Reset prop files
|
|
reset_prop_files() {
|
|
log_handler "Resetting prop files$3."
|
|
|
|
# Changes files
|
|
for PROPTYPE in $PROPSLIST; do
|
|
log_handler "Disabling prop file editing for '$PROPTYPE'."
|
|
PROP=$(get_prop_type $PROPTYPE)
|
|
SETPROP=$(echo "SET$PROP" | tr '[:lower:]' '[:upper:]')
|
|
replace_fn $SETPROP "true" "false" $LATEFILE
|
|
done
|
|
# Change fingerprint
|
|
replace_fn SETFINGERPRINT "true" "false" $LATEFILE
|
|
# Edit settings variables
|
|
replace_fn BUILDEDIT 1 0 $LATEFILE
|
|
replace_fn DEFAULTEDIT 1 0 $LATEFILE
|
|
|
|
if [ "$1" != "file" ]; then
|
|
after_change_file "$1" "$2"
|
|
fi
|
|
}
|
|
|
|
# Editing prop files settings
|
|
edit_prop_files() {
|
|
log_handler "Modifying prop files$3."
|
|
|
|
# Checks if editing prop files is enabled
|
|
if [ "$BUILDPROPENB" == 0 ]; then
|
|
log_handler "Editing build.prop is disabled. Only editing default.prop."
|
|
PROPSLIST="
|
|
ro.debuggable
|
|
ro.secure
|
|
"
|
|
else
|
|
# Checking if the device fingerprint is set by the module
|
|
if [ "$FINGERPRINTENB" == 1 ] && [ "$PRINTEDIT" == 1 ]; then
|
|
if [ "$(grep "$ORIGFINGERPRINT" $MIRRORLOC/build.prop)" ]; then
|
|
log_handler "Enabling prop file editing for device fingerprint."
|
|
replace_fn SETFINGERPRINT "false" "true" $LATEFILE
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
for PROPTYPE in $PROPSLIST; do
|
|
log_handler "Checking original file value for '$PROPTYPE'."
|
|
PROP=$(get_prop_type $PROPTYPE)
|
|
FILEPROP=$(echo "FILE$PROP" | tr '[:lower:]' '[:upper:]')
|
|
SETPROP=$(echo "SET$PROP" | tr '[:lower:]' '[:upper:]')
|
|
|
|
# Check the original file value
|
|
PROPVALUE=$(get_file_value $LATEFILE "$FILEPROP=")
|
|
if [ -z "$PROPVALUE" ]; then
|
|
if [ "$PROPTYPE" == "ro.debuggable" ] || [ "$PROPTYPE" == "ro.secure" ]; then
|
|
PROPVALUE=$(get_file_value /default.prop "${PROPTYPE}=")
|
|
else
|
|
PROPVALUE=$(get_file_value $MIRRORLOC/build.prop "${PROPTYPE}=")
|
|
fi
|
|
fi
|
|
|
|
# Checks for default/set values
|
|
safe_props $PROPTYPE $PROPVALUE
|
|
|
|
# Changes file only if necessary
|
|
if [ "$SAFE" == 0 ]; then
|
|
log_handler "Enabling prop file editing for '$PROPTYPE'."
|
|
replace_fn $SETPROP "false" "true" $LATEFILE
|
|
elif [ "$SAFE" == 1 ]; then
|
|
log_handler "Prop file editing unnecessary for '$PROPTYPE'."
|
|
replace_fn $SETPROP "true" "false" $LATEFILE
|
|
else
|
|
log_handler "Couldn't check safe value for '$PROPTYPE'."
|
|
fi
|
|
done
|
|
replace_fn BUILDEDIT 0 1 $LATEFILE
|
|
replace_fn DEFAULTEDIT 0 1 $LATEFILE
|
|
|
|
if [ "$1" != "file" ]; then
|
|
after_change_file "$1" "$2"
|
|
fi
|
|
}
|
|
|
|
# Edit the prop files
|
|
change_prop_file() {
|
|
case $1 in
|
|
build)
|
|
FNLIST="
|
|
ro.build.type
|
|
ro.build.tags
|
|
ro.build.selinux
|
|
"
|
|
PROPFILELOC=$MODPATH/system/build.prop
|
|
;;
|
|
default)
|
|
FNLIST="
|
|
ro.debuggable
|
|
ro.secure
|
|
"
|
|
PROPFILELOC=/default.prop
|
|
;;
|
|
esac
|
|
for ITEM in $FNLIST; do
|
|
PROP=$(get_prop_type $ITEM)
|
|
MODULEPROP=$(echo "MODULE${PROP}" | tr '[:lower:]' '[:upper:]')
|
|
FILEPROP=$(echo "ORIG${PROP}" | tr '[:lower:]' '[:upper:]')
|
|
SETPROP=$(echo "SET${PROP}" | tr '[:lower:]' '[:upper:]')
|
|
if [ "$(eval "echo \$$MODULEPROP")" ]; then
|
|
SEDVAR="$(eval "echo \$$MODULEPROP")"
|
|
else
|
|
for P in $SAFELIST; do
|
|
if [ "$(get_eq_left "$P")" == "$ITEM" ]; then
|
|
SEDVAR=$(get_eq_right "$P")
|
|
fi
|
|
done
|
|
fi
|
|
if [ "$(get_file_value $LATEFILE "${SETPROP}=")" == "true" ]; then
|
|
replace_fn $ITEM $(eval "echo \$$FILEPROP") $SEDVAR $PROPFILELOC && log_handler "${ITEM}=${SEDVAR}"
|
|
fi
|
|
done
|
|
}
|
|
|
|
# ======================== MagiskHide Props functions ========================
|
|
# Check safe values
|
|
safe_props() {
|
|
SAFE=""
|
|
if [ "$2" ]; then
|
|
for P in $SAFELIST; do
|
|
if [ "$(get_eq_left "$P")" == "$1" ]; then
|
|
if [ "$2" == "$(get_eq_right "$P")" ]; then
|
|
SAFE=1
|
|
else
|
|
SAFE=0
|
|
fi
|
|
break
|
|
fi
|
|
done
|
|
fi
|
|
}
|
|
|
|
# Find what prop value to change to
|
|
change_to() {
|
|
CHANGE=""
|
|
case "$1" in
|
|
ro.debuggable) if [ "$2" == 0 ]; then CHANGE=1; else CHANGE=0; fi
|
|
;;
|
|
ro.secure) if [ "$2" == 0 ]; then CHANGE=1; else CHANGE=0; fi
|
|
;;
|
|
ro.build.type) if [ "$2" == "userdebug" ]; then CHANGE="user"; else CHANGE="userdebug"; fi
|
|
;;
|
|
ro.build.tags) if [ "$2" == "test-keys" ]; then CHANGE="release-keys"; else CHANGE="test-keys"; fi
|
|
;;
|
|
ro.build.selinux) if [ "$2" == 0 ]; then CHANGE=1; else CHANGE=0; fi
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# Reset the module prop change
|
|
reset_prop() {
|
|
# Sets variables
|
|
PROP=$(get_prop_type $1)
|
|
MODULEPROP=$(echo "MODULE${PROP}" | tr '[:lower:]' '[:upper:]')
|
|
REPROP=$(echo "RE${PROP}" | tr '[:lower:]' '[:upper:]')
|
|
SUBA=$(get_file_value $LATEFILE "${MODULEPROP}=")
|
|
|
|
log_handler "Resetting $1 to default system value."
|
|
|
|
# Saves new module value
|
|
replace_fn $MODULEPROP "\"$SUBA\"" "\"\"" $LATEFILE
|
|
# Changes prop
|
|
replace_fn $REPROP "true" "false" $LATEFILE
|
|
|
|
# Updates prop change variable in propsconf_late
|
|
if [ "$SUBA" ]; then
|
|
if [ "$PROPCOUNT" -gt 0 ]; then
|
|
PROPCOUNTP=$(($PROPCOUNT-1))
|
|
replace_fn PROPCOUNT $PROPCOUNT $PROPCOUNTP $LATEFILE
|
|
fi
|
|
fi
|
|
if [ "$PROPCOUNT" == 0 ]; then
|
|
replace_fn PROPEDIT 1 0 $LATEFILE
|
|
fi
|
|
|
|
after_change "$1" "$2"
|
|
}
|
|
|
|
# Use prop value
|
|
change_prop() {
|
|
# Sets variables
|
|
PROP=$(get_prop_type $1)
|
|
MODULEPROP=$(echo "MODULE${PROP}" | tr '[:lower:]' '[:upper:]')
|
|
REPROP=$(echo "RE${PROP}" | tr '[:lower:]' '[:upper:]')
|
|
SUBA=$(get_file_value $LATEFILE "${MODULEPROP}=")
|
|
|
|
log_handler "Changing $1 to $2."
|
|
|
|
# Saves new module value
|
|
replace_fn $MODULEPROP "\"$SUBA\"" "\"$2\"" $LATEFILE
|
|
# Changes prop
|
|
replace_fn $REPROP "false" "true" $LATEFILE
|
|
|
|
# Updates prop change variables in propsconf_late
|
|
if [ -z "$SUBA" ]; then
|
|
PROPCOUNTP=$(($PROPCOUNT+1))
|
|
replace_fn PROPCOUNT $PROPCOUNT $PROPCOUNTP $LATEFILE
|
|
fi
|
|
replace_fn PROPEDIT 0 1 $LATEFILE
|
|
|
|
after_change "$1" "$3"
|
|
}
|
|
|
|
# Reset all module prop changes
|
|
reset_prop_all() {
|
|
log_handler "Resetting all props to default values."
|
|
|
|
for PROPTYPE in $PROPSLIST; do
|
|
PROP=$(get_prop_type $PROPTYPE)
|
|
MODULEPROP=$(echo "MODULE${PROP}" | tr '[:lower:]' '[:upper:]')
|
|
REPROP=$(echo "RE${PROP}" | tr '[:lower:]' '[:upper:]')
|
|
SUBA=$(get_file_value $LATEFILE "${MODULEPROP}=")
|
|
|
|
# Saves new module value
|
|
replace_fn $MODULEPROP "\"$SUBA\"" "\"\"" $LATEFILE
|
|
# Changes prop
|
|
replace_fn $REPROP "true" "false" $LATEFILE
|
|
done
|
|
|
|
# Updates prop change variables in propsconf_late
|
|
replace_fn PROPCOUNT $PROPCOUNT 0 $LATEFILE
|
|
replace_fn PROPEDIT 1 0 $LATEFILE
|
|
|
|
after_change "$1"
|
|
}
|
|
|
|
# ======================== Custom Props functions ========================
|
|
# Set custom props
|
|
custom_edit() {
|
|
if [ "$1" ] && [ "$CUSTOMEDIT" == 1 ]; then
|
|
TMPLST="$(get_file_value $LATEFILE "${1}=")"
|
|
if [ "$TMPLST" ]; then
|
|
log_handler "Writing custom props."
|
|
for ITEM in $TMPLST; do
|
|
log_handler "Changing/writing $(get_eq_left "$ITEM")."
|
|
TMPITEM=$( echo $(get_eq_right "$ITEM") | sed 's|_sp_| |g')
|
|
resetprop -v $(get_eq_left "$ITEM") >> $LOGFILE 2>&1
|
|
resetprop -nv $(get_eq_left "$ITEM") "$TMPITEM" >> $LOGFILE 2>&1
|
|
done
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Set custom prop value
|
|
set_custprop() {
|
|
if [ "$2" ]; then
|
|
# Reset the prop
|
|
reset_custprop "$1" "$(resetprop $1)" "bootstage"
|
|
# Set the prop
|
|
PROPSBOOTSTAGE="CUSTOMPROPS"
|
|
PROPSTXT="default"
|
|
if [ "$3" == "post" ]; then
|
|
PROPSBOOTSTAGE="CUSTOMPROPSPOST"
|
|
PROPSTXT="post-fs-data"
|
|
elif [ "$3" == "late" ]; then
|
|
PROPSBOOTSTAGE="CUSTOMPROPSLATE"
|
|
PROPSTXT="late_start service"
|
|
elif [ "$3" == "both" ]; then
|
|
PROPSBOOTSTAGE="CUSTOMPROPSPOST CUSTOMPROPSLATE"
|
|
PROPSTXT="post-fs-data/late_start service"
|
|
fi
|
|
TMPVALUE=$(echo "$2" | sed 's| |_sp_|g')
|
|
TMPORIG=$(echo "$4" | sed 's| |_sp_|g')
|
|
DLIMTMP=1
|
|
for ITEM in $PROPSBOOTSTAGE; do
|
|
CURRCUSTPROPS=$(get_file_value $LATEFILE "${ITEM}=")
|
|
case "$CURRCUSTPROPS" in
|
|
*$1*)
|
|
TMPCUSTPROPS=$(echo "$CURRCUSTPROPS" | sed "s|${1}=${TMPORIG}|${1}=${TMPVALUE}|")
|
|
;;
|
|
*)
|
|
TMPCUSTPROPS=$(echo "$CURRCUSTPROPS ${1}=${TMPVALUE}" | sed 's|^[ \t]*||')
|
|
;;
|
|
esac
|
|
SORTCUSTPROPS=$(echo $(printf '%s\n' $TMPCUSTPROPS | sort -u))
|
|
|
|
log_handler "Setting custom prop $1 in $(echo $PROPSTXT | cut -f $DLIMTMP -d '/') stage."
|
|
replace_fn $ITEM "\"$CURRCUSTPROPS\"" "\"$SORTCUSTPROPS\"" $LATEFILE
|
|
replace_fn CUSTOMEDIT 0 1 $LATEFILE
|
|
DLIMTMP=$(($DLIMTMP + 1))
|
|
done
|
|
|
|
after_change "$1" "$4"
|
|
fi
|
|
}
|
|
|
|
# Reset all custom prop values
|
|
reset_all_custprop() {
|
|
log_handler "Resetting all custom props."
|
|
# Removing all custom props
|
|
replace_fn CUSTOMPROPS "\"$CUSTOMPROPS\"" "\"\"" $LATEFILE
|
|
replace_fn CUSTOMPROPSPOST "\"$CUSTOMPROPSPOST\"" "\"\"" $LATEFILE
|
|
replace_fn CUSTOMPROPSLATE "\"$CUSTOMPROPSLATE\"" "\"\"" $LATEFILE
|
|
replace_fn CUSTOMEDIT 1 0 $LATEFILE
|
|
|
|
after_change "Resetting all custom props" "$1"
|
|
}
|
|
|
|
# Reset custom prop value
|
|
reset_custprop() {
|
|
log_handler "Resetting custom prop $1."
|
|
PROPSBOOTSTAGE="CUSTOMPROPS CUSTOMPROPSPOST CUSTOMPROPSLATE"
|
|
TMPVALUE=$(echo "$2" | sed 's| |_sp_|g')
|
|
|
|
for ITEM in $PROPSBOOTSTAGE; do
|
|
CURRCUSTPROPS=$(get_file_value $LATEFILE "${ITEM}=")
|
|
TMPCUSTPROPS=$(echo $CURRCUSTPROPS | sed "s|${1}=${TMPVALUE}||" | tr -s " " | sed 's|^[ \t]*||')
|
|
# Updating custom props string
|
|
replace_fn $ITEM "\"$CURRCUSTPROPS\"" "\"$TMPCUSTPROPS\"" $LATEFILE
|
|
done
|
|
|
|
if [ -z "$CUSTOMPROPS" ] && [ -z "$CUSTOMPROPSPOST" ] && [ -z "$CUSTOMPROPSLATE" ]; then
|
|
replace_fn CUSTOMEDIT 1 0 $LATEFILE
|
|
fi
|
|
|
|
if [ "$3" != "bootstage" ]; then
|
|
after_change "$1"
|
|
fi
|
|
}
|
|
|
|
# ======================== Delete Props functions ========================
|
|
# Delete props
|
|
prop_del() {
|
|
if [ "$DELEDIT" == 1 ]; then
|
|
log_handler "Deleting props."
|
|
for ITEM in $DELETEPROPS; do
|
|
log_handler "Deleting $ITEM."
|
|
TMPITEM=$( echo $(get_eq_right "$ITEM") | sed 's|_sp_| |g')
|
|
resetprop -v $ITEM >> $LOGFILE 2>&1
|
|
case "$ITEM" in
|
|
persist*)
|
|
resetprop -pv --delete $ITEM >> $LOGFILE 2>&1
|
|
;;
|
|
*)
|
|
resetprop -v --delete $ITEM >> $LOGFILE 2>&1
|
|
;;
|
|
esac
|
|
done
|
|
fi
|
|
}
|
|
|
|
# Set prop to delete
|
|
set_delprop() {
|
|
if [ "$1" ]; then
|
|
TMPDELPROPS=$(echo "$DELETEPROPS ${1}" | sed 's|^[ \t]*||')
|
|
SORTDELPROPS=$(echo $(printf '%s\n' $TMPDELPROPS | sort -u))
|
|
|
|
log_handler "Setting prop to delete, $1."
|
|
replace_fn DELETEPROPS "\"$DELETEPROPS\"" "\"$SORTDELPROPS\"" $LATEFILE
|
|
replace_fn DELEDIT 0 1 $LATEFILE
|
|
|
|
after_change "Delete $1" "$2"
|
|
fi
|
|
}
|
|
|
|
# Reset all props to delete
|
|
reset_all_delprop() {
|
|
log_handler "Resetting list of props to delete."
|
|
# Removing all props to delete
|
|
replace_fn DELETEPROPS "\"$DELETEPROPS\"" "\"\"" $LATEFILE
|
|
replace_fn DELEDIT 1 0 $LATEFILE
|
|
|
|
after_change "Delete $1" "$2"
|
|
}
|
|
|
|
# Reset prop to delete
|
|
reset_delprop() {
|
|
log_handler "Resetting prop to delete, $1."
|
|
TMPDELPROPS=$(echo $DELETEPROPS | sed "s|${1}||" | tr -s " " | sed 's|^[ \t]*||')
|
|
|
|
# Resetting prop to delete
|
|
replace_fn DELETEPROPS "\"$DELETEPROPS\"" "\"$TMPDELPROPS\"" $LATEFILE
|
|
# Loading new value
|
|
. $LATEFILE
|
|
if [ -z "$DELETEPROPS" ]; then
|
|
replace_fn DELEDIT 1 0 $LATEFILE
|
|
fi
|
|
|
|
after_change "Delete $1" "$2"
|
|
}
|
|
|
|
# ======================== Log collecting functions ========================
|
|
# Collects useful logs and info for troubleshooting
|
|
collect_logs() {
|
|
log_handler "Collecting logs and information."
|
|
# Create temporary directory
|
|
mkdir -pv $TMPLOGLOC >> $LOGFILE 2>&1
|
|
|
|
# Saving Magisk and module log files and device original build.prop
|
|
for ITEM in $TMPLOGLIST; do
|
|
if [ -f "$ITEM" ]; then
|
|
case "$ITEM" in
|
|
*build.prop*) BPNAME="build_$(echo $ITEM | sed 's|\/build.prop||' | sed 's|.*\/||g').prop"
|
|
;;
|
|
*) BPNAME=""
|
|
;;
|
|
esac
|
|
cp -af $ITEM ${TMPLOGLOC}/${BPNAME} >> $LOGFILE 2>&1
|
|
else
|
|
case "$ITEM" in
|
|
*/cache)
|
|
if [ "$CACHELOC" == "/cache" ]; then
|
|
CACHELOCTMP=/data/cache
|
|
else
|
|
CACHELOCTMP=/cache
|
|
fi
|
|
ITEMTPM=$(echo $ITEM | sed 's|$CACHELOC|$CACHELOCTMP|')
|
|
if [ -f "$ITEMTPM" ]; then
|
|
cp -af $ITEMTPM $TMPLOGLOC >> $LOGFILE 2>&1
|
|
else
|
|
log_handler "$ITEM not available."
|
|
fi
|
|
;;
|
|
*) log_handler "$ITEM not available."
|
|
;;
|
|
esac
|
|
fi
|
|
done
|
|
|
|
# Saving the current prop values
|
|
resetprop > $TMPLOGLOC/props.txt
|
|
|
|
# Package the files
|
|
cd $CACHELOC
|
|
tar -zcvf propslogs.tar.gz propslogs >> $LOGFILE 2>&1
|
|
|
|
# Copy package to internal storage
|
|
mv -f $CACHELOC/propslogs.tar.gz /storage/emulated/0 >> $LOGFILE 2>&1
|
|
|
|
# Remove temporary directory
|
|
rm -rf $TMPLOGLOC >> $LOGFILE 2>&1
|
|
|
|
log_handler "Logs and information collected."
|
|
|
|
if [ "$1" != "issue" ]; then
|
|
INPUTTMP=""
|
|
menu_header "${C}$1${N}"
|
|
echo ""
|
|
echo "Logs and information collected."
|
|
echo ""
|
|
echo "The packaged file has been saved to the"
|
|
echo "root of your device's internal storage."
|
|
echo ""
|
|
echo "Attach the file to a post in the support"
|
|
echo "thread @ XDA, with a detailed description"
|
|
echo "of your issue."
|
|
echo ""
|
|
echo -n "Press enter to continue..."
|
|
read -r INPUTTMP
|
|
case "$INPUTTMP" in
|
|
*)
|
|
if [ "$2" == "l" ]; then
|
|
exit_fn
|
|
fi
|
|
;;
|
|
esac
|
|
fi
|
|
}
|
|
|
|
# Log print
|
|
log_handler "Functions loaded."
|