setName('backup:retention') ->setDescription('Show or set how many snapshots are kept') ->addOption('last', null, InputOption::VALUE_REQUIRED, 'Always keep the newest N') ->addOption('daily', null, InputOption::VALUE_REQUIRED, 'Keep one per day for the last N days with a backup') ->addOption('weekly', null, InputOption::VALUE_REQUIRED, 'Keep one per week for N weeks') ->addOption('monthly', null, InputOption::VALUE_REQUIRED, 'Keep one per month for N months') ->addOption('user-last', null, InputOption::VALUE_REQUIRED, 'Keep the newest N of each user\'s own exports (occ backup:user:backup)') ->setHelp("Example: occ backup:retention --last=3 --daily=7 --weekly=4 --monthly=12 --user-last=3"); } protected function execute(InputInterface $input, OutputInterface $output): int { if ($input->getOption('user-last') !== null && !ctype_digit((string)$input->getOption('user-last'))) { $output->writeln('--user-last must be a whole number'); return 1; } $p = $this->prune->policy()->toArray(); $changed = false; foreach (['last', 'daily', 'weekly', 'monthly'] as $k) { if ($input->getOption($k) !== null) { $p[$k] = max(0, (int)$input->getOption($k)); $changed = true; } } if ($changed) { try { $this->prune->setPolicy(RetentionPolicy::fromArray($p)); } catch (\InvalidArgumentException $e) { $output->writeln('' . $e->getMessage() . ''); return 1; } } if ($input->getOption('user-last') !== null) { try { $this->prune->setUserExportRetention((int)$input->getOption('user-last')); } catch (\InvalidArgumentException $e) { $output->writeln('' . $e->getMessage() . ''); return 1; } } $output->writeln(sprintf('Keep the last %d, plus one per day for %d days, per week for %d weeks, per month for %d months.', $p['last'], $p['daily'], $p['weekly'], $p['monthly'])); $output->writeln(sprintf('Keep the newest %d of each user\'s own exports.', $this->prune->userExportRetention())); return 0; } }