From 5bd037dc8e8a4e69b3ed2daa6acae2a78d2adcda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Sard=C3=A1?= Date: Thu, 21 Aug 2025 11:28:58 -0300 Subject: [PATCH] =?UTF-8?q?Nova=20atualiza=C3=A7=C3=A3o=20sem=20pedir=20cr?= =?UTF-8?q?edenciais=20do=20git?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pilot_installer_utilities.ps1 | 143 ++++++++++++++++++++++------------ 1 file changed, 92 insertions(+), 51 deletions(-) diff --git a/pilot_installer_utilities.ps1 b/pilot_installer_utilities.ps1 index daae08d..3ed3395 100644 --- a/pilot_installer_utilities.ps1 +++ b/pilot_installer_utilities.ps1 @@ -1,25 +1,28 @@ <# - Atualiza C:\plhDownloads\ com o conteúdo do repositório (branch main) + Atualiza C:\PilotDownloads\ com o conteúdo do repositório (branch main) https://gitea.magicis.com.br/PilotSupport/vlt-install e executa pilot_install.ps1 - Requisitos: - - PowerShell com permissões para escrever em C:\plhDownloads\ - - Preferível executar em janela elevada (winget pode pedir UAC) - - O script: - 1) Garante winget e usa-o para instalar/atualizar Git (Git.Git). - 2) Clona/atualiza o repo em pasta temporária. - 3) Copia por cima (sem /MIR) para C:\plhDownloads\ (exclui .git). - 4) Executa pilot_install.ps1 + Recursos: + - Instala/atualiza Git via winget + - Evita abrir navegador (sem prompts do GCM) + - Suporte a token do Gitea (param ou arquivo) + - Copia por cima (não espelha) #> +param( + [string]$GitUser, # opcional: usuário do Gitea + [string]$GitToken, # opcional: PAT do Gitea + [string]$GitTokenPath # opcional: caminho de arquivo contendo somente o token +) + $ErrorActionPreference = 'Stop' # ===== Configurações ===== -$RepoUrl = 'https://gitea.magicis.com.br/PilotSupport/vlt-install' -$Branch = 'main' # sempre main +$RepoUrl = 'https://gitea.magicis.com.br/PilotSupport/vlt-install' # sem credenciais na URL +$Branch = 'main' $TargetDir = 'C:\PilotDownloads' $WorkDir = Join-Path $env:TEMP 'vlt-install_repo' +$CopyLog = Join-Path $env:TEMP 'vlt-install_copy.log' # ===== Utilitárias ===== function Write-Info($m){ Write-Host "[INFO ] $m" -ForegroundColor Cyan } @@ -33,44 +36,36 @@ function Ensure-Dir([string]$Path){ } } -function Test-Winget { - return [bool](Get-Command winget -ErrorAction SilentlyContinue) -} +function Test-Winget { [bool](Get-Command winget -ErrorAction SilentlyContinue) } function Ensure-Git-WithWinget { if (-not (Test-Winget)) { - Write-Err "winget não encontrado. Instale o 'App Installer' da Microsoft Store para habilitar o winget." + Write-Err "winget não encontrado. Instale o 'App Installer' pela Microsoft Store para habilitar o winget." throw "winget ausente" } Write-Info "Verificando Git via winget..." - $argsCommon = @('--accept-package-agreements','--accept-source-agreements') + $argsCommon = @('--accept-package-agreements','--accept-source-agreements','--silent') # Detecta se Git está instalado $gitInstalled = $false try { - # 'winget list' retorna errolevel 0 mesmo sem pacote; interpretamos saída - $list = winget list --id Git.Git -e 2>$null + $list = winget list --id Git.Git -e @argsCommon 2>$null if ($list -match 'Git\s+Git') { $gitInstalled = $true } } catch { } if ($gitInstalled) { Write-Info "Atualizando Git (se necessário)..." - # silencia prompts; se não houver upgrade disponível, winget finaliza OK. - winget upgrade --id Git.Git -e @argsCommon --silent | Out-Null + & winget upgrade --id Git.Git -e @argsCommon | Out-Null } else { Write-Info "Instalando Git..." - winget install --id Git.Git -e @argsCommon --silent | Out-Null + & winget install --id Git.Git -e @argsCommon | Out-Null } - # Garante que o git esteja acessível - $gitCmd = Get-Command git -ErrorAction SilentlyContinue - if (-not $gitCmd) { - # tenta caminho usual + # Garante PATH do git + if (-not (Get-Command git -ErrorAction SilentlyContinue)) { $maybeGit = 'C:\Program Files\Git\cmd\git.exe' - if (Test-Path $maybeGit) { - $env:Path = "C:\Program Files\Git\cmd;$env:Path" - } + if (Test-Path $maybeGit) { $env:Path = "C:\Program Files\Git\cmd;$env:Path" } } $ver = git --version 2>$null @@ -78,39 +73,82 @@ function Ensure-Git-WithWinget { Write-Ok "Git pronto: $ver" } -# ===== Fluxo principal ===== -try { - Ensure-Git-WithWinget +function Get-GitTokenEffective { + if ($GitToken) { return $GitToken } + if ($GitTokenPath) { + if (-not (Test-Path -LiteralPath $GitTokenPath)) { + throw "Arquivo de token não encontrado: $GitTokenPath" + } + return (Get-Content -LiteralPath $GitTokenPath -Raw).Trim() + } + return $null +} +function Get-BasicAuthHeader([string]$user,[string]$token){ + if (-not $user -or -not $token) { return $null } + $bytes = [Text.Encoding]::ASCII.GetBytes("$user`:$token") + $base64 = [Convert]::ToBase64String($bytes) + return "Authorization: Basic $base64" +} + +function Get-GitCommonArgs { + param([string]$AuthHeader) + + # Evita prompts/UI/navegador e askpass + $args = @( + '-c','credential.helper=', + '-c','credential.interactive=never', + '-c','core.askPass=' + ) + + # Se fornecer header, usa-o nesta chamada (não grava no .git/config) + if ($AuthHeader) { + $args += @('-c',"http.extraHeader=$AuthHeader") + } + return ,$args +} + +# ===== Início ===== +try { + # Auto-desbloqueia este arquivo (elimina marca de internet se houver) + try { Unblock-File -LiteralPath $MyInvocation.MyCommand.Path -ErrorAction SilentlyContinue } catch { } + + Ensure-Git-WithWinget Ensure-Dir $TargetDir - # Prepara/atualiza repositório no diretório de trabalho + # Prepara credenciais (opcionais) + $EffectiveToken = Get-GitTokenEffective + if ($GitUser -and -not $EffectiveToken) { + Write-Warn "GitUser informado mas nenhum token fornecido. Continuação sem autenticação." + } + $AuthHeader = $null + if ($GitUser -and $EffectiveToken) { + $AuthHeader = Get-BasicAuthHeader -user $GitUser -token $EffectiveToken + Write-Info "Usando autenticação via header (sem gravar credenciais em .git/config)." + } + + # Nunca abrir prompts/navegador + $env:GIT_TERMINAL_PROMPT = '0' + + # Clone/Update if (Test-Path (Join-Path $WorkDir '.git')) { - Write-Info "Atualizando repositório existente em $WorkDir ..." + Write-Info "Atualizando repositório em $WorkDir ..." Push-Location $WorkDir - try { git remote set-url origin $RepoUrl | Out-Null } catch { } - git fetch --all --prune - git checkout $Branch - git reset --hard "origin/$Branch" + try { & git (Get-GitCommonArgs -AuthHeader $AuthHeader) remote set-url origin $RepoUrl | Out-Null } catch { } + & git (Get-GitCommonArgs -AuthHeader $AuthHeader) fetch --all --prune + & git (Get-GitCommonArgs -AuthHeader $AuthHeader) checkout $Branch + & git (Get-GitCommonArgs -AuthHeader $AuthHeader) reset --hard "origin/$Branch" Pop-Location } else { Write-Info "Clonando repositório (branch $Branch) para $WorkDir ..." try { Remove-Item -LiteralPath $WorkDir -Recurse -Force -ErrorAction SilentlyContinue } catch { } Ensure-Dir $WorkDir - git clone --depth 1 --branch $Branch $RepoUrl $WorkDir + & git (Get-GitCommonArgs -AuthHeader $AuthHeader) clone --depth 1 --branch $Branch $RepoUrl $WorkDir Write-Ok "Clone concluído." } - # Copiar por cima para o destino (sem espelhar/sem apagar o que já existe) + # Copiar por cima (sem espelhar) Write-Info "Copiando arquivos para $TargetDir (sem espelhar)..." - $log = Join-Path $env:TEMP 'vlt-install_copy.log' - - # Robocopy: - # /E -> inclui subpastas (inclui vazias) - # /IS -> inclui arquivos “iguais” (força overwrite) - # /IT -> inclui arquivos “tweak” - # /XO -> (opcional) pula arquivos mais antigos na origem; REMOVIDO para forçar overwrite - # /NFL /NDL /NP -> logs mais limpos $rc = robocopy ` $WorkDir ` $TargetDir ` @@ -118,13 +156,13 @@ try { /E /IS /IT /R:1 /W:1 /NFL /NDL /NP ` /XD ".git" ` /XF ".gitignore" ".gitattributes" ` - /LOG:$log + /LOG:$CopyLog if ($LASTEXITCODE -ge 8) { - Write-Err "Falha ao copiar arquivos. Veja o log: $log" + Write-Err "Falha ao copiar arquivos. Veja o log: $CopyLog" exit $LASTEXITCODE } else { - Write-Ok "Cópia finalizada. (código robocopy: $LASTEXITCODE) Log: $log" + Write-Ok "Cópia finalizada. (código robocopy: $LASTEXITCODE) Log: $CopyLog" } # Executa o instalador @@ -151,4 +189,7 @@ try { } catch { Write-Err ("Erro: " + $_.Exception.Message) exit 1 +} finally { + # Limpa variáveis sensíveis do ambiente + Remove-Item Env:\GIT_TERMINAL_PROMPT -ErrorAction SilentlyContinue }