Path in the Gestor bibliotecas/instalacao-manifesto.php
Per-layer installation manifest (req-198). The core can be "cannibalized": a project or plugin may override any core file and still receive updates. Every delivery records what it delivered in installation/manifests/<layer>.json (path and sha256). Precedence is projeto > plugin:<id> > core.
instalacao_planejar() compares the package with the manifests and the disk and splits:
| Group | What happens |
|---|---|
escrever |
new or intact file: it is written |
preservar |
an upper layer overrides it (sobreposto) or it changed on the server (editado): the new version goes to backups/overrides/<version>/ and becomes a clash |
retirar |
the layer stopped delivering it and the file is intact: removed |
retirar_choque |
the layer stopped delivering it but the file was edited: kept, recorded as a clash |
originais |
the project is about to overwrite the core version: it is kept in installation/originals/ |
restaurar |
the project stopped overriding: the kept core version comes back |
instalacao_aplicar() runs the plan. In copiar mode (API) it writes the files itself. In preparar mode (system update) it only removes the preserved files from the package, and the updater moves the staging. The first delivery of a layer writes everything and records the baseline.
Clashes. Clashes are stored as pending JSON in installation/choques/. instalacao_choques_gravar_pendentes() moves pending clashes into the atualizacoes_choques table after the database stage.
Snapshot and rollback (BATCH-203). instalacao_snapshot_criar() keeps only what the plan will change, and instalacao_snapshot_restaurar() brings files and manifests back.
The library is pure (no Gestor): it runs in the updater, also from staging, and in the API.
Usage
Manifests
-
instalacao_manifesto_arquivo($base, $camada)gives the path of the layer manifest. -
instalacao_manifesto_ler()reads one manifest;instalacao_manifestos()reads all of them. -
instalacao_manifesto_gravar()writes atomically. -
instalacao_nivel($camada)gives the precedence:projeto2,plugin:*1,core0.
File maps
-
instalacao_recuperacao_caminho_valido($rel)rejects hidden, private, absolute, or traversing paths before inventory and extraction. -
instalacao_recuperacao_arquivo_seguro($base, $rel, $hash)checks containment, real destination, and hash before including a file in the ZIP. -
instalacao_recuperacao_inventario($base, $camadas, $caminhos, $estados)assigns each difference to its owning layer and filters the result; it skips symbolic links and private folders. -
instalacao_mapa($raiz, $ignorar)builds thepath → sha256map of a tree. -
instalacao_fora($rel)tells whether a path stays out of the manifest (protected folders andinstallation/). -
instalacao_rel()converts to a relative path with/. -
instalacao_caminho_base()normalizes the root. -
instalacao_hash_disco()gives the hash of the file on disk.
Plan and apply
-
instalacao_planejar()andinstalacao_aplicar(), described above. -
instalacao_diff($antes, $depois)builds the text diff kept with the clash; a binary or oversized file gets only a notice.
Clashes
-
instalacao_choques_registrar()writes the pending JSON. -
instalacao_choques_gravar_pendentes($base, $inserir)inserts each clash through the given function and marks the file as recorded. -
instalacao_choque_pendente_filtro($linha, $escapar)builds the SQL filter of an identical clash still pending; the writer skips the row when it exists.
Snapshot
-
instalacao_snapshot_criar()andinstalacao_snapshot_restaurar(), described above. -
instalacao_snapshot_anotar()adds data tosnapshot.json, for example the database dump. -
instalacao_snapshot_podar($raiz, $manter)keeps only the most recent ones.
Database and check (BATCH-204), shared by the system update and the API deploy:
-
instalacao_snapshot_dir($base, $id)gives the snapshot folder (a numeric id becomesexec-<id>; characters outside[A-Za-z0-9_-]are dropped); -
instalacao_banco_dump($dir, $banco)andinstalacao_banco_restaurar($dump, $banco)dump and restore withmysqldump/mysql;instalacao_banco_processo()runs the pipe with the password inMYSQL_PWD, andinstalacao_shell_pipefail()uses bash withpipefailwhen available (Debian's/bin/shis dash); -
instalacao_saude_log_offset($base)marks the log position before the delivery;instalacao_saude_verificar()looks for a new fatal and makes the HTTP request (DNS, then127.0.0.1, no connection is a warning, waits for OPcache);instalacao_saude_http()makes one request.
Clash resolution (req-199 / BATCH-205). One engine for up and down, project and core:
-
instalacao_choque_acoes($choque)gives the decisions valid for the reason:editado→ overwrite, keep, merge;sobreposto→ keep, merge (undoing the override belongs in the owner layer repository);retirado-editado→ overwrite (accepts the removal) or keep; -
instalacao_choque_versoes($base, $choque)reads the live version and the new one (copy inbackups/overrides/); -
instalacao_choque_resolver($base, $choque, $acao, $mesclado, $gravarRegras)applies it on disk.manterrecords a rule ininstallation/regras.json(instalacao_regras_ler()/instalacao_regras_gravar()): the next delivery with the disk as it was at the decision is born resolved (manter-regra). Overwrite and merge remove the rule. During recovery,copia_externapoints at the downloaded copy andgravarRegras=falseavoids recording deploy rules in the local repository; -
the planner creates no clash when the layer delivers the same content as the previous delivery: there is nothing new to decide.
Functions
Generated from gestor/bibliotecas/instalacao-manifesto.php · 36 functions
instalacao_caminho_base
view source · line 32 ↗instalacao_caminho_base(string $base): stringParameters
$basestring
Returns
instalacao_manifesto_arquivo
view source · line 34 ↗instalacao_manifesto_arquivo(string $base, string $camada): stringParameters
$basestring$camadastring
Returns
instalacao_nivel
view source · line 40 ↗instalacao_nivel(string $camada): intNível de precedência de uma camada (maior vence).
Parameters
$camadastring
Returns
instalacao_manifesto_ler
view source · line 47 ↗instalacao_manifesto_ler(string $base, string $camada): ?arrayParameters
$basestring$camadastring
Returns
instalacao_manifestos
view source · line 55 ↗instalacao_manifestos(string $base): arrayTodos os manifestos gravados na instalação, por camada.
Parameters
$basestring
Returns
instalacao_manifesto_gravar
view source · line 65 ↗instalacao_manifesto_gravar(string $base, string $camada, array $arquivos, string $versao): boolParameters
$basestring$camadastring$arquivosarray$versaostring
Returns
instalacao_rel
view source · line 76 ↗instalacao_rel(string $raiz, string $caminho): stringCaminho relativo com /.
Parameters
$raizstring$caminhostring
Returns
instalacao_fora
view source · line 81 ↗instalacao_fora(string $rel): boolO caminho relativo fica fora do manifesto? (pastas protegidas e installation/)
Parameters
$relstring
Returns
instalacao_recuperacao_caminho_valido
view source · line 87 ↗instalacao_recuperacao_caminho_valido(string $rel): boolCaminho seguro para leitura ou extração: sem segmentos especiais, ocultos ou pastas privadas.
Parameters
$relstring
Returns
instalacao_recuperacao_arquivo_seguro
view source · line 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.
Parameters
$basestring$relstring$hashstring
Returns
instalacao_recuperacao_inventario
view source · line 109 ↗instalacao_recuperacao_inventario(string $base, array $camadas = [], array $caminhos = [], array $estados = []): arrayInventário de divergências, atribuído à camada dona de cada caminho.
Parameters
$basestring$camadasarray$caminhosarray$estadosarray
Returns
instalacao_mapa
view source · line 163 ↗instalacao_mapa(string $raiz, array $ignorar = []): arrayMapa rel → sha256 de uma árvore (pacote no staging ou instalação).
Parameters
$raizstring$ignorararray- Caminhos relativos exatos a ignorar (ex.: artefatos do próprio pacote).
Returns
instalacao_hash_disco
view source · line 178 ↗instalacao_hash_disco(string $base, string $rel): ?stringParameters
$basestring$relstring
Returns
instalacao_planejar
view source · line 198 ↗instalacao_planejar(string $base, string $camada, array $pacote, bool $completo, ?array $manifestos = null, ?array $listaCompleta = null): arrayPlano de uma entrega.
Parameters
$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
Returns
instalacao_aplicar
view source · line 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).
Parameters
$basestring$pacoteRaizstring$camadastring$planoarray$versaostring$modostring
Returns
instalacao_diff
view source · line 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.
Parameters
$antesstring$depoisstring$rotulostring
Returns
instalacao_choques_registrar
view source · line 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().
Parameters
$basestring$origemstring$camadastring$versaostring$execucao?string$choquesarray
Returns
instalacao_choque_pendente_filtro
view source · line 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.
Parameters
$linhaarray$escaparcallable
Returns
instalacao_choques_gravar_pendentes
view source · line 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.
Parameters
$basestring$inserircallable
Returns
instalacao_snapshot_criar
view source · line 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.
Parameters
$basestring$planoarray$dirstring$metaarray
Returns
instalacao_snapshot_anotar
view source · line 435 ↗instalacao_snapshot_anotar(string $dir, array $dados): voidAcrescenta dados ao snapshot.json (ex.: caminho do dump do banco).
Parameters
$dirstring$dadosarray
Returns
instalacao_snapshot_restaurar
view source · line 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).
Parameters
$basestring$dirstring
Returns
instalacao_snapshot_podar
view source · line 470 ↗instalacao_snapshot_podar(string $raiz, int $manter = 5): intMantém só os $manter snapshots mais recentes numa pasta.
Parameters
$raizstring$manterint
Returns
instalacao_snapshot_dir
view source · line 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.
Parameters
$basestring$idstring
Returns
instalacao_shell_pipefail
view source · line 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).
Parameters
$cmdstring
Returns
instalacao_banco_processo
view source · line 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]
Parameters
$cmdstring$bancoarray
Returns
instalacao_banco_dump
view source · line 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).
Parameters
$dirstring$bancoarray
Returns
instalacao_banco_restaurar
view source · line 539 ↗instalacao_banco_restaurar(string $dump, array $banco): arrayRestaura banco.sql.gz no banco. @return array ['ok' => bool, 'erro' => string]
Parameters
$dumpstring$bancoarray
Returns
instalacao_saude_log_offset
view source · line 549 ↗instalacao_saude_log_offset(string $base): intTamanho atual do log de erros do PHP (para achar fatais novos depois).
Parameters
$basestring
Returns
instalacao_saude_verificar
view source · line 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.
Parameters
$basestring$offsetLogint$dominiostring$opcoesarray
Returns
instalacao_saude_http
view source · line 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.
Parameters
$urlstring$ip?string
Returns
instalacao_regras_ler
view source · line 625 ↗instalacao_regras_ler(string $base): arrayRegras que as resoluções deixam (installation/regras.json): rel → [acao, camada, motivo, hash_disco, hash_novo, em].
Parameters
$basestring
Returns
instalacao_regras_gravar
view source · line 632 ↗instalacao_regras_gravar(string $base, array $regras): boolGrava as regras de forma atômica.
Parameters
$basestring$regrasarray
Returns
instalacao_choque_acoes
view source · line 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.
Parameters
$choquearray
Returns
instalacao_choque_versoes
view source · line 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/).
Parameters
$basestring$choquearray
Returns
instalacao_choque_resolver
view source · line 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).
Parameters
$basestring$choquearray- Linha do registro: caminho, camada, motivo, copia, hash_novo.
$acaostring$mesclado?string$gravarRegrasbool
Returns