mirror of
https://github.com/alchemy-fr/Phraseanet.git
synced 2025-10-12 20:43:25 +00:00

Conflicts: CHANGELOG.md bin/console bin/developer bin/setup bower.json composer.json composer.lock features/bootstrap/FeatureContext.php features/bootstrap/GuiContext.php lib/Alchemy/Phrasea/Authentication/Token/TokenValidator.php lib/Alchemy/Phrasea/Command/BuildMissingSubdefs.php lib/Alchemy/Phrasea/Command/CreateCollection.php lib/Alchemy/Phrasea/Command/Developer/JavascriptBuilder.php lib/Alchemy/Phrasea/Controller/Admin/Collection.php lib/Alchemy/Phrasea/Controller/Admin/Databoxes.php lib/Alchemy/Phrasea/Controller/Admin/TaskManager.php lib/Alchemy/Phrasea/Controller/Api/V1.php lib/Alchemy/Phrasea/Controller/Client/Baskets.php lib/Alchemy/Phrasea/Controller/Client/Root.php lib/Alchemy/Phrasea/Controller/Prod/Basket.php lib/Alchemy/Phrasea/Controller/Prod/Export.php lib/Alchemy/Phrasea/Controller/Prod/Property.php lib/Alchemy/Phrasea/Controller/Prod/Records.php lib/Alchemy/Phrasea/Controller/Prod/Tools.php lib/Alchemy/Phrasea/Controller/Prod/Upload.php lib/Alchemy/Phrasea/Controller/Root/Login.php lib/Alchemy/Phrasea/Controller/Thesaurus/Thesaurus.php lib/Alchemy/Phrasea/Core/Event/ApiLoadEndEvent.php lib/Alchemy/Phrasea/Core/Event/ApiLoadStartEvent.php lib/Alchemy/Phrasea/Core/Provider/TaskManagerServiceProvider.php lib/Alchemy/Phrasea/Core/Version.php lib/Alchemy/Phrasea/Exception/XMLParseErrorException.php lib/Alchemy/Phrasea/Helper/DatabaseHelper.php lib/Alchemy/Phrasea/Helper/User/Edit.php lib/Alchemy/Phrasea/SearchEngine/Phrasea/PhraseaEngine.php lib/Alchemy/Phrasea/SearchEngine/SearchEngineOptions.php lib/Doctrine/Entities/AuthFailure.php lib/Doctrine/Entities/Basket.php lib/Doctrine/Entities/BasketElement.php lib/Doctrine/Entities/LazaretAttribute.php lib/Doctrine/Entities/LazaretCheck.php lib/Doctrine/Entities/LazaretFile.php lib/Doctrine/Entities/LazaretSession.php lib/Doctrine/Entities/Session.php lib/Doctrine/Entities/SessionModule.php lib/Doctrine/Entities/StoryWZ.php lib/Doctrine/Entities/UsrList.php lib/Doctrine/Entities/UsrListEntry.php lib/Doctrine/Entities/UsrListOwner.php lib/Doctrine/Entities/ValidationData.php lib/Doctrine/Entities/ValidationParticipant.php lib/Doctrine/Entities/ValidationSession.php lib/Doctrine/Logger/MonologSQLLogger.php lib/Doctrine/Repositories/BasketRepository.php lib/Doctrine/Repositories/ValidationParticipantRepository.php lib/Doctrine/Types/Binary.php lib/Doctrine/Types/Blob.php lib/Doctrine/Types/Enum.php lib/Doctrine/Types/LongBlob.php lib/Doctrine/Types/VarBinary.php lib/classes/API/OAuth2/Account.php lib/classes/API/OAuth2/Application.php lib/classes/API/OAuth2/Application/OfficePlugin.php lib/classes/API/OAuth2/AuthCode.php lib/classes/API/OAuth2/RefreshToken.php lib/classes/API/OAuth2/Token.php lib/classes/API/V1/Abstract.php lib/classes/API/V1/Interface.php lib/classes/API/V1/adapter.php lib/classes/API/V1/exception/abstract.php lib/classes/API/V1/exception/badrequest.php lib/classes/API/V1/exception/forbidden.php lib/classes/API/V1/exception/internalservererror.php lib/classes/API/V1/exception/maintenance.php lib/classes/API/V1/exception/methodnotallowed.php lib/classes/API/V1/exception/notfound.php lib/classes/API/V1/exception/unauthorized.php lib/classes/API/V1/result.php lib/classes/Exception/Feed/EntryNotFound.php lib/classes/Exception/Feed/ItemNotFound.php lib/classes/Exception/Feed/PublisherNotFound.php lib/classes/Feed/Abstract.php lib/classes/Feed/Adapter.php lib/classes/Feed/Aggregate.php lib/classes/Feed/Collection.php lib/classes/Feed/CollectionInterface.php lib/classes/Feed/Entry/Adapter.php lib/classes/Feed/Entry/Collection.php lib/classes/Feed/Entry/CollectionInterface.php lib/classes/Feed/Entry/Interface.php lib/classes/Feed/Entry/Item.php lib/classes/Feed/Entry/ItemInterface.php lib/classes/Feed/Interface.php lib/classes/Feed/Link.php lib/classes/Feed/LinkInterface.php lib/classes/Feed/Publisher/Adapter.php lib/classes/Feed/Publisher/Interface.php lib/classes/Feed/Token.php lib/classes/Feed/TokenAggregate.php lib/classes/Feed/XML/Abstract.php lib/classes/Feed/XML/Atom.php lib/classes/Feed/XML/Cooliris.php lib/classes/Feed/XML/Interface.php lib/classes/Feed/XML/RSS.php lib/classes/Feed/XML/RSS/Image.php lib/classes/Feed/XML/RSS/ImageInterface.php lib/classes/User/Adapter.php lib/classes/User/Interface.php lib/classes/appbox/register.php lib/classes/connection.php lib/classes/connection/abstract.php lib/classes/connection/interface.php lib/classes/connection/pdo.php lib/classes/connection/pdoStatementDebugger.php lib/classes/deprecated/countries.php lib/classes/deprecated/inscript.api.php lib/classes/eventsmanager/event/test.php lib/classes/ftpclient.php lib/classes/http/request.php lib/classes/media/subdef.php lib/classes/module/console/schedulerStart.php lib/classes/module/console/schedulerState.php lib/classes/module/console/schedulerStop.php lib/classes/module/console/taskState.php lib/classes/module/console/tasklist.php lib/classes/module/console/taskrun.php lib/classes/patch/320alpha4b.php lib/classes/patch/3715alpha1a.php lib/classes/patch/379alpha1a.php lib/classes/patch/380alpha10a.php lib/classes/patch/380alpha11a.php lib/classes/patch/380alpha13a.php lib/classes/patch/380alpha14a.php lib/classes/patch/380alpha15a.php lib/classes/patch/380alpha16a.php lib/classes/patch/380alpha17a.php lib/classes/patch/380alpha18a.php lib/classes/patch/380alpha3a.php lib/classes/patch/380alpha4a.php lib/classes/patch/380alpha6a.php lib/classes/patch/380alpha8a.php lib/classes/patch/380alpha9a.php lib/classes/patch/381alpha1b.php lib/classes/patch/381alpha2a.php lib/classes/patch/381alpha3a.php lib/classes/patch/381alpha4a.php lib/classes/patch/383alpha1a.php lib/classes/patch/383alpha2a.php lib/classes/patch/383alpha3a.php lib/classes/patch/383alpha4a.php lib/classes/record/adapter.php lib/classes/record/preview.php lib/classes/recordutils.php lib/classes/recordutils/audio.php lib/classes/recordutils/document.php lib/classes/recordutils/map.php lib/classes/recordutils/video.php lib/classes/registry.php lib/classes/registryInterface.php lib/classes/set/order.php lib/classes/system/url.php lib/classes/task/Scheduler.php lib/classes/task/appboxAbstract.php lib/classes/task/databoxAbstract.php lib/classes/task/manager.php lib/classes/task/period/RecordMover.php lib/classes/task/period/apibridge.php lib/classes/task/period/apiwebhooks.php lib/classes/task/period/archive.php lib/classes/task/period/cindexer.php lib/classes/task/period/emptyColl.php lib/classes/task/period/ftp.php lib/classes/task/period/ftpPull.php lib/classes/task/period/subdef.php lib/classes/task/period/test.php lib/classes/task/period/writemeta.php lib/conf.d/PhraseaFixture/AbstractWZ.php lib/conf.d/PhraseaFixture/Basket/LoadFiveBaskets.php lib/conf.d/PhraseaFixture/Basket/LoadOneBasket.php lib/conf.d/PhraseaFixture/Basket/LoadOneBasketEnv.php lib/conf.d/PhraseaFixture/Lazaret/LoadOneFile.php lib/conf.d/PhraseaFixture/Story/LoadOneStory.php lib/conf.d/PhraseaFixture/UsrLists/ListAbstract.php lib/conf.d/PhraseaFixture/UsrLists/UsrList.php lib/conf.d/PhraseaFixture/UsrLists/UsrListEntry.php lib/conf.d/PhraseaFixture/UsrLists/UsrListOwner.php lib/conf.d/PhraseaFixture/ValidationParticipant/LoadOneParticipant.php lib/conf.d/PhraseaFixture/ValidationParticipant/LoadParticipantWithSession.php lib/conf.d/PhraseaFixture/ValidationSession/LoadOneValidationSession.php templates/web/admin/collection/collection.html.twig templates/web/common/dialog_export.html.twig templates/web/common/menubar.html.twig templates/web/prod/actions/Tools/index.html.twig templates/web/prod/index.html.twig templates/web/prod/upload/upload-flash.html.twig templates/web/prod/upload/upload.html.twig templates/web/report/report_layout_child.html.twig templates/web/setup/step2.html.twig templates/web/thesaurus/new-synonym-dialog.html.twig templates/web/thesaurus/properties.html.twig templates/web/thesaurus/search.html.twig tests/Alchemy/Tests/Phrasea/Application/ApiAbstract.php tests/Alchemy/Tests/Phrasea/Cache/FactoryTest.php tests/Alchemy/Tests/Phrasea/Controller/Admin/AdminCollectionTest.php tests/Alchemy/Tests/Phrasea/Controller/Client/RootTest.php
235 lines
10 KiB
PHP
235 lines
10 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of Phraseanet
|
|
*
|
|
* (c) 2005-2015 Alchemy
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Alchemy\Phrasea\Command\Developer;
|
|
|
|
use Alchemy\Phrasea\Command\Command;
|
|
use Alchemy\Phrasea\Core\Version;
|
|
use Alchemy\Phrasea\Exception\RuntimeException;
|
|
use Symfony\Component\Console\Input\ArrayInput;
|
|
use Symfony\Component\Console\Input\InputInterface;
|
|
use Symfony\Component\Console\Output\OutputInterface;
|
|
use Symfony\Component\Console\Input\InputOption;
|
|
use Symfony\Component\Process\ExecutableFinder;
|
|
use Symfony\Component\Yaml\Yaml;
|
|
use Symfony\Component\Process\Process;
|
|
use vierbergenlars\SemVer\version as SemVer;
|
|
|
|
class IniReset extends Command
|
|
{
|
|
public function __construct()
|
|
{
|
|
parent::__construct('ini:reset');
|
|
|
|
$this->setDescription('Reset environment')
|
|
->addOption('yes', 'y', InputOption::VALUE_NONE, 'Answers yes to all questions and do not ask the user')
|
|
->addOption('email', null, InputOption::VALUE_OPTIONAL, 'Admin e-mail address', null)
|
|
->addOption('password', null, InputOption::VALUE_OPTIONAL, 'Admin password', null)
|
|
->addOption('db-name', null, InputOption::VALUE_OPTIONAL, 'Databox name to reset, in case of multiple databox are mounted', null)
|
|
->addOption('dependencies', null, InputOption::VALUE_NONE, 'Fetch dependencies', null)
|
|
->addOption('run-patches', null, InputOption::VALUE_NONE, 'Reset in v3.1 states & apply all patches', null)
|
|
;
|
|
}
|
|
|
|
protected function doExecute(InputInterface $input, OutputInterface $output)
|
|
{
|
|
$interactive = !$input->getOption('yes');
|
|
$dialog = $this->getHelperSet()->get('dialog');
|
|
|
|
if (!$this->container['phraseanet.configuration']->isSetup()) {
|
|
throw new RuntimeException(sprintf(
|
|
'Phraseanet is not setup. You can run <info>bin/setup system::install</info> command to install Phraseanet.'
|
|
));
|
|
}
|
|
|
|
// get dbs
|
|
$conf = $this->container['phraseanet.configuration']->getConfig();
|
|
$dbs = array('ab' => $conf['main']['database']['dbname'], 'dbs' => array(), 'setup_dbs' => array());
|
|
foreach($this->container['phraseanet.appbox']->get_databoxes() as $databox) {
|
|
$dbs['dbs'][] = $databox;
|
|
}
|
|
|
|
if (count($dbs['dbs']) > 1) {
|
|
if ($input->getOption('db-name')) {
|
|
$dbName = $input->getOption('db-name');
|
|
} else {
|
|
$dialog = $this->getHelperSet()->get('dialog');
|
|
$dbName = $dialog->ask(
|
|
$output,
|
|
_('Please enter the databox name to reset or create')
|
|
);
|
|
}
|
|
} else if ($input->getOption('db-name')) {
|
|
$dbName = $input->getOption('db-name');
|
|
} else {
|
|
$dbName = current($dbs['dbs'])->get_dbname();
|
|
}
|
|
|
|
$continue = 'y';
|
|
if (count($dbs['dbs']) > 1 && in_array($dbName, array_map(function($db) { return $db->get_dbname();}, $dbs['dbs']))) {
|
|
if ($interactive) {
|
|
do {
|
|
$continue = mb_strtolower($dialog->ask($output, '<question>' .$dbName.' database is going to be truncated, do you want to continue ? (Y/n)</question>', 'Y'));
|
|
} while (!in_array($continue, array('y', 'n')));
|
|
}
|
|
}
|
|
|
|
if ('y' !== $continue) {
|
|
return;
|
|
}
|
|
|
|
$unmountedDbs = $dbToMount = array_diff(array_map(function($db) { return $db->get_dbname();}, $dbs['dbs']), array($dbName));
|
|
|
|
if (count($unmountedDbs) > 1 && $interactive) {
|
|
array_unshift($unmountedDbs, 'all');
|
|
$selected = $dialog->select(
|
|
$output,
|
|
'Choose Dbs to mount',
|
|
$unmountedDbs,
|
|
0,
|
|
false,
|
|
'Invalid choice',
|
|
true
|
|
);
|
|
|
|
$dbToMount = array_map(function($c) use ($unmountedDbs) {
|
|
return $unmountedDbs[$c];
|
|
}, $selected);
|
|
}
|
|
|
|
if ($input->getOption('dependencies') || !SemVer::eq($this->container['phraseanet.appbox']->get_version(), $this->container['phraseanet.version']->getNumber())) {
|
|
$this->getApplication()->find('dependencies:all')->run( new ArrayInput(array(
|
|
'command' => 'dependencies:all'
|
|
)), $output);
|
|
}
|
|
|
|
// get data paths
|
|
$dataPath = $this->container['conf']->get(['main', 'storage', 'subdefs'], $this->container['root.path'].'/datas');
|
|
|
|
$schema = $this->container['EM']->getConnection()->getSchemaManager();
|
|
$output->writeln('Creating database "'.$dbs['ab'].'"...<info>OK</info>');
|
|
$schema->dropAndCreateDatabase($dbs['ab']);
|
|
$output->writeln('Creating database "'.$dbName.'"...<info>OK</info>');
|
|
$schema->dropAndCreateDatabase($dbName);
|
|
|
|
// inject v3.1 fixtures
|
|
if ($input->getOption('run-patches')) {
|
|
$content = file_get_contents($this->container['root.path'].'/resources/hudson/connexion.inc');
|
|
|
|
$content = str_replace('{{dbname}}', $conf['main']['database']['dbname'], $content);
|
|
$content = str_replace('{{hostname}}', $conf['main']['database']['host'], $content);
|
|
$content = str_replace('{{port}}', $conf['main']['database']['port'], $content);
|
|
$content = str_replace('{{user}}', $conf['main']['database']['user'], $content);
|
|
$content = str_replace('{{password}}', $conf['main']['database']['password'], $content);
|
|
|
|
$tmpFile = tempnam(sys_get_temp_dir(), 'connexion.inc-v3.1-');
|
|
$this->container['filesystem']->dumpFile($tmpFile, $content);
|
|
|
|
$this->container['filesystem']->copy($tmpFile, $this->container['root.path'].'/config/connexion.inc');
|
|
$this->container['filesystem']->copy($this->container['root.path'].'/resources/hudson/_GV.php', $this->container['root.path'].'/config/_GV.php');
|
|
|
|
$content = file_get_contents($this->container['root.path'] . '/resources/hudson/fixtures.sql');
|
|
$content = str_replace('{{APPLICATION_BOX}}', $dbs['ab'], $content);
|
|
$content = str_replace('{{DATA_BOX}}', $dbName, $content);
|
|
$content = str_replace('{{DB_HOST}}', $conf['main']['database']['host'], $content);
|
|
$content = str_replace('{{DB_PORT}}', $conf['main']['database']['port'], $content);
|
|
$content = str_replace('{{DB_USER}}', $conf['main']['database']['user'], $content);
|
|
$content = str_replace('{{DB_PASSWORD}}', $conf['main']['database']['password'], $content);
|
|
$content = str_replace('{{DATA_BOX}}', $dbName, $content);
|
|
$content = str_replace('{{USER_EMAIL}}', $input->getOption('email'), $content);
|
|
$content = str_replace('{{USER_PASSWORD}}', hash('sha256', $input->getOption('password')), $content);
|
|
|
|
$tmpFile = tempnam(sys_get_temp_dir(), 'fixtures-v3.1-');
|
|
$this->container['filesystem']->dumpFile($tmpFile, $content);
|
|
|
|
$verbosity = $output->getVerbosity();
|
|
$output->setVerbosity(OutputInterface::VERBOSITY_QUIET);
|
|
$this->getApplication()->find('dbal:import')->run(new ArrayInput(array(
|
|
'command' => 'dbal:import',
|
|
'file' => $tmpFile
|
|
)), $output);
|
|
$output->setVerbosity($verbosity);
|
|
$output->writeln('Importing Phraseanet v3.1 fixtures...<info>OK</info>');
|
|
} else {
|
|
$this->getApplication()->find('system:uninstall')->run(new ArrayInput(array(
|
|
'command' => 'system:uninstall'
|
|
)), $output);
|
|
|
|
$cmd = sprintf('php ' . __DIR__ . '/../../../../../bin/setup system:install --email=%s --password=%s --db-user=%s --db-template=%s --db-password=%s --databox=%s --appbox=%s --server-name=%s --db-host=%s --db-port=%s -y',
|
|
$input->getOption('email'),
|
|
$input->getOption('password'),
|
|
$conf['main']['database']['user'],
|
|
'en',
|
|
$conf['main']['database']['password'],
|
|
$dbName,
|
|
$dbs['ab'],
|
|
$conf['servername'],
|
|
$conf['main']['database']['host'],
|
|
$conf['main']['database']['port']
|
|
);
|
|
$process = new Process($cmd);
|
|
$process->run(function ($type, $buffer) {
|
|
if ('err' === $type) {
|
|
echo 'ERR > ' . $buffer;
|
|
}
|
|
});
|
|
if (false === $process->isSuccessful()) {
|
|
$output->writeln('<error>Failed to execute the following command "'.$cmd.'"</error>');
|
|
|
|
return 1;
|
|
}
|
|
$output->writeln("<info>Install successful !</info>");
|
|
}
|
|
|
|
foreach ($dbs['dbs'] as $databox) {
|
|
if (!in_array($databox->get_dbname(), $dbToMount) && !in_array('all', $dbToMount)) {
|
|
continue;
|
|
}
|
|
$credentials = $databox->get_connection()->get_credentials();
|
|
|
|
\databox::mount(
|
|
$this->container,
|
|
$credentials['hostname'],
|
|
$credentials['port'],
|
|
$credentials['user'],
|
|
$credentials['password'],
|
|
$databox->get_dbname()
|
|
);
|
|
$output->writeln('Mounting database "'.$databox->get_dbname().'"...<info>OK</info>');
|
|
}
|
|
|
|
$output->writeln('Upgrading from v3.1 to v'.Version::getNumber());
|
|
$cmd = 'php ' . __DIR__ . '/../../../../../bin/setup system:upgrade -y -f -v';
|
|
$process = new Process($cmd);
|
|
$process->run(function ($type, $buffer) {
|
|
if ('err' === $type) {
|
|
echo 'ERR > ' . $buffer;
|
|
}
|
|
});
|
|
if (false === $process->isSuccessful()) {
|
|
$output->writeln('<error>Failed to execute the following command "'.$cmd.'"</error>');
|
|
|
|
return 1;
|
|
}
|
|
|
|
// create setup dbs
|
|
$command = $this->getApplication()->find('ini:setup-tests-dbs');
|
|
$input = new ArrayInput(array(
|
|
'command' => 'ini:setup-tests-dbs'
|
|
));
|
|
$command->run($input, $output);
|
|
|
|
$this->container['conf']->set(['main', 'storage', 'subdefs'], $dataPath);
|
|
|
|
return 0;
|
|
}
|
|
}
|