protected function execute(InputInterface $input, OutputInterface $output) { $client = new Curl(); $browser = new Browser($client); $module = $input->getArgument('module'); $version = $input->getArgument('version'); if ($version) { $release_selected = $version; } else { // Getting Module page header and parse to get module Node $output->writeln('[+] <info>' . sprintf($this->trans('commands.module.download.messages.getting-releases'), implode(',', array($module))) . '</info>'); try { $response = $browser->get('https://www.drupal.org/project/' . $module); $link = $response->getHeader('link'); } catch (\Exception $e) { $output->writeln('[+] <error>' . $e->getMessage() . '</error>'); return; } $header_link = explode(';', $link); $project_node = str_replace('<', '', str_replace('>', '', $header_link[0])); $project_release_d8 = $project_node . '/release?api_version%5B%5D=7234'; // Parse release module page to get Drupal 8 releases try { $response = $client->get($project_release_d8); $html = $response->getContent(); } catch (\Exception $e) { print_r($e->getMessage()); $output->writeln('[+] <error>' . $e->getMessage() . '</error>'); return; } $crawler = new Crawler($html); $releases = []; foreach ($crawler->filter('span.file a') as $element) { if (strpos($element->nodeValue, '.tar.gz') > 0) { $release_name = str_replace('.tar.gz', '', str_replace($module . '-', '', $element->nodeValue)); $releases[$release_name] = $element->nodeValue; } } if (empty($releases)) { $output->writeln('[+] <error>' . sprintf($this->trans('commands.module.download.messages.no-releases'), implode(',', array($module))) . '</error>'); return; } // List module releases to enable user to select his favorite release $questionHelper = $this->getQuestionHelper(); $question = new ChoiceQuestion($this->trans('commands.module.download.messages.select-release'), array_combine(array_keys($releases), array_keys($releases)), '0'); $release_selected = $questionHelper->ask($input, $output, $question); } // Start the process to download the zip file of release and copy in contrib folter $output->writeln('[-] <info>' . sprintf($this->trans('commands.module.download.messages.downloading'), $module, $release_selected) . '</info>'); $release_file_path = 'http://ftp.drupal.org/files/projects/' . $module . '-' . $release_selected . '.tar.gz'; // Destination file to download the release $destination = tempnam(sys_get_temp_dir(), 'console.') . '.tar.gz'; try { //$client->get($release_file_path, ['save_to' => $destination]); $response = $client->get($release_file_path); file_put_contents($destination, $response->getContent()); // Determine destination folder for contrib modules $drupal = $this->getDrupalHelper(); $drupalRoot = $drupal->getRoot(); if ($drupalRoot) { $module_contrib_path = $drupalRoot . '/modules/contrib'; } else { $output->writeln('[-] <info>' . sprintf($this->trans('commands.module.download.messages.outside-drupal'), $module, $release_selected) . '</info>'); $module_contrib_path = getcwd() . '/modules/contrib'; } // Create directory if does not exist if (!file_exists(dirname($module_contrib_path))) { if (!mkdir($module_contrib_path, 0777, true)) { $output->writeln(' <error>' . $this->trans('commands.module.download.messages.error-creating-folder') . ': ' . $module_contrib_path . '</error>'); return; } } // Prepare release to unzip and untar $zippy = Zippy::load(); $archive = $zippy->open($destination); $archive->extract($module_contrib_path . '/'); unlink($destination); $output->writeln('[-] <info>' . sprintf($this->trans('commands.module.download.messages.downloaded'), $module, $release_selected, $module_contrib_path) . '</info>'); } catch (\Exception $e) { $output->writeln('[+] <error>' . $e->getMessage() . '</error>'); return; } return true; }