mirror of
https://github.com/fleetdm/fleet
synced 2026-04-21 13:37:30 +00:00
Add Granola as a Windows FMA (#43537)
Add support for Granola (Windows) including winget input, installer/uninstaller scripts, and output metadata. Added ee/maintained-apps/inputs/winget/granola.json plus install/uninstall PowerShell scripts, and new ee/maintained-apps/outputs/granola/windows.json containing version 7.128.0, installer URL and script refs (with SHA256). Also register Granola in ee/maintained-apps/outputs/apps.json and update the frontend icon and website app image assets for Granola.
This commit is contained in:
parent
61bf32838f
commit
3e75d59bc0
7 changed files with 183 additions and 2 deletions
13
ee/maintained-apps/inputs/winget/granola.json
Normal file
13
ee/maintained-apps/inputs/winget/granola.json
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"name": "Granola",
|
||||
"slug": "granola/windows",
|
||||
"package_identifier": "Granola.Granola",
|
||||
"unique_identifier": "Granola",
|
||||
"fuzzy_match_name": true,
|
||||
"installer_arch": "x64",
|
||||
"installer_type": "exe",
|
||||
"installer_scope": "user",
|
||||
"install_script_path": "ee/maintained-apps/inputs/winget/scripts/granola_install.ps1",
|
||||
"uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/granola_uninstall.ps1",
|
||||
"default_categories": ["Productivity"]
|
||||
}
|
||||
26
ee/maintained-apps/inputs/winget/scripts/granola_install.ps1
Normal file
26
ee/maintained-apps/inputs/winget/scripts/granola_install.ps1
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
# Learn more about .exe install scripts:
|
||||
# http://fleetdm.com/learn-more-about/exe-install-scripts
|
||||
|
||||
$exeFilePath = "${env:INSTALLER_PATH}"
|
||||
|
||||
try {
|
||||
# Granola uses a Nullsoft installer:
|
||||
# - /S for silent installation
|
||||
# - /currentuser for per-user installs
|
||||
$processOptions = @{
|
||||
FilePath = "$exeFilePath"
|
||||
ArgumentList = "/S /currentuser"
|
||||
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
|
||||
}
|
||||
113
ee/maintained-apps/inputs/winget/scripts/granola_uninstall.ps1
Normal file
113
ee/maintained-apps/inputs/winget/scripts/granola_uninstall.ps1
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
# Attempts to locate Granola's uninstaller from registry and execute it silently
|
||||
|
||||
$displayName = "Granola"
|
||||
$productCode = "cdc80bd8-3b8c-5d86-a628-c46cf9da018d"
|
||||
|
||||
$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) {
|
||||
$codeCandidates = @(
|
||||
"$p\$productCode",
|
||||
"$p\{$productCode}"
|
||||
)
|
||||
|
||||
foreach ($candidate in $codeCandidates) {
|
||||
if (Test-Path $candidate) {
|
||||
$uninstall = Get-ItemProperty -Path $candidate -ErrorAction SilentlyContinue
|
||||
if ($uninstall) {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($uninstall) {
|
||||
break
|
||||
}
|
||||
|
||||
$items = Get-ItemProperty "$p\*" -ErrorAction SilentlyContinue | Where-Object {
|
||||
$_.DisplayName -and ($_.DisplayName -eq $displayName -or $_.DisplayName -like "$displayName*")
|
||||
}
|
||||
|
||||
if ($items) {
|
||||
$uninstall = $items | Select-Object -First 1
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if (-not $uninstall) {
|
||||
Write-Host "Uninstall entry not found"
|
||||
Exit 0
|
||||
}
|
||||
|
||||
$uninstallString = if ($uninstall.QuietUninstallString) {
|
||||
$uninstall.QuietUninstallString
|
||||
}
|
||||
else {
|
||||
$uninstall.UninstallString
|
||||
}
|
||||
|
||||
if (-not $uninstallString) {
|
||||
Write-Host "Uninstall command not found"
|
||||
Exit 0
|
||||
}
|
||||
|
||||
Stop-Process -Name "Granola" -Force -ErrorAction SilentlyContinue
|
||||
|
||||
$exePath = ""
|
||||
$arguments = ""
|
||||
|
||||
if ($uninstallString -match '^"([^"]+)"(.*)') {
|
||||
$exePath = $matches[1]
|
||||
$arguments = $matches[2].Trim()
|
||||
}
|
||||
elseif ($uninstallString -match '^([^\s]+)(.*)') {
|
||||
$exePath = $matches[1]
|
||||
$arguments = $matches[2].Trim()
|
||||
}
|
||||
else {
|
||||
Write-Host "Error: Could not parse uninstall string: $uninstallString"
|
||||
Exit 1
|
||||
}
|
||||
|
||||
$argumentList = @()
|
||||
if ($arguments -ne '') {
|
||||
$argumentList += $arguments -split '\s+'
|
||||
}
|
||||
|
||||
# NSIS uninstallers require /S for silent mode.
|
||||
if ($argumentList -notcontains "/S" -and $arguments -notmatch '\b/S\b') {
|
||||
$argumentList += "/S"
|
||||
}
|
||||
|
||||
Write-Host "Uninstall executable: $exePath"
|
||||
Write-Host "Uninstall arguments: $($argumentList -join ' ')"
|
||||
|
||||
try {
|
||||
$processOptions = @{
|
||||
FilePath = $exePath
|
||||
NoNewWindow = $true
|
||||
PassThru = $true
|
||||
Wait = $true
|
||||
}
|
||||
|
||||
if ($argumentList.Count -gt 0) {
|
||||
$processOptions.ArgumentList = $argumentList
|
||||
}
|
||||
|
||||
$process = Start-Process @processOptions
|
||||
$exitCode = $process.ExitCode
|
||||
|
||||
Write-Host "Uninstall exit code: $exitCode"
|
||||
Exit $exitCode
|
||||
}
|
||||
catch {
|
||||
Write-Host "Error running uninstaller: $_"
|
||||
Exit 1
|
||||
}
|
||||
|
|
@ -841,6 +841,13 @@
|
|||
"unique_identifier": "com.granola.app",
|
||||
"description": "Granola is an AI-powered notepad for meetings."
|
||||
},
|
||||
{
|
||||
"name": "Granola",
|
||||
"slug": "granola/windows",
|
||||
"platform": "windows",
|
||||
"unique_identifier": "Granola",
|
||||
"description": "Granola is an AI-powered notepad for meetings."
|
||||
},
|
||||
{
|
||||
"name": "Hyper",
|
||||
"slug": "hyper/darwin",
|
||||
|
|
@ -1962,4 +1969,4 @@
|
|||
"description": "Zotero is a free tool for collecting, organizing, citing, and sharing research."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
|
|||
22
ee/maintained-apps/outputs/granola/windows.json
Normal file
22
ee/maintained-apps/outputs/granola/windows.json
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"versions": [
|
||||
{
|
||||
"version": "7.128.0",
|
||||
"queries": {
|
||||
"exists": "SELECT 1 FROM programs WHERE name LIKE 'Granola %' AND publisher = 'Granola';",
|
||||
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Granola %' AND publisher = 'Granola' AND version_compare(version, '7.128.0') < 0);"
|
||||
},
|
||||
"installer_url": "https://api.granola.ai/v1/check-for-update/Granola-7.128.0-win-x64.exe",
|
||||
"install_script_ref": "3f66ac53",
|
||||
"uninstall_script_ref": "a4fab3f5",
|
||||
"sha256": "4ff0a9cec505f1e892f5b0ab90164c062d3aa17f1bbe4040c536c1672e32ca2c",
|
||||
"default_categories": [
|
||||
"Productivity"
|
||||
]
|
||||
}
|
||||
],
|
||||
"refs": {
|
||||
"3f66ac53": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n # Granola uses a Nullsoft installer:\n # - /S for silent installation\n # - /currentuser for per-user installs\n $processOptions = @{\n FilePath = \"$exeFilePath\"\n ArgumentList = \"/S /currentuser\"\n PassThru = $true\n Wait = $true\n }\n\n $process = Start-Process @processOptions\n $exitCode = $process.ExitCode\n\n Write-Host \"Install exit code: $exitCode\"\n Exit $exitCode\n}\ncatch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n",
|
||||
"a4fab3f5": "# Attempts to locate Granola's uninstaller from registry and execute it silently\n\n$displayName = \"Granola\"\n$productCode = \"cdc80bd8-3b8c-5d86-a628-c46cf9da018d\"\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\n\nforeach ($p in $paths) {\n $codeCandidates = @(\n \"$p\\$productCode\",\n \"$p\\{$productCode}\"\n )\n\n foreach ($candidate in $codeCandidates) {\n if (Test-Path $candidate) {\n $uninstall = Get-ItemProperty -Path $candidate -ErrorAction SilentlyContinue\n if ($uninstall) {\n break\n }\n }\n }\n\n if ($uninstall) {\n break\n }\n\n $items = Get-ItemProperty \"$p\\*\" -ErrorAction SilentlyContinue | Where-Object {\n $_.DisplayName -and ($_.DisplayName -eq $displayName -or $_.DisplayName -like \"$displayName*\")\n }\n\n if ($items) {\n $uninstall = $items | Select-Object -First 1\n break\n }\n}\n\nif (-not $uninstall) {\n Write-Host \"Uninstall entry not found\"\n Exit 0\n}\n\n$uninstallString = if ($uninstall.QuietUninstallString) {\n $uninstall.QuietUninstallString\n}\nelse {\n $uninstall.UninstallString\n}\n\nif (-not $uninstallString) {\n Write-Host \"Uninstall command not found\"\n Exit 0\n}\n\nStop-Process -Name \"Granola\" -Force -ErrorAction SilentlyContinue\n\n$exePath = \"\"\n$arguments = \"\"\n\nif ($uninstallString -match '^\"([^\"]+)\"(.*)') {\n $exePath = $matches[1]\n $arguments = $matches[2].Trim()\n}\nelseif ($uninstallString -match '^([^\\s]+)(.*)') {\n $exePath = $matches[1]\n $arguments = $matches[2].Trim()\n}\nelse {\n Write-Host \"Error: Could not parse uninstall string: $uninstallString\"\n Exit 1\n}\n\n$argumentList = @()\nif ($arguments -ne '') {\n $argumentList += $arguments -split '\\s+'\n}\n\n# NSIS uninstallers require /S for silent mode.\nif ($argumentList -notcontains \"/S\" -and $arguments -notmatch '\\b/S\\b') {\n $argumentList += \"/S\"\n}\n\nWrite-Host \"Uninstall executable: $exePath\"\nWrite-Host \"Uninstall arguments: $($argumentList -join ' ')\"\n\ntry {\n $processOptions = @{\n FilePath = $exePath\n NoNewWindow = $true\n PassThru = $true\n Wait = $true\n }\n\n if ($argumentList.Count -gt 0) {\n $processOptions.ArgumentList = $argumentList\n }\n\n $process = Start-Process @processOptions\n $exitCode = $process.ExitCode\n\n Write-Host \"Uninstall exit code: $exitCode\"\n Exit $exitCode\n}\ncatch {\n Write-Host \"Error running uninstaller: $_\"\n Exit 1\n}\n"
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
BIN
website/assets/images/app-icon-granola-60x60@2x.png
vendored
BIN
website/assets/images/app-icon-granola-60x60@2x.png
vendored
Binary file not shown.
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 7.5 KiB |
Loading…
Reference in a new issue