protected function execute(InputInterface $input, OutputInterface $output) { $configHelper = $this->getHelper('configuration'); /* @var $configHelper GlobalConfigurationHelper */ $exitCode = 0; foreach ($input->getArgument('vhosts') as $vhostConfig) { /* @var $vhostConfig VhostConfiguration */ try { if (!$vhostConfig->getLink()->isLink()) { throw new NotALinkException($vhostConfig->getLink()); } if (!$input->getOption('force')) { if ($vhostConfig->getTarget()->getPathname() !== $vhostConfig->getLink()->getLinkTarget()) { throw new InvalidLinkTargetException($vhostConfig->getLink(), $vhostConfig->getTarget()); } } FsUtil::unlink($vhostConfig->getLink()); $output->writeln(sprintf('Removed vhost <info>%s</info>', $vhostConfig->getName())); $configHelper->getConfiguration()->removeVhostConfiguration($vhostConfig->getName()); } catch (FileException $ex) { $output->writeln(sprintf('<error>Could not remove vhost "%s": %s</error>', $vhostConfig->getName(), $ex->getMessage())); $exitCode = 1; } } $configHelper->getConfiguration()->write(); return $exitCode; }
protected function execute(InputInterface $input, OutputInterface $output) { $configHelper = $this->getHelper('configuration'); /* @var $configHelper GlobalConfigurationHelper */ $vhostConfigs = $input->getArgument('vhosts'); if (!$input->getOption('force')) { $vhostConfigs = array_filter($vhostConfigs, function (VhostConfiguration $vhostConfiguration) { return $vhostConfiguration->isDisabled(); }); } foreach ($vhostConfigs as $vhostConfig) { /* @var $vhostConfig VhostConfiguration */ if ($input->getOption('force') || $vhostConfig->getLink()->isLink() && $vhostConfig->getLink()->getLinkTarget() === $vhostConfig->getTarget()->getPathname()) { FsUtil::unlink($vhostConfig->getLink()); $output->writeln(sprintf('Removed <info>%s</info>', $vhostConfig->getLink()), OutputInterface::VERBOSITY_VERBOSE); } else { throw new InvalidLinkTargetException($vhostConfig->getLink(), $vhostConfig->getTarget()); } $vhostConfig->setDisabled(false); FsUtil::symlink($vhostConfig->getTarget(), $vhostConfig->getLink()); $output->writeln(sprintf('Linked <info>%s</info> to <info>%s</info>', $vhostConfig->getLink(), $vhostConfig->getTarget()), OutputInterface::VERBOSITY_VERBOSE); $output->writeln(sprintf('Enabled vhost <info>%s</info>', $vhostConfig->getName())); } $configHelper->getConfiguration()->write(); }
protected function execute(InputInterface $input, OutputInterface $output) { $configHelper = $this->getHelper('configuration'); /* @var $configHelper GlobalConfigurationHelper */ $repositoryConfig = $configHelper->getConfiguration()->getRepositoryConfiguration($input->getArgument('repository')); $output->writeln(sprintf('Private key file: <info>%s</info>', $repositoryConfig->getIdentityFile())); $output->writeln(sprintf('Ssh alias: <comment>%s</comment>', $repositoryConfig->getSshAlias()), OutputInterface::VERBOSITY_VERBOSE); try { $output->writeln(sprintf('Fingerprint: <comment>%s</comment>', $repositoryConfig->getSshFingerprint())); $output->write(FsUtil::file_get_contents($repositoryConfig->getIdentityFile() . '.pub'), false, OutputInterface::OUTPUT_RAW | OutputInterface::VERBOSITY_QUIET); } finally { $output->writeln(sprintf('Status: %s', $repositoryConfig->getStatusMessage())); } }
private function getBuildCommit() { $commit = '@git-commit@'; if ($commit !== '@' . 'git-commit' . '@') { return $commit; } try { // try to locate composers' installed.json file. (in case of global install) $packages = json_decode(FsUtil::file_get_contents(__DIR__ . '/../../../composer/installed.json'), true); foreach ($packages as $package) { if ($package['name'] === self::PACKAGE_NAME) { return $package['source']['reference']; } } } catch (FilesystemOperationFailedException $ex) { // no op } return 'UNKNOWN'; }
protected function execute(InputInterface $input, OutputInterface $output) { $configHelper = $this->getHelper('configuration'); /* @var $configHelper GlobalConfigurationHelper */ try { $configHelper->getConfiguration()->getVhostConfiguration($input->getArgument('vhost')); throw new VhostExistsException($input->getArgument('vhost')); } catch (NoSuchVhostException $ex) { // noop } $application = $configHelper->getConfiguration()->getApplication($input->getArgument('application')); $vhostConfig = VhostConfiguration::create($configHelper->getConfiguration(), $input->getArgument('vhost'), $application); if (!is_dir($vhostConfig->getLink()->getPath())) { FsUtil::mkdir($vhostConfig->getLink()->getPath(), true); $output->writeln(sprintf('Created directory <info>%s</info>', $vhostConfig->getLink()->getPath()), OutputInterface::VERBOSITY_VERY_VERBOSE); } FsUtil::symlink($vhostConfig->getTarget(), $vhostConfig->getLink()); $output->writeln(sprintf('Created vhost <info>%s</info> for <info>%s</info> (<comment>%s</comment>)', $input->getArgument('vhost'), $vhostConfig->getApplication(), $vhostConfig->getTarget())); $configHelper->getConfiguration()->write(); }
protected function execute(InputInterface $input, OutputInterface $output) { $configHelper = $this->getHelper('configuration'); /* @var $configHelper GlobalConfigurationHelper */ $clicDir = $input->getOption('clic-dir'); if (!$clicDir) { $clicDir = $configHelper->getConfiguration()->getClicDirectory(); } $backupFile = new \SplFileInfo($clicDir . '/settings-backup/' . sha1($configHelper->getConfigurationFile()->getPathname()) . '/' . $input->getArgument('version')); if (!$backupFile->isFile()) { throw new NotAFileException($backupFile); } try { $config = new GlobalConfiguration($backupFile); $config->getConfig(); } catch (\Exception $ex) { $output->writeln(sprintf('<error>Cannot restore %s: %s</error>', $backupFile, $ex->getMessage())); return 1; } FsUtil::file_put_contents($configHelper->getConfigurationFile(), FsUtil::file_get_contents($backupFile)); $output->writeln(sprintf('Restored %s to version %s', $configHelper->getConfigurationFile(), $backupFile->getRealPath())); }
public function write() { $this->validate(); FsUtil::file_put_contents($this->getConfigFile()->getPathname(), json_encode($this->config, JSON_PRETTY_PRINT)); }
protected function execute(InputInterface $input, OutputInterface $output) { $configHelper = $this->getHelper('configuration'); /* @var $configHelper GlobalConfigurationHelper */ $extractHelper = $this->getHelper('extract'); /* @var $extractHelper ExtractHelper */ if (!$input->getArgument('application')) { $appName = basename($input->getArgument('archive')); $input->setArgument('application', preg_replace('/\\.(zip|rar|(tar(\\.(gz|bz2|xz|Z))?))$/i', '', $appName)); } $application = Application::create($configHelper->getConfiguration(), $input->getArgument('application')); if (!is_dir($application->getPath())) { FsUtil::mkdir($application->getPath(), true); $output->writeln(sprintf('Created directory <info>%s</info>', $application->getPath()), OutputInterface::VERBOSITY_VERY_VERBOSE); } NotEmptyException::assert($application->getPath()); $appDir = $application->getPath(); $configHelper->getConfiguration()->removeApplication($application->getName()); // Clean up application again, so application:add further down does not complain. if (strpos($input->getArgument('archive'), '://') !== false) { // This is an url $outputFile = $extractHelper->downloadFile($input->getArgument('archive'), $output); $extractHelper->extractArchive($outputFile, $appDir, $output); $this->getApplication()->find('application:add')->run(new ArrayInput(['application' => $input->getArgument('application'), '--archive-url' => $input->getArgument('archive')]), $output); } else { $extractHelper->extractArchive($input->getArgument('archive'), $application->getPath(), $output); $this->getApplication()->find('application:add')->run(new ArrayInput(['application' => $input->getArgument('application')]), $output); } if ($input->getOption('override')) { $input1 = new ArrayInput(['application' => $input->getArgument('application'), 'config-file' => $input->getOption('override')]); if ($input->getOption('override-type')) { $input1->setOption('type', $input->getOption('override-type')); } $this->getApplication()->find('application:override')->run($input1, $output); } if (!$input->getOption('no-scripts')) { /* * Run post-extract script */ return $this->getApplication()->find('application:execute')->run(new ArrayInput(['script' => 'post-extract', 'application' => $input->getArgument('application')]), $output); } return 0; }
public function getTempDir($seed) { $configHelper = $this->getHelperSet()->get('configuration'); /* @var $configHelper GlobalConfigurationHelper */ $tempDir = $configHelper->getConfiguration()->getClicDirectory() . '/tmp/' . sha1(time() . $seed); if (!is_dir($tempDir)) { FsUtil::mkdir($tempDir, true); } return $tempDir; }
public function write() { if (file_exists($this->getConfigFile()->getPathname())) { $backupDir = $this->getClicDirectory() . '/settings-backup/' . sha1($this->getConfigFile()->getPathname()); if (!is_dir($backupDir)) { FsUtil::mkdir($backupDir, true); } $backupFile = $backupDir . '/' . time(); FsUtil::rename($this->getConfigFile()->getPathname(), $backupFile); if (file_exists($backupDir . '/prev')) { FsUtil::unlink($backupDir . '/prev'); } FsUtil::symlink($backupFile, $backupDir . '/prev'); } parent::write(); }
private function askDirectoryQuestion(callable $getter, callable $setter, $questionText, InputInterface $input, OutputInterface $output) { try { $directory = $getter(); } catch (MissingConfigurationParameterException $ex) { $directory = null; } catch (FileException $ex) { $directory = $ex->getFilename(); } $question = new Question($questionText, $directory); $question->setValidator(function ($dir) use($input, $output) { if (!is_dir($dir)) { if (!$input->getOption('no-create-missing')) { FsUtil::mkdir($dir, true); $output->writeln(sprintf('Created directory <info>%s</info>', $dir), OutputInterface::VERBOSITY_VERBOSE); } } return $dir; }); $questionHelper = $this->getHelper('question'); /* @var $questionHelper QuestionHelper */ $dirAnswer = $questionHelper->ask($input, $output, $question); $validator = $question->getValidator(); $dirAnswer = $validator($dirAnswer); $setter($dirAnswer); }
protected function execute(InputInterface $input, OutputInterface $output) { $configHelper = $this->getHelper('configuration'); /* @var $configHelper GlobalConfigurationHelper */ try { $configHelper->getConfiguration()->getRepositoryConfiguration($input->getArgument('repository')); throw new RepositoryExistsException($input->getArgument('repository')); } catch (NoSuchRepositoryException $ex) { // no op } if (!Util::isSshRepositoryUrl($input->getArgument('repository'))) { throw new NoSshRepositoryException($input->getArgument('repository')); } $repositoryConfig = new RepositoryConfiguration(); $repositoryConfig->setSshAlias($input->getOption('alias') ?: sha1($input->getArgument('repository') . time())); $sshKeyFile = new \SplFileInfo($input->getArgument('key')); if (!$sshKeyFile->isFile()) { throw new NotAFileException($sshKeyFile); } $repositoryConfig->setIdentityFile($sshKeyFile->getRealPath()); $sshConfigFile = new \SplFileInfo($configHelper->getConfiguration()->getSshDirectory() . '/config'); if (!file_exists($sshConfigFile->getPathname())) { FsUtil::touch($sshConfigFile->getPathname()); } if (!$sshConfigFile->isFile()) { throw new NotAFileException($sshConfigFile); } if (!$sshConfigFile->isReadable()) { throw new UnreadableFileException($sshConfigFile); } if (!$sshConfigFile->isWritable()) { throw new UnwritableFileException($sshConfigFile); } $sshConfigLines = file($sshConfigFile); try { if (Util::addSshAliasLines($sshConfigLines, $input->getArgument('repository'), $repositoryConfig)) { FsUtil::file_put_contents($sshConfigFile, implode(PHP_EOL, $sshConfigLines)); $output->writeln(sprintf('Added section <info>%s</info> to <info>%s</info>', 'Host ' . $repositoryConfig->getSshAlias(), $sshConfigFile->getPathname()), OutputInterface::VERBOSITY_VERBOSE); } else { $output->writeln(sprintf('Added section <info>%s</info> already exists in <info>%s</info>', 'Host ' . $repositoryConfig->getSshAlias(), $sshConfigFile->getPathname()), OutputInterface::VERBOSITY_VERBOSE); } } catch (SshAliasExistsException $ex) { throw new SshAliasExistsException($ex->getAliasName(), $ex->getLineNumber(), $sshConfigFile); } $configHelper->getConfiguration()->setRepositoryConfiguration($input->getArgument('repository'), $repositoryConfig); $configHelper->getConfiguration()->write(); $output->writeln(sprintf('Registered private key <info>%s</info> for repository <info>%s</info>', $repositoryConfig->getIdentityFile(), $input->getArgument('repository'))); return 0; }
protected function execute(InputInterface $input, OutputInterface $output) { $configHelper = $this->getHelper('configuration'); /* @var $configHelper GlobalConfigurationHelper */ $processHelper = $this->getHelper('process'); /* @var $processHelper ProcessHelper */ $questionHelper = $this->getHelper('question'); /* @var $questionHelper QuestionHelper */ if (!$input->getArgument('application')) { $input->setArgument('application', basename($input->getArgument('repository'), '.git')); } try { $repositoryConfiguration = $configHelper->getConfiguration()->getRepositoryConfiguration($input->getArgument('repository')); } catch (NoSuchRepositoryException $ex) { $repositoryConfiguration = null; } $repositoryParts = Util::parseRepositoryUrl($input->getArgument('repository')); if (!Util::isSshRepositoryUrl($repositoryParts)) { $input->setOption('no-deploy-key', true); } $application = Application::create($configHelper->getConfiguration(), $input->getArgument('application')); if (!is_dir($application->getPath())) { FsUtil::mkdir($application->getPath(), true); $output->writeln(sprintf('Created directory <info>%s</info>', $application->getPath()), OutputInterface::VERBOSITY_VERY_VERBOSE); } NotEmptyException::assert($application->getPath()); if (!$repositoryConfiguration && !$input->getOption('no-deploy-key')) { $output->writeln('You do not have a deploy key configured for this repository.', OutputInterface::VERBOSITY_VERBOSE); $repositoryConfiguration = new RepositoryConfiguration(); $repositoryConfiguration->setSshAlias(sha1($input->getArgument('repository')) . '-' . basename($input->getArgument('application'))); /* * Generate a new deploy key, link it to the repository and print it. */ $keyFile = $configHelper->getConfiguration()->getSshDirectory() . '/id_rsa-' . $repositoryConfiguration->getSshAlias(); try { $this->getApplication()->find('repository:generate-key')->run(new ArrayInput(['key' => $keyFile, '--comment' => 'clic-deploy-key-' . $repositoryConfiguration->getSshAlias() . '@' . gethostname(), '--target-repository' => $input->getArgument('repository'), '--print-public-key' => true]), $output); $repositoryConfiguration = $configHelper->getConfiguration()->getRepositoryConfiguration($input->getArgument('repository')); } catch (FileExistsException $ex) { $repositoryConfiguration->setIdentityFile($ex->getFilename()); $output->writeln(sprintf('Key <info>%s</info> already exists. Not generating a new one.', $ex->getFilename())); } /* * Ask to add it as a deploy key to the repo */ $output->writeln('<comment>Please set the public key printed above as a deploy key for the repository</comment>'); while (!$questionHelper->ask($input, $output, new ConfirmationQuestion('Is the deploy key uploaded?'))) { } } if ($repositoryConfiguration && !$input->getOption('no-deploy-key')) { /* * If there is a configuration now, save it */ $configHelper->getConfiguration()->setRepositoryConfiguration($input->getArgument('repository'), $repositoryConfiguration); $configHelper->getConfiguration()->write(); } else { $repositoryConfiguration = null; } /* * Run a git clone for the application */ $gitClone = ProcessBuilder::create(['git', 'clone', Util::replaceRepositoryUrl($repositoryParts, $repositoryConfiguration), $application->getPath()])->setTimeout(null)->getProcess(); $processHelper->mustRun($output, $gitClone, null, null, OutputInterface::VERBOSITY_NORMAL, OutputInterface::VERBOSITY_NORMAL); $configHelper->getConfiguration()->removeApplication($application->getName()); // Clean up application again, so application:add further down does not complain. $this->getApplication()->find('application:add')->run(new ArrayInput(['application' => $input->getArgument('application'), '--remote' => $input->getArgument('repository')]), $output); if ($input->getOption('override')) { $input1 = new ArrayInput(['application' => $input->getArgument('application'), 'config-file' => $input->getOption('override')]); if ($input->getOption('override-type')) { $input1->setOption('type', $input->getOption('override-type')); } $this->getApplication()->find('application:override')->run($input1, $output); } if (!$input->getOption('no-scripts')) { /* * Run post-clone script */ return $this->getApplication()->find('application:execute')->run(new ArrayInput(['script' => 'post-clone', 'application' => $input->getArgument('application')]), $output); } return 0; }
/** * @param OutputInterface $output * @param $configFile * @return string */ protected function downloadGit(OutputInterface $output, $configFile) { $configHelper = $this->getHelper('configuration'); /* @var $configHelper GlobalConfigurationHelper */ $processHelper = $this->getHelper('process'); /* @var $processHelper ProcessHelper */ $globalConfiguration = $configHelper->getConfiguration(); $overridesDirectory = $globalConfiguration->getOverridesDirectory(); $configDir = $overridesDirectory . '/' . sha1($configFile) . '-' . basename($configFile, '.git'); if (!is_dir($configDir)) { FsUtil::mkdir($configDir); /* * Run a git clone for the application */ $gitClone = ProcessBuilder::create(['git', 'clone', $configFile, $configDir])->setTimeout(null)->getProcess(); $processHelper->mustRun($output, $gitClone, null, null, OutputInterface::VERBOSITY_NORMAL, OutputInterface::VERBOSITY_NORMAL); } else { /* * Run a git pull for the application */ $gitPull = ProcessBuilder::create(['git', 'pull'])->setTimeout(null)->setWorkingDirectory($configDir)->getProcess(); $processHelper->mustRun($output, $gitPull, null, null, OutputInterface::VERBOSITY_NORMAL, OutputInterface::VERBOSITY_NORMAL); } $configFile = $configDir; return $configFile; }
/** * @param OutputInterface $output * @param $file */ private function unlinkFile(OutputInterface $output, $file) { try { FsUtil::unlink($file); $output->writeln(sprintf('Removed file <info>%s</info>', $file)); } catch (FilesystemOperationFailedException $ex) { $output->writeln(sprintf('<error>Could not remove file %s: %s</error>', $ex->getFilename(), $ex->getMessage())); } }