- per suggestion from eng.stk avoid archiving all of $home since /tmp in recovery might hold sensitive crypto data - restrict tar to $home (i.e. /tmp/anykernel by default) and $parent/recovery.log (i.e. /tmp/recovery.log) - probably no need to be verbose when making the archive, it kinda clutters up the end of the captured log
224 lines
6.0 KiB
Bash
Executable File
224 lines
6.0 KiB
Bash
Executable File
#!/sbin/sh
|
|
# AnyKernel3 Backend (DO NOT CHANGE)
|
|
# osm0sis @ xda-developers
|
|
|
|
OUTFD=/proc/self/fd/$2;
|
|
ZIPFILE="$3";
|
|
|
|
ps | grep zygote | grep -v grep >/dev/null && BOOTMODE=true || BOOTMODE=false;
|
|
$BOOTMODE || ps -A 2>/dev/null | grep zygote | grep -v grep >/dev/null && BOOTMODE=true;
|
|
|
|
$BOOTMODE && DIR=/sdcard || DIR=$(dirname "$ZIPFILE");
|
|
|
|
test "$home" || home=/tmp/anykernel;
|
|
parent=$(dirname $home);
|
|
|
|
ui_print() {
|
|
until [ ! "$1" ]; do
|
|
echo -e "ui_print $1\nui_print" > $OUTFD;
|
|
shift;
|
|
done;
|
|
}
|
|
show_progress() { echo "progress $1 $2" > $OUTFD; }
|
|
file_getprop() { $bb grep "^$2=" "$1" | $bb cut -d= -f2-; }
|
|
int2ver() {
|
|
if [ "$1" -eq "$1" ] 2>/dev/null; then
|
|
echo "$1.0.0";
|
|
elif [ ! "$(echo "$1" | $bb cut -d. -f3)" ]; then
|
|
echo "$1.0";
|
|
else
|
|
echo "$1";
|
|
fi;
|
|
}
|
|
cleanup() {
|
|
cd $parent;
|
|
rm -rf $home;
|
|
}
|
|
debugging() {
|
|
case $(basename "$ZIPFILE" .zip) in
|
|
*-debugging)
|
|
ui_print " " "Creating debugging archive in $DIR...";
|
|
$bb tar -czf "$DIR/anykernel3-$(date +%Y-%m-%d_%H%M%S)-debug.tgz" $home $parent/recovery.log;
|
|
;;
|
|
esac;
|
|
}
|
|
is_mounted() { $bb mount | $bb grep " $1 "; }
|
|
unmount_all() {
|
|
($bb umount /system;
|
|
if [ -d /system_root -a ! -f /system/build.prop ]; then
|
|
$bb umount /system_root;
|
|
fi;
|
|
$bb umount /system;
|
|
$bb umount /vendor;
|
|
$bb umount /data) 2>/dev/null;
|
|
}
|
|
abort() {
|
|
ui_print "$*";
|
|
debugging;
|
|
if [ ! -f anykernel.sh -o "$(file_getprop anykernel.sh do.cleanuponabort 2>/dev/null)" == 1 ]; then
|
|
cleanup;
|
|
fi;
|
|
unmount_all;
|
|
exit 1;
|
|
}
|
|
|
|
show_progress 1.34 4;
|
|
ui_print " ";
|
|
cleanup;
|
|
mkdir -p $home/bin;
|
|
cd $home;
|
|
unzip -o "$ZIPFILE";
|
|
if [ $? != 0 -o ! "$(ls tools)" ]; then
|
|
abort "Unzip failed. Aborting...";
|
|
fi;
|
|
bb=$home/tools/busybox;
|
|
chmod 755 $bb;
|
|
$bb chmod -R 755 tools bin;
|
|
$bb --install -s bin;
|
|
if [ $? != 0 -o -z "$(ls bin)" ]; then
|
|
abort "Busybox setup failed. Aborting...";
|
|
fi;
|
|
|
|
if [ -f banner ]; then
|
|
while IFS='' read -r line || $bb [[ -n "$line" ]]; do
|
|
ui_print "$line";
|
|
done < banner;
|
|
ui_print " " " ";
|
|
fi;
|
|
|
|
ui_print "$(file_getprop anykernel.sh kernel.string)";
|
|
if [ -f version ]; then
|
|
ui_print " ";
|
|
while IFS='' read -r line || $bb [[ -n "$line" ]]; do
|
|
ui_print "$line";
|
|
done < version;
|
|
ui_print " ";
|
|
fi;
|
|
ui_print " " "AnyKernel3 by osm0sis @ xda-developers" " " " ";
|
|
|
|
unmount_all;
|
|
if [ ! "$(is_mounted /system)" ]; then
|
|
$bb mount -o ro -t auto /system;
|
|
fi;
|
|
($bb mount -o ro -t auto /vendor;
|
|
$bb mount /data) 2>/dev/null;
|
|
if [ -f /system/system/build.prop ]; then
|
|
$bb umount /system;
|
|
($bb umount /system;
|
|
mkdir /system_root) 2>/dev/null;
|
|
$bb mount -o ro -t auto /dev/block/bootdevice/by-name/system /system_root;
|
|
$bb mount -o bind /system_root/system /system;
|
|
fi;
|
|
savedpath="$LD_LIBRARY_PATH";
|
|
savedpre="$LD_PRELOAD";
|
|
unset LD_LIBRARY_PATH;
|
|
unset LD_PRELOAD;
|
|
|
|
if [ ! "$(getprop 2>/dev/null)" ]; then
|
|
getprop() {
|
|
local propval="$(file_getprop /default.prop $1 2>/dev/null)";
|
|
test "$propval" || local propval="$(file_getprop /system/build.prop $1 2>/dev/null)";
|
|
test "$propval" && echo "$propval" || echo "";
|
|
}
|
|
elif [ ! "$(getprop ro.product.device 2>/dev/null)" -a ! "$(getprop ro.build.product 2>/dev/null)" ]; then
|
|
getprop() {
|
|
($(which getprop) | $bb grep "$1" | $bb cut -d[ -f3 | $bb cut -d] -f1) 2>/dev/null;
|
|
}
|
|
fi;
|
|
|
|
if [ "$(file_getprop anykernel.sh do.devicecheck)" == 1 ]; then
|
|
ui_print "Checking device...";
|
|
device="$(getprop ro.product.device)";
|
|
product="$(getprop ro.build.product)";
|
|
for testname in $(file_getprop anykernel.sh 'device.name.*'); do
|
|
if [ "$device" == "$testname" -o "$product" == "$testname" ]; then
|
|
ui_print "$testname";
|
|
match=1;
|
|
break;
|
|
fi;
|
|
done;
|
|
ui_print " ";
|
|
if [ ! "$match" ]; then
|
|
abort "Unsupported device. Aborting...";
|
|
fi;
|
|
fi;
|
|
|
|
supported_ver="$(file_getprop anykernel.sh supported.versions | $bb tr -d '[:space:]')";
|
|
if [ "$supported_ver" ]; then
|
|
ui_print "Checking Android version...";
|
|
android_ver="$(file_getprop /system/build.prop ro.build.version.release)";
|
|
if [ "$(echo $supported_ver | $bb grep -)" ]; then
|
|
lo_ver=$(echo $supported_ver | $bb cut -d- -f1);
|
|
hi_ver=$(echo $supported_ver | $bb cut -d- -f2);
|
|
if [ "$(echo -e "$(int2ver $hi_ver)\n$(int2ver $lo_ver)\n$(int2ver $android_ver)" | $bb sort -g | $bb grep -n "$(int2ver $android_ver)" | $bb grep '^2:')" ]; then
|
|
supported=1;
|
|
fi;
|
|
else
|
|
for ver in $(echo $supported_ver | $bb sed 's;,; ;g'); do
|
|
if [ "$(int2ver $ver)" == "$(int2ver $android_ver)" ]; then
|
|
supported=1;
|
|
break;
|
|
fi;
|
|
done;
|
|
fi;
|
|
if [ "$supported" ]; then
|
|
ui_print "$android_ver" " ";
|
|
else
|
|
ui_print " ";
|
|
abort "Unsupported Android version. Aborting...";
|
|
fi;
|
|
fi;
|
|
|
|
ui_print "Installing...";
|
|
core=$($bb grep -oE 'ak.*core.sh' anykernel.sh);
|
|
test -f tools/$core || $bb ln -s $home/tools/ak*-core.sh $home/tools/$core;
|
|
PATH="$home/bin:$PATH" home=$home $bb ash anykernel.sh $2;
|
|
if [ $? != 0 ]; then
|
|
abort;
|
|
fi;
|
|
|
|
if [ "$(file_getprop anykernel.sh do.modules)" == 1 ]; then
|
|
ui_print " " "Pushing modules...";
|
|
$bb mount -o rw,remount -t auto /system;
|
|
$bb mount -o rw,remount -t auto /vendor 2>/dev/null;
|
|
cd $home/modules;
|
|
for module in $(find . -name '*.ko'); do
|
|
modtarget=$(echo $module | $bb cut -c2-);
|
|
if [ ! -e $modtarget ]; then
|
|
case $module in
|
|
*/vendor/*) modcon=vendor;;
|
|
*) modcon=system;;
|
|
esac;
|
|
fi;
|
|
if [ "$(is_mounted $modtarget)" ]; then
|
|
$bb mount -o rw,remount -t auto $modtarget;
|
|
fi;
|
|
mkdir -p $(dirname $modtarget);
|
|
$bb cp -rLf $module $modtarget;
|
|
$bb chown 0:0 $modtarget;
|
|
$bb chmod 644 $modtarget;
|
|
if [ "$modcon" ]; then
|
|
chcon "u:object_r:${modcon}_file:s0" $modtarget;
|
|
fi;
|
|
if [ "$(is_mounted $modtarget)" ]; then
|
|
$bb mount -o ro,remount -t auto $modtarget;
|
|
fi;
|
|
done;
|
|
cd $home;
|
|
$bb mount -o ro,remount -t auto /system;
|
|
$bb mount -o ro,remount -t auto /vendor 2>/dev/null;
|
|
fi;
|
|
|
|
debugging;
|
|
|
|
if [ "$(file_getprop anykernel.sh do.cleanup)" == 1 ]; then
|
|
cleanup;
|
|
fi;
|
|
|
|
test "$savedpath" && export LD_LIBRARY_PATH="$savedpath";
|
|
test "$savedpre" && export LD_PRELOAD="$savedpre";
|
|
|
|
unmount_all;
|
|
|
|
ui_print " " " " "Done!";
|