addOption('write', 'w', null, 'Writes the configuration') ->addOption('enabled', 'e', null, 'Set the enable toggle to `true`') ->addArgument('type', InputArgument::REQUIRED, 'The configuration type, either `nginx` or `apache`') ->setDescription('Generates Phraseanet xsendfile mapping configuration depending on databoxes configuration'); } /** * {@inheritdoc} */ protected function doExecute(InputInterface $input, OutputInterface $output) { $paths = $this->extractPath($this->container['phraseanet.appbox']); foreach ($paths as $path) { $this->container['filesystem']->mkdir($path); } $type = strtolower($input->getArgument('type')); $enabled = $input->getOption('enabled'); $factory = new XSendFileFactory($this->container['monolog'], true, $type, $this->computeMapping($paths)); $mode = $factory->getMode(true); $conf = [ 'enabled' => $enabled, 'type' => $type, 'mapping' => $mode->getMapping(), ]; if ($input->getOption('write')) { $output->write("Writing configuration ..."); $this->container['conf']->set('xsendfile', $conf); $output->writeln(" OK"); $output->writeln(""); $output->writeln("It is now strongly recommended to use xsendfile:dump-configuration command to upgrade your virtual-host"); } else { $output->writeln("Configuration will not be written, use --write option to write it"); $output->writeln(""); $output->writeln(Yaml::dump(['xsendfile' => $conf], 4)); } $output->writeln(""); return 0; } private function computeMapping($paths) { return array_merge([ ['mount-point' => 'protected_lazaret', 'directory' => $this->container['tmp.lazaret.path']], ['mount-point' => 'protected_download', 'directory' => $this->container['tmp.download.path']], ], array_map([$this, 'pathsToConf'], array_unique($paths))); } private function pathsToConf($path) { static $n = 0; $n++; return ['mount-point' => 'protected_dir_'.$n, 'directory' => $path]; } private function extractPath(\appbox $appbox) { $paths = []; foreach ($appbox->get_databoxes() as $databox) { $paths[] = (string) $databox->get_sxml_structure()->path; foreach ($databox->get_subdef_structure() as $group => $subdefs) { foreach ($subdefs as $subdef) { $paths[] = $subdef->get_path(); } } } return array_filter(array_unique($paths)); } }