From 6f502cf250ef9a791eca76f02450e85ad6a849d6 Mon Sep 17 00:00:00 2001 From: tema Date: Fri, 22 Apr 2022 23:38:10 +0300 Subject: [PATCH] Init --- .gitignore | 2 + tools/filemanager.sh | 107 +++++++++++++++++++++++++++ tools/helper.sh | 13 ++++ tools/menu.sh | 172 +++++++++++++++++++++++++++++++++++++++++++ twrp-control.sh | 152 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 446 insertions(+) create mode 100644 .gitignore create mode 100644 tools/filemanager.sh create mode 100644 tools/helper.sh create mode 100644 tools/menu.sh create mode 100644 twrp-control.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..93151a8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +test.sh +go-project \ No newline at end of file diff --git a/tools/filemanager.sh b/tools/filemanager.sh new file mode 100644 index 0000000..529fab2 --- /dev/null +++ b/tools/filemanager.sh @@ -0,0 +1,107 @@ + +function get_term_size() { + # Get terminal size ('stty' is POSIX and always available). + # This can't be done reliably across all bash versions in pure bash. + read -r LINES COLUMNS < <(stty size) + + # Max list items that fit in the scroll area. + ((max_items=LINES-3)) + return $max_items +} + +#CHECK IF ZIP +function checkzip { + if [[ $1 == *.zip ]]; then + confirm_question + if [[ $? -eq 0 ]]; + then + return 0 + else + return 1 + fi + else + echo "This is not a ZIP file." + return 1 + fi +} + + +function checker { + if [ -f "${list_dir[$selected]}" ]; + then + checkzip "${list_dir[$selected]}" + if [[ $? == 0 ]]; then + push_install "${list_dir[$selected]}" + else + filemanager + fi + + elif [ -d "${list_dir[$selected]}" ]; + then + cd "${list_dir[$selected]}" + clear + start_scroll=0 + stop_scroll=$max_items + filemanager + fi +} + + +get_term_size +start_scroll=0 +stop_scroll=$max_items +#FILE NAVIGATING +function filemanager { + clear + + arr=(*) + + local other=0 + list_dir=("..") + if [[ ${#arr[@]} -gt $max_items ]]; then + local d=1 + if [[ $stop_scroll -le ${#arr[@]} ]]; then + for ((i=$start_scroll; i < stop_scroll; i++)); do + list_dir[d]+=${arr[i]} + ((d++)) + done + + if [[ $start_scroll -ne 0 ]]; then + list_dir[0]="..." + elif [[ $start_scroll -eq 0 ]]; then + list_dir[0]='..' + fi + + if [[ $stop_scroll != ${#arr[@]} ]]; then + list_dir[d]="..." + fi + start_scroll=$stop_scroll + stop_scroll=$((stop_scroll+max_items)) + else + stop_scroll=${#arr[@]} + other=$((stop_scroll-$max_items)) + filemanager + fi + else + list_dir=(".." *) + fi + + select_option "${list_dir[@]}" + selected=$? + if [[ $selected == $d ]]; + then + filemanager + elif [[ $selected -eq 0 && $start_scroll -ne 0 && $start_scroll -ne $max_items ]]; + then + start_scroll=$(( start_scroll-(max_items*2+other) )) + stop_scroll=$(( stop_scroll-(max_items*2+other) )) + if [[ $start_scroll -lt 0 ]]; then + start_scroll=0 + stop_scroll=$max_items + fi + filemanager + else + checker + fi + +} diff --git a/tools/helper.sh b/tools/helper.sh new file mode 100644 index 0000000..1478a69 --- /dev/null +++ b/tools/helper.sh @@ -0,0 +1,13 @@ +confirm_question(){ + read -p "You are sure? [y/N]" answ + if [[ $answ == "y" ]] || [[ $answ == "Y" ]]; + then + return 0 + elif [[ $answ == "n" ]] || [[ $answ == "N" ]] || [[ $answ == "" ]];then + echo "Operation $1 canceled!" + read -n 1 -s -r -p "Press any key to continue" + return 1 + else + confirm_question + fi +} \ No newline at end of file diff --git a/tools/menu.sh b/tools/menu.sh new file mode 100644 index 0000000..6354a15 --- /dev/null +++ b/tools/menu.sh @@ -0,0 +1,172 @@ +#!/usr/bin/env bash + +# Renders a text based list of options that can be selected by the +# user using up, down and enter keys and returns the chosen option. +# +# Arguments : list of options, maximum of 256 +# "opt1" "opt2" ... +# Return value: selected index (0 for opt1, 1 for opt2 ...) +function select_option { + + # little helpers for terminal print control and key input + ESC=$( printf "\033") + cursor_blink_on() { printf "$ESC[?25h"; } + cursor_blink_off() { printf "$ESC[?25l"; } + cursor_to() { printf "$ESC[$1;${2:-1}H"; } + print_option() { printf " $1 "; } + print_selected() { printf "$ESC[7m $1 $ESC[27m"; } + get_cursor_row() { IFS=';' read -sdR -p $'\E[6n' ROW COL; echo ${ROW#*[}; } + key_input() { read -s -n3 key 2>/dev/null >&2 + if [[ $key = $ESC[A ]]; then echo up; fi + if [[ $key = $ESC[B ]]; then echo down; fi + if [[ $key = "" ]]; then echo enter; fi; } + + # initially print empty new lines (scroll down if at bottom of screen) + for opt; do printf "\n"; done + + # determine current screen position for overwriting the options + local lastrow=`get_cursor_row` + local startrow=$(($lastrow - $#)) + + # ensure cursor and input echoing back on upon a ctrl+c during read -s + trap "cursor_blink_on; stty echo; printf '\n'; exit" 2 + cursor_blink_off + + local selected=0 + while true; do + # print options by overwriting the last lines + local idx=0 + for opt; do + cursor_to $(($startrow + $idx)) + if [ $idx -eq $selected ]; then + print_selected "$opt" + else + print_option "$opt" + fi + ((idx++)) + done + + # user key control + case `key_input` in + enter) break;; + up) ((selected--)); + if [ $selected -lt 0 ]; then selected=$(($# - 1)); fi;; + down) ((selected++)); + if [ $selected -ge $# ]; then selected=0; fi;; + esac + done + + # cursor position back to normal + cursor_to $lastrow + printf "\n" + cursor_blink_on + + return $selected +} + +function multi_select_option { + # little helpers for terminal print control and key input + ESC=$( printf "\033") + cursor_blink_on() { printf "$ESC[?25h"; } + cursor_blink_off() { printf "$ESC[?25l"; } + cursor_to() { printf "$ESC[$1;${2:-1}H"; } + print_option() { in=$1 + c=$2 + if [[ $in != "Wipe" && $in != "Exit" ]]; + then + printf " [${choices[$c]}] $in "; + else + printf " $in " + fi + } + print_selected() { in=$1 + if [[ $in != "Wipe" && $in != "Exit" ]]; then + printf "$ESC[7m [${choices[$2]}] $1$ESC[27m"; + else + printf "$ESC[7m $1$ESC[27m"; + fi + } + get_cursor_row() { IFS=';' read -sdR -p $'\E[6n' ROW COL; echo ${ROW#*[}; } + key_input() { read -s -n3 key 2>/dev/null >&2 + if [[ $key = $ESC[A ]]; then echo up; fi + if [[ $key = $ESC[B ]]; then echo down; fi + if [[ $key = "" ]]; then echo enter; fi; } + + checker() { idx=$1; + if [[ "${choices[$idx]}" != " " && \ + "${choices[$idx]}" != "*" \ + ]]; then + choices[$idx]=" " + fi + } + + local wipe_part=false + local stop_loop=false + # initially print empty new lines (scroll down if at bottom of screen) + for opt; do printf "\n"; done + + # determine current screen position for overwriting the options + local lastrow=`get_cursor_row` + local startrow=$(($lastrow - $#)) + + # ensure cursor and input echoing back on upon a ctrl+c during read -s + trap "cursor_blink_on; stty echo; printf '\n'; exit" 2 + cursor_blink_off + + local selected=0 + while true; do + # print options by overwriting the last lines + local idx=0 + for opt; do + cursor_to $(($startrow + $idx)) + checker $idx + if [ $idx -eq $selected ]; then + print_selected "$opt" "$idx" + else + print_option "$opt" "$idx" + fi + ((idx++)) + done + # user key control + case `key_input` in + enter) if [[ $selected == $(($idx-1)) ]]; then + stop_loop=true + elif [[ $selected == $(($idx-2)) ]]; then + printf "\n" + confirm_question + if [[ $? -eq 0 ]];then + wipe_part=true; + stop_loop=true + else + choices=() + wipe_part=false + main + fi + else + [[ "${choices[selected]}" == "*" ]] && + choices[selected]=" " || \ + choices[selected]='*' + fi + ;; + + up) ((selected--)); + if [ $selected -lt 0 ]; then selected=$(($# - 1)); fi;; + down) ((selected++)); + if [ $selected -ge $# ]; then selected=0; fi;; + esac + if [[ $stop_loop == true ]]; then + break + fi + done + + # cursor position back to normal + cursor_to $lastrow + printf "\n" + cursor_blink_on + if [[ $wipe_part == true ]];then + return 0 + else + return 1 + fi +} + diff --git a/twrp-control.sh b/twrp-control.sh new file mode 100644 index 0000000..4895629 --- /dev/null +++ b/twrp-control.sh @@ -0,0 +1,152 @@ +#!/usr/bin/env bash +echo "ADB TWRP" + +if [ -f /usr/bin/adb ]; then + echo "Searching for devices..." + + adb devices | grep "recovery" &> /dev/null + if [ $? -eq 0 ]; then + echo "Device found." + read -n 1 -s -r -p "Press any key to continue" + else + echo "Devices not found." + #exit 0 + fi +else + echo "Dependency adb not installed." + exit 0 +fi + +. tools/menu.sh +. tools/filemanager.sh +. tools/helper.sh + +function push_install { + local filename=$1 + local path="$(pwd)/${filename}" + adb push "${path}" '/sdcard' + adb shell "twrp install /sdcard/${filename}" +} + +function install_zip { + clear + echo " +█ █▄░█ █▀ ▀█▀ ▄▀█ █░░ █░░   ▀█ █ █▀█ +█ █░▀█ ▄█ ░█░ █▀█ █▄▄ █▄▄   █▄ █ █▀▀ +" + select_option "Enter absolute path." "Navigate and choose file" + case $? in + 0) + read -p "Enter absolute path of the zip file: " zipfile + if [ -f $zipfile ]; then + checkzip "$zipfile" + fi + + if [ $? -eq 0 ];then + a=($(echo $zipfile | tr "/" " ")) + count=${#a[@]} + filename=${a[count-1]} + path='' + for ((i=0; i < count-1; i++));do + path+="/${a[i]}" + done + adb push "${path}/${filename}" '/sdcard' + adb shell "twrp install /sdcard/${filename}" + else + echo "File not found!" + fi;; + 1) + filemanager;; + esac + read -n 1 -s -r -p "Press any key to continue" + main +} + +function wipes { + clear + echo " +█░█░█ █ █▀█ █▀▀ +▀▄▀▄▀ █ █▀▀ ██▄ +" + wipes_part=("Dalvik/ART cache" "System" "Cache" "Data" "Wipe" "Exit") #"Vendor" + + multi_select_option "${wipes_part[@]}" + if [[ $? -eq 0 ]];then + for ((i=0; i < ${#choices[@]}; i++)); do + + if [[ "${choices[$i]}" == "*" ]]; then + case ${wipes_part[${i}]} in + "Dalvik/ART cache") adb shell "twrp wipe dalvik";; + "System") adb shell "twrp wipe system";; + "Vendor") adb shell "twrp wipe vendor";; + "Cache") adb shell "twrp wipe cache";; + "Data") adb shell "twrp wipe data";; + esac + fi + done + read -n 1 -s -r -p "Press any key to continue" + fi +} + +function format_data { + clear + echo " +█▀▀ █▀█ █▀█ █▀▄▀█ ▄▀█ ▀█▀   █▀▄ ▄▀█ ▀█▀ ▄▀█ +█▀░ █▄█ █▀▄ █░▀░█ █▀█ ░█░   █▄▀ █▀█ ░█░ █▀█ +" + confirm_question "Format Data" + if [[ $? -eq 0 ]]; then + adb shell "twrp format data" + read -n 1 -s -r -p "Press any key to continue" + main + else + main + fi +} + +function data_decrypt { + read -rsp "Enter password from Decrypt /Data " passwd + adb shell "twrp decrypt ${passwd}" + read -n 1 -s -r -p "Press any key to continue" +} + +function reboot_select { + clear + echo " +█▀█ █▀▀ █▄▄ █▀█ █▀█ ▀█▀ +█▀▄ ██▄ █▄█ █▄█ █▄█ ░█░ +" + select_option "System" "Recovery" "Poweroff" "BootLoader" "EDL" "Back" + case $? in + 0) adb shell twrp reboot 1> /dev/null;; # System + 1) adb shell twrp reboot recovery;; # Recovery + 2) adb shell twrp reboot poweroff;; # PowerOff + 3) adb shell twrp reboot bootloader;; # BootLoader + 4) adb shell twrp reboot download;; # EDL + 5) main;; # back + esac + read -n 1 -s -r -p "Press any key to continue" + main +} + + +function main { + clear + echo " +▀█▀ █░█░█ █▀█ █▀█   █▀▀ █▀█ █▄░█ ▀█▀ █▀█ █▀█ █░░ +░█░ ▀▄▀▄▀ █▀▄ █▀▀   █▄▄ █▄█ █░▀█ ░█░ █▀▄ █▄█ █▄▄ +" + select_option "Flash zip" "Wipe" "Format Data" "Decrypt /Data" "Reboot" "Exit" + + case $? in + 0) install_zip;; # Flash zip + 1) wipes;; # Wipe + 2) format_data;; # Format Data + 3) data_decrypt;; + 4) reboot_select;; # Reboot + 5) adb kill-server && clear && exit 0;; + esac + #read -n 1 -s -r -p "Press any key to continue" + main +} +main