setDescription('check configuration file'); return $this; } public function execute(InputInterface $input, OutputInterface $output) { foreach (array(self::DEV, self::PROD, self::TEST) as $env) { $output->writeln(""); $output->writeln(sprintf("Checking for %s configuration settings", $env)); $output->writeln("========================================="); $output->writeln(""); $this->env = $env; $this->initTests($output); $this->prepareTests($output); $this->runTests($output); } return 0; } private function initTests(OutputInterface $output) { $this->configuration = Core\Configuration::build(); if (!$this->configuration->isInstalled()) { $output->writeln(sprintf("\nPhraseanet is not installed\n")); return 1; } } private function prepareTests(OutputInterface $output) { try { $this->checkParse($output); $this->checkGetSelectedEnvironement($output); $this->checkGetSelectedEnvironementFromFile($output); } catch (\Exception $e) { $previous = $e->getPrevious(); $output->writeln(sprintf( "%s FATAL error : %s" , $e->getMessage() , $previous instanceof \Exception ? $previous->getMessage() : 'Unknown.' ) ); $output->writeln(sprintf("\nConfig check test suite can not continue please correct FATAL error and relaunch.\n")); return 1; } } private function runTests(OutputInterface $output) { $nbErrors = 0; foreach ($this->testSuite as $test) { try { call_user_func(array($this, $test), $output); } catch (\Exception $e) { $nbErrors++; $previous = $e->getPrevious(); $output->writeln(sprintf( "%s FAILED : %s" , $e->getMessage() , $previous instanceof \Exception ? $previous->getMessage() : 'Unknow' ) ); } } return (int) ($nbErrors > 0); } private function checkParse(OutputInterface $output) { if (!$this->configuration) { throw new \Exception("Unable to load configurations\n"); } if (!$this->configuration->getConnexions()) { throw new \Exception("Unable to load connexions\n"); } if (!$this->configuration->getServices()) { throw new \Exception("Unable to load services\n"); } return; } private function checkGetSelectedEnvironement(OutputInterface $output) { try { $this->configuration; } catch (\Exception $e) { throw new \Exception(sprintf("Check get selected environment\n"), null, $e); } $output->writeln("Get Selected Environment OK"); return; } private function checkGetSelectedEnvironementFromFile(OutputInterface $output) { $configuration = Core\Configuration::build(); $env = $configuration->getEnvironnement(); $output->writeln("Get Selected Environment from file : ".$env.""); return; } private function checkPhraseanetScope(OutputInterface $output) { try { $phraseanet = $this->configuration->getPhraseanet(); $url = $phraseanet->get("servername"); if ($this->env === self::TEST) { if ($phraseanet->get("debug") !== true) { $output->writeln(sprintf( "%s:phraseanet:debug must be initialized to true<:comment>" , $this->env ) ); } if ($phraseanet->get("display_errors") !== true) { throw new \Exception(sprintf( "%s:phraseanet:debug must be initialized to true" , $this->env ) ); } } if ($this->env === self::PROD) { if ($phraseanet->get("debug") !== false) { throw new \Exception(sprintf( "%s:phraseanet:debug must be initialized to false" , $this->env ) ); } if ($phraseanet->get("display_errors") !== false) { throw new \Exception(sprintf( "%s:phraseanet:debug must be initialized to false" , $this->env ) ); } } } catch (\Exception $e) { throw new \Exception(sprintf("Check Phraseanet Scope\n"), null, $e); } $output->writeln("Phraseanet Scope OK"); return; } private function checkDatabaseScope(OutputInterface $output) { try { $connexionName = $this->configuration->getPhraseanet()->get('database'); $connexion = $this->configuration->getConnexion($connexionName); try { $config = new \Doctrine\DBAL\Configuration(); $conn = \Doctrine\DBAL\DriverManager::getConnection( $connexion->all() , $config ); unset($conn); $this->connexionOk = true; } catch (\Exception $e) { throw new \Exception(sprintf( "Unable to connect to database declared in connexion '%s' for the following reason %s" , $connexionName , $e->getMessage() ) ); } } catch (\Exception $e) { throw new \Exception(sprintf("Check Database Scope\n"), null, $e); } $output->writeln("Database Scope OK"); return; } private function checkTeamplateEngineService(OutputInterface $output) { try { $templateEngineName = $this->configuration->getTemplating(); try { $configuration = $this->configuration->getService($templateEngineName); } catch (\Exception $e) { $message = sprintf( "%s called from %s in %s:%s:template_engine scope" , $e->getMessage() , $this->configuration->getFile()->getFilename() , $this->env , $templateEngineName ); $e = new \Exception($message); throw $e; } $service = Core\Service\Builder::create( \bootstrap::getCore() , $templateEngineName , $configuration ); if ($service->getType() === 'twig') { $twig = $service->getDriver(); if (self::PROD === $this->env && $twig->isDebug()) { $output->writeln(sprintf("%s service should not be in debug mode for %s environment", $service->getName(), $this->env)); } elseif ((self::TEST === $this->env || self::DEV === $this->env) && !$twig->isDebug()) { $output->writeln(sprintf("%s service should be in debug mode for %s environment", $service->getName(), $this->env)); } if ($twig->isStrictVariables() && self::PROD === $this->env) { $output->writeln(sprintf("%s service should not be set in strict variables mode for %s environment", $service->getName(), $this->env)); } elseif ((self::TEST === $this->env || self::DEV === $this->env) && !$twig->isStrictVariables()) { $output->writeln(sprintf("%s service should be set in strict variables mode for %s environment", $service->getName(), $this->env)); } } } catch (\Exception $e) { if ($e instanceof \Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException) { if ($e->getKey() === 'template_engine') { $e = new \Exception(sprintf( "Missing parameter %s for %s environment scope" , $e->getKey() , $this->env ) ); } else { $e = new \Exception(sprintf( "Missing parameter %s for %s service declared in %s scope." , $e->getKey() , $templateEngineName , $this->env ) ); } } throw new \Exception(sprintf("Check Template Service\n"), null, $e); } $output->writeln("Template engine service OK"); return; } private function checkOrmService(OutputInterface $output) { if (!$this->connexionOk) { $output->writeln("As ORM service test depends on database test success, it is not executed"); return; } try { $ormName = $this->configuration->getOrm(); try { $configuration = $this->configuration->getService($ormName); } catch (\Exception $e) { $message = sprintf( "%s called from %s in %s:orm scope" , $e->getMessage() , $this->configuration->getFile()->getFilename() , $this->env , $ormName ); $e = new \Exception($message); throw $e; } $service = Core\Service\Builder::create( \bootstrap::getCore() , $ormName , $configuration ); if ($service->getType() === 'doctrine') { $caches = $service->getCacheServices(); if ($service->isDebug() && self::PROD === $this->env) { $output->writeln(sprintf( "%s service should not be in debug mode " , $service->getName() ) ); } elseif ((self::TEST === $this->env || self::DEV === $this->env) && !$service->isDebug()) { $output->writeln(sprintf( "%s service should be in debug mode" , $service->getName() ) ); } foreach ($caches->all() as $key => $cache) { if ($cache->getType() === 'array' && self::PROD === $this->env) { $output->writeln(sprintf( "%s:doctrine:orm:%s %s service should not be an array cache type for %s environment" , $service->getName() , $key , $cache->getName() , $this->env ) ); } elseif ($cache->getType() !== 'array' && (self::TEST === $this->env || self::DEV === $this->env)) { $output->writeln(sprintf( "%s:doctrine:orm:%s %s service should be an array cache type for %s environment" , $service->getName() , $key , $cache->getName() , $this->env ) ); } } } } catch (\Exception $e) { if ($e instanceof \Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException) { if ($e->getKey() === 'orm') { $e = new \Exception(sprintf( "Missing parameter %s for %s environment scope" , $e->getKey() , $this->env ) ); } else { $e = new \Exception(sprintf( "Missing parameter %s for %s service declared in %s scope." , $e->getKey() , $service->getName() , $this->env ) ); } } throw new \Exception(sprintf("Check ORM Service\n"), null, $e); } $output->writeln("ORM service OK"); return; } }