Caminho no Gestor bibliotecas/instalacao-manifesto.php
Manifesto de instalação por camada (req-198). O core é "canibalizável": um projeto ou plugin pode sobrepor qualquer arquivo do core e continuar recebendo atualizações. Cada entrega grava o que entregou em installation/manifests/<camada>.json (caminho e sha256). A precedência é projeto > plugin:<id> > core.
instalacao_planejar() compara o pacote com os manifestos e o disco e separa:
| Grupo | O que acontece |
|---|---|
escrever |
arquivo novo ou intacto: é escrito |
preservar |
a camada de cima sobrepõe (sobreposto) ou houve mudança no servidor (editado): a versão nova vai para backups/overrides/<versão>/ e vira choque |
retirar |
a camada deixou de entregar e o arquivo está intacto: sai |
retirar_choque |
a camada deixou de entregar, mas o arquivo foi editado: fica e vira choque |
originais |
o projeto vai sobrescrever a versão do core: ela é guardada em installation/originals/ |
restaurar |
o projeto deixou de sobrepor: a versão do core guardada volta |
instalacao_aplicar() executa o plano. No modo copiar (API), ele mesmo escreve os arquivos. No modo preparar (atualização do sistema), só tira do pacote o que é preservado, e o atualizador move o staging. A primeira entrega de uma camada escreve tudo e grava a linha de base.
Choques. Os choques são gravados como JSON pendente em installation/choques/. instalacao_choques_gravar_pendentes() leva os pendentes para a tabela atualizacoes_choques depois da etapa de banco.
Snapshot e rollback (BATCH-203). instalacao_snapshot_criar() guarda só o que o plano vai mudar, e instalacao_snapshot_restaurar() volta os arquivos e os manifestos.
A biblioteca é pura (sem Gestor): roda no atualizador, inclusive a partir do staging, e na API.
Uso
Manifestos
-
instalacao_manifesto_arquivo($base, $camada)dá o caminho do manifesto da camada. -
instalacao_manifesto_ler()lê um manifesto;instalacao_manifestos()lê todos. -
instalacao_manifesto_gravar()grava de forma atômica. -
instalacao_nivel($camada)dá a precedência:projeto2,plugin:*1,core0.
Mapas de arquivos
-
instalacao_recuperacao_caminho_valido($rel)recusa caminho oculto, privado, absoluto ou com travessia antes de inventariar e extrair. -
instalacao_recuperacao_arquivo_seguro($base, $rel, $hash)confere contenção, destino real e hash antes de incluir um arquivo no ZIP. -
instalacao_recuperacao_inventario($base, $camadas, $caminhos, $estados)atribui cada divergência à camada dona e filtra o resultado; ignora links simbólicos e pastas privadas. -
instalacao_mapa($raiz, $ignorar)gera o mapacaminho → sha256de uma árvore. -
instalacao_fora($rel)diz se o caminho fica fora do manifesto (pastas protegidas einstallation/). -
instalacao_rel()converte para caminho relativo com/. -
instalacao_caminho_base()normaliza a raiz. -
instalacao_hash_disco()dá o hash do arquivo no disco.
Plano e aplicação
-
instalacao_planejar()einstalacao_aplicar(), descritos acima. -
instalacao_diff($antes, $depois)gera o diff textual guardado no choque; arquivo binário ou grande demais recebe só um aviso.
Choques
-
instalacao_choques_registrar()grava o JSON pendente. -
instalacao_choques_gravar_pendentes($base, $inserir)insere cada choque pela função recebida e marca o arquivo como gravado. -
instalacao_choque_pendente_filtro($linha, $escapar)monta o filtro SQL de um choque igual ainda pendente; quem grava pula a linha quando ele existe.
Snapshot
-
instalacao_snapshot_criar()einstalacao_snapshot_restaurar(), descritos acima. -
instalacao_snapshot_anotar()acrescenta dados aosnapshot.json, por exemplo o dump do banco. -
instalacao_snapshot_podar($raiz, $manter)mantém só os mais recentes.
Banco e verificação (BATCH-204), compartilhados pela atualização do sistema e pelo deploy por API:
-
instalacao_snapshot_dir($base, $id)dá a pasta do snapshot (id numérico viraexec-<id>; caracteres fora de[A-Za-z0-9_-]saem); -
instalacao_banco_dump($dir, $banco)einstalacao_banco_restaurar($dump, $banco)fazem o dump e a restauração commysqldump/mysql;instalacao_banco_processo()roda o pipe com a senha emMYSQL_PWD, einstalacao_shell_pipefail()usa o bash compipefailquando existe (o/bin/shdo Debian é o dash); -
instalacao_saude_log_offset($base)marca a posição do log antes da entrega;instalacao_saude_verificar()procura fatal novo e faz a requisição HTTP (DNS, depois127.0.0.1, sem conexão é aviso, espera o OPcache);instalacao_saude_http()faz uma requisição.
Resolução de choques (req-199 / BATCH-205). Um motor para subir e descer, projeto e core:
-
instalacao_choque_acoes($choque)dá as decisões que valem para o motivo:editado→ sobrescrever, manter, mesclar;sobreposto→ manter, mesclar (desfazer a sobreposição é no repositório da camada dona);retirado-editado→ sobrescrever (aceita a retirada) ou manter; -
instalacao_choque_versoes($base, $choque)lê a versão no ar e a nova (cópia embackups/overrides/); -
instalacao_choque_resolver($base, $choque, $acao, $mesclado, $gravarRegras)aplica no disco.mantergrava regra eminstallation/regras.json(instalacao_regras_ler()/instalacao_regras_gravar()): a próxima entrega com o disco igual ao da decisão já nasce resolvida (manter-regra). Sobrescrever e mesclar apagam a regra. Na descida,copia_externaaponta para a cópia baixada egravarRegras=falsenão grava regras de deploy no repositório local; -
o planejador não gera choque quando a camada entrega o mesmo conteúdo da entrega anterior: não há nada novo a decidir.
Funções
Gerado a partir de gestor/bibliotecas/instalacao-manifesto.php · 36 funções
instalacao_caminho_base
ver no código · linha 32 ↗instalacao_caminho_base(string $base): stringParâmetros
$basestring
Retorno
instalacao_manifesto_arquivo
ver no código · linha 34 ↗instalacao_manifesto_arquivo(string $base, string $camada): stringParâmetros
$basestring$camadastring
Retorno
instalacao_nivel
ver no código · linha 40 ↗instalacao_nivel(string $camada): intNível de precedência de uma camada (maior vence).
Parâmetros
$camadastring
Retorno
instalacao_manifesto_ler
ver no código · linha 47 ↗instalacao_manifesto_ler(string $base, string $camada): ?arrayParâmetros
$basestring$camadastring
Retorno
instalacao_manifestos
ver no código · linha 55 ↗instalacao_manifestos(string $base): arrayTodos os manifestos gravados na instalação, por camada.
Parâmetros
$basestring
Retorno
instalacao_manifesto_gravar
ver no código · linha 65 ↗instalacao_manifesto_gravar(string $base, string $camada, array $arquivos, string $versao): boolParâmetros
$basestring$camadastring$arquivosarray$versaostring
Retorno
instalacao_rel
ver no código · linha 76 ↗instalacao_rel(string $raiz, string $caminho): stringCaminho relativo com /.
Parâmetros
$raizstring$caminhostring
Retorno
instalacao_fora
ver no código · linha 81 ↗instalacao_fora(string $rel): boolO caminho relativo fica fora do manifesto? (pastas protegidas e installation/)
Parâmetros
$relstring
Retorno
instalacao_recuperacao_caminho_valido
ver no código · linha 87 ↗instalacao_recuperacao_caminho_valido(string $rel): boolCaminho seguro para leitura ou extração: sem segmentos especiais, ocultos ou pastas privadas.
Parâmetros
$relstring
Retorno
instalacao_recuperacao_arquivo_seguro
ver no código · linha 96 ↗instalacao_recuperacao_arquivo_seguro(string $base, string $rel, string $hash): ?stringConfere contenção, destino real e hash antes de colocar um arquivo no ZIP.
Parâmetros
$basestring$relstring$hashstring
Retorno
instalacao_recuperacao_inventario
ver no código · linha 109 ↗instalacao_recuperacao_inventario(string $base, array $camadas = [], array $caminhos = [], array $estados = []): arrayInventário de divergências, atribuído à camada dona de cada caminho.
Parâmetros
$basestring$camadasarray$caminhosarray$estadosarray
Retorno
instalacao_mapa
ver no código · linha 163 ↗instalacao_mapa(string $raiz, array $ignorar = []): arrayMapa rel → sha256 de uma árvore (pacote no staging ou instalação).
Parâmetros
$raizstring$ignorararray- Caminhos relativos exatos a ignorar (ex.: artefatos do próprio pacote).
Retorno
instalacao_hash_disco
ver no código · linha 178 ↗instalacao_hash_disco(string $base, string $rel): ?stringParâmetros
$basestring$relstring
Retorno
instalacao_planejar
ver no código · linha 198 ↗instalacao_planejar(string $base, string $camada, array $pacote, bool $completo, ?array $manifestos = null, ?array $listaCompleta = null): arrayPlano de uma entrega.
Parâmetros
$basestring- Raiz da instalação.
$camadastring- 'core' | 'plugin:<id>' | 'projeto'.
$pacotearray- Mapa
rel → sha256do que chega. $completobool- O pacote traz TUDO que a camada entrega (senão não há retirada).
$manifestos?array- Manifestos atuais (null = lê do disco).
$listaCompleta?array- Mapa
rel → sha256de TUDO que a camada entrega, quando o pacote
Retorno
instalacao_aplicar
ver no código · linha 274 ↗instalacao_aplicar(string $base, string $pacoteRaiz, string $camada, array $plano, string $versao, string $modo = 'copiar'): arrayAplica o plano: guarda originais, escreve, preserva (cópia nova em backups/overrides/), retira, restaura e grava o manifesto. Os arquivos a escrever são COPIADOS do pacote ($modo = 'copiar') ou apenas removidos do pacote quando preservados, para quem aplica por conta própria ('preparar', usado pela atualização do sistema, que move o staging depois).
Parâmetros
$basestring$pacoteRaizstring$camadastring$planoarray$versaostring$modostring
Retorno
instalacao_diff
ver no código · linha 320 ↗instalacao_diff(string $antes, string $depois, string $rotulo = ''): ?stringDiff unificado curto entre dois textos (arquivo no ar × versão nova). Binário ou grande demais: só o aviso. Suficiente para o registro de choques; o merge fica para a req-199.
Parâmetros
$antesstring$depoisstring$rotulostring
Retorno
instalacao_choques_registrar
ver no código · linha 347 ↗instalacao_choques_registrar(string $base, string $origem, string $camada, string $versao, ?string $execucao, array $choques): ?stringGuarda os choques de uma entrega num JSON pendente (installation/choques/*.pendente.json). A gravação na tabela atualizacoes_choques acontece depois da etapa de banco (a tabela pode ainda não existir na etapa de arquivos) por instalacao_choques_gravar_pendentes().
Parâmetros
$basestring$origemstring$camadastring$versaostring$execucao?string$choquesarray
Retorno
instalacao_choque_pendente_filtro
ver no código · linha 361 ↗instalacao_choque_pendente_filtro(array $linha, callable $escapar): stringFiltro SQL (sem o WHERE) de um choque igual ainda pendente: mesmo caminho, camada, motivo e hashes, sem resolução. Quem grava pula a linha quando ele existe, para a mesma situação não virar uma linha por atualização. $escapar escapa um valor para SQL.
Parâmetros
$linhaarray$escaparcallable
Retorno
instalacao_choques_gravar_pendentes
ver no código · linha 376 ↗instalacao_choques_gravar_pendentes(string $base, callable $inserir): intGrava os choques pendentes com $inserir(array $linha): bool (colunas de atualizacoes_choques) e renomeia cada arquivo para .gravado.json. Arquivo com falha continua pendente para a próxima vez.
Parâmetros
$basestring$inserircallable
Retorno
instalacao_snapshot_criar
ver no código · linha 407 ↗instalacao_snapshot_criar(string $base, array $plano, string $dir, array $meta = []): arraySnapshot seletivo antes de aplicar um plano: guarda só o que vai ser sobrescrito, removido ou restaurado (não a instalação inteira), a lista do que é novo (sai no rollback) e os manifestos atuais. Grava <dir>/snapshot.json.
Parâmetros
$basestring$planoarray$dirstring$metaarray
Retorno
instalacao_snapshot_anotar
ver no código · linha 435 ↗instalacao_snapshot_anotar(string $dir, array $dados): voidAcrescenta dados ao snapshot.json (ex.: caminho do dump do banco).
Parâmetros
$dirstring$dadosarray
Retorno
instalacao_snapshot_restaurar
ver no código · linha 448 ↗instalacao_snapshot_restaurar(string $base, string $dir): arrayVolta os arquivos ao estado do snapshot: tira os novos, devolve os sobrescritos e os removidos e restaura os manifestos. O banco é à parte (dump anotado no snapshot).
Parâmetros
$basestring$dirstring
Retorno
instalacao_snapshot_podar
ver no código · linha 470 ↗instalacao_snapshot_podar(string $raiz, int $manter = 5): intMantém só os $manter snapshots mais recentes numa pasta.
Parâmetros
$raizstring$manterint
Retorno
instalacao_snapshot_dir
ver no código · linha 489 ↗instalacao_snapshot_dir(string $base, string $id): ?stringPasta do snapshot de uma execução. Id só com dígitos vira exec-<id> (atualização do sistema); os outros (ex.: api-20260930-120000-ab12) valem como estão. Caracteres fora de [A-Za-z0-9_-] saem.
Parâmetros
$basestring$idstring
Retorno
instalacao_shell_pipefail
ver no código · linha 501 ↗instalacao_shell_pipefail(string $cmd): arrayComando de shell com pipefail (a falha do mysqldump não some atrás do gzip). O /bin/sh do Debian e do Ubuntu é o dash, que não tem pipefail e sai com código 2 no set -o pipefail; por isso usa o bash quando existe e, sem ele, o sh sem pipefail (o tamanho do arquivo ainda é conferido).
Parâmetros
$cmdstring
Retorno
instalacao_banco_processo
ver no código · linha 507 ↗instalacao_banco_processo(string $cmd, array $banco): arrayRoda um pipe de shell com a senha do banco em MYSQL_PWD. @return array ['codigo' => int, 'erro' => string]
Parâmetros
$cmdstring$bancoarray
Retorno
instalacao_banco_dump
ver no código · linha 524 ↗instalacao_banco_dump(string $dir, array $banco): arrayDump do banco (mysqldump --single-transaction, gzip) em <dir>/banco.sql.gz, anotado no snapshot.json. $banco: host, usuario, senha, nome (o $_BANCO do Gestor).
Parâmetros
$dirstring$bancoarray
Retorno
instalacao_banco_restaurar
ver no código · linha 539 ↗instalacao_banco_restaurar(string $dump, array $banco): arrayRestaura banco.sql.gz no banco. @return array ['ok' => bool, 'erro' => string]
Parâmetros
$dumpstring$bancoarray
Retorno
instalacao_saude_log_offset
ver no código · linha 549 ↗instalacao_saude_log_offset(string $base): intTamanho atual do log de erros do PHP (para achar fatais novos depois).
Parâmetros
$basestring
Retorno
instalacao_saude_verificar
ver no código · linha 569 ↗instalacao_saude_verificar(string $base, int $offsetLog, string $dominio, array $opcoes = []): arrayVerificação depois de uma entrega: sem erro fatal novo no log do PHP e a raiz do site respondendo abaixo de 500.
Parâmetros
$basestring$offsetLogint$dominiostring$opcoesarray
Retorno
instalacao_saude_http
ver no código · linha 604 ↗instalacao_saude_http(string $url, ?string $ip): intCódigo HTTP de $url (0 sem conexão). Com $ip, o host da URL é resolvido para ele.
Parâmetros
$urlstring$ip?string
Retorno
instalacao_regras_ler
ver no código · linha 625 ↗instalacao_regras_ler(string $base): arrayRegras que as resoluções deixam (installation/regras.json): rel → [acao, camada, motivo, hash_disco, hash_novo, em].
Parâmetros
$basestring
Retorno
instalacao_regras_gravar
ver no código · linha 632 ↗instalacao_regras_gravar(string $base, array $regras): boolGrava as regras de forma atômica.
Parâmetros
$basestring$regrasarray
Retorno
instalacao_choque_acoes
ver no código · linha 649 ↗instalacao_choque_acoes(array $choque): arrayDecisões possíveis para um choque, pelo motivo: - editado (mudança no servidor): sobrescrever com a versão nova, manter a do servidor ou mesclar; - sobreposto (a camada de cima é a dona): manter ou mesclar. Sobrescrever não vale aqui: a próxima entrega da camada dona escreveria de novo; o lugar de desfazer a sobreposição é o repositório dela; - retirado-editado: sobrescrever (aceita a retirada, o arquivo sai) ou manter; - original-ausente: manter.
Parâmetros
$choquearray
Retorno
instalacao_choque_versoes
ver no código · linha 663 ↗instalacao_choque_versoes(string $base, array $choque): arrayAs duas versões de um choque: a que está no ar (disco) e a nova (cópia guardada em backups/overrides/).
Parâmetros
$basestring$choquearray
Retorno
instalacao_choque_resolver
ver no código · linha 685 ↗instalacao_choque_resolver(string $base, array $choque, string $acao, ?string $mesclado = null, bool $gravarRegras = true): arrayAplica a decisão sobre um choque no disco e guarda a regra que vale nas próximas entregas. - sobrescrever: a versão nova (cópia) vai para o lugar; numa retirada, o arquivo sai; - manter: nada muda no disco; a regra faz a próxima entrega do mesmo conteúdo já nascer resolvida; - mesclar: $mesclado vai para o lugar (a próxima entrega com versão nova volta a pedir decisão).
Parâmetros
$basestring$choquearray- Linha do registro: caminho, camada, motivo, copia, hash_novo.
$acaostring$mesclado?string$gravarRegrasbool
Retorno