setName("ot:site:scan") ->setDescription("Scan the typo3 DB") ->setHelp("This CLI command performs a full scan on the Typo3 db.") ->addOption( 'deep', 'd', InputOption::VALUE_NONE, 'Performs a deeper scan, with more control operations' )->addOption( 'report', 'r', InputOption::VALUE_OPTIONAL, 'Build an html report file with the given name.' ); } /** * -- This method is expected by Typo3, do not rename ou remove -- * * @param InputInterface $input * @param OutputInterface $output * @return int * @throws \Exception */ protected function execute(InputInterface $input, OutputInterface $output) { $deep = $input->getOption('deep'); $io = new SymfonyStyle($input, $output); // instanciate twig loader $loader = new FilesystemLoader(__DIR__ . '/../../templates'); $twig = new Environment($loader); // evaluate the report path $report_path = $input->getOption('report'); if ($report_path == null) { $report_path = getcwd() . '/scan_report.html'; } else { $info = pathinfo($report_path); if ($info['extension'] !== 'html') { $report_path .= '.html'; } } // perform the scan $scanController = GeneralUtility::makeInstance(ObjectManager::class)->get(ScanController::class); $progressBar = $io->createProgressBar(); $progressBar->display(); $scan = $scanController->scanAllAction( $deep, function ($i, $total) use ($progressBar) { $progressBar->setProgress($i); if ($total !== $progressBar->getMaxSteps()) { $progressBar->setMaxSteps($total); } } ); // render the twig template $template = $twig->load('scan_report.twig'); $html_report = $template->render(['scan' => $scan]); $f = fopen($report_path, 'wb+'); try { fwrite($f, $html_report); $io->success(sprintf("Report file was created at: " . $report_path)); } finally { fclose($f); } return 0; } }