setName(self::NAME) ->setDescription( 'Checks if the GeoLite2 db file is too old or it does not exist, and tries to download an up-to-date ' . 'copy if so.', ); } protected function execute(InputInterface $input, OutputInterface $output): ?int { $io = new SymfonyStyle($input, $output); try { $this->dbUpdater->checkDbUpdate(function (bool $olderDbExists) use ($io): void { $io->text(sprintf('%s GeoLite2 db file...', $olderDbExists ? 'Updating' : 'Downloading')); $this->progressBar = new ProgressBar($io); }, function (int $total, int $downloaded): void { $this->progressBar?->setMaxSteps($total); $this->progressBar?->setProgress($downloaded); }); if ($this->progressBar === null) { $io->info('GeoLite2 db file is up to date.'); } else { $this->progressBar->finish(); $io->success('GeoLite2 db file properly downloaded.'); } return ExitCode::EXIT_SUCCESS; } catch (GeolocationDbUpdateFailedException $e) { $olderDbExists = $e->olderDbExists(); if ($olderDbExists) { $io->warning( 'GeoLite2 db file update failed. Visits will continue to be located with the old version.', ); } else { $io->error('GeoLite2 db file download failed. It will not be possible to locate visits.'); } if ($io->isVerbose()) { $this->getApplication()?->renderThrowable($e, $io); } return $olderDbExists ? ExitCode::EXIT_WARNING : ExitCode::EXIT_FAILURE; } } }