- shared/platform-tools: ea3616a → 12f26fd (27 commits). Traz o módulo de audit (f761d99, o pin da frota), «manter sessão iniciada», o registo de segurança da frota (o gancho que o login já tinha passa a funcionar) e a correção do IP do cliente encontrada nesta auditoria (último X-Forwarded-For / X-Real-IP), promovida ao partilhado. client_ip() da app delega nele. - config/functions_audit.php: audit() sobre platform_audit(); tabela audit_log criada no primeiro uso, segredos ocultados, nunca parte a ação. - Registado: login, falha de login, bloqueio por excesso de tentativas, logout, pedidos de recuperação, mudança/definição de palavra-passe, registo e criação de utilizadores, convites, perfil (antes/depois), todas as definições (db_update_setting, com valor anterior), cada passo da lixeira (apagar, restaurar, eliminar de vez) e ações nas mensagens. - Sistema → Auditoria (views/sysadmin/audit.php), só sysadmin. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
31 lines
1.1 KiB
PHP
31 lines
1.1 KiB
PHP
<?php
|
|
// Aplica a retenção avô-pai-filho à pasta backups/ sem fazer uma cópia nova.
|
|
//
|
|
// php shared/platform-tools/bin/backup-prune.php [--dry-run]
|
|
// 30 4 * * * php /var/www/html/shared/platform-tools/bin/backup-prune.php
|
|
//
|
|
// Os workers já podam no fim de cada cópia. Isto serve para um site cujas cópias
|
|
// pararam (a poda nunca corre depois de uma cópia falhada), para ver o que uma
|
|
// mudança de BACKUP_KEEP_* apagaria antes de a fazer (--dry-run), e para podar
|
|
// depois de a mudar.
|
|
|
|
declare(strict_types=1);
|
|
|
|
if (PHP_SAPI !== 'cli') {
|
|
http_response_code(404);
|
|
exit;
|
|
}
|
|
|
|
require_once dirname(__DIR__) . '/backups/config.php';
|
|
require_once dirname(__DIR__) . '/functions_backup.php';
|
|
|
|
$dryRun = in_array('--dry-run', $argv, true);
|
|
$r = backup_prune($dryRun);
|
|
|
|
echo 'Política: ' . backup_retention_summary($r['policy']) . "\n";
|
|
foreach ($r['kept'] as $k) printf(" mantém %s (%s)\n", $k['filename'], $k['reason']);
|
|
foreach ($r['deleted'] as $f) printf(" %s %s\n", $dryRun ? 'apagaria' : 'apagou ', $f);
|
|
foreach ($r['errors'] as $f) printf(" ERRO %s\n", $f);
|
|
|
|
exit($r['errors'] ? 1 : 0);
|