From 9b8ebf5e2d86f0fa711e9ff5af8ee8d6fca96981 Mon Sep 17 00:00:00 2001 From: Manuel Thalmann Date: Tue, 23 Jul 2024 09:14:05 +0200 Subject: [PATCH] Translate scripts to `fish` --- deploy.fish | 146 +++++++++++++++++++++++++++++++++++++++++++ deploy.sh | 128 +------------------------------------ lib/choose-disk.fish | 44 +++++++++++++ lib/choose-disk.sh | 59 ----------------- 4 files changed, 191 insertions(+), 186 deletions(-) create mode 100644 deploy.fish create mode 100644 lib/choose-disk.fish delete mode 100644 lib/choose-disk.sh diff --git a/deploy.fish b/deploy.fish new file mode 100644 index 0000000..f0c9d59 --- /dev/null +++ b/deploy.fish @@ -0,0 +1,146 @@ +#!/bin/env fish +begin + set -l dir (status dirname) + source "$dir/lib/choose-disk.fish" + + set -l setupLabel "winiso" + set -l buildDir "$(status dirname)/build" + set -l isoFile "$buildDir/win.iso" + set -l mountPath "/media/wininstall" + set -l bootPath "/media/boot" + set -l dataPath "/media/data" + set -l overlayDir (mktemp -d) + + set -q WIN11_IMAGE_PATH + or begin + echo "Please specify the Windows 11 ISO in the `WIN11_IMAGE_PATH` variable." + exit 1 + end + + set -l dir (status dirname) + set -l overlayDir (mktemp -d) + set -l editionField "Edition ID" + set -l wimFile "$dataPath/sources/install.wim" + + set -l intelNetworkArchive "$buildDir/intelNetwork.zip" + set -l marvellNetworkArchive "$buildDir/marvellNetwork.zip" + set -l gitArchive (realpath -m "$buildDir/git.msi") + set -l pwshArchive "$buildDir/pwsh.zip" + + mkdir -p "$buildDir" + cp -r "$dir/winfs"/* "$overlayDir" + + if [ ! -f "$intelNetworkArchive" ] + curl -L "https://dlcdnets.asus.com/pub/ASUS/mb/04LAN/DRV_LAN_Intel_I211_UWD_TP_W10_64_VER12151841_20190306R.zip?model=ROG%20ZENITH%20EXTREME%20ALPHA" -o "$intelNetworkArchive" + end + + if [ ! -f "$marvellNetworkArchive" ] + curl -L "https://dlcdnets.asus.com/pub/ASUS/mb/04LAN/DRV_LAN_Marvell_TP_TSD_W11_64_V3130_20211118R.zip?model=ROG%20ZENITH%20EXTREME%20ALPHA" -o "$marvellNetworkArchive" + end + + if [ ! -f "$gitArchive" ] + curl -L "https://github.com/git-for-windows/git/releases/download/v2.41.0.windows.1/PortableGit-2.41.0-64-bit.7z.exe" -o "$gitArchive" + end + + if [ ! -f "$pwshArchive" ] + curl -L "https://github.com/PowerShell/PowerShell/releases/download/v7.3.7/PowerShell-7.3.7-win-x64.zip" -o "$pwshArchive" + end + + mkdir -p "$overlayDir/drivers" + + begin + set -l tempDir (mktemp -d) + unzip "$intelNetworkArchive" -d "$tempDir" + cp -r "$tempDir" "$overlayDir/drivers/IntelNetwork" + rm -rf "$tempDir" + end + + begin + set -l tempDir (mktemp -d) + unzip "$marvellNetworkArchive" -d "$tempDir" + cp -r "$tempDir/x64" "$overlayDir/drivers/MarvellNetwork" + rm -rf "$tempDir" + end + + begin + set -l dir "$overlayDir/git" + mkdir -p "$dir" + pushd "$dir" > /dev/null + 7z x "$gitArchive" + popd > /dev/null + end + + unzip "$pwshArchive" -d "$overlayDir/PowerShell" + + mkdir -p "$(dirname "$isoFile")" + sudo mount --mkdir "$WIN11_IMAGE_PATH" "$mountPath" + mkwinpeimg --iso --arch amd64 --overlay "$overlayDir" --windows-dir "$mountPath" "$isoFile" + sudo umount "$mountPath" + rm -rf "$overlayDir" + + if [ ! -b "$WIN_DISK" ] + chooseDisk WIN_DISK + end + + sudo shred -vfzn 0 -s 512 "$WIN_DISK" + + begin + printf %s\n \ + o \ + n \ + "" \ + "" \ + "" \ + +2G \ + y \ + t \ + c \ + a \ + "" \ + \ + n \ + "" \ + "" \ + "" \ + "" \ + y \ + t \ + "" \ + 7 \ + \ + w + end | sudo fdisk "$WIN_DISK" + + begin + set -l disks + + while true + set disks (string split -n " " (bash -c "echo $WIN_DISK*")) + [ (count $disks) -ge 3 ] && break + end + + set -l bootDisk "$disks[2]" + set -l dataDisk "$disks[3]" + sudo mkfs.fat -F 32 -n "BOOT" "$bootDisk" + sudo mkfs.ntfs -fFL "$setupLabel" "$dataDisk" + sudo mount --mkdir "$bootDisk" "$bootPath" + sudo mount --mkdir "$dataDisk" "$dataPath" + sudo mount --mkdir "$isoFile" "$mountPath" + sudo cp -r "$mountPath"/* "$bootPath" + sudo umount "$mountPath" + + sudo mount "$WIN11_IMAGE_PATH" "$mountPath" + sudo cp -r "$mountPath"/* "$dataPath" + sudo cp -r "$mountPath/efi" "$bootPath" + + while [ ! (wiminfo "$wimFile" 1 | grep "^$editionField" | cut -d ":" -f2 | string trim) = "Professional" ] + sudo wimdelete --soft "$wimFile" 1 + end + + while wiminfo "$wimFile" 2 &> /dev/null + sudo wimdelete --soft "$wimFile" 2 + end + + sudo -- bash -c "umount -vf $(string escape "$mountPath"); umount -vf $(string escape "$bootPath"); umount -vf $(string escape "$dataPath"); rm -rf $(string escape "$mountPath") $(string escape "$dataPath");" + end +end diff --git a/deploy.sh b/deploy.sh index 70d6e81..8841a54 100755 --- a/deploy.sh +++ b/deploy.sh @@ -1,10 +1,8 @@ #!/bin/bash WIN_DISK="${WIN_DISK}"; workingDir="$(pwd)"; -overlayDir="$(mktemp -d)"; pushd "${BASH_SOURCE%/*}" > /dev/null; . "./.env" > /dev/null 2>&1; -. "./lib/choose-disk.sh"; if [ ! -z "$WIN11_IMAGE_PATH" ] then @@ -21,131 +19,7 @@ then echo "Please specify the path to the Windows 11 ISO image in your .env file located at:"; realpath --relative-to "$workingDir" "$(realpath .env)"; else - buildDir="build"; - mountPath="/media/wininstall"; - bootPath="/media/boot"; - dataPath="/media/data"; - setupLabel="winiso"; - intelNetworkArchive="./$buildDir/intelNetwork.zip"; - marvellNetworkArchive="./$buildDir/marvellNetwork.zip"; - gitArchive="$(realpath -m "./$buildDir/git.msi")"; - pwshArchive="./$buildDir/pwsh.zip"; - editionField="Edition ID"; - - mkdir -p "$buildDir"; - cp -r winfs/* "$overlayDir"; - - if [ ! -f "$intelNetworkArchive" ] - then - curl -L "https://dlcdnets.asus.com/pub/ASUS/mb/04LAN/DRV_LAN_Intel_I211_UWD_TP_W10_64_VER12151841_20190306R.zip?model=ROG%20ZENITH%20EXTREME%20ALPHA" -o "$intelNetworkArchive"; - fi; - - if [ ! -f "$marvellNetworkArchive" ] - then - curl -L "https://dlcdnets.asus.com/pub/ASUS/mb/04LAN/DRV_LAN_Marvell_TP_TSD_W11_64_V3130_20211118R.zip?model=ROG%20ZENITH%20EXTREME%20ALPHA" -o "$marvellNetworkArchive"; - fi; - - if [ ! -f "$gitArchive" ] - then - curl -L "https://github.com/git-for-windows/git/releases/download/v2.41.0.windows.1/PortableGit-2.41.0-64-bit.7z.exe" -o "$gitArchive"; - fi; - - if [ ! -f "$pwshArchive" ] - then - curl -L "https://github.com/PowerShell/PowerShell/releases/download/v7.3.7/PowerShell-7.3.7-win-x64.zip" -o "$pwshArchive"; - fi; - - mkdir -p "$overlayDir/drivers"; - tempDir="$(mktemp -d)"; - unzip "$intelNetworkArchive" -d "$tempDir"; - cp -r "$tempDir" "$overlayDir/drivers/IntelNetwork"; - rm -rf "$tempDir"; - - tempDir="$(mktemp -d)"; - unzip "$marvellNetworkArchive" -d "$tempDir"; - cp -r "$tempDir/x64" "$overlayDir/drivers/MarvellNetwork"; - rm -rf "$tempDir"; - - mkdir -p "$overlayDir/git"; - pushd "$overlayDir/git" > /dev/null; - 7z x "$gitArchive"; - popd > /dev/null; - - unzip "$pwshArchive" -d "$overlayDir/PowerShell"; - - sudo mount --mkdir "$WIN11_IMAGE_PATH" "$mountPath"; - isoFile="./$buildDir/win.iso"; - mkdir -p "$(dirname "$isoFile")"; - mkwinpeimg --iso --arch amd64 --overlay "$overlayDir" --windows-dir "$mountPath" "$isoFile"; - sudo umount "$mountPath"; - rm -rf "$overlayDir"; - - if [ ! -b "$WIN_DISK" ] - then - chooseDisk WIN_DISK; - fi; - - sudo shred -vfzn 0 -s 512M "$WIN_DISK"; - - { - echo "o"; - - echo "n"; - echo ""; - echo ""; - echo ""; - echo "+2G"; - echo "y"; - echo "t"; - echo "c"; - echo "a"; - echo ""; - - echo "n"; - echo ""; - echo ""; - echo ""; - echo ""; - echo "y"; - echo "t"; - echo ""; - echo "7"; - - echo "w"; - } | sudo fdisk "$WIN_DISK"; - - while true - do - disks=($(bash -c "echo $WIN_DISK*")); - [ "${#disks[@]}" -ge 3 ] && break; - done; - - bootDisk="${disks[1]}"; - dataDisk="${disks[2]}"; - sudo mkfs.fat -F 32 -n "BOOT" "$bootDisk"; - sudo mkfs.ntfs -fFL "$setupLabel" "$dataDisk"; - sudo mount --mkdir "$bootDisk" "$bootPath"; - sudo mount --mkdir "$dataDisk" "$dataPath"; - sudo mount --mkdir "$isoFile" "$mountPath"; - sudo cp -r "$mountPath"/* "$bootPath"; - sudo umount "$mountPath"; - - sudo mount "$WIN11_IMAGE_PATH" "$mountPath"; - sudo cp -r "$mountPath"/* "$dataPath"; - sudo cp -r "$mountPath/efi" "$bootPath"; - wimFile="$dataPath/sources/install.wim"; - - while [ ! "$(echo $(wiminfo "$wimFile" 1 | grep "^$editionField" | cut -d ":" -f2))" == "Professional" ] - do - sudo wimdelete --soft "$wimFile" 1; - done; - - while wiminfo "$wimFile" 2 2>&1 > /dev/null - do - sudo wimdelete --soft "$wimFile" 2; - done; - - sudo -- bash -c "umount -vf '$mountPath'; umount -vf '$bootPath'; umount -vf '$dataPath'; rm -rf '$mountPath' '$bootPath' '$dataPath';"; + WIN11_IMAGE_PATH="$WIN11_IMAGE_PATH" fish ./deploy.fish; fi; popd > /dev/null; diff --git a/lib/choose-disk.fish b/lib/choose-disk.fish new file mode 100644 index 0000000..9dcb144 --- /dev/null +++ b/lib/choose-disk.fish @@ -0,0 +1,44 @@ +#!/bin/env fish +function chooseDisk -a result message + set -l disks + + lsblk -do NAME,SIZE,TYPE | while read disk + set -l diskInfo (string split -n " " $disk) + + if contains "$diskInfo[3]" "TYPE" "disk" + set -a disks "$diskInfo" + end + end + + set -l diskCount (count $disks) + set -l padding (math (string length "$diskCount") + 1) + + if [ "$diskCount" -gt 0 ] + while true + echo "$message" + set -l prefix + + for i in (seq "$diskCount") + if [ "$i" -eq 1 ] + set prefix "" + else + set prefix "$(math "$i" - 1):" + end + + printf "%"$padding"s %s\n" "$prefix" "$disks[$i]" + end + + read -lP "Your choice: " choice + + if [ "$choice" -ge 1 ] && [ "$choice" -le "$diskCount" ] + set -l disk (string split -n " " "$disks[$(math "$choice" + 1)]") + set -g "$result" "/dev/$disk[1]" + return + else + echo "The specified choise \"$choice\" is invalid!" >&2 + end + end + else + echo "No valid disk found!" >&2 + end +end diff --git a/lib/choose-disk.sh b/lib/choose-disk.sh deleted file mode 100644 index c1e8a8d..0000000 --- a/lib/choose-disk.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/bin/bash -function chooseDisk() { - local -n result="$1"; - local message="$2"; - local choice; - local disk; - local -a disks; - local i; - disks=(); - - while read disk - do - local -a diskInfo; - diskInfo=($disk); - - if [ "${diskInfo[2]}" == "TYPE" ] || [ "${diskInfo[2]}" == "disk" ] - then - disks+=("$disk"); - fi; - done < <(lsblk -do NAME,SIZE,TYPE); - - diskCount="$(expr "${#disks[@]}" - 1)"; - padding="${#diskCount}"; - - if [ "$diskCount" -gt 0 ] - then - while true - do - echo "$message"; - - for i in $(seq 0 "$(expr "$diskCount")") - do - local index; - if [ "$i" -eq 0 ] - then - index=""; - else - index="$i:"; - fi; - - printf "%$(expr "${diskCount}" + 1)s ${disks[$i]}" "$index"; - echo ""; - done; - - read -p "Your choice: " choice; - - if [ "$choice" -ge 1 ] && [ "$choice" -le "$diskCount" ] - then - disk=(${disks[$choice]}); - result="/dev/${disk[0]}"; - return; - else - >&2 echo "The specified choice \"$choice\" is invalid!"; - fi; - done; - else - >&2 echo "No valid disk found!"; - fi; -}