-
-
Save pkutzner/9b86bf05ce14d3efc477a0e4a73ba6bd to your computer and use it in GitHub Desktop.
Download VMware Workstation for Linux without a Broadcom Account
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
# Download VMware Workstation for Linux | |
# Handles legacy versions (12.x - 17.6.3) from Cloudflare CDN cache and | |
# newer versions (17.6.4+) from Archive.org. | |
# | |
# Use '-k' to keep the CDN download file compressed, exiting after download. (Ignored for v17.6.4+) | |
# Use '-v <Version>' to specify desired version directly. | |
BASE_URL="https://softwareupdate-prod.broadcom.com/cds/vmw-desktop/" | |
CDN_MIRROR="softwareupdate-prod.broadcom.com:443:softwareupdate-prod.broadcom.com.cdn.cloudflare.net:443" | |
declare -A ARCHIVE_URLS | |
ARCHIVE_URLS["17.6.4"]="https://archive.org/download/vmware-workstation-full-17.6.4-24832109.x86_64/VMware-Workstation-Full-17.6.4-24832109.x86_64.bundle" | |
# Cloudflare CDN metadata | |
read -r -d '' XML_DATA << 'EOF' | |
<metalist> | |
<metadata><version>12.0.0</version><url>ws/12.0.0/2985596/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.0.1/3160714/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.1.0/3272444/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.1.1/3770994/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.5.0/4352439/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.5.1/4542065/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.5.2/4638234/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.5.3/5115892/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.5.4/5192485/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.5.5/5234757/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.5.6/5528349/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.5.7/5813279/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.5.8/7098237/linux/core/</url></metadata> | |
<metadata><version>12.0.0</version><url>ws/12.5.9/7535481/linux/core/</url></metadata> | |
<metadata><version>14.0.0</version><url>ws/14.0.0/6661328/linux/core/</url></metadata> | |
<metadata><version>14.0.0</version><url>ws/14.1.0/7370693/linux/core/</url></metadata> | |
<metadata><version>14.0.0</version><url>ws/14.1.1/7528167/linux/core/</url></metadata> | |
<metadata><version>14.0.0</version><url>ws/14.1.2/8497320/linux/core/</url></metadata> | |
<metadata><version>14.0.0</version><url>ws/14.1.3/9474260/linux/core/</url></metadata> | |
<metadata><version>14.0.0</version><url>ws/14.1.4/10722678/linux/core/</url></metadata> | |
<metadata><version>14.0.0</version><url>ws/14.1.5/10950780/linux/core/</url></metadata> | |
<metadata><version>14.0.0</version><url>ws/14.1.6/12368378/linux/core/</url></metadata> | |
<metadata><version>14.0.0</version><url>ws/14.1.7/12989993/linux/core/</url></metadata> | |
<metadata><version>15.0.0</version><url>ws/15.0.0/10134415/linux/core/</url></metadata> | |
<metadata><version>15.0.0</version><url>ws/15.0.1/10737736/linux/core/</url></metadata> | |
<metadata><version>15.0.0</version><url>ws/15.0.2/10952284/linux/core/</url></metadata> | |
<metadata><version>15.0.0</version><url>ws/15.0.3/12422535/linux/core/</url></metadata> | |
<metadata><version>15.0.0</version><url>ws/15.0.4/12990004/linux/core/</url></metadata> | |
<metadata><version>15.0.0</version><url>ws/15.1.0/13591040/linux/core/</url></metadata> | |
<metadata><version>15.0.0</version><url>ws/15.5.0/14665864/linux/core/</url></metadata> | |
<metadata><version>15.0.0</version><url>ws/15.5.1/15018445/linux/core/</url></metadata> | |
<metadata><version>15.0.0</version><url>ws/15.5.2/15785246/linux/core/</url></metadata> | |
<metadata><version>15.0.0</version><url>ws/15.5.5/16285975/linux/core/</url></metadata> | |
<metadata><version>15.0.0</version><url>ws/15.5.6/16341506/linux/core/</url></metadata> | |
<metadata><version>15.0.0</version><url>ws/15.5.7/17171714/linux/core/</url></metadata> | |
<metadata><version>16.0.0</version><url>ws/16.0.0/16894299/linux/core/</url></metadata> | |
<metadata><version>16.0.0</version><url>ws/16.1.0/17198959/linux/core/</url></metadata> | |
<metadata><version>16.0.0</version><url>ws/16.1.1/17801498/linux/core/</url></metadata> | |
<metadata><version>16.0.0</version><url>ws/16.1.2/17966106/linux/core/</url></metadata> | |
<metadata><version>16.0.0</version><url>ws/16.2.0/18760230/linux/core/</url></metadata> | |
<metadata><version>16.0.0</version><url>ws/16.2.1/18811642/linux/core/</url></metadata> | |
<metadata><version>16.0.0</version><url>ws/16.2.3/19376536/linux/core/</url></metadata> | |
<metadata><version>16.0.0</version><url>ws/16.2.4/20089737/linux/core/</url></metadata> | |
<metadata><version>16.0.0</version><url>ws/16.2.5/20904516/linux/core/</url></metadata> | |
<metadata><version>17.0.0</version><url>ws/17.0.0/20800274/linux/core/</url></metadata> | |
<metadata><version>17.0.0</version><url>ws/17.0.1/21139696/linux/core/</url></metadata> | |
<metadata><version>17.0.0</version><url>ws/17.0.2/21581411/linux/core/</url></metadata> | |
<metadata><version>17.0.0</version><url>ws/17.5.0/22583795/linux/core/</url></metadata> | |
<metadata><version>17.0.0</version><url>ws/17.5.1/23298084/linux/core/</url></metadata> | |
<metadata><version>17.0.0</version><url>ws/17.5.2/23775571/linux/core/</url></metadata> | |
<metadata><version>17.0.0</version><url>ws/17.6.0/24238078/linux/core/</url></metadata> | |
<metadata><version>17.0.0</version><url>ws/17.6.1/24319023/linux/core/</url></metadata> | |
<metadata><version>17.0.0</version><url>ws/17.6.2/24409262/linux/core/</url></metadata> | |
<metadata><version>17.0.0</version><url>ws/17.6.3/24583834/linux/core/</url></metadata> | |
</metalist> | |
EOF | |
KEEP_COMPRESSED=false | |
USER_VERSION="" | |
VERSION="" | |
BUILD="" | |
while getopts "kv:" opt; do | |
case $opt in | |
k) KEEP_COMPRESSED=true ;; | |
v) USER_VERSION=$OPTARG ;; | |
*) echo "Usage: $0 [-k] [-v VERSION]" >&2; exit 1 ;; | |
esac | |
done | |
requirements_check() { | |
command -v curl >/dev/null 2>&1 || { echo "Error: curl is required but not installed." >&2; exit 1; } | |
command -v grep >/dev/null 2>&1 || { echo "Error: grep is required but not installed." >&2; exit 1; } | |
command -v awk >/dev/null 2>&1 || { echo "Error: awk is required but not installed." >&2; exit 1; } | |
command -v sed >/dev/null 2>&1 || { echo "Error: sed is required but not installed." >&2; exit 1; } | |
command -v tar >/dev/null 2>&1 || { echo "Error: tar is required but not installed." >&2; exit 1; } | |
command -v sort >/dev/null 2>&1 || { echo "Error: sort is required but not installed." >&2; exit 1; } | |
} | |
requirements_check | |
if [[ $(uname | tr '[:upper:]' '[:lower:]') != "linux"* ]]; then | |
KEEP_COMPRESSED=true | |
echo "Warning: Not running on Linux. Forcing keep compressed." >&2 | |
fi | |
if sort --version 2>/dev/null | grep -q "GNU coreutils"; then | |
SORT_CMD="sort -V" | |
SORT_UNIQUE_CMD="sort -uV" | |
else | |
SORT_CMD="sort -t. -k1,1n -k2,2n -k3,3n -k4,4n" | |
SORT_UNIQUE_CMD="sort -t. -k1,1n -k2,2n -k3,3n -k4,4n -u" | |
fi | |
version_gte() { | |
printf '%s\n%s\n' "$1" "$2" | eval "$SORT_CMD" | head -n 1 | grep -q "^$2$" | |
} | |
get_all_available_versions() { | |
local cdn_versions | |
cdn_versions=$(echo "$XML_DATA" | grep -oP 'ws/\K[0-9]+\.[0-9]+\.[0-9]+' | eval "$SORT_UNIQUE_CMD") | |
local archive_versions | |
archive_versions=$(printf "%s\n" "${!ARCHIVE_URLS[@]}") | |
printf "%s\n%s" "$cdn_versions" "$archive_versions" | eval "$SORT_UNIQUE_CMD" | |
} | |
get_build_for_cdn_version() { | |
local target_version="$1" | |
echo "$XML_DATA" | grep "<url>ws/${target_version}/" | sed -n 's%.*<url>ws/'"$target_version"'/\([0-9]*\)/.*%\1%p' | |
} | |
if [[ -n "$USER_VERSION" ]]; then | |
VERSION="$USER_VERSION" | |
else | |
echo "Available versions:" | |
mapfile -t all_versions < <(get_all_available_versions) | |
[[ ${#all_versions[@]} -eq 0 ]] && { echo "No available versions found." >&2; exit 1; } | |
PS3="Select a version: " | |
select ver in "${all_versions[@]}"; do | |
[[ -n "$ver" ]] && { VERSION=$ver; break; } || echo "Invalid selection. Please try again." | |
done | |
fi | |
if [[ -v "ARCHIVE_URLS[$VERSION]" ]]; then | |
DOWNLOAD_URL="${ARCHIVE_URLS[$VERSION]}" | |
DOWNLOAD_DIR="${HOME}" | |
DOWNLOAD_FILE="${DOWNLOAD_DIR}/$(basename "${DOWNLOAD_URL}")" | |
echo "Selected new version: $VERSION" | |
echo "Downloading from Archive.org..." | |
if [[ "$KEEP_COMPRESSED" = true ]]; then | |
echo "Info: -k flag is ignored for versions 17.6.4 and newer as they are not compressed." | |
fi | |
curl -L --progress-bar -f -o "${DOWNLOAD_FILE}" "${DOWNLOAD_URL}" || { | |
echo "Error: Download failed for ${DOWNLOAD_URL}." >&2 | |
exit 1 | |
} | |
echo "Setting permissions..." | |
chmod +x "${DOWNLOAD_FILE}" | |
echo -e "\nFinished. You can now run the installer bundle." | |
echo "VMware Workstation bundle location: ${DOWNLOAD_FILE}" | |
else | |
BUILD=$(get_build_for_cdn_version "$VERSION") | |
[[ -z "$BUILD" ]] && { echo "Error: Version ${VERSION} not found in the embedded XML data." >&2; exit 1; } | |
echo "Selected legacy version: $VERSION with build: $BUILD" | |
DOWNLOAD_URL="${BASE_URL}ws/${VERSION}/${BUILD}/linux/core/VMware-Workstation-${VERSION}-${BUILD}.x86_64.bundle.tar" | |
DOWNLOAD_DIR="${HOME}" | |
DOWNLOAD_FILE="${DOWNLOAD_DIR}/VMware-Workstation-${VERSION}-${BUILD}.x86_64.bundle.tar" | |
EXTRACT_DIR="${DOWNLOAD_DIR}/VMware-Workstation-${VERSION}-${BUILD}" | |
BUNDLE_PATH="${EXTRACT_DIR}/VMware-Workstation-${VERSION}-${BUILD}.x86_64.bundle" | |
echo "Downloading VMware Workstation v${VERSION} (${BUILD}) from CDN cache..." | |
mkdir -p "${DOWNLOAD_DIR}" | |
check_url() { | |
curl -s --head --connect-to "$CDN_MIRROR" "$1" | head -n 1 | grep "200" >/dev/null | |
} | |
check_url "$DOWNLOAD_URL" || { echo "Error: Installer file not found at $DOWNLOAD_URL via CDN." >&2; exit 1; } | |
curl -k -q --progress-bar -f -o "${DOWNLOAD_FILE}" --connect-to "$CDN_MIRROR" "${DOWNLOAD_URL}" || { | |
echo "Error: Download failed for ${DOWNLOAD_URL}." >&2 | |
exit 1 | |
} | |
if [[ "$KEEP_COMPRESSED" = true ]]; then | |
echo -e "\nFinished. Downloaded file location: ${DOWNLOAD_FILE}" | |
exit 0 | |
fi | |
echo "Extracting tar..." | |
mkdir -p "${EXTRACT_DIR}" && \ | |
tar -xf "${DOWNLOAD_FILE}" -C "${EXTRACT_DIR}" || { | |
echo "Error: Extraction of tar file failed. File may be corrupt." >&2 | |
echo "Downloaded file location: ${DOWNLOAD_FILE}" >&2 | |
rm -rf "${EXTRACT_DIR}" | |
exit 1 | |
} | |
echo "Cleaning up..." | |
chmod +x "${EXTRACT_DIR}/VMware-Workstation-${VERSION}-${BUILD}.x86_64.bundle" | |
rm -f "${DOWNLOAD_FILE}" "${EXTRACT_DIR}/descriptor.xml" 2>/dev/null | |
echo -e "\nFinished. You can now run the installer bundle." | |
echo "VMware Workstation bundle location: ${BUNDLE_PATH}" | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment