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;
}
}