From ffb9d876a173a9f243310c29533e2514a075ca3f Mon Sep 17 00:00:00 2001 From: Harrison Ravazzolo <38767391+harrisonravazzolo@users.noreply.github.com> Date: Fri, 29 May 2026 18:41:49 -0700 Subject: [PATCH] FMA - Another Redis Desktop Manager (#46495) ## Summary by CodeRabbit * **New Features** * Another Redis Desktop Manager support has been added with full installation, update, and uninstallation capabilities for both macOS and Windows operating systems. * Integrated application icon, branding, and user interface components throughout the platform for easy identification and seamless integration. [![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/fleetdm/fleet/pull/46495?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack) --------- Co-authored-by: Allen Houchins <32207388+allenhouchins@users.noreply.github.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .../another-redis-desktop-manager.json | 8 ++ .../winget/another-redis-desktop-manager.json | 13 +++ .../another-redis-desktop-manager_install.ps1 | 21 +++++ ...nother-redis-desktop-manager_uninstall.ps1 | 75 ++++++++++++++++++ .../another-redis-desktop-manager/darwin.json | 22 +++++ .../windows.json | 22 +++++ ee/maintained-apps/outputs/apps.json | 14 ++++ .../icons/AnotherRedisDesktopManager.tsx | 14 ++++ .../SoftwarePage/components/icons/index.ts | 2 + ...another-redis-desktop-manager-60x60@2x.png | Bin 0 -> 12345 bytes 10 files changed, 191 insertions(+) create mode 100644 ee/maintained-apps/inputs/homebrew/another-redis-desktop-manager.json create mode 100644 ee/maintained-apps/inputs/winget/another-redis-desktop-manager.json create mode 100644 ee/maintained-apps/inputs/winget/scripts/another-redis-desktop-manager_install.ps1 create mode 100644 ee/maintained-apps/inputs/winget/scripts/another-redis-desktop-manager_uninstall.ps1 create mode 100644 ee/maintained-apps/outputs/another-redis-desktop-manager/darwin.json create mode 100644 ee/maintained-apps/outputs/another-redis-desktop-manager/windows.json create mode 100644 frontend/pages/SoftwarePage/components/icons/AnotherRedisDesktopManager.tsx create mode 100644 website/assets/images/app-icon-another-redis-desktop-manager-60x60@2x.png diff --git a/ee/maintained-apps/inputs/homebrew/another-redis-desktop-manager.json b/ee/maintained-apps/inputs/homebrew/another-redis-desktop-manager.json new file mode 100644 index 0000000000..e1c6377e85 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/another-redis-desktop-manager.json @@ -0,0 +1,8 @@ +{ + "name": "Another Redis Desktop Manager", + "unique_identifier": "me.qii404.another-redis-desktop-manager", + "token": "another-redis-desktop-manager", + "installer_format": "dmg", + "slug": "another-redis-desktop-manager/darwin", + "default_categories": ["Developer tools"] +} diff --git a/ee/maintained-apps/inputs/winget/another-redis-desktop-manager.json b/ee/maintained-apps/inputs/winget/another-redis-desktop-manager.json new file mode 100644 index 0000000000..eeac5e0833 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/another-redis-desktop-manager.json @@ -0,0 +1,13 @@ +{ + "name": "Another Redis Desktop Manager", + "slug": "another-redis-desktop-manager/windows", + "package_identifier": "qishibo.AnotherRedisDesktopManager", + "unique_identifier": "Another Redis Desktop Manager", + "fuzzy_match_name": true, + "installer_arch": "x64", + "installer_type": "exe", + "installer_scope": "machine", + "default_categories": ["Developer tools"], + "install_script_path": "ee/maintained-apps/inputs/winget/scripts/another-redis-desktop-manager_install.ps1", + "uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/another-redis-desktop-manager_uninstall.ps1" +} diff --git a/ee/maintained-apps/inputs/winget/scripts/another-redis-desktop-manager_install.ps1 b/ee/maintained-apps/inputs/winget/scripts/another-redis-desktop-manager_install.ps1 new file mode 100644 index 0000000000..1e40e5e5c0 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/another-redis-desktop-manager_install.ps1 @@ -0,0 +1,21 @@ +$exeFilePath = "${env:INSTALLER_PATH}" + +try { + +$processOptions = @{ + FilePath = "$exeFilePath" + ArgumentList = "/S", "/ALLUSERS" + PassThru = $true + Wait = $true +} + +$process = Start-Process @processOptions +$exitCode = $process.ExitCode + +Write-Host "Install exit code: $exitCode" +Exit $exitCode + +} catch { + Write-Host "Error: $_" + Exit 1 +} diff --git a/ee/maintained-apps/inputs/winget/scripts/another-redis-desktop-manager_uninstall.ps1 b/ee/maintained-apps/inputs/winget/scripts/another-redis-desktop-manager_uninstall.ps1 new file mode 100644 index 0000000000..15bbd448c2 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/another-redis-desktop-manager_uninstall.ps1 @@ -0,0 +1,75 @@ +$displayNameLike = "Another Redis Desktop Manager*" +$publisher = "Another" + +$paths = @( + 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', + 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall', + 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', + 'HKCU:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall' +) + +$uninstall = $null +foreach ($p in $paths) { + $items = Get-ItemProperty "$p\*" -ErrorAction SilentlyContinue | Where-Object { + $_.DisplayName -like $displayNameLike -and $_.Publisher -like "$publisher*" + } + if ($items) { $uninstall = $items | Select-Object -First 1; break } +} + +if (-not $uninstall -or (-not $uninstall.UninstallString -and -not $uninstall.QuietUninstallString)) { + Write-Host "Uninstall entry not found" + Exit 0 +} + +Stop-Process -Name "Another Redis Desktop Manager" -Force -ErrorAction SilentlyContinue + +$uninstallCommand = if ($uninstall.QuietUninstallString) { + $uninstall.QuietUninstallString +} else { + $uninstall.UninstallString +} + +$exePath = "" +$existingArgs = "" +if ($uninstallCommand -match '^\s*"([^"]+)"\s*(.*)$') { + $exePath = $matches[1] + $existingArgs = $matches[2].Trim() +} elseif ($uninstallCommand -match '(?i)^\s*(.+?\.exe)\s*(.*)$') { + $exePath = $matches[1] + $existingArgs = $matches[2].Trim() +} elseif ($uninstallCommand -match '^\s*(\S+)\s*(.*)$') { + $exePath = $matches[1] + $existingArgs = $matches[2].Trim() +} else { + Throw "Could not parse uninstall string: $uninstallCommand" +} + +if ($existingArgs -notmatch '\b/S\b') { + $existingArgs = ("$existingArgs /S").Trim() +} +# Mirror the install: ensure all-users uninstall so the machine-scope ARP +# entry under HKLM is removed (not just the calling user's HKCU view). +if ($existingArgs -notmatch '(?i)/ALLUSERS') { + $existingArgs = ("$existingArgs /ALLUSERS").Trim() +} + +Write-Host "Uninstall command: $exePath" +Write-Host "Uninstall args: $existingArgs" + +try { + $processOptions = @{ + FilePath = $exePath + ArgumentList = $existingArgs + NoNewWindow = $true + PassThru = $true + Wait = $true + } + + $process = Start-Process @processOptions + $exitCode = $process.ExitCode + Write-Host "Uninstall exit code: $exitCode" + Exit $exitCode +} catch { + Write-Host "Error running uninstaller: $_" + Exit 1 +} diff --git a/ee/maintained-apps/outputs/another-redis-desktop-manager/darwin.json b/ee/maintained-apps/outputs/another-redis-desktop-manager/darwin.json new file mode 100644 index 0000000000..8d0e3de7f1 --- /dev/null +++ b/ee/maintained-apps/outputs/another-redis-desktop-manager/darwin.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.7.1", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'me.qii404.another-redis-desktop-manager';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'me.qii404.another-redis-desktop-manager' AND version_compare(bundle_short_version, '1.7.1') < 0);" + }, + "installer_url": "https://github.com/qishibo/AnotherRedisDesktopManager/releases/download/v1.7.1/Another-Redis-Desktop-Manager-mac-1.7.1-arm64.dmg", + "install_script_ref": "9ad9a271", + "uninstall_script_ref": "9e4bc4d1", + "sha256": "1833e153cd7d9c66cc6d88ec1448b081dfeb5c122c3c65bcae47be1c4d760235", + "default_categories": [ + "Developer tools" + ] + } + ], + "refs": { + "9ad9a271": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\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# copy to the applications folder\nquit_and_track_application 'me.qii404.another-redis-desktop-manager'\nif [ -d \"$APPDIR/Another Redis Desktop Manager.app\" ]; then\n\tsudo mv \"$APPDIR/Another Redis Desktop Manager.app\" \"$TMPDIR/Another Redis Desktop Manager.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Another Redis Desktop Manager.app\" \"$APPDIR\"\nrelaunch_application 'me.qii404.another-redis-desktop-manager'\n", + "9e4bc4d1": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\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\nsudo rm -rf \"$APPDIR/Another Redis Desktop Manager.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/another-redis-desktop-manager'\ntrash $LOGGED_IN_USER '~/Library/Preferences/me.qii404.another-redis-desktop-manager.plist'\n" + } +} diff --git a/ee/maintained-apps/outputs/another-redis-desktop-manager/windows.json b/ee/maintained-apps/outputs/another-redis-desktop-manager/windows.json new file mode 100644 index 0000000000..aeaaf9b5f7 --- /dev/null +++ b/ee/maintained-apps/outputs/another-redis-desktop-manager/windows.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.7.1", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name LIKE 'Another Redis Desktop Manager %' AND publisher = 'Another';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Another Redis Desktop Manager %' AND publisher = 'Another' AND version_compare(version, '1.7.1') < 0);" + }, + "installer_url": "https://github.com/qishibo/AnotherRedisDesktopManager/releases/download/v1.7.1/Another-Redis-Desktop-Manager-win-1.7.1-x64.exe", + "install_script_ref": "a37c96e2", + "uninstall_script_ref": "a39761e0", + "sha256": "563ee788d1185c6cb8bd244c2532dd506e5e12ec1d77c41f0a645b5e21456c29", + "default_categories": [ + "Developer tools" + ] + } + ], + "refs": { + "a37c96e2": "$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n\n$processOptions = @{\n FilePath = \"$exeFilePath\"\n ArgumentList = \"/S\", \"/ALLUSERS\"\n PassThru = $true\n Wait = $true\n}\n\n$process = Start-Process @processOptions\n$exitCode = $process.ExitCode\n\nWrite-Host \"Install exit code: $exitCode\"\nExit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n", + "a39761e0": "$displayNameLike = \"Another Redis Desktop Manager*\"\n$publisher = \"Another\"\n\n$paths = @(\n 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall',\n 'HKLM:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall',\n 'HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall',\n 'HKCU:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall'\n)\n\n$uninstall = $null\nforeach ($p in $paths) {\n $items = Get-ItemProperty \"$p\\*\" -ErrorAction SilentlyContinue | Where-Object {\n $_.DisplayName -like $displayNameLike -and $_.Publisher -like \"$publisher*\"\n }\n if ($items) { $uninstall = $items | Select-Object -First 1; break }\n}\n\nif (-not $uninstall -or (-not $uninstall.UninstallString -and -not $uninstall.QuietUninstallString)) {\n Write-Host \"Uninstall entry not found\"\n Exit 0\n}\n\nStop-Process -Name \"Another Redis Desktop Manager\" -Force -ErrorAction SilentlyContinue\n\n$uninstallCommand = if ($uninstall.QuietUninstallString) {\n $uninstall.QuietUninstallString\n} else {\n $uninstall.UninstallString\n}\n\n$exePath = \"\"\n$existingArgs = \"\"\nif ($uninstallCommand -match '^\\s*\"([^\"]+)\"\\s*(.*)$') {\n $exePath = $matches[1]\n $existingArgs = $matches[2].Trim()\n} elseif ($uninstallCommand -match '(?i)^\\s*(.+?\\.exe)\\s*(.*)$') {\n $exePath = $matches[1]\n $existingArgs = $matches[2].Trim()\n} elseif ($uninstallCommand -match '^\\s*(\\S+)\\s*(.*)$') {\n $exePath = $matches[1]\n $existingArgs = $matches[2].Trim()\n} else {\n Throw \"Could not parse uninstall string: $uninstallCommand\"\n}\n\nif ($existingArgs -notmatch '\\b/S\\b') {\n $existingArgs = (\"$existingArgs /S\").Trim()\n}\n# Mirror the install: ensure all-users uninstall so the machine-scope ARP\n# entry under HKLM is removed (not just the calling user's HKCU view).\nif ($existingArgs -notmatch '(?i)/ALLUSERS') {\n $existingArgs = (\"$existingArgs /ALLUSERS\").Trim()\n}\n\nWrite-Host \"Uninstall command: $exePath\"\nWrite-Host \"Uninstall args: $existingArgs\"\n\ntry {\n $processOptions = @{\n FilePath = $exePath\n ArgumentList = $existingArgs\n NoNewWindow = $true\n PassThru = $true\n Wait = $true\n }\n\n $process = Start-Process @processOptions\n $exitCode = $process.ExitCode\n Write-Host \"Uninstall exit code: $exitCode\"\n Exit $exitCode\n} catch {\n Write-Host \"Error running uninstaller: $_\"\n Exit 1\n}\n" + } +} diff --git a/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json index 84e20e6808..90eba98bb1 100644 --- a/ee/maintained-apps/outputs/apps.json +++ b/ee/maintained-apps/outputs/apps.json @@ -169,6 +169,20 @@ "unique_identifier": "com.veertu.anka", "description": "Anka is a tool for managing and creating virtual machines." }, + { + "name": "Another Redis Desktop Manager", + "slug": "another-redis-desktop-manager/darwin", + "platform": "darwin", + "unique_identifier": "me.qii404.another-redis-desktop-manager", + "description": "Another Redis Desktop Manager is a GUI client for Redis." + }, + { + "name": "Another Redis Desktop Manager", + "slug": "another-redis-desktop-manager/windows", + "platform": "windows", + "unique_identifier": "Another Redis Desktop Manager", + "description": "Another Redis Desktop Manager is a GUI client for Redis." + }, { "name": "AnyDesk", "slug": "anydesk/darwin", diff --git a/frontend/pages/SoftwarePage/components/icons/AnotherRedisDesktopManager.tsx b/frontend/pages/SoftwarePage/components/icons/AnotherRedisDesktopManager.tsx new file mode 100644 index 0000000000..9eca43644f --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/AnotherRedisDesktopManager.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const AnotherRedisDesktopManager = (props: SVGProps) => ( + + + +); +export default AnotherRedisDesktopManager; diff --git a/frontend/pages/SoftwarePage/components/icons/index.ts b/frontend/pages/SoftwarePage/components/icons/index.ts index e77df4121e..9932d520c5 100644 --- a/frontend/pages/SoftwarePage/components/icons/index.ts +++ b/frontend/pages/SoftwarePage/components/icons/index.ts @@ -6,6 +6,7 @@ import { ISoftware } from "interfaces/software"; import { matchLoosePrefixToKey } from "utilities/strings/stringUtils"; import AmazonCorretto25 from "./AmazonCorretto25"; +import AnotherRedisDesktopManager from "./AnotherRedisDesktopManager"; import AzulZulu25Jdk from "./AzulZulu25Jdk"; import AzulZulu25Jre from "./AzulZulu25Jre"; import Backblaze from "./Backblaze"; @@ -301,6 +302,7 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { androidPlayStore: AndroidPlayStore, "android studio": AndroidStudio, anka: Anka, + "another redis desktop manager": AnotherRedisDesktopManager, anydesk: AnyDesk, apparency: Apparency, appcleaner: AppCleaner, diff --git a/website/assets/images/app-icon-another-redis-desktop-manager-60x60@2x.png b/website/assets/images/app-icon-another-redis-desktop-manager-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e98911cfd475423fcf499703e66439022bdb1f48 GIT binary patch literal 12345 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 az5yDW2zul=CY=6T+gFfLm9CdG3;jPXs-buQ literal 0 HcmV?d00001