# Instalador do Cialai Broto para Windows. # # irm https://cialai.com.br/broto/install.ps1 | iex # # Baixa CialaiBroto_x64-setup.exe e o SHA256SUMS.txt de https://cialai.com.br/downloads/broto, confere a soma com # Get-FileHash e abre o instalador. A instalação só pede a confirmação do Windows, e o serviço roda como SYSTEM. # BROTO_BASE_URL aponta para outro espelho. # Tudo fica em funções e só a última linha executa, então um download cortado no meio não roda nada. Os erros param # com throw, nunca com exit, para não fechar o PowerShell de quem colou o comando. function Assert-BrotoWindows { if ($PSVersionTable.PSEdition -eq 'Core' -and -not $IsWindows) { throw 'Este instalador é para Windows. No Linux, rode: curl -fsSL https://cialai.com.br/broto/install.sh | bash' } # Um PowerShell de 32 bits num Windows de 64 bits informa a arquitetura real em PROCESSOR_ARCHITEW6432. $arch = $env:PROCESSOR_ARCHITEW6432 if (-not $arch) { $arch = $env:PROCESSOR_ARCHITECTURE } if ($arch -ne 'AMD64') { throw "O Cialai Broto para Windows é publicado só para x64, e esta máquina é $arch." } } # A linha do SHA256SUMS.txt segue o formato do sha256sum: a soma, dois espaços e o nome do arquivo. function Get-BrotoExpectedHash { param([Parameter(Mandatory = $true)][string]$Sums, [Parameter(Mandatory = $true)][string]$Name) foreach ($line in Get-Content -LiteralPath $Sums) { if ($line -match '^([0-9a-fA-F]{64}) (\S+)$' -and $Matches[2] -eq $Name) { return $Matches[1].ToLowerInvariant() } } throw "O SHA256SUMS.txt não tem $Name." } # Baixa o instalador para a pasta informada e só devolve o caminho depois de conferir a soma. function Save-BrotoInstaller { param([Parameter(Mandatory = $true)][string]$BaseUrl, [Parameter(Mandatory = $true)][string]$Directory) $name = 'CialaiBroto_x64-setup.exe' $version = '' try { $latest = Join-Path $Directory 'latest.json' Invoke-WebRequest -UseBasicParsing -Uri "$BaseUrl/latest.json" -OutFile $latest $version = ((Get-Content -LiteralPath $latest -Raw | ConvertFrom-Json).tag) -replace '^broto-v', '' } catch { $version = '' } $sums = Join-Path $Directory 'SHA256SUMS.txt' Invoke-WebRequest -UseBasicParsing -Uri "$BaseUrl/SHA256SUMS.txt" -OutFile $sums $expected = Get-BrotoExpectedHash -Sums $sums -Name $name if ($version) { Write-Host "Baixando o Cialai Broto $version, $name" } else { Write-Host "Baixando $name" } $file = Join-Path $Directory $name Invoke-WebRequest -UseBasicParsing -Uri "$BaseUrl/$name" -OutFile $file $actual = (Get-FileHash -Algorithm SHA256 -LiteralPath $file).Hash.ToLowerInvariant() if ($actual -ne $expected) { throw "A soma SHA256 de $name não confere. Nada foi instalado." } Write-Host 'Soma SHA256 conferida' return $file } function Install-CialaiBroto { $ErrorActionPreference = 'Stop' # A barra de progresso do Windows PowerShell deixa o download muitas vezes mais lento. $ProgressPreference = 'SilentlyContinue' Assert-BrotoWindows [Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12 $base = $env:BROTO_BASE_URL if (-not $base) { $base = 'https://cialai.com.br/downloads/broto' } $base = $base.TrimEnd('/') $dir = Join-Path ([IO.Path]::GetTempPath()) ('cialai-broto-' + [guid]::NewGuid().ToString('N')) New-Item -ItemType Directory -Path $dir | Out-Null try { Write-Host 'Cialai Broto, instalador para Windows' $installer = Save-BrotoInstaller -BaseUrl $base -Directory $dir Write-Host 'Abrindo o instalador' # Espera só o instalador. Com -Wait, o Windows PowerShell esperaria também a janela que ele abre no fim. $process = Start-Process -FilePath $installer -PassThru $null = $process.Handle $process.WaitForExit() if ($process.ExitCode -ne 0) { throw "O instalador foi fechado antes de concluir, com o código $($process.ExitCode)." } } finally { Remove-Item -LiteralPath $dir -Recurse -Force -ErrorAction SilentlyContinue } Write-Host '' Write-Host 'Cialai Broto instalado.' Write-Host 'Abra o Cialai Broto pelo menu Iniciar e aperte Instalar e iniciar serviço.' Write-Host 'No Cialai do computador que vai comandar, abra Dispositivos, Brotos, Conectar novo Broto e copie o código.' Write-Host 'Cole o código na janela do Broto e aperte Ligar. Os 4 dígitos que aparecem precisam ser os mesmos do Cialai.' } Install-CialaiBroto