diff --git a/ee/maintained-apps/inputs/winget/twingate.json b/ee/maintained-apps/inputs/winget/twingate.json new file mode 100644 index 0000000000..49d12b21fc --- /dev/null +++ b/ee/maintained-apps/inputs/winget/twingate.json @@ -0,0 +1,10 @@ +{ + "name": "Twingate", + "slug": "twingate/windows", + "package_identifier": "Twingate.Client", + "unique_identifier": "Twingate", + "installer_arch": "x64", + "installer_type": "msi", + "installer_scope": "machine", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json index a16d984c3b..55f9539b8c 100644 --- a/ee/maintained-apps/outputs/apps.json +++ b/ee/maintained-apps/outputs/apps.json @@ -1016,6 +1016,13 @@ "unique_identifier": "com.twingate.macos", "description": "Twingate is a zero trust network access platform." }, + { + "name": "Twingate", + "slug": "twingate/windows", + "platform": "windows", + "unique_identifier": "Twingate", + "description": "Twingate is a zero trust network access platform." + }, { "name": "Microsoft Visual Studio Code", "slug": "visual-studio-code/darwin", diff --git a/ee/maintained-apps/outputs/twingate/windows.json b/ee/maintained-apps/outputs/twingate/windows.json new file mode 100644 index 0000000000..84cbeac4c3 --- /dev/null +++ b/ee/maintained-apps/outputs/twingate/windows.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "20.25.322.1319", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name = 'Twingate' AND publisher = 'Twingate Inc.';" + }, + "installer_url": "https://binaries.twingate.com/client/windows/versions/2025.322.1319/TwingateWindowsInstaller.msi", + "install_script_ref": "8959087b", + "uninstall_script_ref": "0684eac9", + "sha256": "104d5868868ab63c90777c992a93e74bab7498c64a61cebba76d9d6a84f56374", + "default_categories": [ + "Productivity" + ], + "upgrade_code": "{11BA3B45-D8FA-4524-A085-80FB0A7CFC8C}" + } + ], + "refs": { + "0684eac9": "# Fleet uninstalls app by finding all related product codes for the specified upgrade code\n$inst = New-Object -ComObject \"WindowsInstaller.Installer\"\n$timeoutSeconds = 300 # 5 minute timeout per product\n\nforeach ($product_code in $inst.RelatedProducts(\"{11BA3B45-D8FA-4524-A085-80FB0A7CFC8C}\")) {\n $process = Start-Process msiexec -ArgumentList @(\"/quiet\", \"/x\", $product_code, \"/norestart\") -PassThru\n \n # Wait for process with timeout\n $completed = $process.WaitForExit($timeoutSeconds * 1000)\n \n if (-not $completed) {\n Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue\n Exit 1603 # ERROR_UNINSTALL_FAILURE\n }\n \n # If the uninstall failed, bail\n if ($process.ExitCode -ne 0) {\n Write-Output \"Uninstall for $($product_code) exited $($process.ExitCode)\"\n Exit $process.ExitCode\n }\n}\n\n# All uninstalls succeeded; exit success\nExit 0\n", + "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" + } +}