Add support for windows languages & windows server

* Add windows languages, many bugfixes
Entering a release, edition, or OS with only part of a valid one will now throw an error, rather than attempting to download
	i.e. $quickget windows 1 > "ERROR! Windows 1 is not a supported release", rather than attempting to download a nonexistent ISO

* Replace "languages" with "editions" to improve consistency

* Remove unnecessary code, hardcode windows editions to not waste time

* Add windows server, LTSC

* Windows server requires IDE drive

* Update Windows Guests section in README.md

* Improve support for windows server

Add back the language array, change stylization of languages in list
This commit is contained in:
Liam 2023-12-28 18:23:08 -06:00 committed by Martin Wimpress
parent 194ec452be
commit 3e22c2b3de
3 changed files with 207 additions and 35 deletions

View File

@ -511,7 +511,7 @@ sudo rm /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist
Now reboot, and the App Store should work. Now reboot, and the App Store should work.
## Windows 8, 10 & 11 Guests ## Windows Guests
`quickget` can download `quickget` can download
[Windows10](https://www.microsoft.com/software-download/windows10) and [Windows10](https://www.microsoft.com/software-download/windows10) and
@ -523,6 +523,9 @@ Windows](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/).
Windows 8.1 is also supported but doesn't feature any automated Windows 8.1 is also supported but doesn't feature any automated
installation or driver optimisation. installation or driver optimisation.
`quickget` can also download [Windows 10 LTSC](https://www.microsoft.com/en-us/evalcenter/download-windows-10-enterprise) and Windows Server [2012-r2](https://www.microsoft.com/en-us/evalcenter/download-windows-server-2012-r2), [2016](https://www.microsoft.com/en-us/evalcenter/download-windows-server-2016), [2019](https://www.microsoft.com/en-us/evalcenter/download-windows-server-2019), and [2022](https://www.microsoft.com/en-us/evalcenter/download-windows-server-2022). No automated installation is supported for these releases.
``` bash ``` bash
quickget windows 11 quickget windows 11
quickemu --vm windows-11.conf quickemu --vm windows-11.conf
@ -535,6 +538,15 @@ quickemu --vm windows-11.conf
- Username: `Quickemu` - Username: `Quickemu`
- Password: `quickemu` - Password: `quickemu`
### Regional versions
By default `quickget` will download the *"English International"* release (*"English (United States)"* for server releases),
but you can optionally specify one of the supported languages: For example:
``` bash
quickget windows 11 "Chinese (Traditional)"
```
The default Windows 11 configuration looks like this: The default Windows 11 configuration looks like this:
``` bash ``` bash

View File

@ -337,7 +337,7 @@ function vm_boot() {
fi fi
echo ", ${RAM_VM} RAM" echo ", ${RAM_VM} RAM"
if [ "${guest_os}" == "macos" ] || [ "${guest_os}" == "windows" ]; then if [ "${guest_os}" == "macos" ] || [ "${guest_os}" == "windows" ] || [ "${guest_os}" == "windows-server" ]; then
if [ "${RAM_VM//G/}" -lt 4 ]; then if [ "${RAM_VM//G/}" -lt 4 ]; then
echo "ERROR! You have insufficient RAM to run ${guest_os} in a VM" echo "ERROR! You have insufficient RAM to run ${guest_os} in a VM"
exit 1 exit 1
@ -348,7 +348,7 @@ function vm_boot() {
boot=${boot,,} boot=${boot,,}
guest_os=${guest_os,,} guest_os=${guest_os,,}
if [ "${guest_os}" == "macos" ] || [ "${guest_os}" == "windows" ]; then if [ "${guest_os}" == "macos" ] || [ "${guest_os}" == "windows" ] || [ "${guest_os}" == "windows-server" ]; then
# Display MSRs alert if the guest is macOS or windows # Display MSRs alert if the guest is macOS or windows
ignore_msrs_alert ignore_msrs_alert
fi fi
@ -585,7 +585,7 @@ function vm_boot() {
disk_size="96G" disk_size="96G"
fi fi
;; ;;
windows) windows|windows-server)
if [ "${QEMU_VER_SHORT}" -gt 60 ]; then if [ "${QEMU_VER_SHORT}" -gt 60 ]; then
CPU="-cpu host,kvm=on,+hypervisor,+invtsc,l3-cache=on,migratable=no,hv_passthrough" CPU="-cpu host,kvm=on,+hypervisor,+invtsc,l3-cache=on,migratable=no,hv_passthrough"
else else
@ -738,7 +738,7 @@ function vm_boot() {
# qxl-vga supports seamless mouse and sane resolutions if only one scanout # qxl-vga supports seamless mouse and sane resolutions if only one scanout
# is used. Which is whay '-vga none' is added to the QEMU command line. # is used. Which is whay '-vga none' is added to the QEMU command line.
DISPLAY_DEVICE="qxl-vga" DISPLAY_DEVICE="qxl-vga"
elif [ "${guest_os}" == "windows" ]; then elif [ "${guest_os}" == "windows" ] || [ "${guest_os}" == "windows-server" ]; then
case ${OUTPUT} in case ${OUTPUT} in
# virtio-gpu "works" with gtk but is limited to 1024x1024 and exhibits other issues. # virtio-gpu "works" with gtk but is limited to 1024x1024 and exhibits other issues.
# https://kevinlocke.name/bits/2021/12/10/windows-11-guest-virtio-libvirt/#video # https://kevinlocke.name/bits/2021/12/10/windows-11-guest-virtio-libvirt/#video
@ -907,7 +907,7 @@ function vm_boot() {
esac esac
fi fi
if [ "${guest_os}" != "windows" ] && [ -n "${PUBLIC}" ]; then if [ "${guest_os}" != "windows" ] || [ "${guest_os}" == "windows-server" ] && [ -n "${PUBLIC}" ]; then
echo -n " - 9P: On guest: " echo -n " - 9P: On guest: "
if [ "${guest_os}" == "linux" ]; then if [ "${guest_os}" == "linux" ]; then
echo "sudo mount -t 9p -o trans=virtio,version=9p2000.L,msize=104857600 ${PUBLIC_TAG} ~/$(basename "${PUBLIC}")" echo "sudo mount -t 9p -o trans=virtio,version=9p2000.L,msize=104857600 ${PUBLIC_TAG} ~/$(basename "${PUBLIC}")"
@ -1153,6 +1153,10 @@ function vm_boot() {
# shellcheck disable=SC2054,SC2206 # shellcheck disable=SC2054,SC2206
args+=(-drive if=ide,index=0,media=disk,file="${disk_img}") args+=(-drive if=ide,index=0,media=disk,file="${disk_img}")
elif [ "${guest_os}" == "windows-server" ]; then
args+=(-device ide-hd,drive=SystemDisk
-drive id=SystemDisk,if=none,format=qcow2,file="${disk_img}" ${STATUS_QUO})
else else
# shellcheck disable=SC2054,SC2206 # shellcheck disable=SC2054,SC2206
args+=(-device virtio-blk-pci,drive=SystemDisk args+=(-device virtio-blk-pci,drive=SystemDisk
@ -1161,7 +1165,7 @@ function vm_boot() {
# https://wiki.qemu.org/Documentation/9psetup # https://wiki.qemu.org/Documentation/9psetup
# https://askubuntu.com/questions/772784/9p-libvirt-qemu-share-modes # https://askubuntu.com/questions/772784/9p-libvirt-qemu-share-modes
if [ "${guest_os}" != "windows" ] && [ -n "${PUBLIC}" ]; then if [ "${guest_os}" != "windows" ] || [ "${guest_os}" == "windows-server" ] && [ -n "${PUBLIC}" ]; then
# shellcheck disable=SC2054 # shellcheck disable=SC2054
args+=(-fsdev local,id=fsdev0,path="${PUBLIC}",security_model=mapped-xattr args+=(-fsdev local,id=fsdev0,path="${PUBLIC}",security_model=mapped-xattr
-device virtio-9p-pci,fsdev=fsdev0,mount_tag="${PUBLIC_TAG}") -device virtio-9p-pci,fsdev=fsdev0,mount_tag="${PUBLIC_TAG}")
@ -1917,6 +1921,10 @@ if [ ${VM_UP} -eq 0 ]; then
sleep 3.5 sleep 3.5
monitor_send_cmd "sendkey ret" monitor_send_cmd "sendkey ret"
fi fi
if [ -n "${iso}" ] && [ "${guest_os}" == "windows-server" ]; then
sleep 7
monitor_send_cmd "sendkey ret"
fi
start_viewer start_viewer
else else
parse_ports_from_file parse_ports_from_file

206
quickget
View File

@ -108,6 +108,7 @@ function pretty_name() {
vanillaos) PRETTY_NAME="Vanilla OS";; vanillaos) PRETTY_NAME="Vanilla OS";;
void) PRETTY_NAME="Void Linux";; void) PRETTY_NAME="Void Linux";;
vxlinux) PRETTY_NAME="VX Linux";; vxlinux) PRETTY_NAME="VX Linux";;
windows-server) PRETTY_NAME="Windows Server";;
xerolinux) PRETTY_NAME="XeroLinux";; xerolinux) PRETTY_NAME="XeroLinux";;
zorin) PRETTY_NAME="Zorin OS";; zorin) PRETTY_NAME="Zorin OS";;
*) PRETTY_NAME="${SIMPLE_NAME^}";; *) PRETTY_NAME="${SIMPLE_NAME^}";;
@ -128,7 +129,7 @@ function validate_release() {
esac esac
RELEASES=$(${RELEASE_GENERATOR}) RELEASES=$(${RELEASE_GENERATOR})
if [[ "${RELEASES}" != *"${RELEASE}"* ]]; then if [[ ! " ${RELEASES[*]} " =~ " ${RELEASE} " ]]; then
echo -e "ERROR! ${DISPLAY_NAME} ${RELEASE} is not a supported release.\n" echo -e "ERROR! ${DISPLAY_NAME} ${RELEASE} is not a supported release.\n"
echo -n "${RELEASES}" echo -n "${RELEASES}"
exit 1 exit 1
@ -189,7 +190,8 @@ function list_csv() {
for OPTION in $(editions_"${OS}"); do for OPTION in $(editions_"${OS}"); do
echo "${DISPLAY_NAME},${OS},${RELEASE},${OPTION},${DOWNLOADER},${PNG},${SVG}" echo "${DISPLAY_NAME},${OS},${RELEASE},${OPTION},${DOWNLOADER},${PNG},${SVG}"
done done
elif [ "${OS}" == "windows" ]; then elif [[ "${OS}" == "windows"* ]]; then
"languages_${OS}"
for OPTION in "${LANGS[@]}"; do for OPTION in "${LANGS[@]}"; do
echo "${DISPLAY_NAME},${OS},${RELEASE},${OPTION},${DOWNLOADER},${PNG},${SVG}" echo "${DISPLAY_NAME},${OS},${RELEASE},${OPTION},${DOWNLOADER},${PNG},${SVG}"
done done
@ -279,6 +281,7 @@ function os_support() {
void \ void \
vxlinux \ vxlinux \
windows \ windows \
windows-server \
xerolinux \ xerolinux \
xubuntu \ xubuntu \
zorin zorin
@ -365,6 +368,7 @@ function os_homepages(){
void) HOMEPAGE="https://voidlinux.org/";; void) HOMEPAGE="https://voidlinux.org/";;
vxlinux) HOMEPAGE="https://vxlinux.org/";; vxlinux) HOMEPAGE="https://vxlinux.org/";;
windows) HOMEPAGE="https://www.microsoft.com/en-us/windows/";; windows) HOMEPAGE="https://www.microsoft.com/en-us/windows/";;
windows-server) HOMEPAGE="https://www.microsoft.com/en-us/windows-server/";;
xerolinux) HOMEPAGE="https://xerolinux.xyz/";; xerolinux) HOMEPAGE="https://xerolinux.xyz/";;
xubuntu) HOMEPAGE="https://xubuntu.org/";; xubuntu) HOMEPAGE="https://xubuntu.org/";;
zorin) HOMEPAGE="https://zorin.com/os/";; zorin) HOMEPAGE="https://zorin.com/os/";;
@ -876,7 +880,32 @@ function releases_vxlinux() {
} }
function releases_windows() { function releases_windows() {
echo 8 10 11 echo 8 10 10-ltsc 11
}
function languages_windows() {
if [ "${RELEASE}" == 8 ]; then
LANGS=("Arabic" "Brazilian Portuguese" "Bulgarian" "Chinese (Simplified)" "Chinese (Traditional)" "Chinese (Traditional Hong Kong)" \
"Croatian" "Czech" "Danish" "Dutch" "English (United States)" "English International" "Estonian" "Finnish" "French" "German" "Greek" \
"Hebrew" "Hungarian" "Italian" "Japanese" "Latvian" "Lithuanian" "Norwegian" "Polish" "Portuguese" "Romanian" "Russian" "Serbian Latin" \
"Slovak" "Slovenian" "Spanish" "Swedish" "Thai" "Turkish" "Ukrainian")
elif [ "${RELEASE}" == "10-ltsc" ]; then
LANGS=("English (United States)" "English (Great Britain)" "Chinese (Simplified)" "Chinese (Traditional)" \
"French" "German" "Italian" "Japanese" "Korean" "Portuguese (Brazil)" "Spanish")
else
LANGS=("Arabic" "Brazilian Portuguese" "Bulgarian" "Chinese (Simplified)" "Chinese (Traditional)" "Croatian" "Czech" "Danish" "Dutch" \
"English (United States)" "English International" "Estonian" "Finnish" "French" "French Canadian" "German" "Greek" "Hebrew" "Hungarian" \
"Italian" "Japanese" "Korean" "Latvian" "Lithuanian" "Norwegian" "Polish" "Portuguese" "Romanian" "Russian" "Serbian Latin" "Slovak" \
"Slovenian" "Spanish" "Spanish (Mexico)" "Swedish" "Thai" "Turkish" "Ukrainian")
fi
}
function releases_windows-server() {
echo 2012-r2 2016 2019 2022
}
function languages_windows-server() {
LANGS=("English (United States)" "Chinese (Simplified)" "French" "German" "Italian" "Japanese" "Russian" "Spanish")
} }
function releases_xerolinux() { function releases_xerolinux() {
@ -952,7 +981,7 @@ function web_get() {
exit 1 exit 1
fi fi
if [[ ${OS} != windows && ${OS} != macos ]]; then if [[ ${OS} != windows && ${OS} != macos && ${OS} != windows-server ]]; then
echo Downloading $(pretty_name "${OS}") ${RELEASE} ${EDITION:+ $EDITION} from ${URL} echo Downloading $(pretty_name "${OS}") ${RELEASE} ${EDITION:+ $EDITION} from ${URL}
fi fi
@ -1069,16 +1098,15 @@ function make_vm_config() {
windows) windows)
GUEST="windows" GUEST="windows"
IMAGE_TYPE="iso";; IMAGE_TYPE="iso";;
windows-server)
GUEST="windows-server"
IMAGE_TYPE="iso";;
*) *)
GUEST="linux" GUEST="linux"
IMAGE_TYPE="iso";; IMAGE_TYPE="iso";;
esac esac
if [ -n "${EDITION}" ]; then CONF_FILE="${VM_PATH}.conf"
CONF_FILE="${OS}-${RELEASE}-${EDITION}.conf"
else
CONF_FILE="${OS}-${RELEASE}.conf"
fi
if [ ! -e "${CONF_FILE}" ]; then if [ ! -e "${CONF_FILE}" ]; then
echo "Making ${CONF_FILE}" echo "Making ${CONF_FILE}"
@ -1164,7 +1192,7 @@ EOF
echo "disk_size=\"32G\"" >> "${CONF_FILE}" echo "disk_size=\"32G\"" >> "${CONF_FILE}"
fi fi
# Enable TPM for Windows 11 # Enable TPM for Windows 11
if [ "${OS}" == "windows" ] && [ "${RELEASE}" -ge 11 ]; then if [ "${OS}" == "windows" ] && [ "${RELEASE}" == 11 ] || [ "${OS}" == "windows-server" ] && [ "${RELEASE}" == "2022" ]; then
echo "tpm=\"on\"" >> "${CONF_FILE}" echo "tpm=\"on\"" >> "${CONF_FILE}"
echo "secureboot=\"off\"" >> "${CONF_FILE}" echo "secureboot=\"off\"" >> "${CONF_FILE}"
fi fi
@ -2609,6 +2637,89 @@ handle_curl_error() {
return 1 return 1
} }
function download_windows-server() {
# Download enterprise evaluation windows versions
local windows_version="$1"
local enterprise_type="$2"
local url="https://www.microsoft.com/en-us/evalcenter/download-$windows_version"
local iso_download_page_html="$(curl --silent --location --fail --proto =https --tlsv1.2 --http1.1 -- "$url")" || {
handle_curl_error $?
return $?
}
local CULTURE=""
local COUNTRY=""
local PRETTY_RELEASE=""
case "$RELEASE" in
"10-ltsc") PRETTY_RELEASE="10 LTSC";;
"2012-r2") PRETTY_RELEASE="2012 R2";;
*) PRETTY_RELEASE="$RELEASE";;
esac
case "$LANG" in
"English (Great Britain)")
CULTURE="en-gb"
COUNTRY="GB";;
"Chinese (Simplified)")
CULTURE="zh-cn"
COUNTRY="CN";;
"Chinese (Traditional)")
CULTURE="zh-tw"
COUNTRY="TW";;
"French")
CULTURE="fr-fr"
COUNTRY="FR";;
"German")
CULTURE="de-de"
COUNTRY="DE";;
"Italian")
CULTURE="it-it"
COUNTRY="IT";;
"Japanese")
CULTURE="ja-jp"
COUNTRY="JP";;
"Korean")
CULTURE="ko-kr"
COUNTRY="KR";;
"Portuguese (Brazil)")
CULTURE="pt-br"
COUNTRY="BR";;
"Spanish")
CULTURE="es-es"
COUNTRY="ES";;
"Russian")
CULTURE="ru-ru"
COUNTRY="RU";;
*)
CULTURE="en-us"
COUNTRY="US";;
esac
iso_download_links="$(echo "$iso_download_page_html" | grep -o "https://go.microsoft.com/fwlink/p/?LinkID=[0-9]\+&clcid=0x[0-9a-z]\+&culture=$CULTURE&country=$COUNTRY" | head -c 1024)"
case "$enterprise_type" in
# Select x64 LTSC download link
"ltsc") iso_download_link=$(echo "$iso_download_links" | head -n 4 | tail -n 1) ;;
*) iso_download_link="$iso_download_links" ;;
esac
iso_download_link="$(curl --silent --location --output /dev/null --silent --write-out "%{url_effective}" --head --fail --proto =https --tlsv1.2 --http1.1 -- "$iso_download_link")"
if [ "${COUNTRY}" != "US" ]; then
echo Downloading $(pretty_name "${OS}") ${PRETTY_RELEASE} in "${LANG}" from "$iso_download_link"
else
echo Downloading $(pretty_name "${OS}") ${PRETTY_RELEASE} from "$iso_download_link"
fi
FILE_NAME="${iso_download_link##*/}"
web_get "$iso_download_link" "${VM_PATH}" "${FILE_NAME}"
OS="windows-server"
}
function download_windows() { function download_windows() {
# Download newer consumer Windows versions from behind gated Microsoft API # Download newer consumer Windows versions from behind gated Microsoft API
# This function aims to precisely emulate what Fido does down to the URL requests and HTTP headers (exceptions: updated user agent and referer adapts to Windows version instead of always being "windows11") but written in POSIX sh (with coreutils) and curl instead of PowerShell (also simplified to greatly reduce attack surface) # This function aims to precisely emulate what Fido does down to the URL requests and HTTP headers (exceptions: updated user agent and referer adapts to Windows version instead of always being "windows11") but written in POSIX sh (with coreutils) and curl instead of PowerShell (also simplified to greatly reduce attack surface)
@ -2650,7 +2761,7 @@ function download_windows() {
# tr: Filter for only numerics to prevent HTTP parameter injection # tr: Filter for only numerics to prevent HTTP parameter injection
# head -c was recently added to POSIX: https://austingroupbugs.net/view.php?id=407 # head -c was recently added to POSIX: https://austingroupbugs.net/view.php?id=407
local product_edition_id="$(echo "$iso_download_page_html" | grep -Eo '<option value="[0-9]+">Windows' | cut -d '"' -f 2 | head -n 1 | tr -cd '0-9' | head -c 16)" local product_edition_id="$(echo "$iso_download_page_html" | grep -Eo '<option value="[0-9]+">Windows' | cut -d '"' -f 2 | head -n 1 | tr -cd '0-9' | head -c 16)"
echo " - Product edition ID: $product_edition_id" # echo " - Product edition ID: $product_edition_id"
# Permit Session ID # Permit Session ID
# "org_id" is always the same value # "org_id" is always the same value
@ -2674,9 +2785,10 @@ function download_windows() {
# Limit untrusted size for input validation # Limit untrusted size for input validation
language_skuid_table_html="$(echo "$language_skuid_table_html" | head -c 10240)" language_skuid_table_html="$(echo "$language_skuid_table_html" | head -c 10240)"
# tr: Filter for only alphanumerics or "-" to prevent HTTP parameter injection # tr: Filter for only alphanumerics or "-" to prevent HTTP parameter injection
local sku_id="$(echo "$language_skuid_table_html" | grep "English (United States)" | sed 's/&quot;//g' | cut -d ',' -f 1 | cut -d ':' -f 2 | tr -cd '[:alnum:]-' | head -c 16)" local sku_id="$(echo "$language_skuid_table_html" | grep "${LANG}" | sed 's/&quot;//g' | cut -d ',' -f 1 | cut -d ':' -f 2 | tr -cd '[:alnum:]-' | head -c 16)"
echo " - SKU ID: $sku_id" # echo " - SKU ID: $sku_id"
# Get ISO download link # Get ISO download link
# If any request is going to be blocked by Microsoft it's always this last one (the previous requests always seem to succeed) # If any request is going to be blocked by Microsoft it's always this last one (the previous requests always seem to succeed)
@ -2689,6 +2801,12 @@ function download_windows() {
local failed=0 local failed=0
if [ "${LANG}" == "English (United States)" ]; then
LANG="English"
fi
local HASH=$(echo "$iso_download_link_html" | sed 's/<tr><td>/\n<tr><td>/g' | grep "$LANG 64-bit" | grep -o -P '(?<=</td><td>).*(?=</td></tr>)')
# Limit untrusted size for input validation # Limit untrusted size for input validation
iso_download_link_html="$(echo "$iso_download_link_html" | head -c 4096)" iso_download_link_html="$(echo "$iso_download_link_html" | head -c 4096)"
@ -2709,7 +2827,7 @@ function download_windows() {
if [ ${failed} -eq 1 ]; then if [ ${failed} -eq 1 ]; then
echo " - Manually download the Windows ${windows_version} ISO using a web browser from: ${url}" echo " - Manually download the Windows ${windows_version} ISO using a web browser from: ${url}"
echo " - Save the downloaded ISO to: $(realpath ${VM_PATH})" echo " - Save the downloaded ISO to: $(realpath "${VM_PATH}")"
echo " - Update the config file to reference the downloaded ISO: ./${VM_PATH}.conf" echo " - Update the config file to reference the downloaded ISO: ./${VM_PATH}.conf"
echo " - Continuing with the VM creation process..." echo " - Continuing with the VM creation process..."
return 1 return 1
@ -2734,15 +2852,29 @@ function download_windows() {
exit 0 exit 0
fi fi
echo Downloading Windows ${RELEASE} from "$iso_download_link" if [ "${LANG}" != "English International" ]; then
echo Downloading Windows ${RELEASE} in "${LANG}" from "$iso_download_link"
else
echo Downloading Windows ${RELEASE} from "$iso_download_link"
fi
# Download ISO # Download ISO
FILE_NAME="$(echo "$iso_download_link" | cut -d'?' -f1 | cut -d'/' -f5)" FILE_NAME="$(echo "$iso_download_link" | cut -d'?' -f1 | cut -d'/' -f5)"
web_get "$iso_download_link" "${VM_PATH}" "${FILE_NAME}" web_get "$iso_download_link" "${VM_PATH}" "${FILE_NAME}"
# Only Windows 11 hashes can be found directly from Microsoft's page.
if [ "${windows_version}" == 11 ]; then
check_hash "${FILE_NAME}" "${HASH}"
fi
} }
function get_windows() { function get_windows() {
download_windows "${RELEASE}" if [ "${RELEASE}" == "10-ltsc" ]; then
download_windows-server windows-10-enterprise ltsc
elif [ "${OS}" == "windows-server" ]; then
download_windows-server windows-server-${RELEASE}
else
download_windows "${RELEASE}"
fi
if [ "${download_iso}" == 'on' ]; then if [ "${download_iso}" == 'on' ]; then
exit 0 exit 0
@ -2851,7 +2983,7 @@ else
exit 1 exit 1
fi fi
if [[ ! $(os_support) =~ ${OS} ]]; then if [[ ! " $(os_support) " =~ " ${OS} " ]]; then
echo -e "ERROR! ${OS} is not a supported OS.\n" echo -e "ERROR! ${OS} is not a supported OS.\n"
os_support os_support
exit 1 exit 1
@ -2863,17 +2995,22 @@ if [ -n "${2}" ]; then
# If the OS has an editions_() function, use it. # If the OS has an editions_() function, use it.
if [[ $(type -t "editions_${OS}") == function ]]; then if [[ $(type -t "editions_${OS}") == function ]]; then
validate_release "releases_${OS}"
EDITIONS=($(editions_${OS})) EDITIONS=($(editions_${OS}))
EDITION=${EDITIONS[0]} EDITION=${EDITIONS[0]}
if [ -n "${3}" ]; then if [ -n "${3}" ]; then
EDITION="${3}" EDITION="${3}"
if [[ ! ${EDITIONS[*]} =~ ${EDITION} ]]; then if [[ ! " ${EDITIONS[*]} " =~ " ${EDITION} " ]]; then
echo -e "ERROR! ${EDITION} is not a supported $(pretty_name "${OS}") edition:\n" echo -e "ERROR! ${EDITION} is not a supported $(pretty_name "${OS}") edition:\n"
for EDITION in "${EDITIONS[@]}"; do for EDITION in "${EDITIONS[@]}"; do
echo -n "${EDITION} " echo -n "${EDITION} "
done done
exit 1 exit 1
fi fi
else
echo -en "ERROR! You must specify an edition.\n - Editions: "
editions_"${OS}"
exit 1
fi fi
# Handle odd missing fedora cominations # Handle odd missing fedora cominations
@ -2896,7 +3033,6 @@ if [ -n "${2}" ]; then
VM_PATH="${OS}-${RELEASE}-${EDITION}" VM_PATH="${OS}-${RELEASE}-${EDITION}"
validate_release "releases_${OS}"
create_vm "$("get_${OS}" "${EDITION}")" create_vm "$("get_${OS}" "${EDITION}")"
elif [ "${OS}" == "macos" ]; then elif [ "${OS}" == "macos" ]; then
# macOS doesn't use create_vm() # macOS doesn't use create_vm()
@ -2915,19 +3051,30 @@ if [ -n "${2}" ]; then
# deepin doesn't use create_vm() # deepin doesn't use create_vm()
validate_release releases_deepin validate_release releases_deepin
get_deepin get_deepin
elif [ "${OS}" == "windows" ]; then elif [[ "${OS}" == "windows"* ]]; then
# Windows doesn't use create_vm() LANG="English International"
validate_release releases_windows "languages_${OS}"
if [ -n "${3}" ]; then
LANG="${3}"
if [[ ! ${LANGS[*]} =~ "${LANG}" ]]; then
echo -e "ERROR! ${LANG} is not a supported Windows language:\n"
for LANG in "${LANGS[@]}"; do
echo -n "${LANG} "
done
exit 1
fi
VM_PATH="$(echo "${OS}-${RELEASE}-${LANG// /-}" | tr -d '()')"
fi
validate_release "releases_${OS}"
get_windows get_windows
else else
validate_release "releases_${OS}" validate_release "releases_${OS}"
create_vm "$("get_${OS}")" create_vm "$("get_${OS}")"
fi fi
elif [ "${open_distro_homepage}" == 'on' ]; then
HOMEPAGE=$(os_homepages ${OS})
open_url "${HOMEPAGE}" && exit 0
else else
if [ "${open_distro_homepage}" == 'on' ]; then
HOMEPAGE=$(os_homepages ${OS})
open_url "${HOMEPAGE}" && exit 0
fi
echo "ERROR! You must specify a release." echo "ERROR! You must specify a release."
case ${OS} in case ${OS} in
*ubuntu-server*) *ubuntu-server*)
@ -2938,7 +3085,12 @@ else
echo -n " - Releases: " echo -n " - Releases: "
releases_ubuntu | sed -Ee 's/eol-\S+//g' # hide eol releases releases_ubuntu | sed -Ee 's/eol-\S+//g' # hide eol releases
;; ;;
*windows*)
echo -n " - Releases: "
"releases_${OS}"
echo -n " - Languages: "
"languages_${OS}" && echo "${LANGS[@]}"
;;
*) *)
echo -n " - Releases: " echo -n " - Releases: "
releases_"${OS}" releases_"${OS}"