Security update for Core, with self-updated composer
[yaffs-website] / vendor / drupal / console / src / Command / Dotenv / InitCommand.php
diff --git a/vendor/drupal/console/src/Command/Dotenv/InitCommand.php b/vendor/drupal/console/src/Command/Dotenv/InitCommand.php
new file mode 100644 (file)
index 0000000..f4bd456
--- /dev/null
@@ -0,0 +1,198 @@
+<?php
+
+namespace Drupal\Console\Command\Dotenv;
+
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Drupal\Console\Core\Command\Command;
+use Symfony\Component\Filesystem\Filesystem;
+use Drupal\Component\Utility\Crypt;
+use Drupal\Console\Generator\DotenvInitGenerator;
+use Webmozart\PathUtil\Path;
+use Drupal\Console\Core\Utils\DrupalFinder;
+
+/**
+ * Class InitCommand
+ *
+ * @package Drupal\Console\Command\Dotenv
+ */
+class InitCommand extends Command
+{
+    /**
+     * @var DrupalFinder
+     */
+    protected $drupalFinder;
+
+    /**
+     * InitCommand constructor.
+     *
+     * @param DrupalFinder $drupalFinder
+     */
+
+    /**
+     * @var DotenvInitGenerator
+     */
+    protected $generator;
+
+    private $envParameters = [
+        'environment' => 'local',
+        'database_name' => 'drupal',
+        'database_user' => 'drupal',
+        'database_password' => 'drupal',
+        'database_host' => '127.0.0.1',
+        'database_port' => '3306',
+    ];
+
+    /**
+     * InitCommand constructor.
+     *
+     * @param DrupalFinder        $drupalFinder
+     * @param DotenvInitGenerator $generator
+     */
+    public function __construct(
+        DrupalFinder $drupalFinder,
+        DotenvInitGenerator $generator
+    ) {
+        $this->drupalFinder = $drupalFinder;
+        $this->generator = $generator;
+        parent::__construct();
+    }
+
+    protected function configure()
+    {
+        $this->setName('dotenv:init')
+            ->setDescription('Dotenv initializer.');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function interact(InputInterface $input, OutputInterface $output)
+    {
+        foreach ($this->envParameters as $key => $value) {
+            $this->envParameters[$key] = $this->getIo()->ask(
+                'Enter value for ' . strtoupper($key),
+                $value
+            );
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $this->copyFiles();
+
+        $this->generator->generate([
+            'io' => $this->getIo(),
+            'env_parameters' => $this->envParameters,
+            'console_root' => $this->drupalFinder->getComposerRoot(),
+        ]);
+    }
+
+    private function copyFiles()
+    {
+        $fs = new Filesystem();
+        $defaultSettingsFile = $this->drupalFinder->getDrupalRoot() . '/sites/default/default.settings.php';
+        $settingsFile = $this->drupalFinder->getDrupalRoot() . '/sites/default/settings.php';
+
+        if (!$fs->exists($defaultSettingsFile)) {
+            $defaultSettingsFile = Path::makeRelative(
+                $defaultSettingsFile,
+                $this->drupalFinder->getComposerRoot()
+            );
+            $this->getIo()->error('File: ' . $defaultSettingsFile . 'not found.');
+
+            return 1;
+        }
+
+        if ($fs->exists($settingsFile)) {
+            $settingsFileOriginal = $settingsFile.'.original';
+            if (!$fs->exists($settingsFileOriginal)) {
+                $fs->rename(
+                    $settingsFile,
+                    $settingsFileOriginal,
+                    true
+                );
+
+
+                $settingsOriginalFile = Path::makeRelative(
+                    $settingsFile,
+                    $this->drupalFinder->getComposerRoot()
+                );
+
+                $this->getIo()->success('File '.$settingsOriginalFile.'.original created.');
+            }
+        }
+
+        $fs->copy(
+            $defaultSettingsFile,
+            $settingsFile
+        );
+
+        include_once $this->drupalFinder->getDrupalRoot() . '/core/includes/bootstrap.inc';
+        include_once $this->drupalFinder->getDrupalRoot() . '/core/includes/install.inc';
+
+        $settings['config_directories'] = [
+            CONFIG_SYNC_DIRECTORY => (object) [
+                'value' => Path::makeRelative(
+                    $this->drupalFinder->getComposerRoot() . '/config/sync',
+                    $this->drupalFinder->getDrupalRoot()
+                ),
+                'required' => true,
+            ],
+        ];
+
+        $settings['settings']['hash_salt'] = (object) [
+            'value'    => Crypt::randomBytesBase64(55),
+            'required' => true,
+        ];
+
+        drupal_rewrite_settings($settings, $settingsFile);
+
+        $settingsFileContent = file_get_contents($settingsFile);
+        file_put_contents(
+            $settingsFile,
+            $settingsFileContent .
+            file_get_contents(
+                $this->drupalFinder->getConsolePath() . 'templates/files/settings.dist'
+            )
+        );
+
+        $fs->chmod($settingsFile, 0666);
+
+        $settingsFile = Path::makeRelative(
+            $settingsFile,
+            $this->drupalFinder->getComposerRoot()
+        );
+
+        $this->getIo()->success('File '.$settingsFile.' created.');
+
+        $gitIgnoreFile = $this->drupalFinder->getComposerRoot() . '/.gitignore';
+        $gitIgnoreExampleFile = $this->drupalFinder->getComposerRoot() . '/example.gitignore';
+        if (!$fs->exists($gitIgnoreFile)) {
+            if (!$fs->exists($gitIgnoreExampleFile)) {
+                $fs->copy(
+                    $gitIgnoreExampleFile,
+                    $gitIgnoreFile
+                );
+            }
+        }
+
+        if ($fs->exists($gitIgnoreFile)) {
+            $gitIgnoreContent = file_get_contents($gitIgnoreFile);
+            if (strpos($gitIgnoreContent, '.env') === false) {
+                file_put_contents(
+                    $gitIgnoreFile,
+                    $gitIgnoreContent .
+                    file_get_contents(
+                        $this->drupalFinder->getConsolePath() . 'templates/files/.gitignore.dist'
+                    )
+                );
+
+                $this->getIo()->success("File .gitignore updated.");
+            }
+        }
+    }
+}