97 lines
3.0 KiB
PHP
97 lines
3.0 KiB
PHP
<?php
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use Illuminate\Console\Command;
|
|
|
|
/**
|
|
* Rimuove gli archivi di backup e i pacchetti caricati piu' vecchi di un
|
|
* giorno.
|
|
*
|
|
* Sono file grossi che vivono nel volume `storage_data`, lo stesso dei PDF dei
|
|
* territori: un download mai completato o un ripristino interrotto ne lascia
|
|
* uno indietro, e senza pulizia si accumulano finche' il volume non si riempie
|
|
* — a quel punto smettono di funzionare anche l'import dei PDF e i log.
|
|
*
|
|
* La creazione di un nuovo backup fa gia' la sua pulizia, ma solo se qualcuno
|
|
* ne crea uno: un'installazione che non tocca piu' la pagina resterebbe con i
|
|
* residui addosso per sempre. Da qui il task pianificato.
|
|
*/
|
|
class BackupCleanup extends Command
|
|
{
|
|
protected $signature = 'backup:cleanup {--ore=24 : Eta minima, in ore, dei file da rimuovere}';
|
|
|
|
protected $description = 'Rimuove archivi di backup e pacchetti di ripristino piu\' vecchi di N ore';
|
|
|
|
/** Cartelle sotto storage/app in cui vivono i file temporanei del backup. */
|
|
private const CARTELLE = [
|
|
'backups' => '*.zip',
|
|
'backup-restore-in' => '*.zip',
|
|
];
|
|
|
|
public function handle(): int
|
|
{
|
|
$ore = max(1, (int) $this->option('ore'));
|
|
$limite = now()->subHours($ore)->getTimestamp();
|
|
|
|
$rimossi = 0;
|
|
$liberati = 0;
|
|
|
|
foreach (self::CARTELLE as $cartella => $pattern) {
|
|
$percorso = storage_path('app/' . $cartella);
|
|
|
|
if (! is_dir($percorso)) {
|
|
continue;
|
|
}
|
|
|
|
foreach (glob($percorso . '/' . $pattern) ?: [] as $file) {
|
|
if (filemtime($file) >= $limite) {
|
|
continue;
|
|
}
|
|
|
|
$dimensione = filesize($file) ?: 0;
|
|
|
|
if (@unlink($file)) {
|
|
$rimossi++;
|
|
$liberati += $dimensione;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Le cartelle di staging del ripristino: il job le cancella nel
|
|
// finally, ma un processo ucciso a meta' non arriva a eseguirlo.
|
|
$staging = storage_path('app/backup-restore');
|
|
if (is_dir($staging)) {
|
|
foreach (glob($staging . '/*', GLOB_ONLYDIR) ?: [] as $dir) {
|
|
if (filemtime($dir) < $limite) {
|
|
$this->rimuoviCartella($dir);
|
|
$rimossi++;
|
|
}
|
|
}
|
|
}
|
|
|
|
$this->info(sprintf(
|
|
'Pulizia backup: %d elementi rimossi, %.1f MB liberati.',
|
|
$rimossi,
|
|
$liberati / 1048576
|
|
));
|
|
|
|
return self::SUCCESS;
|
|
}
|
|
|
|
private function rimuoviCartella(string $path): void
|
|
{
|
|
$iterator = new \RecursiveIteratorIterator(
|
|
new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS),
|
|
\RecursiveIteratorIterator::CHILD_FIRST
|
|
);
|
|
|
|
foreach ($iterator as $item) {
|
|
/** @var \SplFileInfo $item */
|
|
$item->isDir() ? @rmdir($item->getPathname()) : @unlink($item->getPathname());
|
|
}
|
|
|
|
@rmdir($path);
|
|
}
|
|
}
|