Files
anykernel3-rhode/tools/ak2-core.sh
T
Nathan Chancellor cf764ee768 AK2: Improve patch_fstab
After aa1377c, trying to remove part of the original string was not
possible.

Example:
patch_fstab fstab.qcom /system ext4 flags “wait,verify” “wait”

Because "wait" is within "wait,verify", the entire if block will miss
since grep will succeed in finding it. To work around this, we'll
allow users to leave the last part blank and put in the part they
want to remove as the fifth parameter.

Example:
patch_fstab fstab.qcom /system ext4 flags “,verify” “”

Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
2017-10-15 22:27:34 -03:00

408 lines
14 KiB
Bash
Executable File

## AnyKernel methods (DO NOT CHANGE)
# set up extracted files and directories
ramdisk=/tmp/anykernel/ramdisk;
bin=/tmp/anykernel/tools;
split_img=/tmp/anykernel/split_img;
patch=/tmp/anykernel/patch;
chmod -R 755 $bin;
mkdir -p $ramdisk $split_img;
OUTFD=/proc/self/fd/$1;
# ui_print <text>
ui_print() { echo -e "ui_print $1\nui_print" > $OUTFD; }
# contains <string> <substring>
contains() { test "${1#*$2}" != "$1" && return 0 || return 1; }
# dump boot and extract ramdisk
dump_boot() {
if [ ! -e "$(echo $block | cut -d\ -f1)" ]; then
ui_print " "; ui_print "Invalid partition. Aborting..."; exit 1;
fi;
if [ -f "$bin/nanddump" ]; then
$bin/nanddump -f /tmp/anykernel/boot.img $block;
else
dd if=$block of=/tmp/anykernel/boot.img;
fi;
if [ "$(strings /tmp/anykernel/boot.img | grep -E 'Green Loader|Green Recovery')" ]; then
mv -f /tmp/anykernel/boot.img /tmp/anykernel/boot-orig.img;
dd bs=1048576 count=1 conv=notrunc if=/tmp/anykernel/boot-orig.img of=$split_img/boot.img-master_boot.key;
dd bs=1048576 skip=1 conv=notrunc if=/tmp/anykernel/boot-orig.img of=/tmp/anykernel/boot.img;
fi;
if [ -f "$bin/unpackelf" -a "$($bin/unpackelf -i /tmp/anykernel/boot.img -h -q 2>/dev/null; echo $?)" == 0 ]; then
$bin/unpackelf -i /tmp/anykernel/boot.img -o $split_img;
mv -f $split_img/boot.img-ramdisk.cpio.gz $split_img/boot.img-ramdisk.gz;
elif [ -f "$bin/dumpimage" ]; then
$bin/dumpimage -l /tmp/anykernel/boot.img;
$bin/dumpimage -l /tmp/anykernel/boot.img > $split_img/boot.img-header;
grep "Name:" $split_img/boot.img-header | cut -c15- > $split_img/boot.img-name;
grep "Type:" $split_img/boot.img-header | cut -c15- | cut -d\ -f1 > $split_img/boot.img-arch;
grep "Type:" $split_img/boot.img-header | cut -c15- | cut -d\ -f2 > $split_img/boot.img-os;
grep "Type:" $split_img/boot.img-header | cut -c15- | cut -d\ -f3 | cut -d- -f1 > $split_img/boot.img-type;
grep "Type:" $split_img/boot.img-header | cut -d\( -f2 | cut -d\) -f1 | cut -d\ -f1 | cut -d- -f1 > $split_img/boot.img-comp;
grep "Address:" $split_img/boot.img-header | cut -c15- > $split_img/boot.img-addr;
grep "Point:" $split_img/boot.img-header | cut -c15- > $split_img/boot.img-ep;
$bin/dumpimage -i /tmp/anykernel/boot.img -p 0 $split_img/boot.img-zImage;
test $? != 0 && dumpfail=1;
if [ "$(cat $split_img/boot.img-type)" == "Multi" ]; then
$bin/dumpimage -i /tmp/anykernel/boot.img -p 1 $split_img/boot.img-ramdisk.gz;
else
dumpfail=1;
fi;
elif [ -f "$bin/rkcrc" ]; then
dd bs=4096 skip=8 iflag=skip_bytes conv=notrunc if=/tmp/anykernel/boot.img of=$split_img/boot.img-ramdisk.gz;
elif [ -f "$bin/pxa-unpackbootimg" ]; then
$bin/pxa-unpackbootimg -i /tmp/anykernel/boot.img -o $split_img;
else
$bin/unpackbootimg -i /tmp/anykernel/boot.img -o $split_img;
fi;
if [ $? != 0 -o "$dumpfail" ]; then
ui_print " "; ui_print "Dumping/splitting image failed. Aborting..."; exit 1;
fi;
if [ -f "$bin/mkmtkhdr" ]; then
dd bs=512 skip=1 conv=notrunc if=$split_img/boot.img-ramdisk.gz of=$split_img/temprd;
mv -f $split_img/temprd $split_img/boot.img-ramdisk.gz;
fi;
if [ -f "$bin/unpackelf" -a -f "$split_img/boot.img-dtb" ]; then
case $(od -ta -An -N4 $split_img/boot.img-dtb | sed -e 's/del //' -e 's/ //g') in
QCDT|ELF) ;;
*) gzip $split_img/boot.img-zImage;
mv -f $split_img/boot.img-zImage.gz $split_img/boot.img-zImage;
cat $split_img/boot.img-dtb >> $split_img/boot.img-zImage;
rm -f $split_img/boot.img-dtb;;
esac;
fi;
mv -f $ramdisk /tmp/anykernel/rdtmp;
mkdir -p $ramdisk;
chmod 755 $ramdisk;
cd $ramdisk;
gunzip -c $split_img/boot.img-ramdisk.gz | cpio -i -d;
if [ $? != 0 -o -z "$(ls $ramdisk)" ]; then
ui_print " "; ui_print "Unpacking ramdisk failed. Aborting..."; exit 1;
fi;
cp -af /tmp/anykernel/rdtmp/* $ramdisk;
}
# repack ramdisk then build and write image
write_boot() {
cd $split_img;
if [ -f "$bin/mkimage" ]; then
name=`cat *-name`;
arch=`cat *-arch`;
os=`cat *-os`;
type=`cat *-type`;
comp=`cat *-comp`;
test "$comp" == "uncompressed" && comp=none;
addr=`cat *-addr`;
ep=`cat *-ep`;
else
if [ -f *-cmdline ]; then
cmdline=`cat *-cmdline`;
fi;
if [ -f *-board ]; then
board=`cat *-board`;
fi;
base=`cat *-base`;
pagesize=`cat *-pagesize`;
kerneloff=`cat *-kerneloff`;
ramdiskoff=`cat *-ramdiskoff`;
if [ -f *-tagsoff ]; then
tagsoff=`cat *-tagsoff`;
fi;
if [ -f *-osversion ]; then
osver=`cat *-osversion`;
fi;
if [ -f *-oslevel ]; then
oslvl=`cat *-oslevel`;
fi;
if [ -f *-second ]; then
second=`ls *-second`;
second="--second $split_img/$second";
secondoff=`cat *-secondoff`;
secondoff="--second_offset $secondoff";
fi;
if [ -f *-hash ]; then
hash=`cat *-hash`;
test "$hash" == "unknown" && hash=sha1;
hash="--hash $hash";
fi;
if [ -f *-unknown ]; then
unknown=`cat *-unknown`;
fi;
fi;
for i in zImage zImage-dtb Image.gz Image Image-dtb Image.gz-dtb Image.bz2 Image.bz2-dtb Image.lzo Image.lzo-dtb Image.lzma Image.lzma-dtb Image.xz Image.xz-dtb Image.lz4 Image.lz4-dtb Image.fit; do
if [ -f /tmp/anykernel/$i ]; then
kernel=/tmp/anykernel/$i;
break;
fi;
done;
if [ ! "$kernel" ]; then
kernel=`ls *-zImage`;
kernel=$split_img/$kernel;
fi;
for i in dtb dt.img; do
if [ -f /tmp/anykernel/$i ]; then
dtb="--dt /tmp/anykernel/$i";
break;
fi;
done;
if [ ! "$dtb" -a -f *-dtb ]; then
dtb=`ls *-dtb`;
dtb="--dt $split_img/$dtb";
fi;
if [ -f "$bin/mkbootfs" ]; then
$bin/mkbootfs $ramdisk | gzip > /tmp/anykernel/ramdisk-new.cpio.gz;
else
cd $ramdisk;
find . | cpio -H newc -o | gzip > /tmp/anykernel/ramdisk-new.cpio.gz;
fi;
if [ $? != 0 ]; then
ui_print " "; ui_print "Repacking ramdisk failed. Aborting..."; exit 1;
fi;
cd /tmp/anykernel;
if [ -f "$bin/mkmtkhdr" ]; then
$bin/mkmtkhdr --rootfs ramdisk-new.cpio.gz;
mv -f ramdisk-new.cpio.gz-mtk ramdisk-new.cpio.gz;
case $kernel in
$split_img/*) ;;
*) $bin/mkmtkhdr --kernel $kernel; kernel=$kernel-mtk;;
esac;
fi;
if [ -f "$bin/mkimage" ]; then
$bin/mkimage -A $arch -O $os -T $type -C $comp -a $addr -e $ep -n "$name" -d $kernel:$ramdisk boot-new.img;
elif [ -f "$bin/rkcrc" ]; then
$bin/rkcrc -k ramdisk-new.cpio.gz boot-new.img;
elif [ -f "$bin/pxa-mkbootimg" ]; then
$bin/pxa-mkbootimg --kernel $kernel --ramdisk ramdisk-new.cpio.gz $second --cmdline "$cmdline" --board "$board" --base $base --pagesize $pagesize --kernel_offset $kerneloff --ramdisk_offset $ramdiskoff $secondoff --tags_offset "$tagsoff" --unknown $unknown $dtb --output boot-new.img;
else
$bin/mkbootimg --kernel $kernel --ramdisk ramdisk-new.cpio.gz $second --cmdline "$cmdline" --board "$board" --base $base --pagesize $pagesize --kernel_offset $kerneloff --ramdisk_offset $ramdiskoff $secondoff --tags_offset "$tagsoff" --os_version "$osver" --os_patch_level "$oslvl" $hash $dtb --output boot-new.img;
fi;
if [ $? != 0 ]; then
ui_print " "; ui_print "Repacking image failed. Aborting..."; exit 1;
elif [ `wc -c < boot-new.img` -gt `wc -c < boot.img` ]; then
ui_print " "; ui_print "New image larger than boot partition. Aborting..."; exit 1;
fi;
if [ -f "$bin/futility" -a -d "$bin/chromeos" ]; then
$bin/futility vbutil_kernel --pack boot-new-signed.img --keyblock $bin/chromeos/kernel.keyblock --signprivate $bin/chromeos/kernel_data_key.vbprivk --version 1 --vmlinuz boot-new.img --bootloader $bin/chromeos/empty --config $bin/chromeos/empty --arch arm --flags 0x1;
if [ $? != 0 ]; then
ui_print " "; ui_print "Signing image failed. Aborting..."; exit 1;
fi;
mv -f boot-new-signed.img boot-new.img;
fi;
if [ -f "$bin/BootSignature_Android.jar" -a -d "$bin/avb" ]; then
if [ -f "/system/system/bin/dalvikvm" ]; then
umount /system;
umount /system 2>/dev/null;
mkdir /system_root;
mount -o ro -t auto /dev/block/bootdevice/by-name/system$slot /system_root;
mount -o bind /system_root/system /system;
fi;
unset LD_LIBRARY_PATH;
pk8=`ls $bin/avb/*.pk8`;
cert=`ls $bin/avb/*.x509.*`;
/system/bin/dalvikvm -Xbootclasspath:/system/framework/core-oj.jar:/system/framework/core-libart.jar:/system/framework/conscrypt.jar:/system/framework/bouncycastle.jar -Xnodex2oat -Xnoimage-dex2oat -cp $bin/BootSignature_Android.jar com.android.verity.BootSignature /boot boot-new.img $pk8 $cert boot-new-signed.img;
if [ $? != 0 ]; then
ui_print " "; ui_print "Signing image failed. Aborting..."; exit 1;
fi;
mv -f boot-new-signed.img boot-new.img;
if [ -d "/system_root" ]; then
umount /system;
umount /system_root;
rmdir /system_root;
mount -o ro -t auto /system;
fi;
fi;
if [ -f "$bin/blobpack" ]; then
printf '-SIGNED-BY-SIGNBLOB-\00\00\00\00\00\00\00\00' > boot-new-signed.img;
$bin/blobpack tempblob LNX boot-new.img;
cat tempblob >> boot-new-signed.img;
mv -f boot-new-signed.img boot-new.img;
fi;
if [ -f "/data/custom_boot_image_patch.sh" ]; then
ash /data/custom_boot_image_patch.sh /tmp/anykernel/boot-new.img;
if [ $? != 0 ]; then
ui_print " "; ui_print "User script execution failed. Aborting..."; exit 1;
fi;
fi;
if [ "$(strings /tmp/anykernel/boot.img | grep SEANDROIDENFORCE )" ]; then
printf 'SEANDROIDENFORCE' >> boot-new.img;
fi;
if [ -f "$bin/dhtbsign" ]; then
$bin/dhtbsign -i boot-new.img -o boot-new-signed.img;
mv -f boot-new-signed.img boot-new.img;
fi;
if [ -f "$split_img/boot.img-master_boot.key" ]; then
cat $split_img/boot.img-master_boot.key boot-new.img > boot-new-signed.img;
mv -f boot-new-signed.img boot-new.img;
fi;
if [ -f "$bin/flash_erase" -a -f "$bin/nandwrite" ]; then
$bin/flash_erase $block 0 0;
$bin/nandwrite -p $block /tmp/anykernel/boot-new.img;
else
dd if=/dev/zero of=$block 2>/dev/null;
dd if=/tmp/anykernel/boot-new.img of=$block;
fi;
}
# backup_file <file>
backup_file() { test ! -f $1~ && cp $1 $1~; }
# replace_string <file> <if search string> <original string> <replacement string>
replace_string() {
if [ -z "$(grep "$2" $1)" ]; then
sed -i "s;${3};${4};" $1;
fi;
}
# replace_section <file> <begin search string> <end search string> <replacement string>
replace_section() {
begin=`grep -n "$2" $1 | head -n1 | cut -d: -f1`;
for end in `grep -n "$3" $1 | cut -d: -f1`; do
if [ "$begin" -lt "$end" ]; then
if [ "$3" == " " ]; then
sed -i "/${2//\//\\/}/,/^\s*$/d" $1;
else
sed -i "/${2//\//\\/}/,/${3//\//\\/}/d" $1;
fi;
sed -i "${begin}s;^;${4}\n;" $1;
break;
fi;
done;
}
# remove_section <file> <begin search string> <end search string>
remove_section() {
begin=`grep -n "$2" $1 | head -n1 | cut -d: -f1`;
for end in `grep -n "$3" $1 | cut -d: -f1`; do
if [ "$begin" -lt "$end" ]; then
if [ "$3" == " " ]; then
sed -i "/${2//\//\\/}/,/^\s*$/d" $1;
else
sed -i "/${2//\//\\/}/,/${3//\//\\/}/d" $1;
fi;
break;
fi;
done;
}
# insert_line <file> <if search string> <before|after> <line match string> <inserted line>
insert_line() {
if [ -z "$(grep "$2" $1)" ]; then
case $3 in
before) offset=0;;
after) offset=1;;
esac;
line=$((`grep -n "$4" $1 | head -n1 | cut -d: -f1` + offset));
if [ "$(wc -l $1 | cut -d\ -f1)" -le "$line" ]; then
echo "$5" >> $1;
else
sed -i "${line}s;^;${5}\n;" $1;
fi;
fi;
}
# replace_line <file> <line replace string> <replacement line>
replace_line() {
if [ ! -z "$(grep "$2" $1)" ]; then
line=`grep -n "$2" $1 | head -n1 | cut -d: -f1`;
sed -i "${line}s;.*;${3};" $1;
fi;
}
# remove_line <file> <line match string>
remove_line() {
if [ ! -z "$(grep "$2" $1)" ]; then
line=`grep -n "$2" $1 | head -n1 | cut -d: -f1`;
sed -i "${line}d" $1;
fi;
}
# prepend_file <file> <if search string> <patch file>
prepend_file() {
if [ -z "$(grep "$2" $1)" ]; then
echo "$(cat $patch/$3 $1)" > $1;
fi;
}
# insert_file <file> <if search string> <before|after> <line match string> <patch file>
insert_file() {
if [ -z "$(grep "$2" $1)" ]; then
case $3 in
before) offset=0;;
after) offset=1;;
esac;
line=$((`grep -n "$4" $1 | head -n1 | cut -d: -f1` + offset));
sed -i "${line}s;^;\n;" $1;
sed -i "$((line - 1))r $patch/$5" $1;
fi;
}
# append_file <file> <if search string> <patch file>
append_file() {
if [ -z "$(grep "$2" $1)" ]; then
echo -ne "\n" >> $1;
cat $patch/$3 >> $1;
echo -ne "\n" >> $1;
fi;
}
# replace_file <file> <permissions> <patch file>
replace_file() {
cp -pf $patch/$3 $1;
chmod $2 $1;
}
# patch_fstab <fstab file> <mount match name> <fs match type> <block|mount|fstype|options|flags> <original string> <replacement string>
patch_fstab() {
entry=$(grep "$2" $1 | grep "$3");
if [ -z "$(echo "$entry" | grep "$6")" ] || [ -z $6 ]; then
case $4 in
block) part=$(echo "$entry" | awk '{ print $1 }');;
mount) part=$(echo "$entry" | awk '{ print $2 }');;
fstype) part=$(echo "$entry" | awk '{ print $3 }');;
options) part=$(echo "$entry" | awk '{ print $4 }');;
flags) part=$(echo "$entry" | awk '{ print $5 }');;
esac;
newpart=$(echo "$part" | sed "s;${5};${6};");
newentry=$(echo "$entry" | sed "s;${part};${newpart};");
sed -i "s;${entry};${newentry};" $1;
fi;
}
# patch_cmdline <cmdline match string> [<replacement string>]
patch_cmdline() {
cmdfile=`ls $split_img/*-cmdline`;
if [ -z "$(grep "$1" $cmdfile)" ]; then
cmdtmp=`cat $cmdfile`;
echo "$cmdtmp $1" > $cmdfile;
else
match=$(grep -o "$1.*$" $cmdfile | cut -d\ -f1);
sed -i -e "s;${match};${2};" -e 's; ; ;' -e 's;[ \t]*$;;' $cmdfile;
fi;
}
# patch_prop <prop file> <prop name> <new prop value>
patch_prop() {
if [ -z "$(grep "^$2=" $1)" ]; then
echo -ne "\n$2=$3\n" >> $1;
else
line=`grep -n "^$2=" $1 | head -n1 | cut -d: -f1`;
sed -i "${line}s;.*;${2}=${3};" $1;
fi;
}
# slot detection enabled by is_slot_device=1 (from anykernel.sh)
if [ "$is_slot_device" == 1 ]; then
slot=$(getprop ro.boot.slot_suffix 2>/dev/null);
test ! "$slot" && slot=$(grep -o 'androidboot.slot_suffix=.*$' /proc/cmdline | cut -d\ -f1 | cut -d= -f2);
test "$slot" && block=$block$slot;
if [ $? != 0 -o ! -e "$block" ]; then
ui_print " "; ui_print "Unable to determine active boot slot. Aborting..."; exit 1;
fi;
fi;
## end methods