quickemu/quickget

958 lines
29 KiB
Plaintext
Raw Permalink Normal View History

#!/usr/bin/env bash
# Here the quick 'n dirty guide to adding a new OS to quickget
#
# 1. Add the new OS, all lowercase, to os_support()
# 2. Add a "pretty name" display name to pretty_name()
# 3. Create a releases_newos() generator that outputs the currently supported release versions
# 4. Add the new OS to make_vm_config()
# 5. Create a get_newos() function that does something like this:
# function get_newos() {
2021-10-19 16:19:11 +00:00
# local HASH=""
# local ISO=""
# local URL=""
#
# validate_release "releases_newos"
# ISO="newos-${RELEASE}-amd64.iso"
# URL="https://www.newos.org/download/${ISO}"
# web_get "${URL}" "${VM_PATH}"
2021-10-19 16:19:11 +00:00
# web_get "${URL}/SHA256SUMS" "${VM_PATH}"
# HASH=$(cat "${VM_PATH}/SHA256SUMS" | cut -d' ' -f1)
2021-10-19 19:34:03 +00:00
# check_hash "${ISO}" "${HASH}"
# make_vm_config "${ISO}"
# }
# 6. Add new OS to the argument parser at the bottom of the script
2021-10-19 15:32:35 +00:00
function pretty_name() {
2021-10-19 16:31:11 +00:00
local SIMPLE_NAME=""
2021-10-19 15:32:35 +00:00
local PRETTY_NAME=""
2021-10-19 16:31:11 +00:00
SIMPLE_NAME="${1}"
case ${SIMPLE_NAME} in
elementary) PRETTY_NAME="elementary OS";;
freebsd) PRETTY_NAME="FreeBSD";;
2021-10-19 15:32:35 +00:00
linuxmint-cinnamon) PRETTY_NAME="Linux Mint Cinnamon";;
2021-10-19 16:31:11 +00:00
linuxmint-mate) PRETTY_NAME="Linux Mint MATE";;
linuxmint-xfce) PRETTY_NAME="Linux Mint XFCE";;
macos) PRETTY_NAME="macOS";;
2021-10-20 22:22:35 +00:00
openbsd) PRETTY_NAME="OpenBSD";;
2021-10-19 16:50:28 +00:00
opensuse) PRETTY_NAME="openSUSE";;
2021-10-19 16:31:11 +00:00
popos) PRETTY_NAME="Pop!_OS";;
ubuntu-budgie) PRETTY_NAME="Ubuntu Budgie";;
ubuntu-kylin) PRETTY_NAME="Ubuntu Kylin";;
ubuntu-mate) PRETTY_NAME="Ubuntu MATE";;
ubuntu-studio) PRETTY_NAME="Ubuntu Studio";;
*) PRETTY_NAME="${SIMPLE_NAME^}";;
2021-10-19 15:32:35 +00:00
esac
echo "${PRETTY_NAME}"
}
2021-10-19 15:33:03 +00:00
function validate_release() {
local DISPLAY_NAME=""
local RELEASE_GENERATOR="${1}"
local RELEASES=""
DISPLAY_NAME="$(pretty_name "${OS}")"
RELEASES=$(${RELEASE_GENERATOR})
if [[ "${RELEASES}" != *"${RELEASE}"* ]]; then
echo "ERROR! ${DISPLAY_NAME} ${RELEASE} is not a supported release."
echo "${RELEASES}"
exit 1
fi
}
function list_json() {
# Reference: https://stackoverflow.com/a/67359273
list_csv | jq -R 'split(",") as $h|reduce inputs as $in ([]; . += [$in|split(",")|. as $a|reduce range(0,length) as $i ({};.[$h[$i]]=$a[$i])])'
exit 0
}
2021-10-19 23:35:00 +00:00
function list_csv() {
local DISPLAY_NAME
local FUNC
local LANG
local OS
local RELEASE
echo "Display Name,OS,Release,Option"
for OS in $(os_support); do
2021-10-19 15:32:35 +00:00
DISPLAY_NAME="$(pretty_name "${OS}")"
if [[ "${OS}" == *"ubuntu"* ]]; then
FUNC="ubuntu"
elif [[ "${OS}" == *"linuxmint"* ]]; then
FUNC="linuxmint"
else
FUNC="${OS}"
fi
for RELEASE in $("releases_${FUNC}"); do
if [ "${OS}" == "windows" ]; then
for LANG in "${LANGS[@]}"; do
2021-10-19 23:33:30 +00:00
echo "${DISPLAY_NAME},${OS},${RELEASE},${LANG}"
done
elif [ "${OS}" == "popos" ]; then
for DRIVER in intel nvidia; do
2021-10-19 23:33:30 +00:00
echo "${DISPLAY_NAME},${OS},${RELEASE},${DRIVER}"
done
else
2021-10-19 23:33:30 +00:00
echo "${DISPLAY_NAME},${OS},${RELEASE},"
fi
done
done
exit 0
}
function os_support() {
echo elementary \
freebsd \
fedora \
kubuntu \
linuxmint-cinnamon \
linuxmint-mate \
linuxmint-xfce \
lubuntu \
macos \
openbsd \
2021-10-16 18:27:45 +00:00
opensuse \
popos \
ubuntu \
2021-09-28 01:14:30 +00:00
ubuntu-budgie \
ubuntu-kylin \
ubuntu-mate \
ubuntu-studio \
2021-09-28 04:03:16 +00:00
windows \
xubuntu
}
function releases_elementary() {
2021-10-19 13:58:57 +00:00
echo 6.0
}
function releases_freebsd(){
2021-10-19 13:59:21 +00:00
echo 12.2 \
13.0
}
2021-10-13 19:12:33 +00:00
function releases_fedora(){
echo 33 \
34 \
35_beta
}
function releases_linuxmint(){
echo 20.2
}
function releases_openbsd(){
2021-10-20 22:22:35 +00:00
echo 7.0
}
2021-10-16 18:27:45 +00:00
function releases_opensuse(){
2021-10-19 14:00:07 +00:00
echo 15.0 \
15.1 \
15.2 \
15.3 \
microos \
tumbleweed
2021-10-16 18:27:45 +00:00
}
function releases_macos() {
2021-09-28 14:25:38 +00:00
echo high-sierra \
mojave \
catalina \
big-sur
}
function releases_popos() {
2021-10-19 14:01:19 +00:00
echo 20.04 \
21.04
}
function releases_ubuntu() {
echo bionic \
focal \
hirsute \
2021-10-15 00:20:50 +00:00
impish \
devel
}
2021-09-28 04:03:16 +00:00
function languages_windows() {
LANGS=(Arabic
"Brazilian Portuguese"
Bulgarian
"Chinese (Simplified)"
"Chinese (Traditional)"
Croatian
Czech
Danish
Dutch
English
"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)
2021-09-28 04:03:16 +00:00
}
function releases_windows() {
2021-10-05 22:51:57 +00:00
echo 8 \
10 \
11
2021-09-28 04:03:16 +00:00
}
function unattended_windows() {
cat << 'EOF' > "${1}"
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend"
xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!--
For documentation on components:
http://technet.microsoft.com/en-us/library/ff699038.aspx
-->
<settings pass="generalize">
<!--
The PersistAllDeviceInstalls setting indicates whether all plug and
play devices on the destination computer remain installed during the
generalize configuration pass.
-->
<component name="Microsoft-Windows-PnPSysprep"
processorArchitecture="amd64"
publicKeyToken="31bf3856ad364e35"
language="neutral"
versionScope="nonSxS">
<PersistAllDeviceInstalls>true</PersistAllDeviceInstalls>
</component>
</settings>
<settings pass="windowsPE">
<component name="Microsoft-Windows-Setup" processorArchitecture="amd64"
publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<DiskConfiguration>
<Disk wcm:action="add">
<DiskID>0</DiskID>
<WillWipeDisk>true</WillWipeDisk>
<CreatePartitions>
<CreatePartition wcm:action="add">
<Order>1</Order>
<Type>EFI</Type>
<Size>100</Size>
</CreatePartition>
<CreatePartition wcm:action="add">
<Order>2</Order>
<Type>MSR</Type>
<Size>512</Size>
</CreatePartition>
<CreatePartition wcm:action="add">
<Order>3</Order>
<Type>Primary</Type>
<Extend>true</Extend>
</CreatePartition>
</CreatePartitions>
<ModifyPartitions>
<ModifyPartition wcm:action="add">
<Order>1</Order>
<PartitionID>1</PartitionID>
<Label>System</Label>
<Format>FAT32</Format>
</ModifyPartition>
<ModifyPartition wcm:action="add">
<Order>2</Order>
<PartitionID>3</PartitionID>
<Label>Windows</Label>
<Letter>C</Letter>
<Format>NTFS</Format>
</ModifyPartition>
</ModifyPartitions>
</Disk>
<WillShowUI>OnError</WillShowUI>
</DiskConfiguration>
<ImageInstall>
<OSImage>
<WillShowUI>OnError</WillShowUI>
<InstallTo>
<DiskID>0</DiskID>
<PartitionID>3</PartitionID>
</InstallTo>
</OSImage>
</ImageInstall>
<UserData>
<AcceptEula>true</AcceptEula>
<ProductKey>
<key>VK7JG-NPHTM-C97JM-9MPGT-3V66T</key>
<WillShowUI>Never</WillShowUI>
</ProductKey>
</UserData>
<DynamicUpdate>
<Enable>true</Enable>
<WillShowUI>Never</WillShowUI>
</DynamicUpdate>
</component>
<component name="Microsoft-Windows-PnpCustomizationsWinPE"
publicKeyToken="31bf3856ad364e35" language="neutral"
versionScope="nonSxS" processorArchitecture="amd64">
<!--
This makes the VirtIO drivers available to Windows, assuming that
the VirtIO driver disk
(https://github.com/virtio-win/virtio-win-pkg-scripts/blob/master/README.md)
is available as drive E:
-->
<DriverPaths>
<PathAndCredentials wcm:action="add" wcm:keyValue="1">
<Path>E:\qemufwcfg\w10\amd64</Path>
</PathAndCredentials>
<PathAndCredentials wcm:action="add" wcm:keyValue="2">
<Path>E:\vioinput\w10\amd64</Path>
</PathAndCredentials>
<PathAndCredentials wcm:action="add" wcm:keyValue="3">
<Path>E:\vioscsi\w10\amd64</Path>
</PathAndCredentials>
<PathAndCredentials wcm:action="add" wcm:keyValue="4">
<Path>E:\viostor\w10\amd64</Path>
</PathAndCredentials>
<PathAndCredentials wcm:action="add" wcm:keyValue="5">
<Path>E:\vioserial\w10\amd64</Path>
</PathAndCredentials>
<PathAndCredentials wcm:action="add" wcm:keyValue="6">
<Path>E:\qxldod\w10\amd64</Path>
</PathAndCredentials>
<PathAndCredentials wcm:action="add" wcm:keyValue="7">
<Path>E:\amd64\w10</Path>
</PathAndCredentials>
<PathAndCredentials wcm:action="add" wcm:keyValue="8">
<Path>E:\viogpudo\w10\amd64</Path>
</PathAndCredentials>
<PathAndCredentials wcm:action="add" wcm:keyValue="9">
<Path>E:\viorng\w10\amd64</Path>
</PathAndCredentials>
<PathAndCredentials wcm:action="add" wcm:keyValue="10">
<Path>E:\NetKVM\w10\amd64</Path>
</PathAndCredentials>
<PathAndCredentials wcm:action="add" wcm:keyValue="11">
<Path>E:\viofs\w10\amd64</Path>
</PathAndCredentials>
<PathAndCredentials wcm:action="add" wcm:keyValue="12">
<Path>E:\Balloon\w10\amd64</Path>
</PathAndCredentials>
</DriverPaths>
</component>
</settings>
<settings pass="specialize">
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64"
publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<ComputerName>*</ComputerName>
<OEMInformation>
<Manufacturer>Wimpys World</Manufacturer>
<Model>Quickemu</Model>
<SupportHours>24/7</SupportHours>
<SupportPhone></SupportPhone>
<SupportProvider>Wimpys World</SupportProvider>
<SupportURL>https://github.com/wimpysworld/quickemu/issues</SupportURL>
</OEMInformation>
<OEMName>Wimpys World</OEMName>
</component>
</settings>
<settings pass="oobeSystem">
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64"
publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<OOBE>
<HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>
<HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
</OOBE>
<FirstLogonCommands>
<SynchronousCommand wcm:action="add">
<CommandLine>msiexec /i E:\guest-agent\qemu-ga-x86_64.msi /quiet /passive /qn</CommandLine>
<Description>Install Virtio Guest Agent</Description>
<Order>1</Order>
</SynchronousCommand>
<SynchronousCommand wcm:action="add">
<CommandLine>msiexec /i F:\spice-webdavd-x64-latest.msi /quiet /passive /qn</CommandLine>
<Description>Install spice-webdavd file sharing agent</Description>
<Order>2</Order>
</SynchronousCommand>
<SynchronousCommand wcm:action="add">
<CommandLine>msiexec /i F:\UsbDk_1.0.22_x64.msi /quiet /passive /qn</CommandLine>
<Description>Install usbdk USB sharing agent</Description>
<Order>3</Order>
</SynchronousCommand>
<SynchronousCommand wcm:action="add">
<CommandLine>msiexec /i F:\spice-vdagent-x64-0.10.0.msi /quiet /passive /qn</CommandLine>
<Description>Install spice-vdagent SPICE agent</Description>
<Order>4</Order>
</SynchronousCommand>
</FirstLogonCommands>
</component>
</settings>
</unattend>
EOF
}
2021-10-19 16:19:11 +00:00
function check_hash() {
local iso=""
local hash=""
local hash_algo=""
iso="${VM_PATH}/${1}"
2021-10-19 16:19:11 +00:00
hash="${2}"
# Guess the hash algorithm by the hash length
case ${#hash} in
32) hash_algo=md5sum;;
40) hash_algo=sha1sum;;
64) hash_algo=sha256sum;;
2021-10-21 00:13:43 +00:00
128) hash_algo=sha512sum;;
*) echo "WARNING! Can't guess hash algorithm, not checking ${iso} hash."
return;;
esac
2021-10-19 16:19:11 +00:00
echo -n "Checking ${iso} with ${hash_algo}... "
if ! echo "${hash} ${iso}" | ${hash_algo} --check --status; then
echo "ERROR!"
echo "${iso} doesn't match ${hash}. Try running 'quickget' again."
exit 1
else
echo "Good!"
fi
}
function web_get() {
local DIR="${2}"
local FILE=""
local URL="${1}"
2021-09-28 04:03:16 +00:00
if [ -n "${3}" ]; then
FILE="${3}"
else
FILE="${URL##*/}"
fi
if ! mkdir -p "${DIR}" 2>/dev/null; then
echo "ERROR! Unable to create directory ${DIR}"
exit 1
fi
if ! wget --quiet --continue --show-progress --progress=bar:force:noscroll "${URL}" -O "${DIR}/${FILE}"; then
2021-09-28 04:03:16 +00:00
echo "ERROR! Failed to download ${URL}. Try running 'quickget' again."
exit 1
fi
}
function zsync_get() {
local DIR="${2}"
local FILE=""
local OUT=""
local URL="${1}"
FILE="${URL##*/}"
if [ -n "${3}" ]; then
OUT="${3}"
else
OUT="${FILE}"
fi
if ! mkdir -p "${DIR}" 2>/dev/null; then
echo "ERROR! Unable to create directory ${DIR}"
exit 1
fi
2021-10-19 18:42:01 +00:00
if ! zsync "${URL}.zsync" -i "${DIR}/${OUT}" -o "${DIR}/${OUT}" 2>/dev/null; then
echo "ERROR! Failed to download ${URL}.zsync"
exit 1
fi
if [ -e "${DIR}/${FILE}.zs-old" ]; then
rm -v "${DIR}/${FILE}.zs-old"
fi
}
function start_vm_info() {
echo
echo "To start your ${OS} ${RELEASE} virtual machine run:"
echo " quickemu --vm ${OS}-${RELEASE}.conf"
echo
}
function make_vm_config() {
local IMAGE_FILE=""
local ISO_FILE=""
local IMAGE_TYPE=""
local GUEST=""
IMAGE_FILE="${1}"
ISO_FILE="${2}"
if [ "${OS}" == "elementary" ]; then
GUEST="linux"
IMAGE_TYPE="iso"
elif [ "${OS}" == "freebsd" ]; then
GUEST="freebsd"
IMAGE_TYPE="iso"
elif [ "${OS}" == "fedora" ]; then
GUEST="linux"
IMAGE_TYPE="iso"
elif [[ "${OS}" == *"linuxmint"* ]]; then
GUEST="linux"
IMAGE_TYPE="iso"
2021-10-20 22:22:35 +00:00
elif [ "${OS}" == "openbsd" ]; then
GUEST="openbsd"
IMAGE_TYPE="iso"
elif [ "${OS}" == "opensuse" ]; then
2021-10-16 18:27:45 +00:00
GUEST="linux"
IMAGE_TYPE="iso"
elif [ "${OS}" == "popos" ]; then
GUEST="linux"
IMAGE_TYPE="iso"
2021-10-13 19:12:33 +00:00
elif [[ "${OS}" == *"ubuntu"* ]]; then
GUEST="linux"
2021-10-15 00:45:05 +00:00
IMAGE_TYPE="iso"
elif [ "${OS}" == "macos" ]; then
GUEST="macos"
IMAGE_TYPE="img"
2021-09-28 04:03:16 +00:00
elif [ "${OS}" == "windows" ]; then
GUEST="windows"
IMAGE_TYPE="iso"
fi
if [ ! -e "${OS}-${RELEASE}.conf" ]; then
echo "Making VM configuration for ${OS}-${RELEASE}..."
cat << EOF > "${OS}-${RELEASE}.conf"
guest_os="${GUEST}"
disk_img="${VM_PATH}/disk.qcow2"
2021-09-28 04:03:16 +00:00
${IMAGE_TYPE}="${VM_PATH}/${IMAGE_FILE}"
EOF
if [ -n "${ISO_FILE}" ]; then
echo "fixed_iso=\"${VM_PATH}/${ISO_FILE}\"" >> "${OS}-${RELEASE}.conf"
2021-09-28 04:03:16 +00:00
fi
2021-10-20 22:22:35 +00:00
if [ "${OS}" == "openbsd" ]; then
echo "boot=\"legacy\"" >> "${OS}-${RELEASE}.conf"
fi
if [ "${OS}" == "macos" ]; then
echo "macos_release=\"${RELEASE}\"" >> "${OS}-${RELEASE}.conf"
fi
2021-10-06 10:01:33 +00:00
# Enable TPM for Windows 11
2021-10-19 15:38:43 +00:00
if [ "${OS}" == "windows" ] && [ "${RELEASE}" -ge 11 ]; then
2021-10-06 10:01:33 +00:00
echo "tpm=\"on\"" >> "${OS}-${RELEASE}.conf"
fi
fi
start_vm_info
}
function get_elementary() {
2021-10-19 13:58:57 +00:00
local ISO=""
local URL=""
validate_release "releases_elementary"
2021-10-19 13:49:47 +00:00
ISO="elementaryos-${RELEASE}-stable.20211005.iso"
URL="https://ams3.dl.elementary.io/download/MTYzNDU5MDA5NA==/${ISO}"
2021-10-19 13:49:47 +00:00
web_get "${URL}" "${VM_PATH}"
make_vm_config "${ISO}"
}
function get_freebsd() {
2021-10-21 00:13:43 +00:00
local HASH=""
2021-10-19 13:59:21 +00:00
local ISO=""
local URL=""
2021-10-07 15:36:38 +00:00
validate_release "releases_freebsd"
2021-10-19 13:59:21 +00:00
ISO="FreeBSD-${RELEASE}-RELEASE-amd64-dvd1.iso"
2021-10-21 00:13:43 +00:00
HASH=$(wget -q -O- "https://download.freebsd.org/ftp/releases/amd64/amd64/ISO-IMAGES/${RELEASE}/CHECKSUM.SHA512-FreeBSD-${RELEASE}-RELEASE-amd64" | grep '('"${ISO}"')' | cut -d' ' -f4)
2021-10-19 13:59:21 +00:00
URL="https://download.freebsd.org/ftp/releases/amd64/amd64/ISO-IMAGES/${RELEASE}/${ISO}"
2021-10-19 13:49:47 +00:00
web_get "${URL}" "${VM_PATH}"
2021-10-21 00:13:43 +00:00
check_hash "${ISO}" "${HASH}"
2021-10-19 13:49:47 +00:00
make_vm_config "${ISO}"
}
2021-10-13 19:12:33 +00:00
function get_fedora() {
2021-10-19 14:01:43 +00:00
local FEDORA_RELEASE=""
local FEDORA_VERSIONS=""
local HASH=""
2021-10-19 14:01:43 +00:00
local ISO=""
2021-10-13 19:12:33 +00:00
local URL=""
2021-10-19 14:01:43 +00:00
local VERSION_NUM=""
validate_release "releases_fedora"
2021-10-13 19:12:33 +00:00
FEDORA_VERSIONS=$(wget -q -O- "https://getfedora.org/releases.json" | jq '.[] | select((.variant=="Workstation" or .variant=="Spins") and .arch=="x86_64")')
2021-10-19 14:01:43 +00:00
if [[ "${RELEASE}" == *"beta"* ]]; then
VERSION_NUM=${RELEASE%"_beta"}
FEDORA_RELEASE=$(echo "${FEDORA_VERSIONS}" | jq -c '. | select(.version | contains("Beta"))' | jq '. | select(.variant=="Workstation")')
2021-10-13 19:12:33 +00:00
ISO="Fedora-Workstation-Live-x86_64-${VERSION_NUM}_Beta-1.2.iso"
else
2021-10-19 14:01:43 +00:00
FEDORA_RELEASE=$(echo "${FEDORA_VERSIONS}" | jq '. | select(.variant=="Workstation" and .version=="'${RELEASE}'")')
ISO="Fedora-Workstation-Live-x86_64-${RELEASE}-1.2.iso"
2021-10-13 19:12:33 +00:00
fi
2021-10-15 00:45:05 +00:00
2021-10-19 13:49:47 +00:00
URL=$(echo "${FEDORA_RELEASE}" | jq -r '.link')
HASH=$(echo "${FEDORA_RELEASE}" | jq -r '.sha256')
2021-10-19 13:49:47 +00:00
web_get "${URL}" "${VM_PATH}"
2021-10-19 19:34:03 +00:00
check_hash "${ISO}" "${HASH}"
2021-10-19 13:49:47 +00:00
make_vm_config "${ISO}"
2021-10-13 19:12:33 +00:00
}
function get_linuxmint() {
local FLAVOR=""
2021-10-20 23:54:45 +00:00
local HASH=""
local ISO=""
local URL=""
validate_release "releases_linuxmint"
FLAVOR=$(echo "${OS}" | cut -d'-' -f2)
ISO="linuxmint-${RELEASE}-${FLAVOR}-64bit.iso"
2021-10-20 23:54:45 +00:00
HASH=$(wget -q -O- "https://mirror.bytemark.co.uk/linuxmint/stable/${RELEASE}/sha256sum.txt" | grep "${ISO}" | cut -d' ' -f1)
URL="https://mirror.bytemark.co.uk/linuxmint/stable/${RELEASE}/${ISO}"
2021-10-19 13:49:47 +00:00
web_get "${URL}" "${VM_PATH}"
2021-10-20 23:54:45 +00:00
check_hash "${ISO}" "${HASH}"
2021-10-19 13:49:47 +00:00
make_vm_config "${ISO}"
}
function get_openbsd() {
2021-10-20 22:22:35 +00:00
local HASH=""
local ISO=""
local URL=""
2021-10-20 22:22:35 +00:00
validate_release "releases_openbsd"
ISO="install${RELEASE//\./}.iso"
URL="https://cdn.openbsd.org/pub/OpenBSD/${RELEASE}/amd64/${ISO}"
HASH=$(wget -q -O- "https://cdn.openbsd.org/pub/OpenBSD/${RELEASE}/amd64/SHA256" | grep "${ISO}" | cut -d' ' -f4)
web_get "${URL}" "${VM_PATH}"
check_hash "${ISO}" "${HASH}"
make_vm_config "${ISO}"
}
2021-10-16 18:27:45 +00:00
function get_opensuse() {
2021-10-20 23:56:25 +00:00
local HASH=""
2021-10-19 14:00:07 +00:00
local ISO=""
2021-10-16 18:27:45 +00:00
local URL=""
validate_release "releases_opensuse"
2021-10-19 14:00:07 +00:00
if [ "${RELEASE}" == "tumbleweed" ]; then
2021-10-16 18:27:45 +00:00
ISO="openSUSE-Tumbleweed-DVD-x86_64-Current.iso"
2021-10-19 14:00:07 +00:00
URL="https://download.opensuse.org/tumbleweed/iso/${ISO}"
2021-10-20 23:56:25 +00:00
HASH=$(wget -q -O- "${URL}.sha256" | cut -d' ' -f1)
2021-10-19 14:00:07 +00:00
elif [ "${RELEASE}" == "microos" ]; then
2021-10-18 11:30:06 +00:00
ISO="openSUSE-MicroOS-DVD-x86_64-Current.iso"
2021-10-19 14:00:07 +00:00
URL="https://download.opensuse.org/tumbleweed/iso/${ISO}"
2021-10-20 23:56:25 +00:00
HASH=$(wget -q -O- "${URL}.sha256" | cut -d' ' -f1)
2021-10-16 18:27:45 +00:00
else
2021-10-19 14:00:07 +00:00
ISO="openSUSE-Leap-${RELEASE}-DVD-x86_64.iso"
URL="https://download.opensuse.org/distribution/leap/${RELEASE}/iso/${ISO}"
2021-10-20 23:56:25 +00:00
HASH=$(wget -q -O- "${URL}.sha256" | cut -d' ' -f1)
2021-10-16 18:27:45 +00:00
fi
2021-10-19 13:49:47 +00:00
web_get "${URL}" "${VM_PATH}"
2021-10-20 23:56:25 +00:00
check_hash "${ISO}" "${HASH}"
2021-10-19 13:49:47 +00:00
make_vm_config "${ISO}"
2021-10-16 18:27:45 +00:00
}
function get_macos() {
local CWD=""
local MACRECOVERY=""
case ${RELEASE} in
high-sierra)
BOARD_ID="Mac-7BA5B2D9E42DDD94"
MLB="00000000000J80300";;
2021-09-28 14:26:10 +00:00
mojave)
BOARD_ID="Mac-7BA5B2DFE22DDD8C"
MLB="00000000000KXPG00";;
catalina)
BOARD_ID="Mac-CFF7D910A743CAAF"
MLB="00000000000PHCD00";;
big-sur)
BOARD_ID="Mac-E43C1C25D4880AD6"
MLB="00000000000000000";;
*) echo "ERROR! Unknown release: ${RELEASE}"
releases_macos
exit 1;;
esac
# Use a bundled macrecovery if possible
CWD="$(dirname ${0})"
2021-10-05 16:11:49 +00:00
if [ -x "${CWD}/macrecovery" ]; then
MACRECOVERY="${CWD}/macrecovery"
elif [ -x /usr/bin/macrecovery ]; then
MACRECOVERY="/usr/bin/macrecovery"
else
web_get "https://raw.githubusercontent.com/acidanthera/OpenCorePkg/master/Utilities/macrecovery/macrecovery.py" "${HOME}/.quickemu"
MACRECOVERY="python3 ${HOME}/.quickemu/macrecovery.py"
sed -i 's/\<env python\>/env python3/g' "${MACRECOVERY}"
fi
if [ -z "${MACRECOVERY}" ]; then
echo "ERROR! Can not find a usable macrecovery.py."
exit 1
fi
# Get firmware
web_get "https://github.com/kholia/OSX-KVM/raw/master/OpenCore-Catalina/OpenCore.qcow2" "${VM_PATH}"
web_get "https://github.com/kholia/OSX-KVM/raw/master/OVMF_CODE.fd" "${VM_PATH}"
if [ ! -e "${VM_PATH}/OVMF_VARS-1024x768.fd" ]; then
web_get "https://github.com/kholia/OSX-KVM/raw/master/OVMF_VARS-1024x768.fd" "${VM_PATH}"
fi
if [ ! -e "${VM_PATH}/RecoveryImage.chunklist" ]; then
echo "Downloading ${RELEASE}..."
${MACRECOVERY} \
--board-id "${BOARD_ID}" \
--mlb "${MLB}" \
--basename RecoveryImage \
--outdir "${VM_PATH}" \
download
fi
if [ -e "${VM_PATH}/RecoveryImage.dmg" ] && [ ! -e "${VM_PATH}/RecoveryImage.img" ]; then
echo "Converting RecoveryImage..."
qemu-img convert "${VM_PATH}/RecoveryImage.dmg" -O raw "${VM_PATH}/RecoveryImage.img"
fi
make_vm_config RecoveryImage.img
}
function get_popos() {
local DRIVER="intel"
local HASH=""
2021-10-19 13:49:47 +00:00
local ISO=""
local URL=""
if [ -n "${1}" ]; then
DRIVER="${1}"
fi
validate_release "releases_popos"
URL=$(wget -q -O- "https://api.pop-os.org/builds/${RELEASE}/${DRIVER}" | jq ".url")
URL="${URL//\"/}"
ISO=$(echo "${URL}" | sed -e "s/.*\/\([^\/]*\)$/\1/")
HASH=$(wget -q -O- "https://api.pop-os.org/builds/${RELEASE}/${DRIVER}" | jq ".sha_sum")
HASH="${HASH//\"/}"
2021-10-19 13:49:47 +00:00
web_get "${URL}" "${VM_PATH}"
check_hash "${ISO}" "${HASH}"
2021-10-19 13:49:47 +00:00
make_vm_config "${ISO}"
}
function get_ubuntu() {
local DEVEL="daily-live"
local ISO=""
local HASH=""
local PROJECT=""
local URL=""
case ${OS} in
kubuntu|lubuntu|ubuntu|ubuntu-budgie|ubuntu-mate|xubuntu)
PROJECT="${OS}";;
ubuntu-kylin)
PROJECT="ubuntukylin";;
ubuntu-studio)
PROJECT="ubuntustudio"
DEVEL="dvd";;
*) echo "ERROR! ${OS} is not a recognised Ubuntu flavour."
exit 1;;
esac
validate_release "releases_ubuntu"
if [ "${RELEASE}" == "devel" ]; then
URL="http://cdimage.ubuntu.com/${PROJECT}/${DEVEL}/current"
elif [ "${PROJECT}" == "ubuntu" ]; then
URL="http://releases.ubuntu.com/${RELEASE}"
else
URL="http://cdimage.ubuntu.com/${PROJECT}/releases/${RELEASE}/release"
fi
web_get "${URL}/SHA256SUMS" "${VM_PATH}"
ISO=$(grep 'desktop\|dvd' "${VM_PATH}/SHA256SUMS" | grep amd64 | cut -d' ' -f2 | sed 's|*||g')
HASH=$(cat "${VM_PATH}/SHA256SUMS" | cut -d' ' -f1)
if [ "${RELEASE}" == "devel" ]; then
zsync_get "${URL}/${ISO}" "${VM_PATH}" "${OS}-${RELEASE}.iso"
make_vm_config "${OS}-${RELEASE}.iso"
else
web_get "${URL}/${ISO}" "${VM_PATH}"
2021-10-19 19:34:03 +00:00
check_hash "${ISO}" "${HASH}"
make_vm_config "${ISO}"
fi
}
2021-09-28 04:03:16 +00:00
# Adapted from https://gist.github.com/hongkongkiwi/15a5bf16437315df256c118c163607cb
function get_windows() {
local ARCH="x64"
local LANG_CODE="en"
local LATEST_WINDOWS_VERSION=""
local WINDOWS_NAME=""
local VERSION_ID=""
local EDITION_ID=""
local LANGUAGE_ID=""
local FILE_NAME=""
local ARCH_ID=""
local DOWNLOAD_INFO=""
local DOWNLOAD_ID=""
local DOWNLOAD_URL=""
2021-10-19 14:14:03 +00:00
validate_release "releases_windows"
2021-09-28 04:03:16 +00:00
echo "Getting Windows ${RELEASE} URL..."
2021-10-05 19:08:13 +00:00
WINDOWS_VERSIONS=$(wget -q -O- "https://tb.rg-adguard.net/php/get_version.php?type_id=1" | jq '.versions | sort_by(-(.version_id | tonumber))')
LATEST_WINDOWS_VERSION=$(echo "${WINDOWS_VERSIONS}" | jq -c 'map(select(.name | contains("Windows '${RELEASE}'")))[0]')
2021-10-05 19:08:13 +00:00
2021-09-28 04:03:16 +00:00
WINDOWS_NAME=$(echo "${LATEST_WINDOWS_VERSION}" | jq -r .name)
VERSION_ID=$(echo "${LATEST_WINDOWS_VERSION}" | jq -r .version_id)
2021-10-05 19:08:13 +00:00
case ${RELEASE} in
8) EDITION_ID=$(wget -q -O- "https://tb.rg-adguard.net/php/get_edition.php?version_id=${VERSION_ID}&lang=name_${LANG_CODE}" | jq -r '.editions[] | select(.name_'${LANG_CODE}'=="Windows 8.1 Pro + Core").edition_id');;
10|11) EDITION_ID=$(wget -q -O- "https://tb.rg-adguard.net/php/get_edition.php?version_id=${VERSION_ID}&lang=name_${LANG_CODE}" | jq -r '.editions[] | select(.name_'${LANG_CODE}'=="Windows '${RELEASE}'").edition_id');;
2021-10-05 19:08:13 +00:00
esac
2021-09-28 04:03:16 +00:00
LANGUAGE_ID=$(wget -q -O- "https://tb.rg-adguard.net/php/get_language.php?edition_id=${EDITION_ID}&lang=name_${LANG_CODE}" | jq -r '.languages[] | select(.name_'${LANG_CODE}'=="'"${LANG_NAME}"'").language_id')
ARCH_INFO=$(wget -q -O- "https://tb.rg-adguard.net/php/get_arch.php?language_id=${LANGUAGE_ID}")
FILE_NAME=$(echo "${ARCH_INFO}" | jq -r '.archs[] | select(.name | contains("'${ARCH}'")).name')
ARCH_ID=$(echo "${ARCH_INFO}" | jq -r '.archs[] | select(.name | contains("'${ARCH}'")).arch_id')
DOWNLOAD_INFO=$(wget -q -O- "https://tb.rg-adguard.net/dl.php?fileName=${ARCH_ID}&lang=en")
DOWNLOAD_SHA1=$(echo "${DOWNLOAD_INFO}" | sed -e 's/<[^>]*>//g' | grep -o -P '(?<=SHA1: ).*(?= expire)' | sed 's/Link//')
2021-09-28 04:03:16 +00:00
DOWNLOAD_ID=$(echo "${DOWNLOAD_INFO}" | grep -oP '(?<=https:\/\/tb\.rg-adguard\.net/dl\.php\?go=)[0-9a-z]+')
DOWNLOAD_URL="https://tb.rg-adguard.net/dl.php?go=${DOWNLOAD_ID}"
echo "Downloading ${WINDOWS_NAME}..."
web_get "${DOWNLOAD_URL}" "${VM_PATH}" "${FILE_NAME}"
2021-10-09 15:10:58 +00:00
# Windows 10 doesn't include a SHA1, so only check the integrity if the SHA1 is available.
if [ -n "${DOWNLOAD_SHA1}" ]; then
2021-10-19 19:34:03 +00:00
check_hash "${FILE_NAME}" "${DOWNLOAD_SHA1}"
2021-10-09 15:10:58 +00:00
fi
2021-09-28 04:03:16 +00:00
web_get "https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso" "${VM_PATH}"
2021-10-19 15:39:21 +00:00
rm -f "${VM_PATH}/unattended.iso"
case ${RELEASE} in
10|11)
echo "Making unattended.iso"
mkdir -p "${VM_PATH}/unattended" 2>/dev/null
web_get https://www.spice-space.org/download/windows/spice-webdavd/spice-webdavd-x64-latest.msi "${VM_PATH}/unattended"
web_get https://www.spice-space.org/download/windows/vdagent/vdagent-win-0.10.0/spice-vdagent-x64-0.10.0.msi "${VM_PATH}/unattended"
web_get https://www.spice-space.org/download/windows/usbdk/UsbDk_1.0.22_x64.msi "${VM_PATH}/unattended"
unattended_windows "${VM_PATH}/unattended/autounattend.xml"
mkisofs -quiet -l -o "${VM_PATH}/unattended.iso" "${VM_PATH}/unattended/"
;;
esac
2021-09-28 04:03:16 +00:00
make_vm_config "${FILE_NAME}" "virtio-win.iso"
}
LANGS=()
languages_windows
if [ -n "${1}" ]; then
OS="${1,,}"
2021-10-19 23:35:00 +00:00
if [ "${OS}" == "list" ] || [ "${OS}" == "list_csv" ]; then
list_csv
elif [ "${OS}" == "list_json" ]; then
list_json
fi
else
2021-10-19 13:56:45 +00:00
echo "ERROR! You must specify an operating system:"
os_support
exit 1
fi
if [ -n "${2}" ]; then
RELEASE="${2,,}"
2021-10-19 13:56:45 +00:00
VM_PATH="${OS}-${RELEASE}"
if [ "${OS}" == "elementary" ]; then
get_elementary
elif [ "${OS}" == "macos" ]; then
get_macos
elif [ "${OS}" == "freebsd" ]; then
get_freebsd
elif [ "${OS}" == "fedora" ]; then
get_fedora
elif [[ "${OS}" == *"linuxmint"* ]]; then
get_linuxmint
2021-10-20 22:22:35 +00:00
elif [ "${OS}" == "openbsd" ]; then
get_openbsd
2021-10-19 13:56:45 +00:00
elif [ "${OS}" == "opensuse" ]; then
get_opensuse
elif [ "${OS}" == "popos" ]; then
if [ -n "${3}" ]; then
DRIVER="${3}"
DRIVERS=(intel nvidia)
if [[ ! ${DRIVERS[*]} =~ ${DRIVER} ]]; then
echo "ERROR! ${DRIVER} is not a supported driver:"
for DRIVER in "${DRIVERS[@]}"; do
echo "${DRIVER}"
done
exit 1
fi
else
DRIVER="intel"
fi
VM_PATH="${OS}-${RELEASE}-${DRIVER}"
get_popos "${DRIVER}"
2021-10-19 13:56:45 +00:00
elif [[ "${OS}" == *"ubuntu"* ]]; then
get_ubuntu
elif [ "${OS}" == "windows" ]; then
if [ -n "${3}" ]; then
LANG_NAME="${3}"
if [[ ! ${LANGS[*]} =~ ${LANG_NAME} ]]; then
echo "ERROR! ${LANG_NAME} is not a supported language:"
for LANG in "${LANGS[@]}"; do
echo "${LANG}"
done
exit 1
fi
else
LANG_NAME="English International"
fi
get_windows "${LANG_NAME}"
else
echo "ERROR! ${OS} is unknown:"
os_support
exit 1
fi
else
2021-10-19 13:56:45 +00:00
echo "ERROR! You must specify a release for ${OS}:"
if [ "${OS}" == "elementary" ]; then
releases_elementary
elif [ "${OS}" == "freebsd" ]; then
2021-10-07 15:36:10 +00:00
releases_freebsd
2021-10-16 18:09:39 +00:00
elif [ "${OS}" == "fedora" ]; then
releases_fedora
2021-10-19 13:56:45 +00:00
elif [[ "${OS}" == *"linuxmint"* ]]; then
releases_linuxmint
2021-10-16 18:27:45 +00:00
elif [ "${OS}" == "opensuse" ]; then
releases_opensuse
elif [ "${OS}" == "openbsd" ]; then
releases_openbsd
2021-10-07 15:36:10 +00:00
elif [ "${OS}" == "macos" ]; then
releases_macos
elif [ "${OS}" == "popos" ]; then
releases_popos
elif [[ "${OS}" == *"ubuntu"* ]]; then
releases_ubuntu
2021-10-05 22:51:57 +00:00
elif [ "${OS}" == "windows" ]; then
2021-09-28 04:03:16 +00:00
releases_windows
fi
exit 1
fi