From d83c30761bdfc4379df231fe35d281a32e52c4d7 Mon Sep 17 00:00:00 2001 From: Mitch Francese <2227948+tux234@users.noreply.github.com> Date: Mon, 8 Dec 2025 22:23:30 -0500 Subject: [PATCH] Add Fleet-managed app: Tableau Desktop for Darwin (#36352) - Add input manifest for tableau - Generate output files for version 2025.2.4 - Add description to apps.json - Installer format: pkg (via Homebrew) - Bundle identifier: com.tableausoftware.Desktop.app --------- Co-authored-by: Allen Houchins --- .../inputs/homebrew/tableau.json | 8 +++++++ ee/maintained-apps/outputs/apps.json | 9 +++++++- .../outputs/tableau/darwin.json | 21 ++++++++++++++++++ .../components/icons/TableauDesktop.tsx | 14 ++++++++++++ .../SoftwarePage/components/icons/index.ts | 4 ++-- .../images/app-icon-tableau-60x60@2x.png | Bin 0 -> 5722 bytes 6 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 ee/maintained-apps/inputs/homebrew/tableau.json create mode 100644 ee/maintained-apps/outputs/tableau/darwin.json create mode 100644 frontend/pages/SoftwarePage/components/icons/TableauDesktop.tsx create mode 100644 website/assets/images/app-icon-tableau-60x60@2x.png diff --git a/ee/maintained-apps/inputs/homebrew/tableau.json b/ee/maintained-apps/inputs/homebrew/tableau.json new file mode 100644 index 0000000000..bfec249a03 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/tableau.json @@ -0,0 +1,8 @@ +{ + "name": "Tableau Desktop", + "unique_identifier": "com.tableausoftware.Desktop.app", + "token": "tableau", + "installer_format": "dmg", + "slug": "tableau/darwin", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json index 70f363bd6d..a0f11fcb86 100644 --- a/ee/maintained-apps/outputs/apps.json +++ b/ee/maintained-apps/outputs/apps.json @@ -890,7 +890,7 @@ "unique_identifier": "com.sublimetext.4", "description": "Sublime Text is a text editor for code, markup, and prose." }, - { + { "name": "Sublime Text", "slug": "sublime-text/windows", "platform": "windows", @@ -904,6 +904,13 @@ "unique_identifier": "com.tinyapp.TablePlus", "description": "TablePlus is a native GUI tool for relational databases." }, + { + "name": "Tableau Desktop", + "slug": "tableau/darwin", + "platform": "darwin", + "unique_identifier": "com.tableausoftware.Desktop.app", + "description": "Tableau Desktop is a powerful data visualization and business intelligence platform for analyzing and presenting data insights." + }, { "name": "Tailscale", "slug": "tailscale-app/darwin", diff --git a/ee/maintained-apps/outputs/tableau/darwin.json b/ee/maintained-apps/outputs/tableau/darwin.json new file mode 100644 index 0000000000..1a9cdf30ca --- /dev/null +++ b/ee/maintained-apps/outputs/tableau/darwin.json @@ -0,0 +1,21 @@ +{ + "versions": [ + { + "version": "2025.3.0", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.tableausoftware.Desktop.app';" + }, + "installer_url": "https://downloads.tableau.com/esdalt/2025.3.0/TableauDesktop-2025-3-0-arm64.dmg", + "install_script_ref": "2920fd1c", + "uninstall_script_ref": "ff6f427b", + "sha256": "954f538f3a2e1faf9bc082b3cb19382f93653fe0c3e4441149cb7476bc892f8a", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "2920fd1c": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nhdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\"\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\"\n# install pkg files\nsudo installer -pkg \"$TMPDIR/Tableau Desktop.pkg\" -target /\n", + "ff6f427b": "#!/bin/sh\n\n# variables\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nexpand_pkgid_and_map() {\n local PKGID=\"$1\"\n local FUNC=\"$2\"\n if [[ \"$PKGID\" == *\"*\" ]]; then\n local prefix=\"${PKGID%\\*}\"\n echo \"Expanding wildcard for PKGID: $PKGID\"\n for receipt in $(pkgutil --pkgs | grep \"^${prefix}\"); do\n echo \"Processing $receipt\"\n \"$FUNC\" \"$receipt\"\n done\n else\n \"$FUNC\" \"$PKGID\"\n fi\n}\n\nforget_pkg() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" forget_receipt\n}\n\nforget_receipt() {\n local PKGID=\"$1\"\n sudo pkgutil --forget \"$PKGID\"\n}\n\nremove_pkg_files() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" remove_receipt_files\n}\n\nremove_receipt_files() {\n local PKGID=\"$1\"\n local PKGINFO VOLUME INSTALL_LOCATION FULL_INSTALL_LOCATION\n\n echo \"pkgutil --pkg-info-plist \\\"$PKGID\\\"\"\n PKGINFO=$(pkgutil --pkg-info-plist \"$PKGID\")\n VOLUME=$(echo \"$PKGINFO\" | awk '/volume<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n INSTALL_LOCATION=$(echo \"$PKGINFO\" | awk '/install-location<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n\n if [ -z \"$INSTALL_LOCATION\" ] || [ \"$INSTALL_LOCATION\" = \"/\" ]; then\n FULL_INSTALL_LOCATION=\"$VOLUME\"\n else\n FULL_INSTALL_LOCATION=\"$VOLUME/$INSTALL_LOCATION\"\n FULL_INSTALL_LOCATION=$(echo \"$FULL_INSTALL_LOCATION\" | sed 's|//|/|g')\n fi\n\n echo \"sudo pkgutil --only-files --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-files --files \"$PKGID\" | sed \"s|^|/${INSTALL_LOCATION}/|\" | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n echo \"sudo pkgutil --only-dirs --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | grep '\\\\.app$' | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-dirs --files \"$PKGID\" | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" | grep '\\.app$' | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n root_app_dir=$(\n sudo pkgutil --only-dirs --files \"$PKGID\" \\\n | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" \\\n | grep 'Applications' \\\n | awk '{ print length, $0 }' \\\n | sort -n \\\n | head -n1 \\\n | cut -d' ' -f2-\n )\n if [ -n \"$root_app_dir\" ]; then\n echo \"sudo rmdir -p \\\"$root_app_dir\\\" 2>/dev/null || :\"\n sudo rmdir -p \"$root_app_dir\" 2>/dev/null || :\n fi\n}\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nremove_pkg_files 'com.amazon.redshiftodbc'\nforget_pkg 'com.amazon.redshiftodbc'\nremove_pkg_files 'com.simba.sparkodbc'\nforget_pkg 'com.simba.sparkodbc'\nremove_pkg_files 'com.simba.sqlserverodbc'\nforget_pkg 'com.simba.sqlserverodbc'\nremove_pkg_files 'com.tableausoftware.Desktop.app'\nforget_pkg 'com.tableausoftware.Desktop.app'\nremove_pkg_files 'com.tableausoftware.DesktopShortcut'\nforget_pkg 'com.tableausoftware.DesktopShortcut'\nremove_pkg_files 'com.tableausoftware.extensions'\nforget_pkg 'com.tableausoftware.extensions'\nremove_pkg_files 'com.tableausoftware.FLEXNet.*'\nforget_pkg 'com.tableausoftware.FLEXNet.*'\nremove_pkg_files 'com.tableausoftware.mysql'\nforget_pkg 'com.tableausoftware.mysql'\nremove_pkg_files 'com.tableausoftware.networkExtensions'\nforget_pkg 'com.tableausoftware.networkExtensions'\nremove_pkg_files 'com.tableausoftware.oracle'\nforget_pkg 'com.tableausoftware.oracle'\nremove_pkg_files 'com.tableausoftware.postgresql'\nforget_pkg 'com.tableausoftware.postgresql'\nremove_pkg_files 'com.tableausoftware.telemetry'\nforget_pkg 'com.tableausoftware.telemetry'\nremove_pkg_files 'simba.sparkodbc'\nforget_pkg 'simba.sparkodbc'\nsudo rm -rf '/Library/Preferences/com.tableau.Tableau-2025.3.plist'\ntrash $LOGGED_IN_USER '/Library/Preferences/com.tableau.Tableau-2025.3.plist'\ntrash $LOGGED_IN_USER '~/Documents/My Tableau Repository'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.tableau.caching'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.tableausoftware.MapTiles'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.tableau.Registration.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.tableau.Tableau-2025.3.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.tableausoftware.tableaudesktop.savedState'\ntrash $LOGGED_IN_USER '~/Library/Tableau'\n" + } +} diff --git a/frontend/pages/SoftwarePage/components/icons/TableauDesktop.tsx b/frontend/pages/SoftwarePage/components/icons/TableauDesktop.tsx new file mode 100644 index 0000000000..986d962cb2 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/TableauDesktop.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const TableauDesktop = (props: SVGProps) => ( + + + +); +export default TableauDesktop; diff --git a/frontend/pages/SoftwarePage/components/icons/index.ts b/frontend/pages/SoftwarePage/components/icons/index.ts index 91e0bc7ba3..bc8fede4e0 100644 --- a/frontend/pages/SoftwarePage/components/icons/index.ts +++ b/frontend/pages/SoftwarePage/components/icons/index.ts @@ -121,6 +121,7 @@ import Snagit from "./Snagit"; import Sourcetree from "./Sourcetree"; import Spotify from "./Spotify"; import SublimeText from "./SublimeText"; +import TableauDesktop from "./TableauDesktop"; import TablePlus from "./TablePlus"; import Tailscale from "./Tailscale"; import TeamViewer from "./TeamViewer"; @@ -273,6 +274,7 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { sourcetree: Sourcetree, spotify: Spotify, "sublime text": SublimeText, + tableau: TableauDesktop, tableplus: TablePlus, tailscale: Tailscale, telegram: Telegram, @@ -381,8 +383,6 @@ const matchStrictNameSourceToIcon = ({ return Zoom; case name === "zoom": return Zoom; - case name === "zoom.us": - return Zoom; case name.startsWith("zoom workplace"): return Zoom; default: diff --git a/website/assets/images/app-icon-tableau-60x60@2x.png b/website/assets/images/app-icon-tableau-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2ebd6a8c49611b98b86a1fb692a5781d24bdd7db GIT binary patch literal 5722 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