Conn2Flow
Navegação das docs

SDD

req-168: Encapsulamento de cd sob sudo -u no SshRemoteTransport e AuthCookieCommand (BATCH-173)

Durante a execução do pipeline ./c2f project:update-all [REDACTED]-local --confirmar-remoto, as etapas 1 a 5 concluem com sucesso, mas a etapa 6/8 (Regenerando CSS derivado) falha…

1. Descrição do Problema & Contexto

Durante a execução do pipeline ./c2f project:update-all [REDACTED]-local --confirmar-remoto, as etapas 1 a 5 concluem com sucesso, mas a etapa 6/8 (Regenerando CSS derivado) falha com o seguinte erro retornado pelo SSH:

▶ 6/8 Regenerando CSS derivado ([REDACTED]-local)
──────────────────────────────────────────────────
  projeto: [REDACTED]-local | local: true | url: https://[REDACTED].local/
  transporte: ssh [REDACTED]:22[REDACTED]
  comando remoto: [REDACTED]=yes -o ConnectTimeout=15 -p 22 "[REDACTED]" "cd '[REDACTED] && sudo -u '[REDACTED]' 'sh' '-c' 'if [ -x ./c2f ]; then '''./c2f''' '''css:rebuild'''; elif command -v c2f >/dev/null 2>&1; then'''c2f''' '''css:rebuild'''; else '''php''' '''controladores/agents/arquitetura/css-regenerar.php''' '''--gestor=.'''; fi'"
 ✖ ERROR  bash: line 1: cd: [REDACTED] Permission denied
 ✖ ERROR  A regeneração remota do CSS falhou para '[REDACTED]-local' (código 1).

Causa Raiz Mapeada

  1. O BATCH-172 corrigiu o encapsulamento de cd sob sudo -u nos scripts shell (project_transport_remote_exec em project-transport.sh), o que permitiu às etapas 2/8 e 5/8 executarem normalmente no tenant HestiaCP ([REDACTED]).

  2. Entretanto, a etapa 6/8 é disparada pelo comando PHP CssRebuildCommand, que utiliza a classe Conn2Flow\Cli\Support\SshRemoteTransport (cli/src/Support/SshRemoteTransport.php).

  3. No método buildRemoteCommand(), o comando ainda concatena cd $directory && antes de sudo -u $runAs:

    if ($this->runAs !== null) {
       $remote = 'sudo -u ' . $this->posixQuote($this->runAs) . ' ' . $remote;
    }
    $directory = $workingDirectory ?? $this->cliWorkingDirectory();
    $remote = 'cd ' . $this->posixQuote($directory) . ' && ' . $remote;
  4. O mesmo padrão de cd prévio desprotegido existe em AuthCookieCommand::generateViaSsh() (cli/src/Commands/AuthCookieCommand.php:276).

  5. Como o usuário [REDACTED] (otavio) não tem permissão para navegar diretamente no diretório do tenant (750 pertencente a [REDACTED]), o comando falha com cd: Permission denied.


2. Escopo Técnico de Alterações

Módulo 1: SshRemoteTransport (cli/src/Support/SshRemoteTransport.php)

  • No método buildRemoteCommand():

    • Quando runAs estiver definido, encapsular a mudança de diretório (cd "$directory") e o comando $remote juntos sob sudo -u $runAs sh -c "cd ... && ...".

    • Quando runAs for nulo, manter a execução direta cd "$directory" && $remote.

Módulo 2: AuthCookieCommand (cli/src/Commands/AuthCookieCommand.php)

  • No método generateViaSsh():

    • Quando ssh['runAs'] estiver definido, encapsular o cd e a execução do PHP gerador de cookie sob sudo -u $runAs sh -c ....

Módulo 3: Testes Automatizados

  • Em tests/Unit/PHP/CssAuditSshReq052Test.php (ou teste unitário dedicado de transporte):

    • Adicionar teste garantindo que SshRemoteTransport::buildRemoteCommand() com runAs encapsula o cd dentro do sudo -u ... sh -c.


3. Critérios de Validação e Aceite

  1. Execução Completa de 8/8 sem Erros:

    • A execução de ./c2f project:update-all [REDACTED]-local --confirmar-remoto passa pela etapa 6/8 (Regenerando CSS derivado) com sucesso, sem avisos de cd: Permission denied.

  2. Suíte de Testes 100% Verde:

    • PHPUnit 100% passando.

  3. Evidências Registradas:

    • Registrar evidências em sdd/implementation/BATCH-173.md, BATCH-INDEX.md e CURRENT.md.

O Futuro é Híbrido: Humano + IA.

O Conn2Flow é a ferramenta. Se você precisa do Arquiteto para desenhar a estratégia da sua empresa usando essa tecnologia...

Contrate Consultoria Especializada