5 * Contains \Drupal\AppConsole\Command\Multisite\UpdateCommand.
8 namespace Drupal\Console\Command\Multisite;
10 use Drupal\Console\Core\Command\Command;
11 use Symfony\Component\Console\Input\InputInterface;
12 use Symfony\Component\Console\Input\InputOption;
13 use Symfony\Component\Console\Output\OutputInterface;
14 use Symfony\Component\Filesystem\Exception\IOExceptionInterface;
15 use Symfony\Component\Filesystem\Filesystem;
20 * @package Drupal\Console\Command\Multisite
22 class UpdateCommand extends Command
27 * DebugCommand constructor.
31 public function __construct($appRoot)
33 $this->appRoot = $appRoot;
34 parent::__construct();
50 protected $directory = '';
55 protected $explodeUriDirectory = [];
60 protected $explodeDirectory = [];
65 public function configure()
67 $this->setName('multisite:update')
68 ->setDescription($this->trans('commands.multisite.update.description'))
69 ->setHelp($this->trans('commands.multisite.update.help'))
73 InputOption::VALUE_REQUIRED,
74 $this->trans('commands.multisite.update.options.directory')
76 ->setAliases(['muu']);
82 protected function interact(InputInterface $input, OutputInterface $output)
84 $this->uri = parse_url($input->getParameterOption(['--uri', '-l'], 'default'), PHP_URL_HOST);
86 $sites = $this->getMultisite($this->uri);
87 if ($this->uri == "default") {
88 $this->uri = $this->getIo()->choice(
89 $this->trans('commands.multisite.update.questions.uri'),
92 } elseif (!array_key_exists($this->uri, $sites)) {
93 $this->getIo()->error(
94 $this->trans('commands.multisite.update.error.invalid-uri')
99 $this->uri = $sites[$this->uri];
101 $directory = $input->getOption('directory');
103 $directory = $this->getIo()->ask($this->trans('commands.multisite.update.questions.directory'));
105 $input->setOption('directory', $directory);
111 protected function execute(InputInterface $input, OutputInterface $output)
113 $this->fs = new Filesystem();
115 if (empty($this->uri)) {
116 $uri = parse_url($input->getParameterOption(['--uri', '-l'], 'default'), PHP_URL_HOST);
117 $sites = $this->getMultisite($uri);
118 $this->uri = $sites[$uri];
121 $this->directory = $input->getOption('directory');
122 $this->explodeDirectory = explode('/', $this->directory);
123 $this->explodeUriDirectory = explode('/', $this->uri);
125 if (count($this->explodeDirectory) <= 2) {
127 $multiSiteFile = sprintf(
128 '%s/sites/sites.php',
131 //Replace Multisite name in sites/sites.php
132 $string_to_replace="sites['".$this->explodeUriDirectory[0]."'] = '".$this->uri."';";
133 $replace_with="sites['".$this->explodeDirectory[0]."'] = '".$this->directory."';";
134 $content=file_get_contents($multiSiteFile);
135 $content_chunks=explode($string_to_replace, $content);
136 $content=implode($replace_with, $content_chunks);
137 file_put_contents($multiSiteFile, $content);
138 } catch (IOExceptionInterface $e) {
139 $this->getIo()->error(
141 $this->trans('commands.multisite.update.errors.write-fail'),
149 //Directory == 1 folder
150 if (count($this->explodeDirectory) == 1) {
152 $this->appRoot.'/sites/'.$this->uri,
153 $this->appRoot.'/sites/'.$this->directory
156 if ($this->explodeDirectory[0] != $this->explodeUriDirectory[0]
157 && $this->fs->exists($this->appRoot.'/sites/'.$this->explodeUriDirectory[0].'/files')
159 $this->fs->remove($this->appRoot.'/sites/'.$this->directory.'/files');
162 $this->appRoot.'/sites/'.$this->explodeUriDirectory[0].'/files',
163 $this->appRoot.'/sites/'.$this->directory.'/files'
167 $this->fs->chmod($this->appRoot.'/sites/'.$this->uri, 0755);
168 $this->fs->remove($this->appRoot.'/sites/'.$this->uri);
170 //Directory == 2 folders && uri == 2 folders
171 if (count($this->explodeUriDirectory) != 1) {
172 if (!$this->fs->exists($this->appRoot . '/sites/' . $this->directory)) {
174 $this->appRoot . '/sites/' . $this->uri,
175 $this->appRoot . '/sites/' . $this->directory
179 if (count(scandir($this->appRoot.'/sites/'.$this->explodeUriDirectory[0])) != 2) {
181 $this->appRoot.'/sites/'.$this->explodeUriDirectory[0].'/files',
182 $this->appRoot . '/sites/' . $this->explodeDirectory[0].'/files'
185 $this->fs->remove($this->appRoot.'/sites/'.$this->explodeUriDirectory[0]);
188 //Directory == 2 folders && uri == 1 folder
190 if (!$this->fs->exists($this->appRoot.'/sites/'.$this->directory)) {
192 $this->fs->chmod($this->appRoot.'/sites/'.$this->uri, 0755);
193 $this->fs->mkdir($this->appRoot.'/sites/'.$this->directory, 0755);
195 if ($this->explodeUriDirectory[0] != $this->explodeDirectory[0]) {
197 $this->appRoot.'/sites/'.$this->uri,
198 $this->appRoot.'/sites/'.$this->explodeDirectory[0]
200 $this->fs->remove($this->appRoot.'/sites/'.$this->uri);
202 } catch (IOExceptionInterface $e) {
203 $this->getIo()->error(
205 $this->trans('commands.multisite.update.errors.mkdir-fail'),
211 $this->moveSettings();
215 $this->editSettings();
217 $this->getIo()->error(
219 $this->trans('commands.multisite.update.errors.invalid-new-dir'),
227 * Get all Multisites.
229 protected function getMultisite()
232 $multiSiteFile = sprintf(
233 '%s/sites/sites.php',
237 if (file_exists($multiSiteFile)) {
238 include $multiSiteFile;
242 $this->getIo()->error(
243 $this->trans('commands.debug.multisite.messages.no-multisites')
253 * Move the settings.php file to new directory.
255 protected function moveSettings()
258 if (!$this->fs->exists($this->appRoot.'/sites/'.$this->directory.'/settings.php')) {
260 $this->appRoot.'/sites/'.$this->uri.'/settings.php',
261 $this->appRoot.'/sites/'.$this->directory.'/settings.php'
263 $this->fs->remove($this->appRoot.'/sites/'.$this->uri.'/settings.php');
265 } catch (IOExceptionInterface $e) {
266 $this->getIo()->error(
268 $this->trans('commands.multisite.update.errors.copy-fail'),
269 $this->appRoot.'/sites/'.$this->explodeDirectory[0].'/settings.php',
270 $this->directory.'/settings.php'
278 * Edit the settings.php file to change the database parameters, because the settings.php file was moved.
280 protected function editSettings()
282 $multiSiteSettingsFile = sprintf(
283 '%s/sites/'.$this->explodeDirectory[0].'/settings.php',
286 if (!$this->fs->exists($multiSiteSettingsFile)) {
287 $multiSiteSettingsFile = sprintf(
288 '%s/sites/'.$this->directory.'/settings.php',
294 $config_directories = [];
296 if (file_exists($multiSiteSettingsFile)) {
297 include $multiSiteSettingsFile;
301 if (!empty($databases) || !empty($config_directories)) {
302 //Replace $databases['default']['default']['database']
303 $line = explode('/', $databases['default']['default']['database']);
304 $string_to_replace= $databases['default']['default']['database'];
305 $replace_with="sites/".$this->explodeDirectory[0]."/files/".end($line);
306 $content=file_get_contents($multiSiteSettingsFile);
307 $content_chunks=explode($string_to_replace, $content);
308 $content=implode($replace_with, $content_chunks);
310 //Replace $config_directories['sync']
311 $string_to_replace= $config_directories['sync'];
312 $replace_with=str_replace($this->uri, $this->directory, $config_directories['sync']);
313 $content_chunks=explode($string_to_replace, $content);
314 $content=implode($replace_with, $content_chunks);
315 file_put_contents($multiSiteSettingsFile, $content);
317 } catch (IOExceptionInterface $e) {
318 $this->getIo()->error(
320 $this->trans('commands.multisite.update.messages.write-fail'),
321 $multiSiteSettingsFile
329 * Custom function to recursively copy all file and folders in new destination
332 * @param $destination
334 public function recurse_copy($source, $destination)
336 $directory = opendir($source);
337 $this->fs->mkdir($destination, 0755);
338 while (false !== ($file = readdir($directory))) {
339 if (($file != '.') && ($file != '..')) {
340 if (is_dir($source . '/' . $file)) {
341 $this->recurse_copy($source . '/' . $file, $destination . '/' . $file);
343 $this->fs->copy($source . '/' . $file, $destination . '/' . $file);
347 closedir($directory);