isFile()) { continue; } $files[] = [ 'path' => $file->getPathname(), 'size' => $file->getSize(), 'mtime' => date('Y-m-d H:i:s', $file->getMTime()), ]; } usort($files, fn($a, $b) => strcmp($b['mtime'], $a['mtime'])); return $files; } $files = backup_evidence_files($backupDir); $generatedAt = date('Y-m-d H:i:s'); $configLocal = $root . DIRECTORY_SEPARATOR . 'php' . DIRECTORY_SEPARATOR . 'config.local.php'; $adminAudit = $root . DIRECTORY_SEPARATOR . 'php' . DIRECTORY_SEPARATOR . 'var' . DIRECTORY_SEPARATOR . 'admin_audit.log'; echo "# backup-evidence\n\n"; echo "- generated_at: {$generatedAt}\n"; echo "- backup_dir: {$backupDir}\n"; echo "- backup_file_count: " . count($files) . "\n"; echo "- restore_test: {$restoreTest}\n"; echo "- config_local_present: " . backup_evidence_bool(is_file($configLocal)) . "\n"; echo "- admin_audit_log_present: " . backup_evidence_bool(is_file($adminAudit)) . "\n\n"; echo "## Backup Files\n\n"; echo "| modified_at | size_bytes | path |\n"; echo "|---|---:|---|\n"; foreach (array_slice($files, 0, 50) as $file) { $safePath = str_replace('|', '/', $file['path']); echo "| {$file['mtime']} | {$file['size']} | {$safePath} |\n"; } if (!$files) { echo "| - | 0 | no backup files found |\n"; } echo "\n## Restore Evidence\n\n"; echo "Record the latest restore drill result in `--restore-test`. Include DB restore, login, SMS test, and monthly report checks.\n";