#!/bin/bash # # shellcheck disable=SC2164 #misc globals usb_devs="" num_usb_devs=0 usb_device="" isChromeOS=true isChromiumOS=false isCloudready=false flashromcmd="" flashrom_params="" flashrom_programmer="-p internal" cbfstoolcmd="" gbbutilitycmd="" preferUSB=false isHswBox=false isBdwBox=false isHswBook=false isBdwBook=false isHsw=false isBdw=false isByt=false isBsw=false isSkl=false isSnbIvb=false isApl=false isKbl=false isGlk=false isStr=false isWhl=false isCml=false isCmlBox=false isCmlBook=false isPco=false isCzn=false isMdn=false isJsl=false isTgl=false isAdl=false isAdlN=false isUnsupported=false firmwareType="" isStock=true isFullRom=false isBootStub=false isUEFI=false hasRwLegacy=false unlockMenu=false hasUEFIoption=false hasShellball=false wpEnabled=false hasLAN=false hasCR50=false kbl_use_rwl18=false useAltfwStd=false snb_ivb=('butterfly' 'link' 'lumpy' 'parrot' 'stout' 'stumpy') hsw_boxes=('mccloud' 'panther' 'tricky' 'zako') hsw_books=('falco' 'leon' 'monroe' 'peppy' 'wolf') bdw_boxes=('guado' 'rikku' 'tidus') bdw_books=('auron_paine' 'auron_yuna' 'buddy' 'gandof' 'lulu' 'samus') baytrail=('banjo' 'candy' 'clapper' 'enguarde' 'glimmer' 'gnawty' 'heli' \ 'kip' 'ninja' 'orco' 'quawks' 'squawks' 'sumo' 'swanky' 'winky') braswell=('banon' 'celes' 'cyan' 'edgar' 'kefka' 'reks' 'relm' \ 'setzer' 'terra' 'ultima' 'wizpig') skylake=('asuka' 'caroline' 'cave' 'chell' 'lars' 'lili' 'sentry') apl=('astronaut' 'babymega' 'babytiger' 'blacktip' 'blue' 'bruce' 'coral' \ 'electro' 'epaulette' 'lava' 'nasher' 'nasher360' 'pyro' 'rabbid' 'reef' \ 'robo' 'robo360' 'sand' 'santa' 'snappy' 'whitetip') kbl_boxes=('bleemo' 'endeavour' 'excelsior' 'fizz' 'jax' 'kench' 'sion' 'teemo' 'wukong') kbl_rwl_20=('akali' 'bard' 'ekko' 'eve' 'nami' 'nautilus' \ 'pantheon' 'sona' 'soraka' 'syndra' 'vayne') kbl_rwl_18=('atlas' 'endeavour' 'karma' 'leona' 'nocturne' 'rammus' 'shyvana') kbl=($(printf "%s " "${kbl_boxes[@]}" "${kbl_rwl_20[@]}" "${kbl_rwl_18[@]}")) glk=('ampton' 'apel' 'apele' 'bloog' 'blooglet' 'blooguard' 'blorb' 'bluebird' 'bobba' \ 'bobba360' 'casta' 'dood' 'droid' 'dorp' 'fleex' 'foob' 'foob360' 'garg' \ 'garg360' 'garfour' 'glk' 'glk360' 'grabbiter' 'laser' 'laser14' 'lick' \ 'meep' 'mimrock' 'nospike' 'octopus' 'orbatrix' 'phaser' 'phaser360' \ 'phaser360s' 'sparky' 'sparky360' 'vorticon' 'vortininja') whl=('arcada' 'sarien') cml_boxes=('ambassador' 'dooly' 'duffy' 'faffy' 'genesis' 'kaisa' 'noibat' 'puff' 'wyvern') cml_books=('akemi' 'dragonair' 'drallion' 'dratini' 'hatch' 'helios' 'jinlon' 'kindred' 'kled' \ 'kohaku' 'nightfury') cml=($(printf "%s " "${cml_boxes[@]}" "${cml_books[@]}")) jsl=('beetley' 'blipper' 'bookem' 'boten' 'botenflex' 'bugzzy' 'cret' 'cret360' \ 'drawcia' 'drawlat' 'drawman' 'drawper' 'galith' 'galith360' 'gallop' 'galnat' 'galnat360' \ 'galtic' 'galtic360' 'kracko' 'kracko360' 'landia' 'landrid' 'lantis' 'madoo' 'magister' \ 'maglet' 'maglia' 'maglith' 'magma' 'magneto' 'magolor' 'magpie' 'metaknight' 'pasara' \ 'pirette' 'pirika' 'sasuke' 'sasukette' 'storo' 'storo360') tgl=('chronicler' 'collis' 'copano' 'delbin' 'drobit' 'eldrid' 'elemi' 'lillipup' 'lindar' \ 'voema' 'volet' 'volta' 'voxel') adl=('anahera' 'brya' 'banshee' 'kano' 'crota' 'crota360' 'felwinter' 'gimble' 'marasov' 'mithrax' \ 'omnigul' 'osiris' 'primus' 'redrix' 'redrix4es' 'taeko' 'taniks' 'vell' 'volmar' 'zavala' \ 'constitution' 'gladios' 'kinox' 'kuldax' 'lisbon' 'moli') adl_n=('craask' 'craaskbowl' 'craaskvin' 'craasneto' 'joxer' 'joxero' 'nereid' 'nirwin' 'nivviks' \ 'pujjo' 'pujjoflex' 'pujjoteen' 'pujjoteen15w' 'xivu' 'xivu360' 'yaviks' 'yavikso') str=('aleena' 'barla' 'careena' 'grunt' 'kasumi' 'liara' 'treeya' 'treeya360') pco=('berknip' 'dirinboz' 'ezkinil' 'gumboz' 'jelboz360' 'morphius' 'vilboz' 'woomax') czn=('dewatt' 'guybrush' 'nipperkin') mdn=('crystaldrift' 'frostflow' 'markarth' 'skyrim' 'whiterun') purism=('librem13v1' 'librem13v2' 'librem13v4' 'librem15v2' 'librem15v3' 'librem15v4' \ 'librem_mini' 'librem_mini_v2' 'librem_14'); UEFI_ROMS=($(printf "%s " "${hsw_boxes[@]}" "${hsw_books[@]}" "${bdw_boxes[@]}" \ "${bdw_books[@]}" "${baytrail[@]}" "${snb_ivb[@]}" "${braswell[@]}" \ "${skylake[@]}" "${kbl[@]}" "${purism[@]}" "${str[@]}" "${cml[@]}" \ "${glk[@]}" "${apl[@]}" "${tgl[@]}" "${jsl[@]}" "${adl[@]}" "${adl_n[@]}" \ "${pco[@]}" "${czn[@]}" "${mdn[@]}" )) shellballs=($(printf "%s " \ "${skylake[@]}" 'atlas' 'eve' 'nautilus' 'nocturne' 'pantheon' 'sona' 'soraka' \ 'teemo' 'sion' 'vayne' 'careena' 'liara' 'akemi' 'kohaku' 'barla' 'babytiger' \ 'dratini' 'rabbid' 'blooglet' 'shyvana' 'leona')) eol_devices=($(printf "%s " "${hsw_boxes[@]}" "${hsw_books[@]}" "${bdw_boxes[@]}" \ "${bdw_books[@]}" "${baytrail[@]}" "${snb_ivb[@]}" "${braswell[@]}" "${skylake[@]}")) #menu text output NORMAL=$(echo "\033[m") MENU=$(echo "\033[36m") #Blue NUMBER=$(echo "\033[33m") #yellow FGRED=$(echo "\033[41m") RED_TEXT=$(echo "\033[31m") GRAY_TEXT=$(echo "\033[1;30m") GREEN_TEXT=$(echo "\033[1;32m") ENTER_LINE=$(echo "\033[33m") function echo_red() { echo -e "\E[0;31m$1" echo -e '\e[0m' } function echo_green() { echo -e "\E[0;32m$1" echo -e '\e[0m' } function echo_yellow() { echo -e "\E[1;33m$1" echo -e '\e[0m' } function exit_red() { echo_red "$@" read -rep "Press [Enter] to return to the main menu." } function die() { echo_red "$@" exit 1 } #################### # list USB devices # #################### function list_usb_devices() { stat -c %N /sys/block/sd* 2>/dev/null | grep usb | cut -f1 -d ' ' | sed "s/[']//g;s|/sys/block|/dev|" > /tmp/usb_block_devices eval usb_devs="($(cat /tmp/usb_block_devices))" [ "$usb_devs" != "" ] || return 1 echo -e "\nDevices available:\n" num_usb_devs=0 for dev in "${usb_devs[@]}" do ((num_usb_devs+=1)) vendor=$(udevadm info --query=all --name=${dev#"/dev/"} | grep -E "ID_VENDOR=" | awk -F"=" '{print $2}') model=$(udevadm info --query=all --name=${dev#"/dev/"} | grep -E "ID_MODEL=" | awk -F"=" '{print $2}') sz=$(fdisk -l 2> /dev/null | grep "Disk ${dev}" | awk '{print $3}') echo -n "$num_usb_devs)" if [ -n "${vendor}" ]; then echo -n " ${vendor}" fi if [ -n "${model}" ]; then echo -n " ${model}" fi echo -e " (${sz} GB)" done echo -e "" return 0 } ################ # Get cbfstool # ################ function get_cbfstool() { if [ ! -f ${cbfstoolcmd} ]; then working_dir=$(pwd) cd $(dirname ${cbfstoolcmd}) #echo_yellow "Downloading cbfstool utility" $CURL -sLO "${util_source}cbfstool.tar.gz" if [ $? -ne 0 ]; then echo_red "Error downloading cbfstool; cannot proceed." #restore working dir cd ${working_dir} return 1 fi tar -zxf cbfstool.tar.gz --no-same-owner if [ $? -ne 0 ]; then echo_red "Error extracting cbfstool; cannot proceed." #restore working dir cd ${working_dir} return 1 fi #set +x chmod +x cbfstool #restore working dir cd ${working_dir} fi return 0 } ################ # Get flashrom # ################ function get_flashrom() { if [ ! -f "${flashromcmd}" ]; then working_dir=$(pwd) cd $(dirname ${flashromcmd}) if [[ "$isChromeOS" = true ]]; then #needed to avoid dependencies not found on older ChromeOS $CURL -sLo "flashrom.tar.gz" "${util_source}flashrom_old.tar.gz" else $CURL -sLo "flashrom.tar.gz" "${util_source}flashrom_ups_libpci37_20240418.tar.gz" fi if [[ $? -ne 0 ]]; then echo_red "Error downloading flashrom; cannot proceed." #restore working dir cd "${working_dir}" return 1 fi if ! tar -zxf flashrom.tar.gz --no-same-owner; then echo_red "Error extracting flashrom; cannot proceed." #restore working dir cd "${working_dir}" return 1 fi #set +x chmod +x flashrom #restore working dir cd "${working_dir}" fi # append programmer type flashromcmd="${flashromcmd} ${flashrom_programmer}" return 0 } ################### # Get gbb_utility # ################### function get_gbb_utility() { if [ ! -f ${gbbutilitycmd} ]; then working_dir=$(pwd) cd $(dirname ${gbbutilitycmd}) $CURL -sLO "${util_source}gbb_utility.tar.gz" if [ $? -ne 0 ]; then echo_red "Error downloading gbb_utility; cannot proceed." #restore working dir cd ${working_dir} return 1 fi tar -zxf gbb_utility.tar.gz if [ $? -ne 0 ]; then echo_red "Error extracting gbb_utility; cannot proceed." #restore working dir cd ${working_dir} return 1 fi #set +x chmod +x gbb_utility #restore working dir cd ${working_dir} fi return 0 } ################################################## # Diagnostic report for troubleshooting purposes # ################################################## function diagnostic_report_save() { ( echo "mrchromebox firmware-util diagnostic report" date echo for key in ${!diagnostic_report_data[@]}; do echo "[$key]" echo "${diagnostic_report_data[$key]}" echo done ) > /tmp/mrchromebox_diag.txt } function diagnostic_report_set() { declare -gA diagnostic_report_data local key="$1" shift diagnostic_report_data[$key]="$*" } ################ # Prelim Setup # ################ function prelim_setup() { # Must run as root [ "$(whoami)" = "root" ] || die "You need to run this script as root; use 'sudo bash