From 93a5a49d522294fbafc7ba9c7c439d96c070b36f Mon Sep 17 00:00:00 2001 From: Martin Wimpress Date: Mon, 21 Feb 2022 09:19:07 +0000 Subject: [PATCH] Refactor OS and releases parser Makes quickget much easier to maintain. Add "editions" generators for those OSs that have editions, such as Linux Mint and MX Linux. Use introspection to automatically parse editions and call the appropriate get_() and releases_() functions. --- quickget | 337 +++++++++++++++---------------------------------------- 1 file changed, 88 insertions(+), 249 deletions(-) diff --git a/quickget b/quickget index fdc6039..0659669 100755 --- a/quickget +++ b/quickget @@ -5,23 +5,28 @@ # 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(); (only if required) -# 5. Create a get_newos() function that does something like this: +# 4. If the OS has "editions" (Linux Mint for example), create editions_newos() generator +# 5. Add the new OS to make_vm_config(); (only if required) +# 6. Create a get_newos() function that does something like this: # function get_newos() { +# local EDITION="" # local HASH="" # local ISO="" # local URL="" # +# if [ -n "${1}" ]; then +# EDITION="${1}" +# fi +# # validate_release "releases_newos" # ISO="newos-${RELEASE}-amd64.iso" # URL="https://www.newos.org/download" # web_get "${URL}/${ISO}" "${VM_PATH}" # web_get "${URL}/SHA256SUMS" "${VM_PATH}" -# HASH=$(cat "${VM_PATH}/SHA256SUMS" | cut -d' ' -f1) +# HASH=$(cut -d' ' -f1 < "${VM_PATH}/SHA256SUMS") # check_hash "${ISO}" "${HASH}" # make_vm_config "${ISO}" # } -# 6. Add new OS to the argument parser at the bottom of the script function cleanup() { if [ -n "$(jobs -p)" ]; then @@ -132,28 +137,13 @@ function list_csv() { DOWNLOADER="${DL}" fi - if [ "${OS}" == "windows" ]; then - for OPTION in "${LANGS[@]}"; do - echo "${DISPLAY_NAME},${OS},${RELEASE},${OPTION},${DOWNLOADER},${PNG},${SVG}" - done - elif [ "${OS}" == "debian" ]; then - for OPTION in cinnamon gnome kde lxde lxqt mate standard xfce; do - echo "${DISPLAY_NAME},${OS},${RELEASE},${OPTION},${DOWNLOADER},${PNG},${SVG}" - done - elif [ "${OS}" == "linuxmint" ]; then - for OPTION in cinnamon mate xfce; do - echo "${DISPLAY_NAME},${OS},${RELEASE},${OPTION},${DOWNLOADER},${PNG},${SVG}" - done - elif [ "${OS}" == "mxlinux" ]; then - for OPTION in xfce kde fluxbox; do - echo "${DISPLAY_NAME},${OS},${RELEASE},${OPTION},${DOWNLOADER},${PNG},${SVG}" - done - elif [ "${OS}" == "nixos" ]; then - for OPTION in gnome plasma5 minimal; do + # If the OS has an editions_() function, use it. + if [[ $(type -t "editions_${OS}") == function ]]; then + for OPTION in $(editions_"${OS}"); do echo "${DISPLAY_NAME},${OS},${RELEASE},${OPTION},${DOWNLOADER},${PNG},${SVG}" done - elif [ "${OS}" == "popos" ]; then - for OPTION in intel nvidia; do + elif [ "${OS}" == "windows" ]; then + for OPTION in "${LANGS[@]}"; do echo "${DISPLAY_NAME},${OS},${RELEASE},${OPTION},${DOWNLOADER},${PNG},${SVG}" done else @@ -246,6 +236,17 @@ function releases_debian() { echo 11.2.0 } +function editions_debian() { + echo standard \ + cinnamon \ + gnome \ + kde \ + lxde \ + lxqt \ + mate \ + xfce +} + function releases_cachyos() { echo 2022.01.09 \ 2022.02.11 @@ -317,15 +318,34 @@ function releases_linuxmint(){ echo 20.2 } +function editions_linuxmint(){ + echo cinnamon \ + mate \ + xfce +} + function releases_mxlinux(){ echo 21 } +function editions_mxlinux(){ + echo xfce \ + kde \ + fluxbox +} + function releases_nixos(){ echo 21.05 \ 21.11 } +function editions_nixos(){ + echo gnome \ + plasma5 \ + minimal +} + + function releases_openbsd(){ echo 7.0 } @@ -374,6 +394,11 @@ function releases_popos() { 21.10 } +function editions_popos() { + echo intel \ + nvidia +} + function releases_regolith() { echo 1.6.0_hirsute \ 1.6.0_focal \ @@ -803,17 +828,17 @@ function get_cachyos() { } function get_debian() { - local DESKTOP="standard" + local EDITION="" local HASH="" local ISO="" local URL="https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid" if [ -n "${1}" ]; then - DESKTOP="${1}" + EDITION="${1}" fi validate_release "releases_debian" - ISO="debian-live-${RELEASE}-amd64-${DESKTOP}.iso" + ISO="debian-live-${RELEASE}-amd64-${EDITION}.iso" HASH=$(wget -q -O- "${URL}/SHA512SUMS" | grep "${ISO}" | cut -d' ' -f1) web_get "${URL}/${ISO}" "${VM_PATH}" check_hash "${ISO}" "${HASH}" @@ -953,19 +978,18 @@ function get_kolibrios() { } function get_linuxmint() { - local DESKTOP="cinnamon" + local EDITION="" local HASH="" local ISO="" local URL="" if [ -n "${1}" ]; then - DESKTOP="${1}" + EDITION="${1}" fi validate_release "releases_linuxmint" - FLAVOR=$(echo "${OS}" | cut -d'-' -f2) URL="https://mirror.bytemark.co.uk/linuxmint/stable/${RELEASE}" - ISO="linuxmint-${RELEASE}-${DESKTOP}-64bit.iso" + ISO="linuxmint-${RELEASE}-${EDITION}-64bit.iso" HASH=$(wget -q -O- "${URL}/${RELEASE}/sha256sum.txt" | grep "${ISO}" | cut -d' ' -f1) web_get "${URL}/${ISO}" "${VM_PATH}" check_hash "${ISO}" "${HASH}" @@ -996,17 +1020,17 @@ function get_manjaro() { } function get_mxlinux() { - local DESKTOP="xfce" + local EDITION="" local HASH="" local ISO="" local URL="" if [ -n "${1}" ]; then - DESKTOP="${1}" + EDITION="${1}" fi validate_release "releases_mxlinux" - case ${DESKTOP} in + case ${EDITION} in xfce) URL="https://sourceforge.net/projects/mx-linux/files/Final/Xfce" ISO="MX-${RELEASE}_x64.iso" @@ -1027,19 +1051,18 @@ function get_mxlinux() { } function get_nixos() { - local DESKTOP="gnome" + local EDITION="" local HASH="" local ISO="" local URL="" if [ -n "${1}" ]; then - DESKTOP="${1}" + EDITION="${1}" fi validate_release "releases_nixos" URL="https://channels.nixos.org/nixos-${RELEASE}" - FLAVOR=$(echo "${OS}" | cut -d'-' -f2) - ISO="latest-nixos-${DESKTOP}-x86_64-linux.iso" + ISO="latest-nixos-${EDITION}-x86_64-linux.iso" HASH=$(wget -q -O- "${URL}/${ISO}.sha256" | cut -d' ' -f1) web_get "${URL}/${ISO}" "${VM_PATH}" check_hash "${ISO}" "${HASH}" @@ -1848,239 +1871,55 @@ else exit 1 fi +if [[ ! $(os_support) =~ ${OS} ]]; then + echo -e "ERROR! ${OS} is not a supported OS.\n" + os_support + exit 1 +fi + if [ -n "${2}" ]; then RELEASE="${2,,}" VM_PATH="${OS}-${RELEASE}" - if [ "${OS}" == "alma" ]; then - get_alma - elif [ "${OS}" == "alpine" ]; then - get_alpine - elif [ "${OS}" == "android" ]; then - get_android - elif [ "${OS}" == "archlinux" ]; then - get_archlinux - elif [ "${OS}" == "arcolinux" ]; then - get_arcolinux - elif [ "${OS}" == "void" ]; then - get_void - elif [ "${OS}" == "debian" ]; then - if [ -n "${3}" ]; then - DESKTOP="${3}" - DESKTOPS=(cinnamon gnome kde lxde lxqt mate standard xfce) - if [[ ! ${DESKTOPS[*]} =~ ${DESKTOP} ]]; then - echo "ERROR! ${DESKTOP} is not a supported Desktop Environment:" - for DESKTOP in "${DESKTOPS[@]}"; do - echo "${DESKTOP}" - done - exit 1 - fi - else - DESKTOP="standard" - fi - VM_PATH="${OS}-${RELEASE}-${DESKTOP}" - get_debian "${DESKTOP}" - elif [ "${OS}" == "devuan" ]; then - get_devuan - elif [ "${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}" == "garuda" ]; then - get_garuda - elif [ "${OS}" == "cachyos" ]; then - get_cachyos - elif [ "${OS}" == "gentoo" ]; then - get_gentoo - elif [ "${OS}" == "haiku" ]; then - get_haiku - elif [ "${OS}" == "kali" ]; then - get_kali - elif [ "${OS}" == "kdeneon" ]; then - get_kdeneon - elif [ "${OS}" == "kolibrios" ]; then - get_kolibrios - elif [ "${OS}" == "linuxmint" ]; then - if [ -n "${3}" ]; then - DESKTOP="${3}" - DESKTOPS=(cinnamon mate xfce) - if [[ ! ${DESKTOPS[*]} =~ ${DESKTOP} ]]; then - echo "ERROR! ${DESKTOP} is not a supported Desktop Environment:" - for DESKTOP in "${DESKTOPS[@]}"; do - echo "${DESKTOP}" - done - exit 1 - fi - else - DESKTOP="cinnamon" - fi - VM_PATH="${OS}-${RELEASE}-${DESKTOP}" - get_linuxmint ${DESKTOP} - elif [ "${OS}" == "manjaro" ]; then - get_manjaro - elif [ "${OS}" == "mxlinux" ]; then - if [ -n "${3}" ]; then - DESKTOP="${3}" - DESKTOPS=(xfce kde fluxbox) - if [[ ! ${DESKTOPS[*]} =~ ${DESKTOP} ]]; then - echo "ERROR! ${DESKTOP} is not a supported Desktop Environment:" - for DESKTOP in "${DESKTOPS[@]}"; do - echo "${DESKTOP}" - done - exit 1 - fi - else - DESKTOP="xfce" - fi - VM_PATH="${OS}-${RELEASE}-${DESKTOP}" - get_mxlinux "${DESKTOP}" - elif [ "${OS}" == "nixos" ]; then - if [ -n "${3}" ]; then - DESKTOP="${3}" - DESKTOPS=(gnome plasma5 minimal) - if [[ ! ${DESKTOPS[*]} =~ ${DESKTOP} ]]; then - echo "ERROR! ${DESKTOP} is not a supported Desktop Environment:" - for DESKTOP in "${DESKTOPS[@]}"; do - echo "${DESKTOP}" - done - exit 1 - fi - else - DESKTOP="gnome" - fi - VM_PATH="${OS}-${RELEASE}-${DESKTOP}" - get_nixos ${DESKTOP} - elif [ "${OS}" == "openbsd" ]; then - get_openbsd - elif [ "${OS}" == "opensuse" ]; then - get_opensuse - elif [ "${OS}" == "oraclelinux" ]; then - get_oraclelinux - elif [ "${OS}" == "slackware" ]; then - get_slackware - elif [ "${OS}" == "popos" ]; then + + # If the OS has an editions_() function, use it. + if [[ $(type -t "editions_${OS}") == function ]]; then + EDITIONS=($(editions_${OS})) + EDITION=${EDITIONS[0]} 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}" + EDITION="${3}" + if [[ ! ${EDITIONS[*]} =~ ${EDITION} ]]; then + echo -e "ERROR! ${EDITION} is not a supported $(pretty_name "${OS}") edition:\n" + for EDITION in "${EDITIONS[@]}"; do + echo -n "${EDITION} " done exit 1 fi - else - DRIVER="intel" fi - VM_PATH="${OS}-${RELEASE}-${DRIVER}" - get_popos "${DRIVER}" - elif [ "${OS}" == "regolith" ]; then - get_regolith - elif [ "${OS}" == "rockylinux" ]; then - get_rocky - elif [ "${OS}" == "solus" ]; then - get_solus - elif [ "${OS}" == "tails" ]; then - get_tails + VM_PATH="${OS}-${RELEASE}-${EDITION}" + get_${OS} "${EDITION}" elif [[ "${OS}" == *"ubuntu"* ]]; then - get_ubuntu + get_ubuntu elif [ "${OS}" == "windows" ]; then + LANG_NAME="English International" if [ -n "${3}" ]; then LANG_NAME="${3}" if [[ ! ${LANGS[*]} =~ "${LANG_NAME}" ]]; then - echo "ERROR! ${LANG_NAME} is not a supported language:" + echo -e "ERROR! ${LANG_NAME} is not a supported Windows language:\n" for LANG in "${LANGS[@]}"; do - echo "${LANG}" + echo -n "${LANG} " done exit 1 fi - else - LANG_NAME="English International" fi get_windows "${LANG_NAME}" - elif [ "${OS}" == "zorin" ]; then - get_zorin else - echo "ERROR! ${OS} is unknown:" - os_support - exit 1 + get_"${OS}" fi else echo -n "ERROR! You must specify a release: " - if [ "${OS}" == "alma" ]; then - releases_alma - elif [ "${OS}" == "alpine" ]; then - releases_alpine - elif [ "${OS}" == "android" ]; then - releases_android - elif [ "${OS}" == "archlinux" ]; then - releases_archlinux - elif [ "${OS}" == "arcolinux" ]; then - releases_arcolinux - elif [ "${OS}" == "debian" ]; then - releases_debian - elif [ "${OS}" == "devuan" ]; then - releases_devuan - elif [ "${OS}" == "elementary" ]; then - releases_elementary - elif [ "${OS}" == "freebsd" ]; then - releases_freebsd - elif [ "${OS}" == "fedora" ]; then - releases_fedora - elif [ "${OS}" == "garuda" ]; then - releases_garuda - elif [ "${OS}" == "cachyos" ]; then - releases_cachyos - elif [ "${OS}" == "gentoo" ]; then - releases_gentoo - elif [ "${OS}" == "haiku" ]; then - releases_haiku - elif [ "${OS}" == "kali" ]; then - releases_kali - elif [ "${OS}" == "kolibrios" ]; then - releases_kolibrios - elif [ "${OS}" == "linuxmint" ]; then - releases_linuxmint - elif [ "${OS}" == "manjaro" ]; then - releases_manjaro - elif [ "${OS}" == "mxlinux" ]; then - releases_mxlinux - elif [ "${OS}" == "nixos" ]; then - releases_nixos - elif [ "${OS}" == "opensuse" ]; then - releases_opensuse - elif [ "${OS}" == "oraclelinux" ]; then - releases_oraclelinux - elif [ "${OS}" == "openbsd" ]; then - releases_openbsd - elif [ "${OS}" == "macos" ]; then - releases_macos - elif [ "${OS}" == "popos" ]; then - releases_popos - elif [ "${OS}" == "regolith" ]; then - releases_regolith - elif [ "${OS}" == "rockylinux" ]; then - releases_rockylinux - elif [ "${OS}" == "slackware" ]; then - releases_slackware - elif [ "${OS}" == "solus" ]; then - releases_solus - elif [ "${OS}" == "tails" ]; then - releases_tails - elif [[ "${OS}" == *"ubuntu"* ]]; then - releases_ubuntu - elif [ "${OS}" == "void" ]; then - releases_void - elif [ "${OS}" == "windows" ]; then - releases_windows - elif [ "${OS}" == "zorin" ]; then - releases_zorin - else - echo "${OS} is unknown" - os_support - fi + case ${OS} in + *ubuntu*) releases_ubuntu;; + *) releases_"${OS}";; + esac exit 1 fi