#!/bin/bash # #misc globals usb_devs="" num_usb_devs=0 usb_device="" isChromeOS=true isChromiumOS=false isCloudready=false flashromcmd="" flashrom_params="-p host" cbfstoolcmd="" gbbutilitycmd="" preferUSB=false useHeadless=false addPXE=false pxeDefault=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 isZen2=false isJsl=false isTgl=false isUnsupported=false firmwareType="" isStock=true isFullRom=false isBootStub=false isUEFI=false hasRwLegacy=false unlockMenu=false hasUEFIoption=false hasLegacyOption=false hasShellball=false wpEnabled=false hasLAN=false hasCR50=false kbl_use_rwl18=false useAltfwStd=false runsWindows=false 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') snb_ivb=('butterfly' 'link' 'lumpy' 'parrot' 'stout' 'stumpy') 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' 'fizz' 'jax' 'kench' 'sion' 'teemo' 'wukong') kbl_rwl_20=('akali' 'bard' 'ekko' 'eve' 'nami' 'nautilus' \ 'pantheon' 'sona' 'soraka' 'syndra' 'vayne') kbl_rwl_18=('atlas' 'karma' 'leona' 'nocturne' 'rammus' 'shyvana') kbl=($(printf "%s " "${kbl_boxes[@]}" "${kbl_rwl_20[@]}" "${kbl_rwl_18[@]}")) purism=('librem13v1' 'librem13v2' 'librem13v4' 'librem15v2' 'librem15v3' 'librem15v4' \ 'librem_mini' 'librem_mini_v2' 'librem_14'); glk=('ampton' 'apel' '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') str=('aleena' 'barla' 'careena' 'grunt' 'kasumi' 'liara' 'treeya' 'treeya360') whl=('arcada' 'sarien') cml_boxes=('dooly' 'duffy' 'faffy' 'kaisa' 'noibat' 'puff' 'wyvern') cml_books=('akemi' 'dragonair' 'drallion' 'dratini' 'hatch' 'helios' 'jinlon' 'kindred' 'kled' 'kohaku' 'nightfury') cml=($(printf "%s " "${cml_boxes[@]}" "${cml_books[@]}")) zen2=('berknip' 'dirinboz' 'ezkinil' 'morphius' 'woomax') jsl=('blipper' 'boten' 'botenflex' 'drawcia' 'drawlat' 'drawman' 'galith' 'gallop' 'galtic' 'kracko' \ 'kracko360' 'lantis' 'madoo' 'magolor' 'magpie' 'magolor' 'sasuke' 'storo' 'storo360') tgl=('copano' 'delbin' 'drobit' 'eldrid' 'elemi' 'lillipup' 'lindar' 'volet' 'volta' 'voxel') UEFI_ROMS=($(printf "%s " "${hsw_boxes[@]}" "${hsw_books[@]}" "${bdw_boxes[@]}" \ "${bdw_books[@]}" "${baytrail[@]}" "${snb_ivb[@]}" "${braswell[@]}" \ "${skylake[@]}" "${kbl[@]}" "${purism[@]}" "${str[@]}" "${cml[@]}" \ "${glk[@]}" "${apl[@]}")) shellballs=($(printf "%s " "${hsw_boxes[@]}" "${hsw_books[@]}" "${bdw_boxes[@]}" \ "${bdw_books[@]}" "${baytrail[@]}" "${snb_ivb[@]}" "${braswell[@]}" \ "${skylake[@]}" 'atlas' 'eve' 'nautilus' 'nocturne' 'pantheon' 'sona' 'soraka' \ 'teemo' 'sion' 'vayne' 'careena' 'liara' 'akemi' 'kohaku' 'barla' 'babytiger' \ 'dratini' 'rabbid' 'blooglet')) runs_windows=($(printf "%s " "${snb_ivb[@]}" "${hsw_boxes[@]}" "${hsw_books[@]}" \ "${bdw_boxes[@]}" "${bdw_books[@]}" "${baytrail[@]}" "${braswell[@]}" 'eve' \ "${purism[@]}" "${kbl_boxes[@]}" "${cml_boxes[@]}")) #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 -ep "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) if [[ "$isChromeOS" = false && "$isChromiumOS" = false ]]; then cd /tmp else #have to use partition 12 (27 for cloudready) on rootdev due to noexec restrictions rootdev=$(rootdev -d -s) [[ "${rootdev}" =~ "mmcblk" || "${rootdev}" =~ "nvme" ]] && part_pfx="p" || part_pfx="" [[ "$isCloudready" = "true" && -b ${rootdev}${part_pfx}27 ]] \ && part_num="${part_pfx}27" || part_num="${part_pfx}12" boot_mounted=$(mount | grep "${rootdev}""${part_num}") if [ "${boot_mounted}" = "" ]; then #mount boot mkdir /tmp/boot >/dev/null 2>&1 mount "$(rootdev -d -s)""${part_num}" /tmp/boot if [ $? -ne 0 ]; then echo_red "Error mounting boot partition; cannot proceed." return 1 fi fi # clear recovery logs which use valuable space rm -rf /tmp/boot/recovery* 2>/dev/null #create util dir mkdir /tmp/boot/util 2>/dev/null cd /tmp/boot/util fi #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` if [[ "$isChromeOS" = false && "$isChromiumOS" = false ]]; then cd /tmp else #have to use partition 12 (27 for cloudready) on rootdev due to noexec restrictions rootdev=$(rootdev -d -s) [[ "${rootdev}" =~ "mmcblk" || "${rootdev}" =~ "nvme" ]] && part_pfx="p" || part_pfx="" [[ "$isCloudready" = "true" && -b ${rootdev}${part_pfx}27 ]] \ && part_num="${part_pfx}27" || part_num="${part_pfx}12" boot_mounted=$(mount | grep "${rootdev}""${part_num}") if [ "${boot_mounted}" = "" ]; then #mount boot mkdir /tmp/boot >/dev/null 2>&1 mount "$(rootdev -d -s)""${part_num}" /tmp/boot if [ $? -ne 0 ]; then echo_red "Error mounting boot partition; cannot proceed." return 1 fi fi # clear recovery logs which use valuable space rm -rf /tmp/boot/recovery* 2>/dev/null #create util dir mkdir /tmp/boot/util 2>/dev/null cd /tmp/boot/util fi 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 "${util_source}flashrom.tar.gz" fi if [ $? -ne 0 ]; then echo_red "Error downloading flashrom; cannot proceed." #restore working dir cd ${working_dir} return 1 fi tar -zxf flashrom.tar.gz --no-same-owner if [ $? -ne 0 ]; then echo_red "Error extracting flashrom; cannot proceed." #restore working dir cd ${working_dir} return 1 fi #set +x chmod +x flashrom #add params flashromcmd="${flashromcmd} ${flashrom_params}" #restore working dir cd ${working_dir} fi return 0 } ################### # Get gbb_utility # ################### function get_gbb_utility() { if [ ! -f ${gbbutilitycmd} ]; then working_dir=`pwd` cd /tmp $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 } ################ # Prelim Setup # ################ function prelim_setup() { # Must run as root [ "$(whoami)" = "root" ] || die "You need to run this script as root; use 'sudo bash