From 3cebee8e73d7cc9d189158a57dcbba5e427fc094 Mon Sep 17 00:00:00 2001 From: Mitch Francese <2227948+tux234@users.noreply.github.com> Date: Mon, 1 Dec 2025 09:58:16 -0500 Subject: [PATCH] Add Fleet-managed app: Little Snitch for macOS (#36338) - Add input manifest for little-snitch - Generate output files - Add description to apps.json --- .../inputs/homebrew/little-snitch.json | 8 ++ ee/maintained-apps/outputs/apps.json | 7 ++ .../outputs/little-snitch/darwin.json | 21 ++++ .../components/icons/LittleSnitch.tsx | 14 +++ tools/software/icons/generate-icons.sh | 94 +++++++++++++++--- .../app-icon-little-snitch-60x60@2x.png | Bin 0 -> 19373 bytes 6 files changed, 130 insertions(+), 14 deletions(-) create mode 100644 ee/maintained-apps/inputs/homebrew/little-snitch.json create mode 100644 ee/maintained-apps/outputs/little-snitch/darwin.json create mode 100644 frontend/pages/SoftwarePage/components/icons/LittleSnitch.tsx create mode 100644 website/assets/images/app-icon-little-snitch-60x60@2x.png diff --git a/ee/maintained-apps/inputs/homebrew/little-snitch.json b/ee/maintained-apps/inputs/homebrew/little-snitch.json new file mode 100644 index 0000000000..1d181f86e7 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/little-snitch.json @@ -0,0 +1,8 @@ +{ + "name": "Little Snitch", + "slug": "little-snitch/darwin", + "unique_identifier": "at.obdev.LittleSnitch", + "token": "little-snitch", + "installer_format": "dmg", + "default_categories": ["Developer tools"] +} diff --git a/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json index 40915017f2..4d075a5ebb 100644 --- a/ee/maintained-apps/outputs/apps.json +++ b/ee/maintained-apps/outputs/apps.json @@ -428,6 +428,13 @@ "unique_identifier": "com.linear", "description": "Linear is an app to manage software development and track bugs." }, + { + "name": "Little Snitch", + "slug": "little-snitch/darwin", + "platform": "darwin", + "unique_identifier": "at.obdev.LittleSnitch", + "description": "Little Snitch is a network monitor and application firewall that provides real-time visibility and control over network connections for macOS." + }, { "name": "Logi Options+", "slug": "logi-options+/darwin", diff --git a/ee/maintained-apps/outputs/little-snitch/darwin.json b/ee/maintained-apps/outputs/little-snitch/darwin.json new file mode 100644 index 0000000000..8035f260e8 --- /dev/null +++ b/ee/maintained-apps/outputs/little-snitch/darwin.json @@ -0,0 +1,21 @@ +{ + "versions": [ + { + "version": "6.3.3", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'at.obdev.LittleSnitch';" + }, + "installer_url": "https://www.obdev.at/downloads/littlesnitch/LittleSnitch-6.3.3.dmg", + "install_script_ref": "8f85249a", + "uninstall_script_ref": "6d6725ce", + "sha256": "9180c2ee2f69259d920255258930783aa7c9cc1ffbbb128920df2f51a9955265", + "default_categories": [ + "Security" + ] + } + ], + "refs": { + "6d6725ce": "#!/bin/sh\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/Little Snitch.app\"\nsudo rmdir '/Library/Application Support/Objective Development'\ntrash $LOGGED_IN_USER '/Library/Application Support/Objective Development/Little Snitch'\ntrash $LOGGED_IN_USER '/Library/Caches/at.obdev.LittleSnitchConfiguration'\ntrash $LOGGED_IN_USER '/Library/Extensions/LittleSnitch.kext'\ntrash $LOGGED_IN_USER '/Library/Little Snitch'\ntrash $LOGGED_IN_USER '/Library/Logs/LittleSnitchDaemon.log'\ntrash $LOGGED_IN_USER '/Library/StagedExtensions/Library/Extensions/LittleSnitch.kext'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Little Snitch'\ntrash $LOGGED_IN_USER '~/Library/Caches/at.obdev.LittleSnitchAgent'\ntrash $LOGGED_IN_USER '~/Library/Caches/at.obdev.LittleSnitchConfiguration'\ntrash $LOGGED_IN_USER '~/Library/Caches/at.obdev.LittleSnitchHelper'\ntrash $LOGGED_IN_USER '~/Library/Caches/at.obdev.LittleSnitchSoftwareUpdate'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.apple.helpd/Generated/at.obdev.LittleSnitchConfiguration.help*'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.apple.helpd/SDMHelpData/Other/English/HelpSDMIndexFile/at.obdev.LittleSnitchConfiguration.help*'\ntrash $LOGGED_IN_USER '~/Library/Logs/Little Snitch Agent.log'\ntrash $LOGGED_IN_USER '~/Library/Logs/Little Snitch Helper.log'\ntrash $LOGGED_IN_USER '~/Library/Logs/Little Snitch Installer.log'\ntrash $LOGGED_IN_USER '~/Library/Logs/Little Snitch Network Monitor.log'\ntrash $LOGGED_IN_USER '~/Library/Preferences/at.obdev.LittleSnitchAgent.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/at.obdev.LittleSnitchConfiguration.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/at.obdev.LittleSnitchInstaller.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/at.obdev.LittleSnitchNetworkMonitor.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/at.obdev.LittleSnitchSoftwareUpdate.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/at.obdev.LittleSnitchInstaller.savedState'\ntrash $LOGGED_IN_USER '~/Library/WebKit/at.obdev.LittleSnitchConfiguration'\n", + "8f85249a": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\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\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_application 'at.obdev.LittleSnitch'\nif [ -d \"$APPDIR/Little Snitch.app\" ]; then\n\tsudo mv \"$APPDIR/Little Snitch.app\" \"$TMPDIR/Little Snitch.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Little Snitch.app\" \"$APPDIR\"\n" + } +} diff --git a/frontend/pages/SoftwarePage/components/icons/LittleSnitch.tsx b/frontend/pages/SoftwarePage/components/icons/LittleSnitch.tsx new file mode 100644 index 0000000000..19e5bcd639 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/LittleSnitch.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const LittleSnitch = (props: SVGProps) => ( + + + +); +export default LittleSnitch; diff --git a/tools/software/icons/generate-icons.sh b/tools/software/icons/generate-icons.sh index 31ea3c1a87..3a7b8b322f 100755 --- a/tools/software/icons/generate-icons.sh +++ b/tools/software/icons/generate-icons.sh @@ -53,24 +53,90 @@ fi # Extract CFBundleIconFile from Info.plist ICON_FILE=$(defaults read "$INFO_PLIST" CFBundleIconFile 2>/dev/null || plutil -extract CFBundleIconFile raw "$INFO_PLIST" 2>/dev/null || echo "") + +# If CFBundleIconFile not found, try modern approach with CFBundleIconName (Asset Catalog) if [[ -z "$ICON_FILE" ]]; then - echo "Error: CFBundleIconFile not found in Info.plist" - exit 1 -fi + ICON_NAME=$(defaults read "$INFO_PLIST" CFBundleIconName 2>/dev/null || plutil -extract CFBundleIconName raw "$INFO_PLIST" 2>/dev/null || echo "") -# Handle case where extension might or might not be included -if [[ "$ICON_FILE" != *.icns ]]; then - ICON_FILE="${ICON_FILE}.icns" -fi + if [[ -n "$ICON_NAME" ]]; then + echo "CFBundleIconFile not found, but CFBundleIconName found: $ICON_NAME" + echo "Extracting icon from Asset Catalog using macOS Workspace API..." -# Find the exact icon file in Resources folder -ICNS_PATH="$APP_PATH/Contents/Resources/$ICON_FILE" -if [[ ! -f "$ICNS_PATH" ]]; then - echo "Error: Icon file '$ICON_FILE' not found in $APP_PATH/Contents/Resources" - exit 1 -fi + # Create temporary directory for extraction + TMP_EXTRACT_DIR=$(mktemp -d) + EXTRACTED_ICON="$TMP_EXTRACT_DIR/app-icon.png" -echo "Using icon file: $ICON_FILE" + # Use osascript to extract icon via NSWorkspace + osascript < /dev/null 2>&1 + sips -z 32 32 "$EXTRACTED_ICON" --out "$ICONSET_DIR/icon_16x16@2x.png" > /dev/null 2>&1 + sips -z 32 32 "$EXTRACTED_ICON" --out "$ICONSET_DIR/icon_32x32.png" > /dev/null 2>&1 + sips -z 64 64 "$EXTRACTED_ICON" --out "$ICONSET_DIR/icon_32x32@2x.png" > /dev/null 2>&1 + sips -z 128 128 "$EXTRACTED_ICON" --out "$ICONSET_DIR/icon_128x128.png" > /dev/null 2>&1 + sips -z 256 256 "$EXTRACTED_ICON" --out "$ICONSET_DIR/icon_128x128@2x.png" > /dev/null 2>&1 + sips -z 256 256 "$EXTRACTED_ICON" --out "$ICONSET_DIR/icon_256x256.png" > /dev/null 2>&1 + sips -z 512 512 "$EXTRACTED_ICON" --out "$ICONSET_DIR/icon_256x256@2x.png" > /dev/null 2>&1 + sips -z 512 512 "$EXTRACTED_ICON" --out "$ICONSET_DIR/icon_512x512.png" > /dev/null 2>&1 + sips -z 1024 1024 "$EXTRACTED_ICON" --out "$ICONSET_DIR/icon_512x512@2x.png" > /dev/null 2>&1 + + # Create icns from iconset + iconutil -c icns "$ICONSET_DIR" -o "$TMP_ICNS" + + if [[ ! -f "$TMP_ICNS" ]]; then + echo "Error: Failed to create icns file from extracted icon" + exit 1 + fi + + ICNS_PATH="$TMP_ICNS" + echo "Successfully extracted icon from Asset Catalog" + else + echo "Error: Neither CFBundleIconFile nor CFBundleIconName found in Info.plist" + exit 1 + fi +else + # Handle case where extension might or might not be included + if [[ "$ICON_FILE" != *.icns ]]; then + ICON_FILE="${ICON_FILE}.icns" + fi + + # Find the exact icon file in Resources folder + ICNS_PATH="$APP_PATH/Contents/Resources/$ICON_FILE" + if [[ ! -f "$ICNS_PATH" ]]; then + echo "Error: Icon file '$ICON_FILE' not found in $APP_PATH/Contents/Resources" + exit 1 + fi + + echo "Using icon file: $ICON_FILE" +fi # Extract iconset TMP_DIR=$(mktemp -d) diff --git a/website/assets/images/app-icon-little-snitch-60x60@2x.png b/website/assets/images/app-icon-little-snitch-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..81647cea39ecb57bdf79f0469f4676fc617aa5c9 GIT binary patch literal 19373 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

F!&lYcorj4wcFQ(@ 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 pfiVh