From 337f4a9e04567bda7b3b0e834da78ac4f8857f9a Mon Sep 17 00:00:00 2001 From: Allen Houchins <32207388+allenhouchins@users.noreply.github.com> Date: Mon, 20 Apr 2026 16:01:18 -0500 Subject: [PATCH] Add Druva inSync as a Windows FMA (#43817) Add support for Druva inSync: new winget input (ee/maintained-apps/inputs/winget/druva-insync.json), app metadata (added entry in ee/maintained-apps/outputs/apps.json) and platform-specific output with version, installer URL, installer/uninstaller script refs, sha256 and upgrade_code (ee/maintained-apps/outputs/druva-insync/windows.json). Also add frontend icon component and mapping (frontend/pages/SoftwarePage/components/icons/DruvaInSync.tsx and index.ts) plus the PNG asset (website/assets/images/app-icon-druva-insync-60x60@2x.png) so the app is manageable and visually represented in the UI. **Related issue:** Resolves #43702 --- .../inputs/winget/druva-insync.json | 11 +++++++++ ee/maintained-apps/outputs/apps.json | 7 ++++++ .../outputs/druva-insync/windows.json | 23 ++++++++++++++++++ .../components/icons/DruvaInSync.tsx | 14 +++++++++++ .../SoftwarePage/components/icons/index.ts | 2 ++ .../images/app-icon-druva-insync-60x60@2x.png | Bin 0 -> 9242 bytes 6 files changed, 57 insertions(+) create mode 100644 ee/maintained-apps/inputs/winget/druva-insync.json create mode 100644 ee/maintained-apps/outputs/druva-insync/windows.json create mode 100644 frontend/pages/SoftwarePage/components/icons/DruvaInSync.tsx create mode 100644 website/assets/images/app-icon-druva-insync-60x60@2x.png diff --git a/ee/maintained-apps/inputs/winget/druva-insync.json b/ee/maintained-apps/inputs/winget/druva-insync.json new file mode 100644 index 0000000000..5aec50cb22 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/druva-insync.json @@ -0,0 +1,11 @@ +{ + "name": "Druva inSync", + "slug": "druva-insync/windows", + "package_identifier": "Druva.inSync", + "unique_identifier": "Druva inSync", + "fuzzy_match_name": true, + "installer_arch": "x64", + "installer_type": "msi", + "installer_scope": "machine", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json index f5d9b10899..3f7ba59684 100644 --- a/ee/maintained-apps/outputs/apps.json +++ b/ee/maintained-apps/outputs/apps.json @@ -631,6 +631,13 @@ "unique_identifier": "com.getdropbox.dropbox", "description": "Dropbox is a client for the Dropbox cloud storage service." }, + { + "name": "Druva inSync", + "slug": "druva-insync/windows", + "platform": "windows", + "unique_identifier": "Druva inSync", + "description": "Druva inSync is a cloud-based product that protects endpoint data." + }, { "name": "Eclipse IDE", "slug": "eclipse-ide/darwin", diff --git a/ee/maintained-apps/outputs/druva-insync/windows.json b/ee/maintained-apps/outputs/druva-insync/windows.json new file mode 100644 index 0000000000..251f3a3ec9 --- /dev/null +++ b/ee/maintained-apps/outputs/druva-insync/windows.json @@ -0,0 +1,23 @@ +{ + "versions": [ + { + "version": "7.5.7", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name LIKE 'Druva inSync %' AND publisher = 'Druva Technologies Pte. Ltd.';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Druva inSync %' AND publisher = 'Druva Technologies Pte. Ltd.' AND version_compare(version, '7.5.7') < 0);" + }, + "installer_url": "https://downloads.druva.com/downloads/inSync/Windows/7.5.7/inSync7.5.7r110923.msi", + "install_script_ref": "8959087b", + "uninstall_script_ref": "b98f2558", + "sha256": "44e7295a0efba9e386e5dc24fa1e024e84b14d5e70f290ddd4389da5c5e5c96e", + "default_categories": [ + "Productivity" + ], + "upgrade_code": "{99ADCB07-6ABD-4A1D-AFF6-03649753BAFF}" + } + ], + "refs": { + "8959087b": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv ${logFile} /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n", + "b98f2558": "# Fleet uninstalls app by finding all related product codes for the specified upgrade code\n$inst = New-Object -ComObject \"WindowsInstaller.Installer\"\n$timeoutSeconds = 300 # 5 minute timeout per product\n\nforeach ($product_code in $inst.RelatedProducts('{99ADCB07-6ABD-4A1D-AFF6-03649753BAFF}')) {\n $process = Start-Process msiexec -ArgumentList @(\"/quiet\", \"/x\", $product_code, \"/norestart\") -PassThru\n \n # Wait for process with timeout\n $completed = $process.WaitForExit($timeoutSeconds * 1000)\n \n if (-not $completed) {\n Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue\n Exit 1603 # ERROR_UNINSTALL_FAILURE\n }\n \n # If the uninstall failed, bail\n if ($process.ExitCode -ne 0) {\n Write-Output \"Uninstall for $($product_code) exited $($process.ExitCode)\"\n Exit $process.ExitCode\n }\n}\n\n# All uninstalls succeeded; exit success\nExit 0\n" + } +} diff --git a/frontend/pages/SoftwarePage/components/icons/DruvaInSync.tsx b/frontend/pages/SoftwarePage/components/icons/DruvaInSync.tsx new file mode 100644 index 0000000000..5c0a2c5f3b --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/DruvaInSync.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const DruvaInSync = (props: SVGProps) => ( + + + +); +export default DruvaInSync; diff --git a/frontend/pages/SoftwarePage/components/icons/index.ts b/frontend/pages/SoftwarePage/components/icons/index.ts index 57a9ee6dd4..243c85c645 100644 --- a/frontend/pages/SoftwarePage/components/icons/index.ts +++ b/frontend/pages/SoftwarePage/components/icons/index.ts @@ -10,6 +10,7 @@ import BetterDisplay from "./BetterDisplay"; import Charles from "./Charles"; import ConnectFonts from "./ConnectFonts"; import CrashPlan from "./CrashPlan"; +import DruvaInSync from "./DruvaInSync"; import GoogleCredentialProviderForWindows from "./GoogleCredentialProviderForWindows"; import Iina from "./Iina"; import Kitty from "./Kitty"; @@ -316,6 +317,7 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { crashplan: CrashPlan, "google credential provider for windows": GoogleCredentialProviderForWindows, iina: Iina, + insyncclient: DruvaInSync, kitty: Kitty, krita: Krita, lastpass: LastPass, diff --git a/website/assets/images/app-icon-druva-insync-60x60@2x.png b/website/assets/images/app-icon-druva-insync-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2769a91dde6587529eaa65f7870dc3f399e9a102 GIT binary patch literal 9242 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