various changes to helper script

This commit is contained in:
urmum-69 2020-06-19 09:46:15 +01:00
parent 5a36ade70d
commit 66c2bb76d5

127
assets/files/bluebomb-helper.sh Normal file → Executable file
View file

@ -1,35 +1,41 @@
#!/usr/bin/env bash #!/usr/bin/env bash
version="0.1.0" # BlueBomb Helper Script
# Origin https://git.snopyta.org/twosecslater/bluebomb-helper.git
# Authors urmum_69, twosecslater
if [[ -n $(uname -a | grep "Microsoft\|MSYS\|CYGWIN") ]]; then printf "\033[1;91mNOTICE\033[0m:\n======\n\nBlueBomb does NOT work under Windows, nor the \"Windows Subsystem for Linux\"."; exit; fi
version="0.1.2"
helpmsg="Need further help? You can either join the Wii Mini Hacking Discord server (recommended) at https://discord.gg/6ryxnkS, the RiiConnect24 Discord server at https://discord.gg/b4Y7jfD or you can send an e-mail to support@riiconnect24.net and we'll try to assist. " helpmsg="Need further help? You can either join the Wii Mini Hacking Discord server (recommended) at https://discord.gg/6ryxnkS, the RiiConnect24 Discord server at https://discord.gg/b4Y7jfD or you can send an e-mail to support@riiconnect24.net and we'll try to assist. "
# set variable $sudo if the user is not root, so sudo is only used if absolutely needed # set variable $sudo if the user is not root, so sudo is only used if absolutely needed
[[ $USER != "root" ]] && sudo0="sudo" [[ $USER != "root" ]] && sudo0="sudo" || true
sc() { sc() {
clear clear
unset answer unset answer
printf "\033[1mBlueBomb Helper\033[0m v$version\n\tStage: $1 - $2\n" | fold -s -w $(tput cols) printf "\033[1mBlueBomb Helper\033[0m v%s\n\tStage: %s - %s\n" "$version" "$1" "$2" | fold -s -w "$(tput cols)"
printf -- "=%.0s" $(seq $(tput cols)) && printf "\n\n" printf -- "=%.0s" $(seq "$(tput cols)") && printf "\n\n"
} }
# clear and greet # clear and greet
sc 0 "Welcome" sc 0 "Welcome"
printf "Hello $USER, and welcome to the BlueBomb helper script.\n\nThis script will automatically check you have an environment capable of utilizing BlueBomb, download required files, and automate things as much as possible to make it easier for you, the end user, to perform the BlueBomb exploit on your Wii or Wii Mini console.\n\n" | fold -s -w $(tput cols) printf "Hello %s, and welcome to the BlueBomb helper script.\n\nThis script will automatically check you have an environment capable of utilizing BlueBomb, download required files, and automate things as much as possible to make it easier for you, the end user, to perform the BlueBomb exploit on your Wii or Wii mini console.\n\n" "$USER" | fold -s -w "$(tput cols)"
# error handling # error handling
error() { error() {
sc 0 "Error" sc 0 "Error"
printf "\033[1;91mAn error has occurred.\033[0m\n\nERROR DETAILS:\n\t* Task: $task\n\t* Command: $BASH_COMMAND\n\t* Line: $1\n\t* Exit code: $2\n\n" | fold -s -w $(tput cols) printf "\033[1;91mAn error has occurred.\033[0m\n\nERROR DETAILS:\n\t* Task: %s\n\t* Command: %s\n\t* Line: %s\n\t* Exit code: %s\n\n" "$task" "$BASH_COMMAND" "$1" "$2" | fold -s -w "$(tput cols)"
case $task in case $task in
"Checking prerequisites - Internet connection" | "Download and extract BlueBomb" ) printf "* NOTE:\n\t* Please ensure that your PC has an active internet connection capable of reaching github.com.\n\n" | fold -s -w $(tput cols) ;; "Checking prerequisites - Internet connection" | "Download and extract BlueBomb" ) printf "* NOTE:\n\t* Please ensure that your PC has an active internet connection capable of reaching github.com.\n\n" | fold -s -w "$(tput cols)" ;;
"Execute BlueBomb" ) printf "* TROUBLESHOOTING NOTES:\n\t* If you get an error about the address/socket being already in use, try manually disabling the Bluetooth service on your PC. For systemd users, you would run 'sudo systemctl disable --now bluetooth.service', and for OpenRC users, you would run 'sudo rc-service bluetooth stop'.\n\t* If you get an error about the device failing to be powered on, try running the script as root.\n\n" | fold -s -w $(tput cols) ;; "Execute BlueBomb" ) printf "* TROUBLESHOOTING NOTES:\n\t* If you get an error about the address/socket being already in use, try manually disabling the Bluetooth service on your PC. For systemd users, you would run 'sudo systemctl disable --now bluetooth.service', and for OpenRC users, you would run 'sudo rc-service bluetooth stop'.\n\t* If you get an error about the device failing to be powered on, try running the script again.\n\n" | fold -s -w "$(tput cols)" ;;
esac esac
[[ -n $output ]] && printf "COMMAND OUTPUT:\n\t${output}\n\n" || true #[[ -n $output ]] && printf "COMMAND OUTPUT:\n\t%s\n\n" "${output}" || true
printf "$helpmsg\n" | fold -s -w $(tput cols) printf "%s\n" "$helpmsg" | fold -s -w "$(tput cols)"
exit exit
} }
@ -45,29 +51,29 @@ credit() {
* urmum_69\t\t\t\tScript author * urmum_69\t\t\t\tScript author
* twosecslater\t\t\tScript author * twosecslater\t\t\tScript author
* Commandblock6417\t\t\tContributor * Commandblock6417\t\t\tContributor
* Terry A. Davis\t\t\tMotivation\n\nHave fun running homebrew on your console!\n" | fold -s -w $(tput cols) * Terry A. Davis\t\t\tMotivation\n\nHave fun running homebrew on your console!\n" | fold -s -w "$(tput cols)"
exit exit
} }
ex() { ex() {
printf "$1" && exit printf "\n%s\n\n%s\n" "$1" "$helpmsg" | fold -s -w "$(tput cols)" && exit
} }
# receive parameters given on command line # receive parameters given on command line
while [[ "$1" =~ ^- && ! "$1" == "--" ]]; do case $1 in while [[ "$1" =~ ^- && ! "$1" == "--" ]]; do case $1 in
-v | --version ) printf "BlueBomb helper script\nVersion: $version\n" && exit ;; -v | --version ) printf "BlueBomb helper script\nVersion: %s\n" "$version" && exit ;;
-r | --region ) shift; regionIn=$1 ;; -r | --region ) shift; regionIn=$1 ;;
-t | --console ) shift; consoleIn=$1 ;; -t | --console ) shift; consoleIn=$1 ;;
-s | --sysmenu ) shift; sysmenuIn=$1 ;; -s | --sysmenu ) shift; sysmenuIn=$1 ;;
-c | --credits ) credit; exit ;; -c | --credits ) credit; exit ;;
-h | --help ) printf "\nUsage: $0 [options...]\n -h | --help ) printf "\nUsage: %s [options...]\n
* -v --version\t\t\tDisplays the current version of the script. * -v --version\t\t\tDisplays the current version of the script.
* -r --region <REGION>\t\tAllows you to select a region without needing to interact with the script. * -r --region <REGION>\t\tAllows you to select a region without needing to interact with the script.
* -t --console <CONSOLE TYPE>\tAllows you to select a console type without needing to interact with the script. * -t --console <CONSOLE TYPE>\tAllows you to select a console type without needing to interact with the script.
* -s --sysmenu <SYSMENU VERSION>\tAllows you to select a system menu version without needing to interact with the script. * -s --sysmenu <SYSMENU VERSION>\tAllows you to select a system menu version without needing to interact with the script.
* -c --credits\t\t\tDisplays the credits for this script. * -c --credits\t\t\tDisplays the credits for this script.
* -h --help\t\t\t\tDisplays this help message.\n\n$helpmsg\n" | fold -s -w $(tput cols); exit ;; * -h --help\t\t\t\tDisplays this help message.\n\n%s\n" "$0" "$helpmsg" | fold -s -w "$(tput cols)"; exit ;;
esac; shift; done esac; shift; done
if [[ "$1" == '--' ]]; then shift; fi if [[ "$1" == '--' ]]; then shift; fi
@ -85,30 +91,53 @@ elif [[ -n "$(uname -m | grep 'x86_64')" ]]; then
elif [[ -n "$(uname -m | grep 'i686')" ]]; then elif [[ -n "$(uname -m | grep 'i686')" ]]; then
arch="x86" arch="x86"
else else
printf "Unable to use your architecture ($(uname -m)).\n$helpmsg\n" printf "Unable to use your architecture (%s).\n\n%s\n" "$(uname -m)" "$helpmsg"
exit exit
fi fi
printf "* Detected architecture: $arch\n\n" printf "* Detected architecture: %s\n\n" "$arch"
## detect package manager ## detect package manager
dependencies=("unzip" "bluetoothctl" "wget") dependencies=("unzip" "wget")
printf "Checking dependencies...\n" printf "Checking dependencies...\n"
[[ -x "$(command -v pacman)" ]] && pm="pacman -S" # Arch, etc.
[[ -x "$(command -v apt)" ]] && pm="apt install" # Debian, etc. # Package managers to test for
[[ -x "$(command -v brew)" ]] && pm="brew install" # literally who uses brew on anything but macos, but doesn't hurt to include support anywho pms=("pacman" # Arch, etc.
[[ -x "$(command -v apk)" ]] && pm="apk add" # Alpine, etc. "apt-get" # Old Debian, etc.
[[ -x "$(command -v xbps-install)" ]] && pm="xbps-install -S" # Void, etc. "apt" # Debian, etc.
[[ -x "$(command -v emerge)" ]] && pm="emerge -aqv" # Gentoo, etc. "brew" # macOS, etc.
[[ -x "$(command -v zypper)" ]] && pm="zypper install" # openSUSE, etc. "apk" # Alpine, etc.
[[ -x "$(command -v dnf)" ]] && pm="dnf install" # Fedora, etc. "xbps-install" # Void, etc.
"emerge" # Gentoo, etc.
"zypper" # openSUSE, etc.
"dnf") # Fedora, etc.
# Install commands for package managers (MUST BE IN SAME ORDER AS $pms)
pmi=("pacman -S"
"apt-get install"
"apt install"
"brew install"
"apk add"
"xbps-install -S"
"emerge -aqv"
"zypper install"
"dnf install")
for i in "${pms[@]}"; do
[[ -x "$(command -v ${i})" ]] && pm="${i}" || true # there is probably a more efficient way of doing this - twosecslater @ June 2020
done; unset i
indep() {
case $1 in
"bluetoothctl" ) echo "bluez" ;;
* ) echo "$1" ;;
esac
}
for i in "${dependencies[@]}"; do for i in "${dependencies[@]}"; do
[[ -z "$(command -v $i)" ]] && missing+="$i" [[ -z "$(command -v "$i")" ]] && missing+=("$i")
done done
for i in "${missing[@]}"; do for i in "${missing[@]}"; do
[[ -n $pm ]] && printf "\n* $i is missing! Attempting to install using detected package manager (you may be prompted for your password)...\n" | fold -s -w $(tput cols) && $sudo0 $pm $i || ex "\n* $i is missing! Please install it using your preferred package manager.\n\n$helpmsg\n" [[ -n $pm ]] && printf "\n* %s is missing! Attempting to install using detected package manager (you may be prompted for your password)...\n" "$i" | fold -s -w "$(tput cols)" && $sudo0 $pm $(indep $i) || ex "* $i is missing! Please install it using your preferred package manager."
done; unset i done; unset i
## detect init system ## detect init system
@ -117,21 +146,18 @@ if [[ -e "$(command -v systemctl)" ]]; then
elif [[ -e "$(command -v openrc)" ]]; then elif [[ -e "$(command -v openrc)" ]]; then
init="openrc" init="openrc"
else else
printf "Unable to detect your init system.\n$helpmsg\n" printf "Unable to detect your init system.\n\n%s\n" "$helpmsg"
exit exit
fi fi
printf "* Detected init system: $init\n\n" printf "* Detected init system: %s\n\n" "$init"
download() { download() {
sc 1 "Prerequisites" sc 1 "Prerequisites"
[[ -e ./bluebomb/bluebomb-$arch ]] && printf "BlueBomb executable exists. Not downloading.\n" && cd bluebomb && return [[ -e ./bluebomb/bluebomb-$arch ]] && printf "BlueBomb executable exists. Not downloading.\n" && cd bluebomb && return || true
task="Checking Prerequisites - Internet connection" printf "* Downloading BlueBomb... "
printf "* Checking internet connection... "
ping -c 3 github.com > /dev/null
printf "Success!\n\n* Downloading BlueBomb... "
task="Download and extract BlueBomb" task="Download and extract BlueBomb"
## download zip from github ## download zip from github
mkdir -p bluebomb && cd bluebomb mkdir -p bluebomb && cd bluebomb || false
wget -q --secure-protocol=TLSv1_2 "https://github.com/Fullmetal5/bluebomb/releases/download/1.5/bluebomb1.5.zip" -O bluebomb.zip wget -q --secure-protocol=TLSv1_2 "https://github.com/Fullmetal5/bluebomb/releases/download/1.5/bluebomb1.5.zip" -O bluebomb.zip
printf "Success!\n\n* Unpacking BlueBomb... " printf "Success!\n\n* Unpacking BlueBomb... "
unzip -q bluebomb.zip unzip -q bluebomb.zip
@ -165,15 +191,15 @@ findinfos() {
else else
if [[ -z $sysmenuIn ]]; then if [[ -z $sysmenuIn ]]; then
sc 2 "Collecting information - Sysmenu version" sc 2 "Collecting information - Sysmenu version"
printf "What is the system menu version of your Wii Console?\n\nIf you're not sure where to find this, follow the following instructions:\n\nFrom the Wii Menu, launch Wii Options (round button in the bottom left), and then launch Wii Settings. On the first page of the Wii Settings at the upper right corner, you should see 'Ver X.YZ'. Where 'X' and 'Y' are numbers, and 'Z' is a letter. An example is '4.3E'. This is your system menu version.\n\nPlease enter the system menu version and then press ENTER: " | fold -s -w $(tput cols) printf "What is the system menu version of your Wii Console?\n\nIf you're not sure where to find this, follow the following instructions:\n\nFrom the Wii Menu, launch Wii Options (round button in the bottom left), and then launch Wii Settings. On the first page of the Wii Settings at the upper right corner, you should see 'Ver X.YZ'. Where 'X' and 'Y' are numbers, and 'Z' is a letter. An example is '4.3E'. This is your system menu version.\n\nPlease enter the system menu version and then press ENTER: " | fold -s -w "$(tput cols)"
read -r sysmenuIn read -r sysmenuIn
fi fi
if [[ ! ${#sysmenuIn} == 4 ]]; then printf "Invalid selection.\n" && unset sysmenuIn && findinfos; if [[ ! ${#sysmenuIn} == 4 ]]; then printf "Invalid selection.\n" && unset sysmenuIn && sleep 2 && findinfos;
fi fi
sysmenuVersions=("2_0E" "2_0J" "2_0U" "2_1E" "2_2E" "2_2J" "2_2U" "3_0E" "3_0J" "3_0U" "3_1E" "3_1J" "3_1U" "3_2E" "3_2J" "3_2U" "3_3E" "3_3J" "3_3U" "3_4E" "3_4J" "3_4U" "3_5K" "4_0E" "4_0J" "4_0U" "4_1E" "4_1J" "4_1K" "4_1U" "4_2E" "4_2J" "4_2K" "4_2U" "4_3E" "4_3J" "4_3K" "4_3U") sysmenuVersions=("2_0E" "2_0J" "2_0U" "2_1E" "2_2E" "2_2J" "2_2U" "3_0E" "3_0J" "3_0U" "3_1E" "3_1J" "3_1U" "3_2E" "3_2J" "3_2U" "3_3E" "3_3J" "3_3U" "3_4E" "3_4J" "3_4U" "3_5K" "4_0E" "4_0J" "4_0U" "4_1E" "4_1J" "4_1K" "4_1U" "4_2E" "4_2J" "4_2K" "4_2U" "4_3E" "4_3J" "4_3K" "4_3U")
arg2=${sysmenuIn//./_} arg2=${sysmenuIn//./_}
arg2=${arg2^^} arg2=${arg2^^}
if [[ ! "${sysmenuVersions[@]}" =~ "${arg2}" ]]; then printf "Invalid version.\n" && unset sysmenuIn && findinfos; fi if [[ ! "${sysmenuVersions[*]}" =~ ${arg2} ]]; then printf "Invalid version.\n" && unset sysmenuIn && sleep 2 && findinfos; fi
fi fi
confirm confirm
} }
@ -185,7 +211,7 @@ confirm() {
"WII_SM" ) printf "Wii\033[0m\n" ;; "WII_SM" ) printf "Wii\033[0m\n" ;;
"MINI_SM_" ) printf "Wii mini\033[0m\n" ;; "MINI_SM_" ) printf "Wii mini\033[0m\n" ;;
esac esac
[[ "$arg1" == "WII_SM" ]] && printf "* Target console sysmenu version:\t\033[1;96m${arg2//_/.}\033[0m\n" || printf "* Target console region:\t\t\033[1;96m$arg2\033[0m\n" [[ "$arg1" == "WII_SM" ]] && printf "* Target console sysmenu version:\t\033[1;96m%s\033[0m\n" "${arg2//_/.}" || printf "* Target console region:\t\t\033[1;96m%s\033[0m\n" "$arg2"
printf "\nBlueBomb will be executed with the above, user-provided information.\n" printf "\nBlueBomb will be executed with the above, user-provided information.\n"
ask 1 "Do you wish to proceed?" ask 1 "Do you wish to proceed?"
case $response in case $response in
@ -196,17 +222,24 @@ confirm() {
execute() { execute() {
sc 4 "Execute BlueBomb" sc 4 "Execute BlueBomb"
#task="Check existence of Bluetooth service for $init"
# Yet to finish implementation of this
#case $init in
# "systemd" ) ;;
# "openrc" ) if $(rc-service -e bluetooth); then bte=true; else bte=false; fi ;;
#esac
task="Stop Bluetooth service for $init" task="Stop Bluetooth service for $init"
printf "* Stopping the Bluetooth service... (you may be prompted for your password)\n" printf "* Stopping the Bluetooth service... (you may be prompted for your password)\n"
case $init in case $init in
"systemd" ) $sudo0 systemctl disable --now bluetooth.service ;; "systemd" ) $sudo0 systemctl disable --now bluetooth.service ;;
"openrc" ) $sudo0 rc-service bluetooth stop ;; "openrc" ) $sudo0 rc-service bluetooth stop ;;
esac esac
#printf "\n* Waiting 5 seconds..." && sleep 5
task="Execute BlueBomb" task="Execute BlueBomb"
printf "\n* Executing BlueBomb...\n" printf "\n* Executing BlueBomb...\n"
printf "$sudo0 ./bluebomb-$arch ./stage0/$arg1$arg2.bin stage1.bin\n" printf "%s ./bluebomb-%s ./stage0/%s%s.bin stage1.bin\n" "$sudo0" "$arch" "$arg1" "$arg2"
$sudo0 ./bluebomb-$arch ./stage0/$arg1$arg2.bin stage1.bin $sudo0 ./bluebomb-${arch} ./stage0/${arg1}${arg2}.bin stage1.bin
printf "\n\nIf BlueBomb failed to run, say \033[1mno\033[0m to the following question, and run the script again. Be persistent, it may take multiple attempts to get working.\n\n" | fold -s -w $(tput cols) printf "\n\nIf BlueBomb failed to run, say \033[1mno\033[0m to the following question, and run the script again. Be persistent, it may take multiple attempts to get working.\n\n" | fold -s -w "$(tput cols)"
ask 1 "Do you wish to re-enable the Bluetooth service?" ask 1 "Do you wish to re-enable the Bluetooth service?"
case $response in case $response in
0 ) task="Enable Bluetooth service for $init" 0 ) task="Enable Bluetooth service for $init"
@ -223,17 +256,17 @@ ask() {
case $1 in case $1 in
0 ) unset answer; shift; printf "\nOPTIONS:\n"; for o in "$@"; do 0 ) unset answer; shift; printf "\nOPTIONS:\n"; for o in "$@"; do
((i++)) || true ((i++)) || true
printf "\t[\033[1m$i\033[0m]: \033[1m$o\033[0m\n" | fold -s -w $(tput cols) printf "\t[\033[1m%s\033[0m]: \033[1m%s\033[0m\n" "$i" "$o" | fold -s -w "$(tput cols)"
done; unset i; unset o done; unset i; unset o
printf "\nPlease type your selection and then press ENTER: " | fold -s -w $(tput cols) printf "\nPlease type your selection and then press ENTER: " | fold -s -w "$(tput cols)"
read -r answer read -r answer
;; ;;
1 ) unset response; shift; printf "\n\033[1m$1\033[0m [\033[1;32myes\033[0m/\033[1;31mno\033[0m]: " 1 ) unset response; shift; printf "\n\033[1m%s\033[0m [\033[1;32myes\033[0m/\033[1;31mno\033[0m]: " "$1"
read -r answer read -r answer
case ${answer^^} in case ${answer^^} in
"Y" | "YES" ) response=0; return ;; "Y" | "YES" ) response=0; return ;;
"N" | "NO" ) response=1; return ;; "N" | "NO" ) response=1; return ;;
* ) printf "Invalid answer \"$answer\". Treating as no.\n"; sleep 2; response=1; return ;; # I'm lazy. * ) printf "Invalid answer \"%s\". Treating as no.\n" "$answer"; sleep 2; response=1; return ;; # I'm lazy.
esac esac
;; ;;
esac esac