#!/bin/bash # set default variables export worklitmp="/tmp/workli" # uselocal="1" # uncomment for using local files instead of auto download (use alongside $cache after first run to use cached files from previous runs) # cache="1" # uncomment to not delete the tmp folder at the end (recommended to be used alongside $uselocal) export spload="$worklitmp/rk3588_spl_loader_v1.08.111.bin" # https://dl.radxa.com/rock5/sw/images/loader/rock-5b/rk3588_spl_loader_v1.08.111.bin export efi="$worklitmp/RK3588_NOR_FLASH_REL.img" # https://github.com/edk2-porting/edk2-rk35xx/releases export uefntf="$worklitmp/bootaa64.efi" # https://github.com/pbatard/uefi-ntfs/releases export uefntfd="$worklitmp/ntfs_aa64.efi" # https://github.com/pbatard/ntfs-3g/releases export pei="$worklitmp/worklipe.cmd" # https://github.com/buddyjojo/workli/tree/master/files export bexec="$worklitmp/batchexec.exe" # ^ export bcd="$worklitmp/BCD" # ^ export filepefiles="$worklitmp/pe-files.zip" # used for auto download only if [[ $DEBUG == *"1"* ]]; then set -x fi if ! command -v zenity &> /dev/null then echo "'zenity' package not installed. Install it (For Debian and Ubuntu, run 'sudo apt install zenity'; for Arch, run 'sudo pacman -S zenity')" fi if [ "$EUID" -ne 0 ] then zenity --title "workli" --info --ok-label="Exit" --text "This script needs to be run as root. If you're a noob, that's 'sudo ./workli.sh' or 'sudo bash workli.sh'" exit 1 fi debug() { echo -e "\e[1;36m[DEBUG]\e[0m $1" >&2 } error() { zenity --error --title "workli" --text "An error has occurred.\n\nError: $1" echo -e "\e[1;31m[ERROR]\e[0m $1" >&2 exit 1 } if ! command -v wimupdate &> /dev/null then wimtool=" - 'wimtools/wimlib' package not installed.\n\n" wimtoold="wimtools " wimtoola="wimlib " export reqdep=1 fi if ! command -v parted &> /dev/null then parted=" - 'parted' package not installed.\n\n" partedp="parted " export reqdep=1 fi if ! command -v mkfs.ntfs &> /dev/null then exfat=" - 'mkfs.ntfs' command not found.\n\n" ntfsp="ntfs-3g " export reqdep=1 fi if ! command -v gawk &> /dev/null then gawk=" - 'gawk' package not installed.\n\n" gawkp="gawk " export reqdep=1 fi if ! command -v xmlstarlet &> /dev/null then xmlstarle=" - 'xmlstarlet' package not installed.\n\n" xmlstarletp="xmlstarlet " export reqdep=1 fi if [[ $reqdep == *"1"* ]]; then zenity --title "workli" --info --ok-label="Exit" --text "Mandatory dependencies:\n\n$wimtool$parted$exfat$gawk$xmlstarle\nInstall them:\n\nFor Debian and Ubuntu, run: \"sudo apt install $wimtoold$partedp$ntfsp$gawkp$xmlstarletp\"\n\nFor Arch, run: \"sudo pacman -S $wimtoola$partedp$ntfsp$gawkp$xmlstarletp\"" exit 1 else debug "All mandatory dependencies are met!" fi if ! command -v wget &> /dev/null then wgeta=" - 'wget' package not installed (used for boot files and UEFI files downloading).\n\n" wgetp="wget " export optdep=1 fi if ! command -v aria2c &> /dev/null then aria=" - 'aria2c' package not installed (used for ESD downloading).\n\n" ariap="aria2 " export optdep=1 fi if ! command -v curl &> /dev/null then curle=" - 'curl' package not installed (used for ESD downloading).\n\n" curlp="curl " export optdep=1 fi if ! command -v jq &> /dev/null then jqe=" - 'jq' package not installed (used for UEFI image downloading).\n\n" jqp="jq " export optdep=1 fi if ! command -v rkdeveloptool &> /dev/null then rkdevtoola=" - 'rkdeveloptool' package not installed (used for UEFI spi flashing). Install it (some distros may not have it yet, in that case you'd need to compile it\n\n" export optdep=1 fi if [[ $optdep == *"1"* ]]; then zenity --title "workli" --info --ok-label="Continue" --text "Optional dependencies:\n\n$wgeta$aria$curle$jqe$rkdevtoola\nInstall them:\n\nFor Debian and Ubuntu, run: \"sudo apt install $wgetp$ariap$curlp$jqp\"\n\nFor Arch, run: \"sudo pacman -S $wgetp$ariap$curlp$jqp\"" else debug "All optional dependencies are met!" fi zenity --title "workli" --info --ok-label="Next" --text "WoRKli, made by JoJo Autoboy#1931\n\nNot really based off of Mario's WoR Linux guide" mkdir -p "$worklitmp/" chmod 777 "$worklitmp/" if [[ $uselocal == *"1"* ]]; then debug "uselocal set to 1, skipping auto download..." else if ! command -v wget &> /dev/null then zenity --title "workli" --info --ok-label="Exit" --text "'wget' package not installed. Install it\n\nFor Debian and Ubuntu, run 'sudo apt install $wgetp'\n\nFor Arch, run 'sudo pacman -S $wgetp'\n\nFor macOS, run 'brew install $wgetp'" exit 1 fi wget -O "$uefntf" "https://github.com/pbatard/uefi-ntfs/releases/latest/download/bootaa64.efi" || error "Failed to download bootaa64.efi from pbatard/uefi-ntfs" wget -O "$uefntfd" "https://github.com/pbatard/ntfs-3g/releases/latest/download/ntfs_aa64.efi" || error "Failed to download ntfs_aa64.efi from pbatard/ntfs-3g" wget -O "$filepefiles" "https://github.com/buddyjojo/workli/releases/latest/download/y-pe-files.zip" || error "Failed to download y-pe-files.zip from buddyjojo/workli" unzip -o "$filepefiles" -d "$worklitmp/" export auto="1" fi if [[ -f $uefntf ]]; then debug "'bootaa64.efi' found" else error "'bootaa64.efi' does not exist." exit 1 fi if [[ -f $uefntfd ]]; then debug "'ntfs_aa64.efi' found" else error "'ntfs_aa64.efi' does not exist." exit 1 fi if [[ -f $pei ]]; then debug "'worklipe.cmd' found" else error "'worklipe.cmd' does not exist." exit 1 fi if [[ -f $bexec ]]; then debug "'batchexec.exe' found" else error "'batchexec.exe' does not exist." exit 1 fi if [[ -f $bcd ]]; then debug "'batchexec.exe' found" else error "'batchexec.exe' does not exist." exit 1 fi zenity --question --title="workli" --text "Do you want to flash the UEFI bootloader? (mandatory for first time run)" case $? in [0]) if [[ $uselocal == *"1"* ]]; then debug "uselocal set to 1, skipping auto download..." else if ! command -v wget &> /dev/null then zenity --title "workli" --info --ok-label="Exit" --text "'wget' package not installed. Install it\n\nFor Debian and Ubuntu, run 'sudo apt install $wgetp'\n\nFor Arch, run 'sudo pacman -S $wgetp'\n\nFor macOS, run 'brew install $wgetp'" exit 1 fi gitjson=$(curl -L https://api.github.com/repos/edk2-porting/edk2-rk35xx/releases/latest) efiFILE=$(echo $gitjson | jq -r '.assets[] | .name' | gawk '{ printf "FALSE""\0"$0"\0" }' | xargs -0 zenity --list --title="workli" --text="What device do you have?\n\nNote: device support may vary and may not work\n\nOfficaly supported boards: Orange pi 5, Rock 5a" --radiolist --multiple --column ' ' --column 'Devices' --height=450) efiURL=$(echo $gitjson | jq --arg efifile "$efiFILE" -r '.assets[] | select( .name | match($efifile)) | .browser_download_url ') wget -O "$efi" "$efiURL" || error "Failed to download RK3588_NOR_FLASH_REL.img" export auto="1" fi if [[ -f $efi ]]; then debug "UEFI img found" else error "UEFI img does not exist." fi zenity --question --title="workli" --text "Do you want to install the UEFI to SPI/EMMC or SD card plugged into host?" --ok-label="SPI" --cancel-label="SD" case $? in [0]) export UEFI="SPI" zenity --title "workli" --info --ok-label="Next" --text "Put the board into Maskrom mode and plug it into the host, depends on device but the Rock 5 and Orange Pi 5 follow about the same method\n\nDO THIS BEFORE CONTINUING" if ! command -v rkdeveloptool &> /dev/null then zenity --title "workli" --info --ok-label="Exit" --text "'rkdeveloptool' not installed. Install it (some ditros may not have it yet, in that case you'd need to compile it" exit 1 fi if [[ $uselocal == *"1"* ]]; then debug "uselocal set to 1, skipping auto download..." else if ! command -v wget &> /dev/null then zenity --title "workli" --info --ok-label="Exit" --text "'wget' package not installed. Install it\n\nFor Debian and Ubuntu, run 'sudo apt install $wgetp'\n\nFor Arch, run 'sudo pacman -S $wgetp'\n\nFor macOS, run 'brew install $wgetp'" exit 1 fi wget -O "$spload" "https://dl.radxa.com/rock5/sw/images/loader/rock-5b/rk3588_spl_loader_v1.08.111.bin" || error "Failed to download rk3588_spl_loader_v1.08.111.bin" fi if [[ -f $efi ]]; then debug "'rk3588_spl_loader_v1.08.111.bin' found" else error "'rk3588_spl_loader_v1.08.111.bin' does not exist." fi if rkdeveloptool ld | grep -q 'Maskrom' then ( rkdeveloptool db $spload >&2 || error "Unable to load the loader" rkdeveloptool wl 0 $efi >&2 || error "unable to flash to SPI" rkdeveloptool rd >&2 zenity --title "workli" --info --ok-label="Continue" --text "The SPI flash suceeded!, device has been reset and should have booted into the UEFI" ) | zenity --progress \ --title="workli" \ --text="Flashing SPI...." \ --pulsate \ --auto-close (( $? != 0 )) && exit 1 else zenity --title "workli" --info --ok-label="Exit" --text "Board not plugged in/not in Maskrom mode" exit 1 fi ;; [1]) zenity --question --title="workli" --text "Are you installing Windows to the same SD card or just using it for the bootloader?" --ok-label="Only bootloader" --cancel-label="Same SD" case $? in [0]) disko () { export fdisk=$(parted -l | grep "Disk /dev*" | grep -v loop | sort | gawk '{ printf "FALSE""\0"$0"\0" }' | xargs -0 zenity --list --title="workli" --text="Where in /dev/ is your SD card?" --radiolist --multiple --column ' ' --column 'Disks' --extra-button "Rescan") (( $? != 0 )) && exit 1 sdisk=${fdisk#Disk /dev/*} disk="${sdisk%%:*}" } disko while [[ $fdisk == *"Rescan"* ]]; do disko done zenity --question --title="workli" --text "You have selected '$disk', is this correct?" case $? in [0]) debug "ok '$disk' it is then" ;; [1]) exit 1 ;; *) exit 1 ;; esac if [[ $disk == *"/dev"* ]]; then error "how.... ('/dev' is in disk name)" else debug "Disk name format correct" fi if [[ -b "/dev/$disk" ]]; then debug "'$disk' found" else error "'$disk' does not exist." fi zenity --question --title="workli" --text 'WARNING: THE SD '$disk' WILL BE WIPED! (have 8MB dded to it)\n\nDo you want to continue?' --ok-label="No" --cancel-label="Yes" case $? in [1]) debug "No going back now" ;; [0]) exit 1 ;; *) error "Invalid input" ;; esac umount /dev/$disk* dd if="$efi" of=/dev/$disk conv=fsync || error "Failed to dd UEFI" ;; [1]) export UEFI="SD" zenity --title "workli" --info --ok-label="Continue" --text "UEFI will be flashed to the sd card during partitioning" ;; *) exit 1 ;; esac ;; *) error "Invalid input" exit 1 ;; esac ;; [1]) debug "UEFI not flashed" ;; *) exit 1 ;; esac dwnopt=$(zenity --question --title="workli" --text "Do you want to:\n\n(1) Let this script download an ESD directly from Microsoft (Recommended, release versions only, gives more type options)\n(2) Generate ISO with UUP Dump (Slower, for insider builds)\n(3) Use your own ISO/ESD or a previously generated/downloaded one" --switch --extra-button "1" --extra-button "2" --extra-button "3") case $dwnopt in 1) if ! command -v aria2c &> /dev/null then aria=" - 'aria2c' package not installed. Install it (For Debian and Ubuntu, run 'sudo apt install aria2'; for Arch, run 'sudo pacman -S aria2')\n\n" export reqdep=1 fi if ! command -v curl &> /dev/null then curle=" - 'curl' package not installed. Install it (For Debian and Ubuntu, run 'sudo apt install curl'; for Arch, run 'sudo pacman -S curl')\n\n" export reqdep=1 fi if [[ $reqdep == *"1"* ]]; then zenity --title "workli" --info --ok-label="Exit" --text "Dependencies:\n\n$aria$curle" exit 1 else debug "All dependencies are met!" fi getversionsxml=$(curl -s -G 'https://worproject.com/dldserv/esd/getversions.php') winversion=$(echo $getversionsxml | xmlstarlet sel -t -v /productsDb/versions/version/@number | zenity --list --title="workli" --text="What Windows version do you want?" --column 'Windows version') if [[ -z "${winversion// }" ]]; then debug "none selected, using latest" winversion=$(echo $getversionsxml | xmlstarlet sel -t -v /productsDb/versions/*[1]/@number - ) fi debug "Windows version is $winversion" winbuild=$(echo $getversionsxml | xmlstarlet sel -t -m /productsDb/versions/version[@number=$winversion]/releases/release -o " " -v ./@build -o " " - ) winbuild=$(zenity --list --title="workli" --text="What Windows build would you like?\n\nNote: defaults to latest if none are selected" --column 'Windows build' $winbuild --height=300) if [[ -z "$winbuild" ]]; then debug "none selected, using latest" winbuild=$(echo $getversionsxml | xmlstarlet sel -t -v /productsDb/versions/version[@number=$winversion]/releases/*[1]/@build - ) fi debug "Windows build is $winbuild" getcatalogxml=$(curl -s -G 'https://worproject.com/dldserv/esd/getcatalog.php' -d arch=ARM64 -d ver=$winversion -d build=$winbuild) winedition=$(echo $getcatalogxml | xmlstarlet sel -t -m "/MCT/Catalogs/Catalog/PublishedMedia/Files/File[not(./Edition_Loc=preceding-sibling::File/Edition_Loc)]" -o " " -v "Edition_Loc" -o " " - | sed s/%//g) winedition="${winedition:1}" winedition=$(zenity --list --title="workli" --text="What Windows edition would you like?\n\nNote: Client is your 'normal' Windows versions (home and pro)\n\nEnterprise is self descriptive" --column 'Windows edition' $winedition --height=300) if [[ -z "$winedition" ]]; then debug "none selected, using first edition that should be Client" winedition=$(echo $getcatalogxml | xmlstarlet sel -t -v /MCT/Catalogs/Catalog/PublishedMedia/Files/File[1]/Edition_Loc -| sed s/%//g ) fi debug "Windows edition is $winedition" winlanguage=$(echo $getcatalogxml | xmlstarlet sel -t -v /MCT/Catalogs/Catalog/PublishedMedia/Files/File/Language | zenity --list --title="workli" --text="What Windows language would you like?" --column 'Windows Language' --width=300 --height=300) if [[ -z "${winlanguage// }" ]]; then debug "none selected, using english" winlangcode="en-us" winlanguage="default" else winlangcode=$(echo $getcatalogxml | xmlstarlet sel -t -m "/MCT/Catalogs/Catalog/PublishedMedia/Files/File[Language='$winlanguage' and Edition_Loc='%$winedition%']" -v LanguageCode - ) fi debug "Windows language is $winlanguage, lang code is $winlangcode" esdurl=$(echo $getcatalogxml | xmlstarlet sel -t -m "/MCT/Catalogs/Catalog/PublishedMedia/Files/File[LanguageCode='$winlangcode' and Edition_Loc='%$winedition%']" -v FilePath - ) debug "ESD link is $esdurl" tmpuupvar=$(zenity --question --title="workli" --text "Do you want the ESD to be deleted when the script finishes?\n\nNote: The ESD will be put in the current directory ($PWD)\n\nNote: The /tmp option is not recommended as /tmp can be too small to fit the ESD (~3.6GB)\n\nNote: The /tmp option will delete the ESD when the script finishes" --extra-button "Download ESD in /tmp") case $? in [0]) export esdpth="$(pwd)" export delesd=1 ;; [1]) export esdpth="$(pwd)" ;; *) exit 1 ;; esac if [[ $tmpuupvar == "Download ESD in /tmp" ]]; then export esdpth="$worklitmp/tmpesd" mkdir "$esdpth" export tmpesd=1 fi if [[ -f $esdpth/win.esd ]] ; then zenity --question --title="workli" --text "Previously generated win.esd found in $esdpth/win.esd, would you like to delete it?" case $? in [0]) rm "$esdpth/win.esd" ;; [1]) error "Please remove or rename file $esdpth/win.esd (or use it with option 2)" ;; *) exit 1 ;; esac fi zenity --title "workli" --info --ok-label="Continue" --text "The aria2c download will now be ran\nIts output will be in the terminal where this script was run" esddwn() { aria2c -d $esdpth -o "win.esd" $esdurl >&2 } ( esddwn if [[ $? -ne 0 ]]; then echo "# Download failed, trying again... Current amount of attempts: $counter" sleep 5 esddwn while [ $? -ne 0 ]; do counter=$(( counter + 1 )) echo "# Download failed, trying again... Current amount of attempts: $counter" sleep 5 esddwn done else zenity --title "workli" --info --ok-label="Continue" --text "The ESD download suceeded!" fi ) | zenity --progress \ --title="workli" \ --text="Downloading ESD...." \ --pulsate \ --auto-close (( $? != 0 )) && exit 1 export iso="$esdpth/win.esd" export esd=1 ;; 2) if ! command -v curl &> /dev/null then curle=" - 'curl' command not found.\n\n" curlep="curl " export reqdep=1 fi if ! command -v jq &> /dev/null then jq=" - 'jq' command not found.\n\n" jqp="jq " export reqdep=1 fi if ! command -v aria2c &> /dev/null then aria2c=" - 'aria2c' command not found.\n\n" aria2p="aria2 " export reqdep=1 fi if ! command -v cabextract &> /dev/null then cabextract=" - 'cabextract' command not found.\n\n" cabextractp="cabextract " export reqdep=1 fi if ! command -v chntpw &> /dev/null then chntpw=" - 'chntpw' command not found.\n\n" chntpwp="chntpw " export reqdep=1 fi if ! command -v mkisofs &> /dev/null && ! command -v genisoimage &> /dev/null then mkisofs=" - 'genisoimage or mkisofs' command not found.\n\n" mkisofsdeb="genisoimage " export reqdep=1 fi if [[ $reqdep == *"1"* ]]; then zenity --title "workli" --info --ok-label="Exit" --text "Dependencies:\n\n$curle$jq$aria2c$cabextract$chntpw$mkisofs\nInstall them:\n\nFor Debaian and Ubuntu, run 'sudo apt install $curlep$jqp$aria2p$cabextractp$chntpwp$mkisofsdeb'\n\nFor Arch, run 'sudo pacman -S $curlep$jqp$aria2p$cabextractp$chntpwp$mkisofsarmc'" exit 1 else debug "All dependencies are met!" fi zenity --question --title="workli" --text "Do you want to use the latest retail/dev builds or enter your own uupdump.net build id? Press 'No' to use id" case $? in [1]) updateid=$(zenity --title "workli" --entry --text "What's the uupdump.net uuid?\nE.g. Once you select the build you want the id will be in the url like:\n\nhttps://uupdump.net/selectlang.php?id= '6b1e576c-9854-44b4-9cdd-108d13cf0035'") foundBuild=$(curl -sk "https://uupdump.net/json-api/listlangs.php?id=$updateid" | jq -r '.response.updateInfo.title') if [[ $? -ne 0 ]]; then error "Got rate limited or id is incrorrect, please try again" else debug "Not null thats good" fi ;; [0]) release=$(zenity --list --title="workli" --text="What windows release type do you want?\n\nNote: Defaults to Public Release\n\nNOTE: Dev builds will not boot on pi 4 and below" --column 'Release type' "Latest Public Release build" "Latest Dev Channel build" --height=300) if [[ $release == "Latest Dev Channel build" ]]; then export ring="wif&build=latest" else export ring="retail&build=19041.1" fi apiget=$(curl "https://uupdump.net/json-api/fetchupd.php?arch=arm64&ring=$ring" | jq -r '.response.updateArray[] | select( .updateTitle | contains("Windows")) | {Id: .updateId, Name: .updateTitle} ') if [[ $? -ne 0 ]]; then error "Probably got rate limited, please try again" else debug "Not null thats good" fi updateid=$(echo $apiget | jq -r .Id) foundBuild=$(echo $apiget | jq -r .Name) ;; *) exit 1 ;; esac debug $foundBuild zenity --question --title="workli" --text "You are about to download:\n\n'$foundBuild'\n\nIs this ok?" case $? in [0]) debug "ok '$foundBuild' it is then" ;; [1]) exit 1 ;; *) exit 1 ;; esac langjson=$(curl -sk "https://uupdump.net/json-api/listlangs.php?id=$updateid" | jq -r '.response.langFancyNames') if [[ $? -ne 0 ]]; then error "Probably got rate limited, please try again" else debug "Not null thats good" fi var=$(echo "$langjson" | cut -d\" -f4 | tr -d '{}' | tr '\n' '|'); var="${var#?}"; var="${var%?}"; var="${var%?}" langa=$(zenity --forms --title "workli" --text "language" --add-combo "Choose your language." --combo-values "$var") if [[ -z "$langa" ]] then error "No language was selected" fi language=$(echo "$langjson" | grep "$langa" | cut -d\" -f2) debug "Language is $language" tmpuupvar=$(zenity --question --title="workli" --text "Do you want the ISO to be deleted when the script finishes?\n\nNote: The UUP files and ISO will be put in the current directory ($PWD/uup)\n\nNote: The /tmp option is not recommended as /tmp can be too small to fit the files needed (4gb+)\n\nNote: The /tmp option will delete the ISO when the script finishes" --extra-button "Generate ISO in /tmp") case $? in [0]) uuproot="$(pwd)" export deluup=1 ;; [1]) uuproot="$(pwd)" ;; *) exit 1 ;; esac if [[ $tmpuupvar == "Generate ISO in /tmp" ]]; then uuproot="$worklitmp/tmpuup" mkdir "$uuproot" export tmpuup=1 fi wget -O "$worklitmp/UUP.zip" "https://uupdump.net/get.php?id=$updateid&pack=en-us&edition=professional&autodl=2" || error "Failed to download UUP.zip" export uupzip=1 unzip "$worklitmp/UUP.zip" -d "$uuproot/uup" zenity --question --title="workli" --text "UUP Dump is known to be unstable sometimes and may require multiple tries to sucessfully download all reqired files.\n\nTo combat this, do you want to enable auto retry? It will indefinitely rerun the UUP script until it succeeds.\n\nYou can stop this any time by pressing the cancel button on the 'progress' window or by ctrl+c'ing the terminal this script is running from" case $? in [0]) export autoretry=1 export counter=1 ;; [1]) export autoretry=0 ;; *) exit 1 ;; esac zenity --title "workli" --info --ok-label="Continue" --text "The UUP Dump script will now be executed\nIts output will be in the terminal where this script was run" cd $uuproot/uup chmod +x uup_download_linux.sh isogen() { ./uup_download_linux.sh >&2 } ( isogen if [[ $? -ne 0 ]]; then if [[ $autoretry == *"1"* ]]; then echo "# Auto-retry enabled, current amount of attempts: $counter" sleep 5 isogen while [ $? -ne 0 ]; do counter=$(( counter + 1 )) echo "# Auto-retry enabled, current amount of attempts: $counter" sleep 5 isogen done else error "Auto-retry disabled, quitting scritpt" fi else zenity --title "workli" --info --ok-label="Continue" --text "The UUP Dump script suceeded!" fi ) | zenity --progress \ --title="workli" \ --text="Generating ISO...." \ --pulsate \ --auto-close (( $? != 0 )) && exit 1 cd ../ if [[ -f "$uuproot/uup/"*ARM64*.ISO ]]; then debug "ISO found" iso=$(find $uuproot/uup/ -name "*ARM64*.ISO") export fulliso=1 else error "ISO not found" fi ;; 3) zenity --title "workli" --info --ok-label="Next" --text "Prerequisites\n\n- Get the windows ESD/ISO: https://worproject.com/guides/getting-windows-images\n\n- Rename the ESD/ISO file to 'win.iso' or 'win.esd'\n\n- If you want use use a modified install.wim, rename it to 'install.wim'\n\nDO THE PREREQUISITES BEFORE CONTINUING" if [[ -f $(pwd)/win.esd ]] || [[ -f "$worklitmp/tmpesd/win.esd" ]] ; then zenity --question --title="workli" --text "Previously downloaded ESD found, would you like to use that or use another one?" case $? in [0]) if [[ -f "$worklitmp/tmpesd/win.esd" ]]; then iso="$worklitmp/tmpesd/win.esd" export esd=1 else iso="$(pwd)/win.esd" export esd=1 fi ;; [1]) iso=$(zenity --title "workli" --entry --text "What's the path to the 'win.esd' or 'install.wim' or 'win.iso'?\n\nE.g. '~/win.iso'") ;; *) exit 1 ;; esac else iso=$(zenity --title "workli" --entry --text "What's the path to the 'win.esd' or 'install.wim' or 'win.iso'?\n\nE.g. '~/win.iso'") fi ;; *) error "Invalid input" exit 1 ;; esac if [[ -f "$iso" ]]; then debug "'win.iso/install.wim/win.esd' found" else error "'win.iso/install.wim/win.esd' does not exist. The iso variable was set to '$iso'" fi if [[ $iso =~ \.[Ww][Ii][Mm]$ ]]; then export fulliso=0 export esd=0 debug "WIM detected = $fulliso, $iso" typexml=$(wiminfo --xml $iso | xmlstarlet fo) elif [[ $iso =~ \.[Ee][Ss][Dd]$ ]]; then export esd=1 export fulliso=0 debug "ESD detected = $esd, $iso" typexml=$(wiminfo --xml $iso | xmlstarlet fo) else export fulliso=1 export esd=0 debug "Full ISO detected = $fulliso, $iso" debug "Mounting ISO for type selection" mkdir -p "$worklitmp/isomount" chmod 777 "$worklitmp/isomount" mount "$iso" "$worklitmp/isomount" installwim=$(find "$worklitmp/isomount/sources/" -type f -name "install.wim" -o -name "install.esd") typexml=$(wiminfo --xml "$installwim" | xmlstarlet fo) umount "$worklitmp/isomount" rm -rf "$worklitmp/isomount" fi windtype=$(echo "$typexml" | xmlstarlet sel -t -v /WIM/IMAGE/NAME | gawk '{ printf "FALSE""\0"$0"\0" }' | sed 's/\(.*\)FALSE/\1TRUE/' |zenity --list --title="workli" --text="What windows type do you want?\n\nNote: some windows types may not be bootable" --radiolist --multiple --column ' ' --column 'Windows type' --width=300 --height=300) wintype=$(echo "$typexml" | xmlstarlet sel -t -v "/WIM/IMAGE[NAME='$windtype']/@INDEX") debug "wintype(index) is $wintype" disko () { export fdisk=$(parted -l | grep "Disk /dev*" | grep -v loop | sort | gawk '{ printf "FALSE""\0"$0"\0" }' | xargs -0 zenity --list --title="workli" --text="Where in /dev/ is your drive?" --radiolist --multiple --column ' ' --column 'Disks' --extra-button "Rescan") (( $? != 0 )) && exit 1 sdisk=${fdisk#Disk /dev/*} disk="${sdisk%%:*}" } disko while [[ $fdisk == *"Rescan"* ]]; do disko done zenity --question --title="workli" --text "You have selected '$disk', is this correct?" case $? in [0]) debug "ok '$disk' it is then" ;; [1]) exit 1 ;; *) exit 1 ;; esac if [[ $disk == *"mmcblk"* ]]; then export nisk="${disk}p" else export nisk="$disk" fi if [[ $disk == *"disk"* ]]; then export nisk="${disk}s" else export nisk="$disk" fi if [[ $disk == *"/dev"* ]]; then error "how.... ('/dev' is in disk name)" else debug "Disk name format correct" fi if [[ -b "/dev/$disk" ]]; then debug "'$disk' found" else error "'$disk' does not exist." fi zenity --question --title="workli" --text 'WARNING: THE DISK '$disk' WILL BE WIPED!\n\nDo you want to continue?' --ok-label="No" --cancel-label="Yes" case $? in [1]) debug "No going back now" ;; [0]) exit 1 ;; *) error "Invalid input" ;; esac ( echo "# Creating partitions..." echo "10" debug "Creating partitions..." umount /dev/$disk* parted -s /dev/$disk mklabel gpt if [[ $UEFI == *"SD"* ]]; then debug "installing fully to sd" dd if="$efi" of=/dev/$disk bs=512 skip=64 seek=64 conv=notrunc || error "Failed to dd UEFI" parted -s /dev/$disk mkpart primary 8MB 128MB else parted -s /dev/$disk mkpart primary 1MB 128MB fi parted -s /dev/$disk set 1 esp on parted -s /dev/$disk set 1 boot on echo "20" parted -s -- /dev/$disk mkpart primary 145MB -0 parted -s /dev/$disk set 2 msftdata on sync mkfs.fat -F 32 /dev/$nisk'1' || error "Failed to format disk" sync mkfs.ntfs -f /dev/$nisk'2' || error "Failed to format disk" sync echo "30" echo "# Copying Windows files to the drive...\n\nThis will take a while.\n\nProgress shown in terminal..." debug "Copying Windows files to the drive." if [[ $fulliso == *"1"* ]]; then mkdir -p "$worklitmp/isomount" chmod 777 "$worklitmp/isomount" mount "$iso" "$worklitmp/isomount" installwim=$(find "$worklitmp/isomount/sources/" -type f -name "install.wim" -o -name "install.esd") wimapply --check "$installwim" $wintype /dev/$nisk'2' >&2 umount "$worklitmp/isomount" rm -rf "$worklitmp/isomount" else wimapply --check "$iso" $wintype /dev/$nisk'2' >&2 fi echo "40" echo "# Mounting partitions..." mkdir -p "$worklitmp/bootpart" "$worklitmp/winpart" mount /dev/$nisk'1' "$worklitmp/bootpart" mount /dev/$nisk'2' "$worklitmp/winpart" echo "50" echo "# Copying boot files..." mkdir -p "$worklitmp/bootpart/EFI/Boot/" mkdir -p "$worklitmp/bootpart/EFI/Rufus/" debug "${uefntf}, ${uefntfd}" cp ${uefntf} "$worklitmp/bootpart/EFI/Boot/" cp ${uefntfd} "$worklitmp/bootpart/EFI/Rufus/" mkdir -p "$worklitmp/winpart/EFI/Boot/" mkdir -p "$worklitmp/winpart/EFI/Microsoft/Boot/Resources" cp "$worklitmp/winpart/Windows/Boot/EFI/bootmgfw.efi" "$worklitmp/winpart/EFI/Boot/bootaa64.efi" cp ${bcd} "$worklitmp/winpart/EFI/Microsoft/Boot/BCD" cp "$worklitmp/winpart/Windows/Boot/EFI/winsipolicy.p7b" "$worklitmp/winpart/EFI/Microsoft/Boot/winsipolicy.p7b" cp "$worklitmp/winpart/Windows/Boot/Resources/bootres.dll" "$worklitmp/winpart/EFI/Microsoft/Boot/Resources/bootres.dll" cp -r "$worklitmp/winpart/Windows/Boot/EFI/CIPolicies" "$worklitmp/winpart/EFI/Microsoft/Boot/" cp -r "$worklitmp/winpart/Windows/Boot/Fonts" "$worklitmp/winpart/EFI/Microsoft/Boot/" echo "60" echo "# Editing WinRE..." winrewim=$(find "$worklitmp/winpart/Windows/System32/Recovery/" -type f -name [Ww]inre.wim) cp "$winrewim" "$worklitmp/winpart/Windows/System32/Recovery/backup-winre.wim" wimupdate "$winrewim" 1 --command="add ${pei} /worklipe.cmd" wimupdate "$winrewim" 1 --command="delete /sources/recovery/RecEnv.exe" wimupdate "$winrewim" 1 --command="add ${bexec} /sources/recovery/RecEnv.exe" echo "80" echo "# Unmounting drive...\n\nThis may also take a while..." debug "Unmounting drive" sync umount /dev/$disk* echo "90" echo "# Cleaning up..." if [[ $cache == *"1"* ]]; then debug "cache set to 1, skipping tmp deletion" debug "uncomment uselocal at top of script to use cached files" else rm -rf "$worklitmp/" fi if [[ $deluup == *"1"* ]]; then rm -rf "$uuproot/uup" else debug "UUPs set to not be deleted" fi if [[ $delesd == *"1"* ]]; then rm -rf "$esdpth" else debug "ESD set to not be deleted" fi echo "100" echo "# Press OK to continue" ) | zenity --progress \ --title="workli" \ --text="Creating partitions..." \ --percentage=0 (( $? != 0 )) && exit 1 zenity --title "workli" --info --ok-label="Done!" --text "Booting\n\n1. Connect the drive and other peripherals to your board then boot it up.\n\n2. Assuming everything went right in the previous steps, the device will boot up to a PE enviroment where it will do some configuring and then reboot into hopefully a full Windows install.\n\nAll done :)\nThanks for using WoRKli" debug "It has finnished" exit 0