diff --git a/ee/maintained-apps/inputs/winget/gadwin-printscreen-pro.json b/ee/maintained-apps/inputs/winget/gadwin-printscreen-pro.json new file mode 100644 index 0000000000..e96f555372 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/gadwin-printscreen-pro.json @@ -0,0 +1,12 @@ +{ + "name": "Gadwin PrintScreen Pro", + "slug": "gadwin-printscreen-pro/windows", + "package_identifier": "Gadwin.PrintScreen.Pro", + "unique_identifier": "Gadwin PrintScreenPro (64-Bit)", + "installer_arch": "x64", + "installer_type": "msi", + "installer_scope": "machine", + "default_categories": [ + "Productivity" + ] +} diff --git a/ee/maintained-apps/inputs/winget/gadwin-printscreen.json b/ee/maintained-apps/inputs/winget/gadwin-printscreen.json new file mode 100644 index 0000000000..806f2ab5d2 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/gadwin-printscreen.json @@ -0,0 +1,12 @@ +{ + "name": "Gadwin PrintScreen", + "slug": "gadwin-printscreen/windows", + "package_identifier": "Gadwin.PrintScreen", + "unique_identifier": "Gadwin PrintScreen (64-Bit)", + "installer_arch": "x64", + "installer_type": "msi", + "installer_scope": "machine", + "default_categories": [ + "Productivity" + ] +} diff --git a/ee/maintained-apps/inputs/winget/gadwin-screenrecorder.json b/ee/maintained-apps/inputs/winget/gadwin-screenrecorder.json new file mode 100644 index 0000000000..37f4e1e62c --- /dev/null +++ b/ee/maintained-apps/inputs/winget/gadwin-screenrecorder.json @@ -0,0 +1,12 @@ +{ + "name": "Gadwin ScreenRecorder", + "slug": "gadwin-screenrecorder/windows", + "package_identifier": "Gadwin.ScreenRecorder", + "unique_identifier": "Gadwin ScreenRecorder (64-Bit)", + "installer_arch": "x64", + "installer_type": "msi", + "installer_scope": "machine", + "default_categories": [ + "Productivity" + ] +} diff --git a/ee/maintained-apps/inputs/winget/galaxy-modeler.json b/ee/maintained-apps/inputs/winget/galaxy-modeler.json new file mode 100644 index 0000000000..92773338e9 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/galaxy-modeler.json @@ -0,0 +1,14 @@ +{ + "name": "Galaxy Modeler", + "slug": "galaxy-modeler/windows", + "package_identifier": "Ideamerit.GalaxyModeler", + "unique_identifier": "Galaxy Modeler", + "installer_arch": "x64", + "installer_type": "exe", + "installer_scope": "machine", + "install_script_path": "ee/maintained-apps/inputs/winget/scripts/galaxy-modeler_install.ps1", + "uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/galaxy-modeler_uninstall.ps1", + "default_categories": [ + "Developer tools" + ] +} diff --git a/ee/maintained-apps/inputs/winget/garmin-basecamp.json b/ee/maintained-apps/inputs/winget/garmin-basecamp.json new file mode 100644 index 0000000000..a00a2acb4a --- /dev/null +++ b/ee/maintained-apps/inputs/winget/garmin-basecamp.json @@ -0,0 +1,15 @@ +{ + "name": "Garmin BaseCamp", + "slug": "garmin-basecamp/windows", + "package_identifier": "Garmin.BaseCamp", + "unique_identifier": "Garmin BaseCamp", + "installer_arch": "x86", + "installer_type": "exe", + "installer_scope": "machine", + "install_script_path": "ee/maintained-apps/inputs/winget/scripts/garmin-basecamp_install.ps1", + "uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/garmin-basecamp_uninstall.ps1", + "default_categories": [ + "Productivity" + ], + "program_publisher": "Garmin Ltd. or its subsidiaries" +} diff --git a/ee/maintained-apps/inputs/winget/geogebra-classic.json b/ee/maintained-apps/inputs/winget/geogebra-classic.json new file mode 100644 index 0000000000..d75a054f04 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/geogebra-classic.json @@ -0,0 +1,14 @@ +{ + "name": "GeoGebra Classic", + "slug": "geogebra-classic/windows", + "package_identifier": "GeoGebra.Classic", + "unique_identifier": "GeoGebra Classic", + "installer_arch": "x86", + "installer_type": "msi", + "installer_scope": "user", + "default_categories": [ + "Productivity" + ], + "install_script_path": "ee/maintained-apps/inputs/winget/scripts/geogebra-classic_install.ps1", + "uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/geogebra-classic_uninstall.ps1" +} diff --git a/ee/maintained-apps/inputs/winget/go.json b/ee/maintained-apps/inputs/winget/go.json new file mode 100644 index 0000000000..f52a7162e0 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/go.json @@ -0,0 +1,13 @@ +{ + "name": "Go", + "slug": "go/windows", + "package_identifier": "GoLang.Go", + "unique_identifier": "Go Programming Language", + "fuzzy_match_name": "Go Programming Language%", + "installer_arch": "x64", + "installer_type": "msi", + "installer_scope": "machine", + "default_categories": [ + "Developer tools" + ] +} diff --git a/ee/maintained-apps/inputs/winget/goanywhere-openpgp-studio.json b/ee/maintained-apps/inputs/winget/goanywhere-openpgp-studio.json new file mode 100644 index 0000000000..44f93801fb --- /dev/null +++ b/ee/maintained-apps/inputs/winget/goanywhere-openpgp-studio.json @@ -0,0 +1,14 @@ +{ + "name": "GoAnywhere OpenPGP Studio", + "slug": "goanywhere-openpgp-studio/windows", + "package_identifier": "Fortra.GoAnywhereOpenPGPStudio", + "unique_identifier": "GoAnywhere OpenPGP Studio", + "installer_arch": "x64", + "installer_type": "exe", + "installer_scope": "machine", + "install_script_path": "ee/maintained-apps/inputs/winget/scripts/goanywhere-openpgp-studio_install.ps1", + "uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/goanywhere-openpgp-studio_uninstall.ps1", + "default_categories": [ + "Security" + ] +} diff --git a/ee/maintained-apps/inputs/winget/goldendict-ng.json b/ee/maintained-apps/inputs/winget/goldendict-ng.json new file mode 100644 index 0000000000..d4741bf884 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/goldendict-ng.json @@ -0,0 +1,15 @@ +{ + "name": "GoldenDict-ng", + "slug": "goldendict-ng/windows", + "package_identifier": "xiaoyifang.GoldenDict-ng", + "unique_identifier": "GoldenDict-ng", + "installer_arch": "x64", + "installer_type": "exe", + "installer_scope": "machine", + "install_script_path": "ee/maintained-apps/inputs/winget/scripts/goldendict-ng_install.ps1", + "uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/goldendict-ng_uninstall.ps1", + "default_categories": [ + "Productivity" + ], + "exists_query": "SELECT 1 FROM programs WHERE name = 'GoldenDict-ng';" +} diff --git a/ee/maintained-apps/inputs/winget/google-ads-editor.json b/ee/maintained-apps/inputs/winget/google-ads-editor.json new file mode 100644 index 0000000000..93e4d6edf6 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/google-ads-editor.json @@ -0,0 +1,13 @@ +{ + "name": "Google Ads Editor", + "slug": "google-ads-editor/windows", + "package_identifier": "Google.AdsEditor", + "unique_identifier": "Google Ads Editor", + "installer_arch": "x64", + "installer_type": "msi", + "installer_scope": "machine", + "install_script_path": "ee/maintained-apps/inputs/winget/scripts/google-ads-editor_install.ps1", + "default_categories": [ + "Productivity" + ] +} diff --git a/ee/maintained-apps/inputs/winget/google-web-designer.json b/ee/maintained-apps/inputs/winget/google-web-designer.json new file mode 100644 index 0000000000..2f864a7dd4 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/google-web-designer.json @@ -0,0 +1,14 @@ +{ + "name": "Google Web Designer", + "slug": "google-web-designer/windows", + "package_identifier": "Google.GoogleWebDesigner", + "unique_identifier": "Google Web Designer", + "installer_arch": "x64", + "installer_type": "exe", + "installer_scope": "machine", + "install_script_path": "ee/maintained-apps/inputs/winget/scripts/google-web-designer_install.ps1", + "uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/google-web-designer_uninstall.ps1", + "default_categories": [ + "Developer tools" + ] +} diff --git a/ee/maintained-apps/inputs/winget/graphviz.json b/ee/maintained-apps/inputs/winget/graphviz.json new file mode 100644 index 0000000000..76277d16d4 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/graphviz.json @@ -0,0 +1,14 @@ +{ + "name": "Graphviz", + "slug": "graphviz/windows", + "package_identifier": "Graphviz.Graphviz", + "unique_identifier": "Graphviz", + "installer_arch": "x64", + "installer_type": "exe", + "installer_scope": "machine", + "install_script_path": "ee/maintained-apps/inputs/winget/scripts/graphviz_install.ps1", + "uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/graphviz_uninstall.ps1", + "default_categories": [ + "Developer tools" + ] +} diff --git a/ee/maintained-apps/inputs/winget/grepwin.json b/ee/maintained-apps/inputs/winget/grepwin.json new file mode 100644 index 0000000000..ec87ef5fff --- /dev/null +++ b/ee/maintained-apps/inputs/winget/grepwin.json @@ -0,0 +1,12 @@ +{ + "name": "grepWin", + "slug": "grepwin/windows", + "package_identifier": "StefansTools.grepWin", + "unique_identifier": "grepWin", + "installer_arch": "x64", + "installer_type": "msi", + "installer_scope": "machine", + "default_categories": [ + "Developer tools" + ] +} diff --git a/ee/maintained-apps/inputs/winget/scripts/galaxy-modeler_install.ps1 b/ee/maintained-apps/inputs/winget/scripts/galaxy-modeler_install.ps1 new file mode 100644 index 0000000000..f207c944f1 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/galaxy-modeler_install.ps1 @@ -0,0 +1,22 @@ +# Learn more about .exe install scripts: +# http://fleetdm.com/learn-more-about/exe-install-scripts +# +# Galaxy Modeler is an electron-builder (NSIS) installer; /S runs silent and +# /allusers forces the machine-wide install per the winget machine-scope switch. + +$exeFilePath = "${env:INSTALLER_PATH}" + +try { + +$process = Start-Process -FilePath "$exeFilePath" -ArgumentList "/S /allusers" -PassThru -Wait +$exitCode = $process.ExitCode +Write-Host "Install exit code: $exitCode" + +# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated +if ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 } +Exit $exitCode + +} catch { + Write-Host "Error: $_" + Exit 1 +} diff --git a/ee/maintained-apps/inputs/winget/scripts/galaxy-modeler_uninstall.ps1 b/ee/maintained-apps/inputs/winget/scripts/galaxy-modeler_uninstall.ps1 new file mode 100644 index 0000000000..6dfc19b9c9 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/galaxy-modeler_uninstall.ps1 @@ -0,0 +1,56 @@ +# Uninstalls Galaxy Modeler. Locates the electron-builder NSIS uninstaller from +# the registry by DisplayName and runs it with /allusers /S after stopping the app. + +$softwareNameLike = "Galaxy Modeler*" + +$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*' +$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*' + +$exitCode = $null + +try { + +foreach ($p in @("Galaxy Modeler")) { + Stop-Process -Name $p -Force -ErrorAction SilentlyContinue +} +Start-Sleep -Seconds 2 + +[array]$uninstallKeys = Get-ChildItem ` + -Path @($machineKey, $machineKey32on64) ` + -ErrorAction SilentlyContinue | + ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue } + +$selected = $uninstallKeys | + Where-Object { $_.DisplayName -like $softwareNameLike } | + Select-Object -First 1 +if (-not $selected -or -not $selected.UninstallString) { + Write-Host "Uninstall entry not found for $softwareNameLike" + Exit 1 +} + +$raw = if ($selected.QuietUninstallString) { $selected.QuietUninstallString } else { $selected.UninstallString } +if ($raw -match '^\s*"([^"]+)"\s*(.*)$') { + $exe = $matches[1]; $exeArgs = $matches[2].Trim() +} elseif ($raw -match '(?i)^\s*(.+?\.exe)\s*(.*)$') { + $exe = $matches[1]; $exeArgs = $matches[2].Trim() +} else { + $exe = $raw; $exeArgs = "" +} + +# electron-builder NSIS uninstaller: /allusers matches the machine install, /S is silent. +if ($exeArgs -notmatch '(?i)(^|\s)/allusers(\s|$)') { $exeArgs = "$exeArgs /allusers".Trim() } +if ($exeArgs -notmatch '(?i)(^|\s)/S(\s|$)') { $exeArgs = "$exeArgs /S".Trim() } + +Write-Host "Uninstall command: $exe" +Write-Host "Uninstall args: $exeArgs" +$process = Start-Process -FilePath $exe -ArgumentList $exeArgs -PassThru -Wait +$exitCode = $process.ExitCode +Write-Host "Uninstall exit code: $exitCode" + +} catch { + Write-Host "Error: $_" + Exit 1 +} + +if ($exitCode -eq 0 -or $exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 } +Exit $exitCode diff --git a/ee/maintained-apps/inputs/winget/scripts/garmin-basecamp_install.ps1 b/ee/maintained-apps/inputs/winget/scripts/garmin-basecamp_install.ps1 new file mode 100644 index 0000000000..0a3b1ac82a --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/garmin-basecamp_install.ps1 @@ -0,0 +1,22 @@ +# Learn more about .exe install scripts: +# http://fleetdm.com/learn-more-about/exe-install-scripts +# +# Garmin BaseCamp is a WiX Burn bundle; /quiet /norestart runs it silently and +# installs machine-wide. + +$exeFilePath = "${env:INSTALLER_PATH}" + +try { + +$process = Start-Process -FilePath "$exeFilePath" -ArgumentList "/quiet /norestart" -PassThru -Wait +$exitCode = $process.ExitCode +Write-Host "Install exit code: $exitCode" + +# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated +if ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 } +Exit $exitCode + +} catch { + Write-Host "Error: $_" + Exit 1 +} diff --git a/ee/maintained-apps/inputs/winget/scripts/garmin-basecamp_uninstall.ps1 b/ee/maintained-apps/inputs/winget/scripts/garmin-basecamp_uninstall.ps1 new file mode 100644 index 0000000000..ffe94b097b --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/garmin-basecamp_uninstall.ps1 @@ -0,0 +1,51 @@ +# Uninstalls Garmin BaseCamp (WiX Burn bundle). Runs the cached bundle's +# QuietUninstallString (/uninstall /quiet). + +$softwareNameLike = "Garmin BaseCamp*" + +$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*' +$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*' + +$exitCode = $null + +try { + +[array]$uninstallKeys = Get-ChildItem ` + -Path @($machineKey, $machineKey32on64) ` + -ErrorAction SilentlyContinue | + ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue } + +$selected = $uninstallKeys | + Where-Object { $_.DisplayName -like $softwareNameLike } | + Select-Object -First 1 +if (-not $selected -or -not $selected.UninstallString) { + Write-Host "Uninstall entry not found for $softwareNameLike" + Exit 1 +} + +# WiX Burn: prefer QuietUninstallString; else force /uninstall /quiet onto the bundle exe. +$raw = if ($selected.QuietUninstallString) { $selected.QuietUninstallString } else { $selected.UninstallString } +if ($raw -match '^\s*"([^"]+)"\s*(.*)$') { + $exe = $matches[1]; $exeArgs = $matches[2].Trim() +} elseif ($raw -match '(?i)^\s*(.+?\.exe)\s*(.*)$') { + $exe = $matches[1]; $exeArgs = $matches[2].Trim() +} else { + $exe = $raw; $exeArgs = "" +} +if ($exeArgs -notmatch '(?i)(^|\s)/uninstall(\s|$)') { $exeArgs = "/uninstall $exeArgs".Trim() } +if ($exeArgs -notmatch '(?i)(^|\s)/quiet(\s|$)') { $exeArgs = "$exeArgs /quiet".Trim() } +if ($exeArgs -notmatch '(?i)/norestart') { $exeArgs = "$exeArgs /norestart".Trim() } + +Write-Host "Uninstall command: $exe" +Write-Host "Uninstall args: $exeArgs" +$process = Start-Process -FilePath $exe -ArgumentList $exeArgs -PassThru -Wait +$exitCode = $process.ExitCode +Write-Host "Uninstall exit code: $exitCode" + +} catch { + Write-Host "Error: $_" + Exit 1 +} + +if ($exitCode -eq 0 -or $exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 } +Exit $exitCode diff --git a/ee/maintained-apps/inputs/winget/scripts/geogebra-classic_install.ps1 b/ee/maintained-apps/inputs/winget/scripts/geogebra-classic_install.ps1 new file mode 100644 index 0000000000..778dd1391b --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/geogebra-classic_install.ps1 @@ -0,0 +1,24 @@ +# Learn more about install scripts: +# http://fleetdm.com/learn-more-about/install-scripts +# +# GeoGebra Classic's winget manifest declares Scope: user at the top level, but +# its WiX MSI installer is machine-wide (installs to Program Files (x86)). We run +# the MSI silently; ALLUSERS is set inside the package, so it lands per-machine. + +$logFile = "${env:TEMP}/fleet-install-software.log" + +try { + +$installProcess = Start-Process msiexec.exe ` + -ArgumentList "/quiet /norestart /lv ${logFile} /i `"${env:INSTALLER_PATH}`"" ` + -PassThru -Verb RunAs -Wait + +Get-Content $logFile -Tail 500 + +if ($installProcess.ExitCode -eq 3010 -or $installProcess.ExitCode -eq 1641) { Exit 0 } +Exit $installProcess.ExitCode + +} catch { + Write-Host "Error: $_" + Exit 1 +} diff --git a/ee/maintained-apps/inputs/winget/scripts/geogebra-classic_uninstall.ps1 b/ee/maintained-apps/inputs/winget/scripts/geogebra-classic_uninstall.ps1 new file mode 100644 index 0000000000..887984b4a0 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/geogebra-classic_uninstall.ps1 @@ -0,0 +1,46 @@ +# Uninstalls GeoGebra Classic (machine-wide WiX MSI). Resolve the ProductCode +# from the registry by DisplayName and uninstall via msiexec. + +$softwareName = "GeoGebra Classic" + +$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*' +$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*' +$successCodes = @(0, 3010, 1641) +$exitCode = $null + +try { + +[array]$uninstallKeys = Get-ChildItem ` + -Path @($machineKey, $machineKey32on64) ` + -ErrorAction SilentlyContinue | + ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue } + +$selected = $uninstallKeys | Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1 +if (-not $selected) { + Write-Host "Uninstall entry not found for '$softwareName'." + Exit 1 +} + +$productCode = $selected.PSChildName +if ($productCode -notmatch '^\{[0-9A-Fa-f-]+\}$') { + $raw = $selected.UninstallString + if ($raw -match '(\{[0-9A-Fa-f-]+\})') { $productCode = $matches[1] } +} +if ($productCode -notmatch '^\{[0-9A-Fa-f-]+\}$') { + Write-Host "Could not determine ProductCode for '$softwareName'." + Exit 1 +} + +Write-Host "Uninstalling product code: $productCode" +$process = Start-Process msiexec.exe ` + -ArgumentList "/x $productCode /qn /norestart" -NoNewWindow -PassThru -Wait +$exitCode = $process.ExitCode +Write-Host "Uninstall exit code: $exitCode" + +} catch { + Write-Host "Error: $_" + Exit 1 +} + +if ($successCodes -contains $exitCode) { Exit 0 } +Exit $exitCode diff --git a/ee/maintained-apps/inputs/winget/scripts/goanywhere-openpgp-studio_install.ps1 b/ee/maintained-apps/inputs/winget/scripts/goanywhere-openpgp-studio_install.ps1 new file mode 100644 index 0000000000..0c5a4e0317 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/goanywhere-openpgp-studio_install.ps1 @@ -0,0 +1,22 @@ +# Learn more about .exe install scripts: +# http://fleetdm.com/learn-more-about/exe-install-scripts +# +# GoAnywhere OpenPGP Studio ships as an install4j installer (bundled JRE). -q +# runs it unattended; suppressUnattendedReboot avoids an automatic reboot. + +$exeFilePath = "${env:INSTALLER_PATH}" + +try { + +$process = Start-Process -FilePath "$exeFilePath" ` + -ArgumentList "-q -Dinstall4j.suppressUnattendedReboot=true" -PassThru -Wait +$exitCode = $process.ExitCode +Write-Host "Install exit code: $exitCode" + +if ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 } +Exit $exitCode + +} catch { + Write-Host "Error: $_" + Exit 1 +} diff --git a/ee/maintained-apps/inputs/winget/scripts/goanywhere-openpgp-studio_uninstall.ps1 b/ee/maintained-apps/inputs/winget/scripts/goanywhere-openpgp-studio_uninstall.ps1 new file mode 100644 index 0000000000..69cb031ea8 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/goanywhere-openpgp-studio_uninstall.ps1 @@ -0,0 +1,54 @@ +# Uninstalls GoAnywhere OpenPGP Studio. install4j registers an ARP entry whose +# UninstallString points at its uninstall.exe; -q runs it unattended. + +$softwareNameLike = "GoAnywhere OpenPGP Studio*" + +$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*' +$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*' + +$exitCode = $null + +try { + +foreach ($p in @("OpenPGPStudio", "GoAnywhere OpenPGP Studio")) { + Stop-Process -Name $p -Force -ErrorAction SilentlyContinue +} + +[array]$uninstallKeys = Get-ChildItem ` + -Path @($machineKey, $machineKey32on64) ` + -ErrorAction SilentlyContinue | + ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue } + +$selected = $uninstallKeys | + Where-Object { $_.DisplayName -like $softwareNameLike } | + Select-Object -First 1 +if (-not $selected -or -not $selected.UninstallString) { + Write-Host "Uninstall entry not found for $softwareNameLike" + Exit 1 +} + +$raw = $selected.UninstallString +if ($raw -match '^\s*"([^"]+)"\s*(.*)$') { + $exe = $matches[1]; $exeArgs = $matches[2].Trim() +} elseif ($raw -match '(?i)^\s*(.+?\.exe)\s*(.*)$') { + $exe = $matches[1]; $exeArgs = $matches[2].Trim() +} else { + $exe = $raw; $exeArgs = "" +} + +# install4j silent uninstall flag. +if ($exeArgs -notmatch '(?i)(^|\s)-q(\s|$)') { $exeArgs = "$exeArgs -q".Trim() } + +Write-Host "Uninstall command: $exe" +Write-Host "Uninstall args: $exeArgs" +$process = Start-Process -FilePath $exe -ArgumentList $exeArgs -PassThru -Wait +$exitCode = $process.ExitCode +Write-Host "Uninstall exit code: $exitCode" + +} catch { + Write-Host "Error: $_" + Exit 1 +} + +if ($exitCode -eq 0 -or $exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 } +Exit $exitCode diff --git a/ee/maintained-apps/inputs/winget/scripts/goldendict-ng_install.ps1 b/ee/maintained-apps/inputs/winget/scripts/goldendict-ng_install.ps1 new file mode 100644 index 0000000000..be8aad568c --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/goldendict-ng_install.ps1 @@ -0,0 +1,22 @@ +# Learn more about .exe install scripts: +# http://fleetdm.com/learn-more-about/exe-install-scripts +# +# GoldenDict-ng is a Nullsoft (NSIS) installer declaring machine scope; +# /S runs it silently and installs machine-wide to Program Files. + +$exeFilePath = "${env:INSTALLER_PATH}" + +try { + +$process = Start-Process -FilePath "$exeFilePath" -ArgumentList "/S" -PassThru -Wait +$exitCode = $process.ExitCode +Write-Host "Install exit code: $exitCode" + +# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated +if ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 } +Exit $exitCode + +} catch { + Write-Host "Error: $_" + Exit 1 +} diff --git a/ee/maintained-apps/inputs/winget/scripts/goldendict-ng_uninstall.ps1 b/ee/maintained-apps/inputs/winget/scripts/goldendict-ng_uninstall.ps1 new file mode 100644 index 0000000000..bb4a54d7fa --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/goldendict-ng_uninstall.ps1 @@ -0,0 +1,57 @@ +# Uninstalls GoldenDict-ng. Locates the NSIS uninstaller from the registry by +# DisplayName and runs it silently with /S. Stop the app first so files unlock. + +$softwareNameLike = "GoldenDict-ng*" + +$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*' +$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*' + +$exitCode = $null + +try { + +foreach ($p in @("GoldenDict")) { + Stop-Process -Name $p -Force -ErrorAction SilentlyContinue +} +Start-Sleep -Seconds 2 + +[array]$uninstallKeys = Get-ChildItem ` + -Path @($machineKey, $machineKey32on64) ` + -ErrorAction SilentlyContinue | + ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue } + +$selected = $uninstallKeys | + Where-Object { $_.DisplayName -like $softwareNameLike } | + Select-Object -First 1 +if (-not $selected -or -not $selected.UninstallString) { + Write-Host "Uninstall entry not found for $softwareNameLike" + Exit 1 +} + +$raw = if ($selected.QuietUninstallString) { $selected.QuietUninstallString } else { $selected.UninstallString } + +# Parse exe + args (quoted / unquoted / bare). +if ($raw -match '^\s*"([^"]+)"\s*(.*)$') { + $exe = $matches[1]; $exeArgs = $matches[2].Trim() +} elseif ($raw -match '(?i)^\s*(.+?\.exe)\s*(.*)$') { + $exe = $matches[1]; $exeArgs = $matches[2].Trim() +} else { + $exe = $raw; $exeArgs = "" +} + +# NSIS uninstallers require /S for a silent uninstall. +if ($exeArgs -notmatch '(?i)(^|\s)/S(\s|$)') { $exeArgs = "$exeArgs /S".Trim() } + +Write-Host "Uninstall command: $exe" +Write-Host "Uninstall args: $exeArgs" +$process = Start-Process -FilePath $exe -ArgumentList $exeArgs -PassThru -Wait +$exitCode = $process.ExitCode +Write-Host "Uninstall exit code: $exitCode" + +} catch { + Write-Host "Error: $_" + Exit 1 +} + +if ($exitCode -eq 0 -or $exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 } +Exit $exitCode diff --git a/ee/maintained-apps/inputs/winget/scripts/google-ads-editor_install.ps1 b/ee/maintained-apps/inputs/winget/scripts/google-ads-editor_install.ps1 new file mode 100644 index 0000000000..cee126ba7d --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/google-ads-editor_install.ps1 @@ -0,0 +1,28 @@ +# Learn more about install scripts: +# http://fleetdm.com/learn-more-about/install-scripts +# +# The Google Ads Editor MSI ships as both a per-user and a per-machine package +# (same binary; the machine variant sets ALLUSERS=1). A plain silent install +# under Fleet's SYSTEM context can land per-user (in the SYSTEM profile), so we +# force a true per-machine install by passing ALLUSERS=1 explicitly. + +$logFile = "${env:TEMP}/fleet-install-software.log" + +try { + +$installProcess = Start-Process msiexec.exe ` + -ArgumentList "/quiet /norestart /lv ${logFile} ALLUSERS=1 /i `"${env:INSTALLER_PATH}`"" ` + -PassThru -Verb RunAs -Wait + +Get-Content $logFile -Tail 500 + +# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated +if ($installProcess.ExitCode -eq 3010 -or $installProcess.ExitCode -eq 1641) { + Exit 0 +} +Exit $installProcess.ExitCode + +} catch { + Write-Host "Error: $_" + Exit 1 +} diff --git a/ee/maintained-apps/inputs/winget/scripts/google-web-designer_install.ps1 b/ee/maintained-apps/inputs/winget/scripts/google-web-designer_install.ps1 new file mode 100644 index 0000000000..15b4e1aa68 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/google-web-designer_install.ps1 @@ -0,0 +1,22 @@ +# Learn more about .exe install scripts: +# http://fleetdm.com/learn-more-about/exe-install-scripts +# +# Google Web Designer is a Nullsoft (NSIS) installer declaring machine scope; +# /S runs it silently and installs machine-wide to Program Files. + +$exeFilePath = "${env:INSTALLER_PATH}" + +try { + +$process = Start-Process -FilePath "$exeFilePath" -ArgumentList "/S" -PassThru -Wait +$exitCode = $process.ExitCode +Write-Host "Install exit code: $exitCode" + +# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated +if ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 } +Exit $exitCode + +} catch { + Write-Host "Error: $_" + Exit 1 +} diff --git a/ee/maintained-apps/inputs/winget/scripts/google-web-designer_uninstall.ps1 b/ee/maintained-apps/inputs/winget/scripts/google-web-designer_uninstall.ps1 new file mode 100644 index 0000000000..0f6051c07a --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/google-web-designer_uninstall.ps1 @@ -0,0 +1,52 @@ +# Uninstalls Google Web Designer. Locates the NSIS uninstaller from the registry +# by DisplayName and runs it silently with /S. + +$softwareNameLike = "Google Web Designer*" + +$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*' +$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*' + +$exitCode = $null + +try { + +[array]$uninstallKeys = Get-ChildItem ` + -Path @($machineKey, $machineKey32on64) ` + -ErrorAction SilentlyContinue | + ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue } + +$selected = $uninstallKeys | + Where-Object { $_.DisplayName -like $softwareNameLike } | + Select-Object -First 1 +if (-not $selected -or -not $selected.UninstallString) { + Write-Host "Uninstall entry not found for $softwareNameLike" + Exit 1 +} + +$raw = if ($selected.QuietUninstallString) { $selected.QuietUninstallString } else { $selected.UninstallString } + +# Parse exe + args (quoted / unquoted / bare). +if ($raw -match '^\s*"([^"]+)"\s*(.*)$') { + $exe = $matches[1]; $exeArgs = $matches[2].Trim() +} elseif ($raw -match '(?i)^\s*(.+?\.exe)\s*(.*)$') { + $exe = $matches[1]; $exeArgs = $matches[2].Trim() +} else { + $exe = $raw; $exeArgs = "" +} + +# NSIS uninstallers require /S for a silent uninstall. +if ($exeArgs -notmatch '(?i)(^|\s)/S(\s|$)') { $exeArgs = "$exeArgs /S".Trim() } + +Write-Host "Uninstall command: $exe" +Write-Host "Uninstall args: $exeArgs" +$process = Start-Process -FilePath $exe -ArgumentList $exeArgs -PassThru -Wait +$exitCode = $process.ExitCode +Write-Host "Uninstall exit code: $exitCode" + +} catch { + Write-Host "Error: $_" + Exit 1 +} + +if ($exitCode -eq 0 -or $exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 } +Exit $exitCode diff --git a/ee/maintained-apps/inputs/winget/scripts/graphviz_install.ps1 b/ee/maintained-apps/inputs/winget/scripts/graphviz_install.ps1 new file mode 100644 index 0000000000..12fbd4d43a --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/graphviz_install.ps1 @@ -0,0 +1,22 @@ +# Learn more about .exe install scripts: +# http://fleetdm.com/learn-more-about/exe-install-scripts +# +# Graphviz is a Nullsoft (NSIS) installer declaring machine scope; /S runs it +# silently and installs machine-wide to Program Files. + +$exeFilePath = "${env:INSTALLER_PATH}" + +try { + +$process = Start-Process -FilePath "$exeFilePath" -ArgumentList "/S" -PassThru -Wait +$exitCode = $process.ExitCode +Write-Host "Install exit code: $exitCode" + +# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated +if ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 } +Exit $exitCode + +} catch { + Write-Host "Error: $_" + Exit 1 +} diff --git a/ee/maintained-apps/inputs/winget/scripts/graphviz_uninstall.ps1 b/ee/maintained-apps/inputs/winget/scripts/graphviz_uninstall.ps1 new file mode 100644 index 0000000000..7a5ac51180 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/scripts/graphviz_uninstall.ps1 @@ -0,0 +1,52 @@ +# Uninstalls Graphviz. Locates the NSIS uninstaller from the registry by +# DisplayName and runs it silently with /S. + +$softwareNameLike = "Graphviz*" + +$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*' +$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*' + +$exitCode = $null + +try { + +[array]$uninstallKeys = Get-ChildItem ` + -Path @($machineKey, $machineKey32on64) ` + -ErrorAction SilentlyContinue | + ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue } + +$selected = $uninstallKeys | + Where-Object { $_.DisplayName -like $softwareNameLike } | + Select-Object -First 1 +if (-not $selected -or -not $selected.UninstallString) { + Write-Host "Uninstall entry not found for $softwareNameLike" + Exit 1 +} + +$raw = if ($selected.QuietUninstallString) { $selected.QuietUninstallString } else { $selected.UninstallString } + +# Parse exe + args (quoted / unquoted / bare). +if ($raw -match '^\s*"([^"]+)"\s*(.*)$') { + $exe = $matches[1]; $exeArgs = $matches[2].Trim() +} elseif ($raw -match '(?i)^\s*(.+?\.exe)\s*(.*)$') { + $exe = $matches[1]; $exeArgs = $matches[2].Trim() +} else { + $exe = $raw; $exeArgs = "" +} + +# NSIS uninstallers require /S for a silent uninstall. +if ($exeArgs -notmatch '(?i)(^|\s)/S(\s|$)') { $exeArgs = "$exeArgs /S".Trim() } + +Write-Host "Uninstall command: $exe" +Write-Host "Uninstall args: $exeArgs" +$process = Start-Process -FilePath $exe -ArgumentList $exeArgs -PassThru -Wait +$exitCode = $process.ExitCode +Write-Host "Uninstall exit code: $exitCode" + +} catch { + Write-Host "Error: $_" + Exit 1 +} + +if ($exitCode -eq 0 -or $exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 } +Exit $exitCode diff --git a/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json index 279c24da0d..5f415908f3 100644 --- a/ee/maintained-apps/outputs/apps.json +++ b/ee/maintained-apps/outputs/apps.json @@ -3473,6 +3473,41 @@ "unique_identifier": "com.nektony.Funter-SIII", "description": "Funter is a shows hidden files and folders and switches their visibility in Finder." }, + { + "name": "Gadwin PrintScreen Pro", + "slug": "gadwin-printscreen-pro/windows", + "platform": "windows", + "unique_identifier": "Gadwin PrintScreenPro (64-Bit)", + "description": "Gadwin PrintScreen Pro is a screen capture tool for saving, printing, and sharing screenshots." + }, + { + "name": "Gadwin PrintScreen", + "slug": "gadwin-printscreen/windows", + "platform": "windows", + "unique_identifier": "Gadwin PrintScreen (64-Bit)", + "description": "Gadwin PrintScreen is a screen capture tool that saves screenshots in multiple graphics formats." + }, + { + "name": "Gadwin ScreenRecorder", + "slug": "gadwin-screenrecorder/windows", + "platform": "windows", + "unique_identifier": "Gadwin ScreenRecorder (64-Bit)", + "description": "Gadwin ScreenRecorder is a screen recording tool for creating videos of on-screen activity." + }, + { + "name": "Galaxy Modeler", + "slug": "galaxy-modeler/windows", + "platform": "windows", + "unique_identifier": "Galaxy Modeler", + "description": "Galaxy Modeler is a visual schema design tool for GraphQL data modeling." + }, + { + "name": "Garmin BaseCamp", + "slug": "garmin-basecamp/windows", + "platform": "windows", + "unique_identifier": "Garmin BaseCamp", + "description": "Garmin BaseCamp is a trip-planning application for organizing maps, routes, and outdoor activities." + }, { "name": "Garmin Express", "slug": "garmin-express/darwin", @@ -3543,6 +3578,13 @@ "unique_identifier": "GenesysCloud", "description": "Genesys Cloud is a desktop app for running the Genesys Cloud contact center platform as a stand-alone program, separate from the web browser." }, + { + "name": "GeoGebra Classic", + "slug": "geogebra-classic/windows", + "platform": "windows", + "unique_identifier": "GeoGebra Classic", + "description": "GeoGebra Classic is a math tool bundle for geometry, algebra, spreadsheets, and calculus." + }, { "name": "Gephi", "slug": "gephi/darwin", @@ -3648,6 +3690,13 @@ "unique_identifier": "com.GeorgSeifert.Glyphs3", "description": "Glyphs is a font editor." }, + { + "name": "Go", + "slug": "go/windows", + "platform": "windows", + "unique_identifier": "Go Programming Language", + "description": "Go is an open-source programming language for building secure, scalable systems." + }, { "name": "Go2Shell", "slug": "go2shell/darwin", @@ -3655,6 +3704,13 @@ "unique_identifier": "com.zipzapmac.Go2Shell", "description": "Go2Shell is an opens a terminal window to the current directory in Finder." }, + { + "name": "GoAnywhere OpenPGP Studio", + "slug": "goanywhere-openpgp-studio/windows", + "platform": "windows", + "unique_identifier": "GoAnywhere OpenPGP Studio", + "description": "GoAnywhere OpenPGP Studio is a free PGP encryption tool for securing files." + }, { "name": "Godot Engine", "slug": "godot/darwin", @@ -3697,6 +3753,13 @@ "unique_identifier": "GoLand", "description": "GoLand is a Go (golang) IDE by JetBrains" }, + { + "name": "GoldenDict-ng", + "slug": "goldendict-ng/windows", + "platform": "windows", + "unique_identifier": "GoldenDict-ng", + "description": "GoldenDict-ng is an open-source dictionary lookup program supporting multiple dictionary formats." + }, { "name": "GoodSync", "slug": "goodsync/darwin", @@ -3704,6 +3767,13 @@ "unique_identifier": "com.sibersystems.goodsyncmac2000", "description": "GoodSync is a file synchronisation and backup software." }, + { + "name": "Google Ads Editor", + "slug": "google-ads-editor/windows", + "platform": "windows", + "unique_identifier": "Google Ads Editor", + "description": "Google Ads Editor is a free application for managing Google Ads campaigns." + }, { "name": "Google Chrome", "slug": "google-chrome/darwin", @@ -3753,6 +3823,13 @@ "unique_identifier": "com.google.GeminiMacOS", "description": "Google Gemini is a native desktop AI assistant from Google." }, + { + "name": "Google Web Designer", + "slug": "google-web-designer/windows", + "platform": "windows", + "unique_identifier": "Google Web Designer", + "description": "Google Web Designer is a tool for creating HTML5-based ads, videos, and interactive designs." + }, { "name": "GoToMeeting", "slug": "gotomeeting/darwin", @@ -3816,6 +3893,20 @@ "unique_identifier": "Granola", "description": "Granola is an AI-powered notepad for meetings." }, + { + "name": "Graphviz", + "slug": "graphviz/windows", + "platform": "windows", + "unique_identifier": "Graphviz", + "description": "Graphviz is open-source graph visualization software for representing structural information as diagrams." + }, + { + "name": "grepWin", + "slug": "grepwin/windows", + "platform": "windows", + "unique_identifier": "grepWin", + "description": "grepWin is a regular expression search-and-replace tool for Windows." + }, { "name": "Grids", "slug": "grids/darwin", diff --git a/ee/maintained-apps/outputs/gadwin-printscreen-pro/windows.json b/ee/maintained-apps/outputs/gadwin-printscreen-pro/windows.json new file mode 100644 index 0000000000..0b36a72013 --- /dev/null +++ b/ee/maintained-apps/outputs/gadwin-printscreen-pro/windows.json @@ -0,0 +1,23 @@ +{ + "versions": [ + { + "version": "6.5.0.0", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name = 'Gadwin PrintScreenPro (64-Bit)' AND publisher = 'Gadwin, Ltd.';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Gadwin PrintScreenPro (64-Bit)' AND publisher = 'Gadwin, Ltd.' AND version_compare(version, '6.5.0.0') < 0);" + }, + "installer_url": "https://www.gadwin.com/download/PrintScreenPro650_Win64.msi", + "install_script_ref": "8959087b", + "uninstall_script_ref": "9290bdad", + "sha256": "4affdc0955cf0c7d84f4916304d7faf2f0f4240ad13cecef1364b470dfc73ca6", + "default_categories": [ + "Productivity" + ], + "upgrade_code": "{482A9C7A-6CB8-4B90-AABC-06AF4A94327D}" + } + ], + "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", + "9290bdad": "# 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\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\nforeach ($product_code in $inst.RelatedProducts('{482A9C7A-6CB8-4B90-AABC-06AF4A94327D}')) {\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 ($successCodes -notcontains $process.ExitCode) {\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/ee/maintained-apps/outputs/gadwin-printscreen/windows.json b/ee/maintained-apps/outputs/gadwin-printscreen/windows.json new file mode 100644 index 0000000000..13aa1b12c8 --- /dev/null +++ b/ee/maintained-apps/outputs/gadwin-printscreen/windows.json @@ -0,0 +1,23 @@ +{ + "versions": [ + { + "version": "6.5.0.0", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name = 'Gadwin PrintScreen (64-Bit)' AND publisher = 'Gadwin, Ltd.';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Gadwin PrintScreen (64-Bit)' AND publisher = 'Gadwin, Ltd.' AND version_compare(version, '6.5.0.0') < 0);" + }, + "installer_url": "https://www.gadwin.com/download/PrintScreen650_Win64.msi", + "install_script_ref": "8959087b", + "uninstall_script_ref": "faa268fb", + "sha256": "46315da911ecc82191d77bf2686e24ec0b02a6846f5e046e62f5642431eaf1a1", + "default_categories": [ + "Productivity" + ], + "upgrade_code": "{56218125-6D61-40D5-922A-F2651C8988AC}" + } + ], + "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", + "faa268fb": "# 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\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\nforeach ($product_code in $inst.RelatedProducts('{56218125-6D61-40D5-922A-F2651C8988AC}')) {\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 ($successCodes -notcontains $process.ExitCode) {\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/ee/maintained-apps/outputs/gadwin-screenrecorder/windows.json b/ee/maintained-apps/outputs/gadwin-screenrecorder/windows.json new file mode 100644 index 0000000000..c1c1cdeaf3 --- /dev/null +++ b/ee/maintained-apps/outputs/gadwin-screenrecorder/windows.json @@ -0,0 +1,23 @@ +{ + "versions": [ + { + "version": "4.5.0.0", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name = 'Gadwin ScreenRecorder (64-Bit)' AND publisher = 'Gadwin, Ltd.';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Gadwin ScreenRecorder (64-Bit)' AND publisher = 'Gadwin, Ltd.' AND version_compare(version, '4.5.0.0') < 0);" + }, + "installer_url": "https://www.gadwin.com/download/ScreenRecorder450_Win64.msi", + "install_script_ref": "8959087b", + "uninstall_script_ref": "38f42353", + "sha256": "2119b9f8c7d2353662ae5141d51eb8581ac308a6964a101a3e83a03156962efd", + "default_categories": [ + "Productivity" + ], + "upgrade_code": "{FD892A1E-972D-428C-BF97-5494CD7795C5}" + } + ], + "refs": { + "38f42353": "# 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\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\nforeach ($product_code in $inst.RelatedProducts('{FD892A1E-972D-428C-BF97-5494CD7795C5}')) {\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 ($successCodes -notcontains $process.ExitCode) {\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", + "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" + } +} diff --git a/ee/maintained-apps/outputs/galaxy-modeler/windows.json b/ee/maintained-apps/outputs/galaxy-modeler/windows.json new file mode 100644 index 0000000000..364a931ed8 --- /dev/null +++ b/ee/maintained-apps/outputs/galaxy-modeler/windows.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "12.6.2", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name = 'Galaxy Modeler' AND publisher = 'Ideamerit';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Galaxy Modeler' AND publisher = 'Ideamerit' AND version_compare(version, '12.6.2') < 0);" + }, + "installer_url": "https://www.datensen.com/downloads/Galaxy%20Modeler-12.6.2-x64.exe", + "install_script_ref": "44443700", + "uninstall_script_ref": "5719b9f7", + "sha256": "c82fc58b557d629c46206f898f23aa103aac5cb08831d8aa17e4a3728bb917a6", + "default_categories": [ + "Developer tools" + ] + } + ], + "refs": { + "44443700": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# Galaxy Modeler is an electron-builder (NSIS) installer; /S runs silent and\n# /allusers forces the machine-wide install per the winget machine-scope switch.\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n\n$process = Start-Process -FilePath \"$exeFilePath\" -ArgumentList \"/S /allusers\" -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Install exit code: $exitCode\"\n\n# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\nif ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n", + "5719b9f7": "# Uninstalls Galaxy Modeler. Locates the electron-builder NSIS uninstaller from\n# the registry by DisplayName and runs it with /allusers /S after stopping the app.\n\n$softwareNameLike = \"Galaxy Modeler*\"\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n\n$exitCode = $null\n\ntry {\n\nforeach ($p in @(\"Galaxy Modeler\")) {\n Stop-Process -Name $p -Force -ErrorAction SilentlyContinue\n}\nStart-Sleep -Seconds 2\n\n[array]$uninstallKeys = Get-ChildItem `\n -Path @($machineKey, $machineKey32on64) `\n -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }\n\n$selected = $uninstallKeys |\n Where-Object { $_.DisplayName -like $softwareNameLike } |\n Select-Object -First 1\nif (-not $selected -or -not $selected.UninstallString) {\n Write-Host \"Uninstall entry not found for $softwareNameLike\"\n Exit 1\n}\n\n$raw = if ($selected.QuietUninstallString) { $selected.QuietUninstallString } else { $selected.UninstallString }\nif ($raw -match '^\\s*\"([^\"]+)\"\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} elseif ($raw -match '(?i)^\\s*(.+?\\.exe)\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} else {\n $exe = $raw; $exeArgs = \"\"\n}\n\n# electron-builder NSIS uninstaller: /allusers matches the machine install, /S is silent.\nif ($exeArgs -notmatch '(?i)(^|\\s)/allusers(\\s|$)') { $exeArgs = \"$exeArgs /allusers\".Trim() }\nif ($exeArgs -notmatch '(?i)(^|\\s)/S(\\s|$)') { $exeArgs = \"$exeArgs /S\".Trim() }\n\nWrite-Host \"Uninstall command: $exe\"\nWrite-Host \"Uninstall args: $exeArgs\"\n$process = Start-Process -FilePath $exe -ArgumentList $exeArgs -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Uninstall exit code: $exitCode\"\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n\nif ($exitCode -eq 0 -or $exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n" + } +} diff --git a/ee/maintained-apps/outputs/garmin-basecamp/windows.json b/ee/maintained-apps/outputs/garmin-basecamp/windows.json new file mode 100644 index 0000000000..2c8851dd42 --- /dev/null +++ b/ee/maintained-apps/outputs/garmin-basecamp/windows.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "4.7.5.0", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name = 'Garmin BaseCamp' AND publisher = 'Garmin Ltd. or its subsidiaries';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Garmin BaseCamp' AND publisher = 'Garmin Ltd. or its subsidiaries' AND version_compare(version, '4.7.5.0') < 0);" + }, + "installer_url": "https://download.garmin.com/software/BaseCamp_475.exe", + "install_script_ref": "df742bcc", + "uninstall_script_ref": "71f96656", + "sha256": "12c753fc067acb51b4a28cb01946edfb6a2545e8865fa2a346689526aeba30ca", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "71f96656": "# Uninstalls Garmin BaseCamp (WiX Burn bundle). Runs the cached bundle's\n# QuietUninstallString (/uninstall /quiet).\n\n$softwareNameLike = \"Garmin BaseCamp*\"\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n\n$exitCode = $null\n\ntry {\n\n[array]$uninstallKeys = Get-ChildItem `\n -Path @($machineKey, $machineKey32on64) `\n -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }\n\n$selected = $uninstallKeys |\n Where-Object { $_.DisplayName -like $softwareNameLike } |\n Select-Object -First 1\nif (-not $selected -or -not $selected.UninstallString) {\n Write-Host \"Uninstall entry not found for $softwareNameLike\"\n Exit 1\n}\n\n# WiX Burn: prefer QuietUninstallString; else force /uninstall /quiet onto the bundle exe.\n$raw = if ($selected.QuietUninstallString) { $selected.QuietUninstallString } else { $selected.UninstallString }\nif ($raw -match '^\\s*\"([^\"]+)\"\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} elseif ($raw -match '(?i)^\\s*(.+?\\.exe)\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} else {\n $exe = $raw; $exeArgs = \"\"\n}\nif ($exeArgs -notmatch '(?i)(^|\\s)/uninstall(\\s|$)') { $exeArgs = \"/uninstall $exeArgs\".Trim() }\nif ($exeArgs -notmatch '(?i)(^|\\s)/quiet(\\s|$)') { $exeArgs = \"$exeArgs /quiet\".Trim() }\nif ($exeArgs -notmatch '(?i)/norestart') { $exeArgs = \"$exeArgs /norestart\".Trim() }\n\nWrite-Host \"Uninstall command: $exe\"\nWrite-Host \"Uninstall args: $exeArgs\"\n$process = Start-Process -FilePath $exe -ArgumentList $exeArgs -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Uninstall exit code: $exitCode\"\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n\nif ($exitCode -eq 0 -or $exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n", + "df742bcc": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# Garmin BaseCamp is a WiX Burn bundle; /quiet /norestart runs it silently and\n# installs machine-wide.\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n\n$process = Start-Process -FilePath \"$exeFilePath\" -ArgumentList \"/quiet /norestart\" -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Install exit code: $exitCode\"\n\n# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\nif ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n" + } +} diff --git a/ee/maintained-apps/outputs/geogebra-classic/windows.json b/ee/maintained-apps/outputs/geogebra-classic/windows.json new file mode 100644 index 0000000000..54dadbffd7 --- /dev/null +++ b/ee/maintained-apps/outputs/geogebra-classic/windows.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "6.0.920", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name = 'GeoGebra Classic' AND publisher = 'International GeoGebra Institute';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'GeoGebra Classic' AND publisher = 'International GeoGebra Institute' AND version_compare(version, '6.0.920') < 0);" + }, + "installer_url": "https://download.geogebra.org/installers/6.0/GeoGebra-Windows-Installer-6-0-920-0.msi", + "install_script_ref": "ebe19da8", + "uninstall_script_ref": "2d02bc56", + "sha256": "65a63d49cc15d64a459338d622c4dde34a2b811ec5dddefe9e4e9c3f7d830ae7", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "2d02bc56": "# Uninstalls GeoGebra Classic (machine-wide WiX MSI). Resolve the ProductCode\n# from the registry by DisplayName and uninstall via msiexec.\n\n$softwareName = \"GeoGebra Classic\"\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$successCodes = @(0, 3010, 1641)\n$exitCode = $null\n\ntry {\n\n[array]$uninstallKeys = Get-ChildItem `\n -Path @($machineKey, $machineKey32on64) `\n -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }\n\n$selected = $uninstallKeys | Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1\nif (-not $selected) {\n Write-Host \"Uninstall entry not found for '$softwareName'.\"\n Exit 1\n}\n\n$productCode = $selected.PSChildName\nif ($productCode -notmatch '^\\{[0-9A-Fa-f-]+\\}$') {\n $raw = $selected.UninstallString\n if ($raw -match '(\\{[0-9A-Fa-f-]+\\})') { $productCode = $matches[1] }\n}\nif ($productCode -notmatch '^\\{[0-9A-Fa-f-]+\\}$') {\n Write-Host \"Could not determine ProductCode for '$softwareName'.\"\n Exit 1\n}\n\nWrite-Host \"Uninstalling product code: $productCode\"\n$process = Start-Process msiexec.exe `\n -ArgumentList \"/x $productCode /qn /norestart\" -NoNewWindow -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Uninstall exit code: $exitCode\"\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n\nif ($successCodes -contains $exitCode) { Exit 0 }\nExit $exitCode\n", + "ebe19da8": "# Learn more about install scripts:\n# http://fleetdm.com/learn-more-about/install-scripts\n#\n# GeoGebra Classic's winget manifest declares Scope: user at the top level, but\n# its WiX MSI installer is machine-wide (installs to Program Files (x86)). We run\n# the MSI silently; ALLUSERS is set inside the package, so it lands per-machine.\n\n$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\nif ($installProcess.ExitCode -eq 3010 -or $installProcess.ExitCode -eq 1641) { Exit 0 }\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n" + } +} diff --git a/ee/maintained-apps/outputs/go/windows.json b/ee/maintained-apps/outputs/go/windows.json new file mode 100644 index 0000000000..2111db626d --- /dev/null +++ b/ee/maintained-apps/outputs/go/windows.json @@ -0,0 +1,23 @@ +{ + "versions": [ + { + "version": "1.26.5", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name LIKE 'Go Programming Language%' AND publisher = 'https://go.dev';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Go Programming Language%' AND publisher = 'https://go.dev' AND version_compare(version, '1.26.5') < 0);" + }, + "installer_url": "https://go.dev/dl/go1.26.5.windows-amd64.msi", + "install_script_ref": "8959087b", + "uninstall_script_ref": "0047620c", + "sha256": "d554dc209403b101225fc2b54647ef47df09bea23291b1246fe1b35198f55f50", + "default_categories": [ + "Developer tools" + ], + "upgrade_code": "{22EA7650-4AC6-4001-BF29-F4B8775DB1C0}" + } + ], + "refs": { + "0047620c": "# 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\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\nforeach ($product_code in $inst.RelatedProducts('{22EA7650-4AC6-4001-BF29-F4B8775DB1C0}')) {\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 ($successCodes -notcontains $process.ExitCode) {\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", + "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" + } +} diff --git a/ee/maintained-apps/outputs/goanywhere-openpgp-studio/windows.json b/ee/maintained-apps/outputs/goanywhere-openpgp-studio/windows.json new file mode 100644 index 0000000000..5ed291bc6d --- /dev/null +++ b/ee/maintained-apps/outputs/goanywhere-openpgp-studio/windows.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "1.2.3", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name = 'GoAnywhere OpenPGP Studio' AND publisher = 'Fortra';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'GoAnywhere OpenPGP Studio' AND publisher = 'Fortra' AND version_compare(version, '1.2.3') < 0);" + }, + "installer_url": "https://static.goanywhere.com/releases/goanywhere/openpgpstudio/gapgpstudio1_2_3_windows-x64.exe", + "install_script_ref": "d871f28a", + "uninstall_script_ref": "b0caf715", + "sha256": "8c50532e3ba8f8fcf2333787741c132be6dc36ab97f50f04d35764a197bf0d5d", + "default_categories": [ + "Security" + ] + } + ], + "refs": { + "b0caf715": "# Uninstalls GoAnywhere OpenPGP Studio. install4j registers an ARP entry whose\n# UninstallString points at its uninstall.exe; -q runs it unattended.\n\n$softwareNameLike = \"GoAnywhere OpenPGP Studio*\"\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n\n$exitCode = $null\n\ntry {\n\nforeach ($p in @(\"OpenPGPStudio\", \"GoAnywhere OpenPGP Studio\")) {\n Stop-Process -Name $p -Force -ErrorAction SilentlyContinue\n}\n\n[array]$uninstallKeys = Get-ChildItem `\n -Path @($machineKey, $machineKey32on64) `\n -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }\n\n$selected = $uninstallKeys |\n Where-Object { $_.DisplayName -like $softwareNameLike } |\n Select-Object -First 1\nif (-not $selected -or -not $selected.UninstallString) {\n Write-Host \"Uninstall entry not found for $softwareNameLike\"\n Exit 1\n}\n\n$raw = $selected.UninstallString\nif ($raw -match '^\\s*\"([^\"]+)\"\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} elseif ($raw -match '(?i)^\\s*(.+?\\.exe)\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} else {\n $exe = $raw; $exeArgs = \"\"\n}\n\n# install4j silent uninstall flag.\nif ($exeArgs -notmatch '(?i)(^|\\s)-q(\\s|$)') { $exeArgs = \"$exeArgs -q\".Trim() }\n\nWrite-Host \"Uninstall command: $exe\"\nWrite-Host \"Uninstall args: $exeArgs\"\n$process = Start-Process -FilePath $exe -ArgumentList $exeArgs -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Uninstall exit code: $exitCode\"\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n\nif ($exitCode -eq 0 -or $exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n", + "d871f28a": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# GoAnywhere OpenPGP Studio ships as an install4j installer (bundled JRE). -q\n# runs it unattended; suppressUnattendedReboot avoids an automatic reboot.\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n\n$process = Start-Process -FilePath \"$exeFilePath\" `\n -ArgumentList \"-q -Dinstall4j.suppressUnattendedReboot=true\" -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Install exit code: $exitCode\"\n\nif ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n" + } +} diff --git a/ee/maintained-apps/outputs/goldendict-ng/windows.json b/ee/maintained-apps/outputs/goldendict-ng/windows.json new file mode 100644 index 0000000000..06b2b35e41 --- /dev/null +++ b/ee/maintained-apps/outputs/goldendict-ng/windows.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "26.6.2", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name = 'GoldenDict-ng';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'GoldenDict-ng' AND version_compare(version, '26.6.2') < 0);" + }, + "installer_url": "https://github.com/xiaoyifang/goldendict-ng/releases/download/v26.6.2/GoldenDict-ng-26.6.2-Qt6.8.3-Windows-installer.exe", + "install_script_ref": "cfd3838e", + "uninstall_script_ref": "ae5457ec", + "sha256": "8225752610bc6f3669c5a07df6f14ce05a538ed3a97ee789c06efd4ff17f09e2", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "ae5457ec": "# Uninstalls GoldenDict-ng. Locates the NSIS uninstaller from the registry by\n# DisplayName and runs it silently with /S. Stop the app first so files unlock.\n\n$softwareNameLike = \"GoldenDict-ng*\"\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n\n$exitCode = $null\n\ntry {\n\nforeach ($p in @(\"GoldenDict\")) {\n Stop-Process -Name $p -Force -ErrorAction SilentlyContinue\n}\nStart-Sleep -Seconds 2\n\n[array]$uninstallKeys = Get-ChildItem `\n -Path @($machineKey, $machineKey32on64) `\n -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }\n\n$selected = $uninstallKeys |\n Where-Object { $_.DisplayName -like $softwareNameLike } |\n Select-Object -First 1\nif (-not $selected -or -not $selected.UninstallString) {\n Write-Host \"Uninstall entry not found for $softwareNameLike\"\n Exit 1\n}\n\n$raw = if ($selected.QuietUninstallString) { $selected.QuietUninstallString } else { $selected.UninstallString }\n\n# Parse exe + args (quoted / unquoted / bare).\nif ($raw -match '^\\s*\"([^\"]+)\"\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} elseif ($raw -match '(?i)^\\s*(.+?\\.exe)\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} else {\n $exe = $raw; $exeArgs = \"\"\n}\n\n# NSIS uninstallers require /S for a silent uninstall.\nif ($exeArgs -notmatch '(?i)(^|\\s)/S(\\s|$)') { $exeArgs = \"$exeArgs /S\".Trim() }\n\nWrite-Host \"Uninstall command: $exe\"\nWrite-Host \"Uninstall args: $exeArgs\"\n$process = Start-Process -FilePath $exe -ArgumentList $exeArgs -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Uninstall exit code: $exitCode\"\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n\nif ($exitCode -eq 0 -or $exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n", + "cfd3838e": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# GoldenDict-ng is a Nullsoft (NSIS) installer declaring machine scope;\n# /S runs it silently and installs machine-wide to Program Files.\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n\n$process = Start-Process -FilePath \"$exeFilePath\" -ArgumentList \"/S\" -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Install exit code: $exitCode\"\n\n# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\nif ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n" + } +} diff --git a/ee/maintained-apps/outputs/google-ads-editor/windows.json b/ee/maintained-apps/outputs/google-ads-editor/windows.json new file mode 100644 index 0000000000..17cf75c137 --- /dev/null +++ b/ee/maintained-apps/outputs/google-ads-editor/windows.json @@ -0,0 +1,23 @@ +{ + "versions": [ + { + "version": "14.12.6.0", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name = 'Google Ads Editor' AND publisher = 'Google';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Google Ads Editor' AND publisher = 'Google' AND version_compare(version, '14.12.6.0') < 0);" + }, + "installer_url": "https://dl.google.com/release2/misc/ccmy7b6t6gzbw2miz232rfkch4_14.12.6.0/google_ads_editor.msi", + "install_script_ref": "bdccfcda", + "uninstall_script_ref": "36567b20", + "sha256": "ad7b17f20fc0e1696e92f9b165ec66e41b45adc202324770ad7ba1c280329a9f", + "default_categories": [ + "Productivity" + ], + "upgrade_code": "{2C881436-87C2-4224-B264-38277EB91B37}" + } + ], + "refs": { + "36567b20": "# 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\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\nforeach ($product_code in $inst.RelatedProducts('{2C881436-87C2-4224-B264-38277EB91B37}')) {\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 ($successCodes -notcontains $process.ExitCode) {\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", + "bdccfcda": "# Learn more about install scripts:\n# http://fleetdm.com/learn-more-about/install-scripts\n#\n# The Google Ads Editor MSI ships as both a per-user and a per-machine package\n# (same binary; the machine variant sets ALLUSERS=1). A plain silent install\n# under Fleet's SYSTEM context can land per-user (in the SYSTEM profile), so we\n# force a true per-machine install by passing ALLUSERS=1 explicitly.\n\n$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv ${logFile} ALLUSERS=1 /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\n# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\nif ($installProcess.ExitCode -eq 3010 -or $installProcess.ExitCode -eq 1641) {\n Exit 0\n}\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n" + } +} diff --git a/ee/maintained-apps/outputs/google-web-designer/windows.json b/ee/maintained-apps/outputs/google-web-designer/windows.json new file mode 100644 index 0000000000..6bc433200c --- /dev/null +++ b/ee/maintained-apps/outputs/google-web-designer/windows.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "14.3.0.0", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name = 'Google Web Designer' AND publisher = 'Google LLC.';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Google Web Designer' AND publisher = 'Google LLC.' AND version_compare(version, '14.3.0.0') < 0);" + }, + "installer_url": "https://dl.google.com/release2/Webdesigner/acky5xyddb2r44okdi2iwoujpiwa_14.3.0.0/googlewebdesigner_win_x64_14.3.0.0.exe", + "install_script_ref": "a7d586ca", + "uninstall_script_ref": "ecb2fc92", + "sha256": "0bd982d5af4ba0cf4178dfbf25730ae27bd79b597a6096498b66563eae338faf", + "default_categories": [ + "Developer tools" + ] + } + ], + "refs": { + "a7d586ca": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# Google Web Designer is a Nullsoft (NSIS) installer declaring machine scope;\n# /S runs it silently and installs machine-wide to Program Files.\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n\n$process = Start-Process -FilePath \"$exeFilePath\" -ArgumentList \"/S\" -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Install exit code: $exitCode\"\n\n# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\nif ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n", + "ecb2fc92": "# Uninstalls Google Web Designer. Locates the NSIS uninstaller from the registry\n# by DisplayName and runs it silently with /S.\n\n$softwareNameLike = \"Google Web Designer*\"\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n\n$exitCode = $null\n\ntry {\n\n[array]$uninstallKeys = Get-ChildItem `\n -Path @($machineKey, $machineKey32on64) `\n -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }\n\n$selected = $uninstallKeys |\n Where-Object { $_.DisplayName -like $softwareNameLike } |\n Select-Object -First 1\nif (-not $selected -or -not $selected.UninstallString) {\n Write-Host \"Uninstall entry not found for $softwareNameLike\"\n Exit 1\n}\n\n$raw = if ($selected.QuietUninstallString) { $selected.QuietUninstallString } else { $selected.UninstallString }\n\n# Parse exe + args (quoted / unquoted / bare).\nif ($raw -match '^\\s*\"([^\"]+)\"\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} elseif ($raw -match '(?i)^\\s*(.+?\\.exe)\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} else {\n $exe = $raw; $exeArgs = \"\"\n}\n\n# NSIS uninstallers require /S for a silent uninstall.\nif ($exeArgs -notmatch '(?i)(^|\\s)/S(\\s|$)') { $exeArgs = \"$exeArgs /S\".Trim() }\n\nWrite-Host \"Uninstall command: $exe\"\nWrite-Host \"Uninstall args: $exeArgs\"\n$process = Start-Process -FilePath $exe -ArgumentList $exeArgs -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Uninstall exit code: $exitCode\"\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n\nif ($exitCode -eq 0 -or $exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n" + } +} diff --git a/ee/maintained-apps/outputs/graphviz/windows.json b/ee/maintained-apps/outputs/graphviz/windows.json new file mode 100644 index 0000000000..a2188441db --- /dev/null +++ b/ee/maintained-apps/outputs/graphviz/windows.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "15.1.0", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name = 'Graphviz' AND publisher = 'Graphviz';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Graphviz' AND publisher = 'Graphviz' AND version_compare(version, '15.1.0') < 0);" + }, + "installer_url": "https://gitlab.com/api/v4/projects/4207231/packages/generic/graphviz-releases/15.1.0/windows_10_cmake_Release_graphviz-install-15.1.0-win64.exe", + "install_script_ref": "8456d4ce", + "uninstall_script_ref": "f6831952", + "sha256": "45f20128e6b86e54eb3c2f0ac94d4232d33b9c8a7a81ac171c3d393b8d19bcdc", + "default_categories": [ + "Developer tools" + ] + } + ], + "refs": { + "8456d4ce": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# Graphviz is a Nullsoft (NSIS) installer declaring machine scope; /S runs it\n# silently and installs machine-wide to Program Files.\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n\n$process = Start-Process -FilePath \"$exeFilePath\" -ArgumentList \"/S\" -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Install exit code: $exitCode\"\n\n# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\nif ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n", + "f6831952": "# Uninstalls Graphviz. Locates the NSIS uninstaller from the registry by\n# DisplayName and runs it silently with /S.\n\n$softwareNameLike = \"Graphviz*\"\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n\n$exitCode = $null\n\ntry {\n\n[array]$uninstallKeys = Get-ChildItem `\n -Path @($machineKey, $machineKey32on64) `\n -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }\n\n$selected = $uninstallKeys |\n Where-Object { $_.DisplayName -like $softwareNameLike } |\n Select-Object -First 1\nif (-not $selected -or -not $selected.UninstallString) {\n Write-Host \"Uninstall entry not found for $softwareNameLike\"\n Exit 1\n}\n\n$raw = if ($selected.QuietUninstallString) { $selected.QuietUninstallString } else { $selected.UninstallString }\n\n# Parse exe + args (quoted / unquoted / bare).\nif ($raw -match '^\\s*\"([^\"]+)\"\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} elseif ($raw -match '(?i)^\\s*(.+?\\.exe)\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} else {\n $exe = $raw; $exeArgs = \"\"\n}\n\n# NSIS uninstallers require /S for a silent uninstall.\nif ($exeArgs -notmatch '(?i)(^|\\s)/S(\\s|$)') { $exeArgs = \"$exeArgs /S\".Trim() }\n\nWrite-Host \"Uninstall command: $exe\"\nWrite-Host \"Uninstall args: $exeArgs\"\n$process = Start-Process -FilePath $exe -ArgumentList $exeArgs -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Uninstall exit code: $exitCode\"\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n\nif ($exitCode -eq 0 -or $exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n" + } +} diff --git a/ee/maintained-apps/outputs/grepwin/windows.json b/ee/maintained-apps/outputs/grepwin/windows.json new file mode 100644 index 0000000000..e6dd6ad5bd --- /dev/null +++ b/ee/maintained-apps/outputs/grepwin/windows.json @@ -0,0 +1,23 @@ +{ + "versions": [ + { + "version": "2.1.1434", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name = 'grepWin' AND publisher = 'Stefans Tools';", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'grepWin' AND publisher = 'Stefans Tools' AND version_compare(version, '2.1.1434') < 0);" + }, + "installer_url": "https://github.com/stefankueng/grepWin/releases/download/2.1.12/grepWin-2.1.12-x64.msi", + "install_script_ref": "8959087b", + "uninstall_script_ref": "249e28e5", + "sha256": "e70cbcc64c966d333940779bf4c5a041bfd9d093a47bb48b48933033ee76fdfc", + "default_categories": [ + "Developer tools" + ], + "upgrade_code": "{C73ED533-953E-47E5-9A42-A48292BB7C6C}" + } + ], + "refs": { + "249e28e5": "# 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\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\nforeach ($product_code in $inst.RelatedProducts('{C73ED533-953E-47E5-9A42-A48292BB7C6C}')) {\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 ($successCodes -notcontains $process.ExitCode) {\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", + "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" + } +} diff --git a/frontend/pages/SoftwarePage/components/icons/GadwinPrintscreen.tsx b/frontend/pages/SoftwarePage/components/icons/GadwinPrintscreen.tsx new file mode 100644 index 0000000000..9138cdb2d7 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/GadwinPrintscreen.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const GadwinPrintscreen = (props: SVGProps) => ( + + + +); +export default GadwinPrintscreen; diff --git a/frontend/pages/SoftwarePage/components/icons/GadwinPrintscreenPro.tsx b/frontend/pages/SoftwarePage/components/icons/GadwinPrintscreenPro.tsx new file mode 100644 index 0000000000..ba2adcd171 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/GadwinPrintscreenPro.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const GadwinPrintscreenPro = (props: SVGProps) => ( + + + +); +export default GadwinPrintscreenPro; diff --git a/frontend/pages/SoftwarePage/components/icons/GalaxyModeler.tsx b/frontend/pages/SoftwarePage/components/icons/GalaxyModeler.tsx new file mode 100644 index 0000000000..4c6ce49ed3 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/GalaxyModeler.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const GalaxyModeler = (props: SVGProps) => ( + + + +); +export default GalaxyModeler; diff --git a/frontend/pages/SoftwarePage/components/icons/GarminBasecamp.tsx b/frontend/pages/SoftwarePage/components/icons/GarminBasecamp.tsx new file mode 100644 index 0000000000..332bb2447f --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/GarminBasecamp.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const GarminBasecamp = (props: SVGProps) => ( + + + +); +export default GarminBasecamp; diff --git a/frontend/pages/SoftwarePage/components/icons/GeogebraClassic.tsx b/frontend/pages/SoftwarePage/components/icons/GeogebraClassic.tsx new file mode 100644 index 0000000000..d345f49165 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/GeogebraClassic.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const GeogebraClassic = (props: SVGProps) => ( + + + +); +export default GeogebraClassic; diff --git a/frontend/pages/SoftwarePage/components/icons/Go.tsx b/frontend/pages/SoftwarePage/components/icons/Go.tsx new file mode 100644 index 0000000000..489db25d03 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Go.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Go = (props: SVGProps) => ( + + + +); +export default Go; diff --git a/frontend/pages/SoftwarePage/components/icons/GoanywhereOpenpgpStudio.tsx b/frontend/pages/SoftwarePage/components/icons/GoanywhereOpenpgpStudio.tsx new file mode 100644 index 0000000000..e24b31434e --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/GoanywhereOpenpgpStudio.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const GoanywhereOpenpgpStudio = (props: SVGProps) => ( + + + +); +export default GoanywhereOpenpgpStudio; diff --git a/frontend/pages/SoftwarePage/components/icons/GoldendictNg.tsx b/frontend/pages/SoftwarePage/components/icons/GoldendictNg.tsx new file mode 100644 index 0000000000..a23e5ab437 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/GoldendictNg.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const GoldendictNg = (props: SVGProps) => ( + + + +); +export default GoldendictNg; diff --git a/frontend/pages/SoftwarePage/components/icons/GoogleAdsEditor.tsx b/frontend/pages/SoftwarePage/components/icons/GoogleAdsEditor.tsx new file mode 100644 index 0000000000..7d03c575be --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/GoogleAdsEditor.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const GoogleAdsEditor = (props: SVGProps) => ( + + + +); +export default GoogleAdsEditor; diff --git a/frontend/pages/SoftwarePage/components/icons/GoogleWebDesigner.tsx b/frontend/pages/SoftwarePage/components/icons/GoogleWebDesigner.tsx new file mode 100644 index 0000000000..a0ac71aa2a --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/GoogleWebDesigner.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const GoogleWebDesigner = (props: SVGProps) => ( + + + +); +export default GoogleWebDesigner; diff --git a/frontend/pages/SoftwarePage/components/icons/Graphviz.tsx b/frontend/pages/SoftwarePage/components/icons/Graphviz.tsx new file mode 100644 index 0000000000..ca6fb9330e --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Graphviz.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Graphviz = (props: SVGProps) => ( + + + +); +export default Graphviz; diff --git a/frontend/pages/SoftwarePage/components/icons/Grepwin.tsx b/frontend/pages/SoftwarePage/components/icons/Grepwin.tsx new file mode 100644 index 0000000000..e0a516215e --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Grepwin.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Grepwin = (props: SVGProps) => ( + + + +); +export default Grepwin; diff --git a/frontend/pages/SoftwarePage/components/icons/index.ts b/frontend/pages/SoftwarePage/components/icons/index.ts index f804a0fe85..4fc05ea99c 100644 --- a/frontend/pages/SoftwarePage/components/icons/index.ts +++ b/frontend/pages/SoftwarePage/components/icons/index.ts @@ -412,6 +412,10 @@ import Freefilesync from "./Freefilesync"; import Front from "./Front"; import Fsmonitor from "./Fsmonitor"; import Funter from "./Funter"; +import GadwinPrintscreen from "./GadwinPrintscreen"; +import GadwinPrintscreenPro from "./GadwinPrintscreenPro"; +import GalaxyModeler from "./GalaxyModeler"; +import GarminBasecamp from "./GarminBasecamp"; import GarminExpress from "./GarminExpress"; import Gather from "./Gather"; import Gdevelop from "./Gdevelop"; @@ -419,6 +423,7 @@ import Geany from "./Geany"; import Geekbench from "./Geekbench"; import Gemini2 from "./Gemini2"; import GenesysCloud from "./GenesysCloud"; +import GeogebraClassic from "./GeogebraClassic"; import Gephi from "./Gephi"; import Ghostty from "./Ghostty"; import Gimp from "./Gimp"; @@ -430,22 +435,29 @@ import Gitify from "./Gitify"; import GitKraken from "./GitKraken"; import GitupApp from "./GitupApp"; import Glyphs from "./Glyphs"; +import Go from "./Go"; import Go2Shell from "./Go2Shell"; +import GoanywhereOpenpgpStudio from "./GoanywhereOpenpgpStudio"; import Godot from "./Godot"; import Godspeed from "./Godspeed"; import GogGalaxy from "./GogGalaxy"; import GoLand from "./GoLand"; +import GoldendictNg from "./GoldendictNg"; import Goodsync from "./Goodsync"; +import GoogleAdsEditor from "./GoogleAdsEditor"; import GoogleCredentialProviderForWindows from "./GoogleCredentialProviderForWindows"; import GoogleDrive from "./GoogleDrive"; import GoogleEarthPro from "./GoogleEarthPro"; import GoogleGemini from "./GoogleGemini"; +import GoogleWebDesigner from "./GoogleWebDesigner"; import GoToMeeting from "./GoToMeeting"; import GpgKeychain from "./GpgKeychain"; import Gpodder from "./Gpodder"; import GrammarlyDesktop from "./GrammarlyDesktop"; import Grandperspective from "./Grandperspective"; import Granola from "./Granola"; +import Graphviz from "./Graphviz"; +import Grepwin from "./Grepwin"; import Grids from "./Grids"; import GrooveOmniDialer from "./GrooveOmniDialer"; import Gyazo from "./Gyazo"; @@ -1518,6 +1530,10 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { front: Front, fsmonitor: Fsmonitor, funter: Funter, + "gadwin printscreen": GadwinPrintscreen, + "gadwin printscreen pro": GadwinPrintscreenPro, + "galaxy modeler": GalaxyModeler, + "garmin basecamp": GarminBasecamp, "garmin express": GarminExpress, "gather town": Gather, gdevelop: Gdevelop, @@ -1526,6 +1542,7 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { gemini: GoogleGemini, "gemini 2": Gemini2, "genesys cloud": GenesysCloud, + "geogebra classic": GeogebraClassic, gephi: Gephi, ghostty: Ghostty, gimp: Gimp, @@ -1537,12 +1554,16 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { gitkraken: GitKraken, gitup: GitupApp, glyphs: Glyphs, + go: Go, go2shell: Go2Shell, + "goanywhere openpgp studio": GoanywhereOpenpgpStudio, "godot engine": Godot, godspeed: Godspeed, "gog galaxy": GogGalaxy, goland: GoLand, + "goldendict-ng": GoldendictNg, goodsync: Goodsync, + "google ads editor": GoogleAdsEditor, "google antigravity": Antigravity, "google antigravity ide": AntigravityIde, "google chrome": ChromeApp, @@ -1550,6 +1571,7 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { "google drive": GoogleDrive, "google earth pro": GoogleEarthPro, "google gemini": GoogleGemini, + "google web designer": GoogleWebDesigner, gotomeeting: GoToMeeting, "gpg keychain": GpgKeychain, "gpg suite": GpgKeychain, @@ -1558,6 +1580,8 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { grandperspective: Grandperspective, granola: Granola, "graphpad prism": Prism, + graphviz: Graphviz, + grepwin: Grepwin, grids: Grids, "groove omnidialer": GrooveOmniDialer, hammerspoon: Hammerspoon, diff --git a/website/assets/images/app-icon-gadwin-printscreen-60x60@2x.png b/website/assets/images/app-icon-gadwin-printscreen-60x60@2x.png new file mode 100644 index 0000000000..f45d80362f Binary files /dev/null and b/website/assets/images/app-icon-gadwin-printscreen-60x60@2x.png differ diff --git a/website/assets/images/app-icon-gadwin-printscreen-pro-60x60@2x.png b/website/assets/images/app-icon-gadwin-printscreen-pro-60x60@2x.png new file mode 100644 index 0000000000..f45d80362f Binary files /dev/null and b/website/assets/images/app-icon-gadwin-printscreen-pro-60x60@2x.png differ diff --git a/website/assets/images/app-icon-galaxy-modeler-60x60@2x.png b/website/assets/images/app-icon-galaxy-modeler-60x60@2x.png new file mode 100644 index 0000000000..574a7b2756 Binary files /dev/null and b/website/assets/images/app-icon-galaxy-modeler-60x60@2x.png differ diff --git a/website/assets/images/app-icon-garmin-basecamp-60x60@2x.png b/website/assets/images/app-icon-garmin-basecamp-60x60@2x.png new file mode 100644 index 0000000000..b8ccf43af6 Binary files /dev/null and b/website/assets/images/app-icon-garmin-basecamp-60x60@2x.png differ diff --git a/website/assets/images/app-icon-geogebra-classic-60x60@2x.png b/website/assets/images/app-icon-geogebra-classic-60x60@2x.png new file mode 100644 index 0000000000..6e9c3d9f35 Binary files /dev/null and b/website/assets/images/app-icon-geogebra-classic-60x60@2x.png differ diff --git a/website/assets/images/app-icon-go-60x60@2x.png b/website/assets/images/app-icon-go-60x60@2x.png new file mode 100644 index 0000000000..f3934d5b80 Binary files /dev/null and b/website/assets/images/app-icon-go-60x60@2x.png differ diff --git a/website/assets/images/app-icon-goanywhere-openpgp-studio-60x60@2x.png b/website/assets/images/app-icon-goanywhere-openpgp-studio-60x60@2x.png new file mode 100644 index 0000000000..a490f2bb14 Binary files /dev/null and b/website/assets/images/app-icon-goanywhere-openpgp-studio-60x60@2x.png differ diff --git a/website/assets/images/app-icon-goldendict-ng-60x60@2x.png b/website/assets/images/app-icon-goldendict-ng-60x60@2x.png new file mode 100644 index 0000000000..65f2e1b962 Binary files /dev/null and b/website/assets/images/app-icon-goldendict-ng-60x60@2x.png differ diff --git a/website/assets/images/app-icon-google-ads-editor-60x60@2x.png b/website/assets/images/app-icon-google-ads-editor-60x60@2x.png new file mode 100644 index 0000000000..a863222983 Binary files /dev/null and b/website/assets/images/app-icon-google-ads-editor-60x60@2x.png differ diff --git a/website/assets/images/app-icon-google-web-designer-60x60@2x.png b/website/assets/images/app-icon-google-web-designer-60x60@2x.png new file mode 100644 index 0000000000..37ba0198a2 Binary files /dev/null and b/website/assets/images/app-icon-google-web-designer-60x60@2x.png differ diff --git a/website/assets/images/app-icon-graphviz-60x60@2x.png b/website/assets/images/app-icon-graphviz-60x60@2x.png new file mode 100644 index 0000000000..f87183fe1f Binary files /dev/null and b/website/assets/images/app-icon-graphviz-60x60@2x.png differ diff --git a/website/assets/images/app-icon-grepwin-60x60@2x.png b/website/assets/images/app-icon-grepwin-60x60@2x.png new file mode 100644 index 0000000000..e5f85212d3 Binary files /dev/null and b/website/assets/images/app-icon-grepwin-60x60@2x.png differ