# Instalador de Agencia para Windows. # # irm https://get.agencia.ip1.cc/install.ps1 | iex # # Con argumentos para setup (iex no los pasa, así que se arma un scriptblock): # # & ([scriptblock]::Create((irm https://get.agencia.ip1.cc/install.ps1))) --no-gui # # Baja el paquete de Windows, verifica su SHA-256, lo descomprime en una carpeta temporal # y le pasa la posta a `agencia setup`, que es el que instala de verdad (carpeta de la app, # tarea programada, PATH). Este script no escribe nada fuera del temporal. # # Variables de entorno: # AGENCIA_VERSION instalar esta versión (v0.1.0) en vez de la última # AGENCIA_GET_URL de dónde bajar (default https://get.agencia.ip1.cc) # AGENCIA_SKIP_SETUP 1 = bajar, verificar y descomprimir, pero en vez de correr setup # imprimir lo que iba a correr # # Escrito para PowerShell 5.1, que es el que trae Windows: nada de operadores de 7 (?., ??, # &&) ni de -SkipCertificateCheck. # # Nunca `exit`: con `irm | iex` el script corre ADENTRO de la sesión de quien lo pegó, y un # exit le cierra la ventana de PowerShell en la cara, con el mensaje de error adentro. Los # errores se avisan con Write-Host y se sale con return. function Install-Agencia { param([string[]]$SetupArgs) $ErrorActionPreference = 'Stop' # La barra de progreso de Invoke-WebRequest en 5.1 redibuja por cada bloque y hace que # bajar 13 MB tarde minutos en vez de segundos. $ProgressPreference = 'SilentlyContinue' # Un Windows 10 sin actualizar arranca PowerShell con TLS 1.0, y el servidor sólo habla # 1.2 o más: sin esto la descarga falla con un "no se pudo crear un canal seguro" que # no dice nada. [Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12 $base = $env:AGENCIA_GET_URL if (-not $base) { $base = 'https://get.agencia.ip1.cc' } $base = $base.TrimEnd('/') # La arquitectura de la máquina, no la del proceso: un PowerShell x64 corriendo emulado # en un Windows ARM dice AMD64 en $env:PROCESSOR_ARCHITECTURE. El registro dice la # verdad. $arch = $null try { $arch = (Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' -Name PROCESSOR_ARCHITECTURE).PROCESSOR_ARCHITECTURE } catch { } if (-not $arch) { $arch = $env:PROCESSOR_ARCHITECTURE } switch ($arch) { 'AMD64' { } 'ARM64' { # No hay paquete de Windows para ARM: Windows 11 en ARM corre binarios x64 # emulados, y Agencia no hace nada pesado como para que se note. Write-Host 'Windows en ARM: instalo la versión x64, que corre emulada.' -ForegroundColor Yellow } default { Write-Host "agencia: no hay paquete de Agencia para la arquitectura $arch (hace falta Windows de 64 bits)." -ForegroundColor Red return } } $tmp = Join-Path ([IO.Path]::GetTempPath()) ('agencia-install-' + [guid]::NewGuid().ToString('N')) New-Item -ItemType Directory -Path $tmp | Out-Null try { $version = $env:AGENCIA_VERSION if ($version) { if (-not $version.StartsWith('v')) { $version = 'v' + $version } $manifestUrl = "$base/releases/$version/latest.json" } else { $manifestUrl = "$base/latest.json" } try { $manifest = Invoke-RestMethod -Uri $manifestUrl -UseBasicParsing } catch { Write-Host "agencia: no pude bajar $manifestUrl. ¿Hay conexión? ($($_.Exception.Message))" -ForegroundColor Red return } $version = $manifest.version $asset = $manifest.assets.'windows-amd64' if (-not $asset -or -not $asset.sha256) { Write-Host "agencia: la versión $version no tiene paquete para Windows." -ForegroundColor Red return } # El paquete se baja de la misma base que el manifest, no de la URL que trae # adentro: así AGENCIA_GET_URL apunta todo a un server de prueba. $file = "agencia-$version-windows-amd64.zip" $zip = Join-Path $tmp $file Write-Host "Bajando Agencia $version para Windows..." try { Invoke-WebRequest -Uri "$base/releases/$version/$file" -OutFile $zip -UseBasicParsing } catch { Write-Host "agencia: no pude bajar $file. ($($_.Exception.Message))" -ForegroundColor Red return } $got = (Get-FileHash -Path $zip -Algorithm SHA256).Hash.ToLowerInvariant() $want = $asset.sha256.ToLowerInvariant() if ($got -ne $want) { Write-Host 'agencia: el SHA-256 de la descarga no coincide con el publicado.' -ForegroundColor Red Write-Host " esperado: $want" Write-Host " bajado: $got" Write-Host 'No instalo un archivo que no es el que se publicó. Probá de nuevo en un rato.' return } Write-Host 'SHA-256 verificado.' Expand-Archive -Path $zip -DestinationPath $tmp -Force $app = Join-Path $tmp 'agencia\agencia.exe' if (-not (Test-Path $app)) { Write-Host 'agencia: el paquete no trae agencia.exe.' -ForegroundColor Red return } if ($env:AGENCIA_SKIP_SETUP -eq '1') { Write-Host 'AGENCIA_SKIP_SETUP=1: no corro setup. Iba a correr:' Write-Host " $app setup $($SetupArgs -join ' ')" & $app version return } Write-Host 'Arrancando el instalador...' Write-Host '' & $app setup @SetupArgs if ($LASTEXITCODE -ne 0) { Write-Host "agencia: el instalador terminó con error ($LASTEXITCODE)." -ForegroundColor Red } } finally { # setup copió la app a su lugar definitivo; lo de acá ya no hace falta. Si algo # quedó abierto, que quede: el temporal lo limpia Windows. Remove-Item -Recurse -Force -Path $tmp -ErrorAction SilentlyContinue } } Install-Agencia -SetupArgs $args