$ErrorActionPreference = "Stop" $Mode = if ($env:TUCDESK_MODE) { $env:TUCDESK_MODE } else { "cloud" } $env:TUCDESK_MODE = $Mode [Environment]::SetEnvironmentVariable("TUCDESK_MODE", $Mode, "User") $ApiUrl = if ($env:TUCDESK_API_URL) { $env:TUCDESK_API_URL } else { "https://api.tucdesk.app" } $env:TUCDESK_API_URL = $ApiUrl [Environment]::SetEnvironmentVariable("TUCDESK_API_URL", $ApiUrl, "User") $StagingRendezvousUrl = if ($env:TUCDESK_RENDEZVOUS_URL) { $env:TUCDESK_RENDEZVOUS_URL } else { "https://rendezvous.tucdesk.app" } $env:TUCDESK_RENDEZVOUS_URL = $StagingRendezvousUrl [Environment]::SetEnvironmentVariable("TUCDESK_RENDEZVOUS_URL", $StagingRendezvousUrl, "User") $RelayAddress = if ($env:TUCDESK_RELAY_ADDR) { $env:TUCDESK_RELAY_ADDR } else { "rendezvous.tucdesk.app:4102" } $env:TUCDESK_RELAY_ADDR = $RelayAddress [Environment]::SetEnvironmentVariable("TUCDESK_RELAY_ADDR", $RelayAddress, "User") $RelayUrl = if ($env:TUCDESK_RELAY_URL) { $env:TUCDESK_RELAY_URL } else { "https://rendezvous.tucdesk.app" } $env:TUCDESK_RELAY_URL = $RelayUrl [Environment]::SetEnvironmentVariable("TUCDESK_RELAY_URL", $RelayUrl, "User") $TurnUrl = if ($env:TUCDESK_TURN_URL) { $env:TUCDESK_TURN_URL } else { "" } $env:TUCDESK_TURN_URL = $TurnUrl [Environment]::SetEnvironmentVariable("TUCDESK_TURN_URL", $TurnUrl, "User") $DashboardUrl = if ($env:TUCDESK_DASHBOARD_URL) { $env:TUCDESK_DASHBOARD_URL } else { "https://app.tucdesk.app" } $env:TUCDESK_DASHBOARD_URL = $DashboardUrl [Environment]::SetEnvironmentVariable("TUCDESK_DASHBOARD_URL", $DashboardUrl, "User") $HostedDownloadBaseUrl = if ($env:TUCDESK_DOWNLOAD_BASE_URL) { $env:TUCDESK_DOWNLOAD_BASE_URL } else { "https://dl.tucdesk.app" } $env:TUCDESK_DOWNLOAD_BASE_URL = $HostedDownloadBaseUrl [Environment]::SetEnvironmentVariable("TUCDESK_DOWNLOAD_BASE_URL", $HostedDownloadBaseUrl, "User") $ServerCertFingerprint = if ($env:TUCDESK_SERVER_CERT_FINGERPRINT) { $env:TUCDESK_SERVER_CERT_FINGERPRINT } else { "sha256:5fd646c87aea0c86afe7b479a1db20fe9a888a3cf96f873d3f5b628b20bed452" } $env:TUCDESK_SERVER_CERT_FINGERPRINT = $ServerCertFingerprint [Environment]::SetEnvironmentVariable("TUCDESK_SERVER_CERT_FINGERPRINT", $ServerCertFingerprint, "User") $DownloadBaseUrl = if ($env:TUCDESK_DOWNLOAD_BASE_URL) { $env:TUCDESK_DOWNLOAD_BASE_URL } else { "" } $Repo = if ($env:TUCDESK_GITHUB_REPO) { $env:TUCDESK_GITHUB_REPO } else { "portmytech/TucDesk-original" } $Version = if ($env:TUCDESK_VERSION) { $env:TUCDESK_VERSION } else { "latest" } $InstallRoot = if ($env:TUCDESK_INSTALL_DIR) { $env:TUCDESK_INSTALL_DIR } else { Join-Path $env:LOCALAPPDATA "TucDesk\bin" } $ZipName = "tucdesk-windows-amd64.zip" New-Item -ItemType Directory -Force -Path $InstallRoot | Out-Null $useHostedDownloads = $DownloadBaseUrl -and $Version -eq "latest" -and -not $env:TUCDESK_GITHUB_REPO $downloadUrl = if ($useHostedDownloads) { "$DownloadBaseUrl/windows/tucdesk-agent.zip" } elseif ($Version -eq "latest") { "https://github.com/$Repo/releases/latest/download/$ZipName" } else { "https://github.com/$Repo/releases/download/$Version/$ZipName" } $tmpRoot = Join-Path $env:TEMP ("tucdesk-install-" + [Guid]::NewGuid().ToString("N")) $zipPath = Join-Path $tmpRoot $ZipName $extractDir = Join-Path $tmpRoot "extract" $targetExe = Join-Path $InstallRoot "tucdesk.exe" $targetTucExe = Join-Path $InstallRoot "tuc.exe" New-Item -ItemType Directory -Force -Path $tmpRoot | Out-Null New-Item -ItemType Directory -Force -Path $extractDir | Out-Null Write-Host "Downloading TucDesk from $downloadUrl" Invoke-WebRequest -Uri $downloadUrl -OutFile $zipPath Expand-Archive -Path $zipPath -DestinationPath $extractDir -Force $sourceExe = Get-ChildItem -Path $extractDir -Filter "tucdesk.exe" -Recurse | Select-Object -First 1 if (-not $sourceExe) { throw "tucdesk.exe not found in downloaded archive." } $sourceTucExe = Get-ChildItem -Path $extractDir -Filter "tuc.exe" -Recurse | Select-Object -First 1 if (-not $sourceTucExe) { throw "tuc.exe not found in downloaded archive." } Copy-Item $sourceExe.FullName $targetExe -Force Copy-Item $sourceTucExe.FullName $targetTucExe -Force if (($env:PATH -split ';') -notcontains $InstallRoot) { $newPath = "$InstallRoot;$env:PATH" [Environment]::SetEnvironmentVariable("Path", $newPath, "User") $env:PATH = $newPath } Write-Host "" Write-Host "TucDesk installed to $targetExe" Write-Host "TUC CLI installed to $targetTucExe" Write-Host "Open a new shell or run:" Write-Host " `"$targetExe`""