/** * Execute command * * @param InputInterface $input Input instance * @param OutputInterface $output Output instance * * @return int|null|void */ public function execute(InputInterface $input, OutputInterface $output) { $this->elevateProcess($input, $output); $command = new CommandBuilder('shutdown', '-h now'); $command->executeInteractive(); return 0; }
/** * Execute command * * @param InputInterface $input Input instance * @param OutputInterface $output Output instance * * @return int|null|void */ public function execute(InputInterface $input, OutputInterface $output) { $this->elevateProcess($input, $output); $command = new CommandBuilder('service', 'php5-fpm restart'); $command->executeInteractive(); return 0; }
/** * Execute command * * @param InputInterface $input Input instance * @param OutputInterface $output Output instance * * @return int|null|void */ public function execute(InputInterface $input, OutputInterface $output) { $this->elevateProcess($input, $output); $dockerInterface = $this->getApplication()->getConfigValue('docker', 'interface'); $command = new CommandBuilder('iftop', '-i %s', array($dockerInterface)); $command->executeInteractive(); return 0; }
/** * Execute command * * @param InputInterface $input Input instance * @param OutputInterface $output Output instance * * @return int|null|void */ public function execute(InputInterface $input, OutputInterface $output) { $paramList = $this->getFullParameterList(); $path = UnixUtility::findFileInDirectortyTree('Makefile'); if (!empty($path)) { $path = dirname($path); $this->output->writeln('<comment>Found Makefile directory: ' . $path . '</comment>'); // Switch to directory of docker-compose.yml PhpUtility::chdir($path); $command = new CommandBuilder('make'); if (!empty($paramList)) { $command->setArgumentList($paramList); } $command->executeInteractive(); } else { $this->output->writeln('<error>No Makefile found in tree</error>'); return 1; } return 0; }
/** * Execute command * * @param InputInterface $input Input instance * @param OutputInterface $output Output instance * * @return int|null|void */ public function execute(InputInterface $input, OutputInterface $output) { $composerCmd = $this->getApplication()->getConfigValue('bin', 'composer'); $paramList = $this->getFullParameterList(); $composerJsonPath = UnixUtility::findFileInDirectortyTree('composer.json'); if (!empty($composerJsonPath)) { $path = dirname($composerJsonPath); $this->output->writeln('<comment>Found composer.json directory: ' . $path . '</comment>'); // Switch to directory of docker-compose.yml PhpUtility::chdir($path); $command = new CommandBuilder(); $command->parse($composerCmd); if (!empty($paramList)) { $command->setArgumentList($paramList); } $command->executeInteractive(); } else { $this->output->writeln('<error>No composer.json found in tree</error>'); return 1; } return 0; }
/** * Run system update * * @param InputInterface $input Input instance * @param OutputInterface $output Output instance * * @return int|null|void */ protected function systemUpdate(InputInterface $input, OutputInterface $output) { $errorMsgList = array(); // ################## // System update // ################## try { $this->outputBlock($output, 'Running system package update'); $command = new CommandBuilder('apt-get', 'clean --quiet'); $command->executeInteractive(); $command = new CommandBuilder('apt-get', 'update --quiet'); $command->executeInteractive(); $command = new CommandBuilder('apt-get', 'dist-upgrade --fix-broken --assume-yes --quiet'); $command->executeInteractive(); $command = new CommandBuilder('apt-get', 'autoclean --quiet'); $command->executeInteractive(); } catch (\RuntimeException $e) { $msg = 'Running system package update... FAILED'; $output->writeln('<error>' . $msg . '</error>'); $errorMsgList[] = $msg; } // ################## // clitools update // ################## try { $this->outputBlock($output, 'Running clitools update'); $updateService = new SelfUpdateService($this->getApplication(), $output); $updateService->update(); } catch (\RuntimeException $e) { $msg = 'Running clitools update... FAILED'; $output->writeln('<error>' . $msg . '</error>'); $errorMsgList[] = $msg; } // ################## // Composer update // ################## try { $this->outputBlock($output, 'Running composer update'); $command = new CommandBuilder('composer', 'self-update'); $command->executeInteractive(); } catch (\RuntimeException $e) { $msg = 'Running composer update... FAILED'; $output->writeln('<error>' . $msg . '</error>'); $errorMsgList[] = $msg; } // ################## // Box.phar update // ################## try { $this->outputBlock($output, 'Running box.phar update'); $command = new CommandBuilder('box.phar', 'update'); $command->executeInteractive(); } catch (\RuntimeException $e) { $msg = 'Running box.phar update... FAILED'; $output->writeln('<error>' . $msg . '</error>'); $errorMsgList[] = $msg; } // ################## // Misc // ################## // TODO // ################## // Summary // ################## if (!empty($errorMsgList)) { $output->writeln(''); $output->writeln(''); $output->writeln('<error>[WARNING] Some update tasks have failed!</error>'); foreach ($errorMsgList as $errorMsg) { $output->writeln(' * ' . $errorMsg); } } else { $output->writeln('<info>Update successfully finished</info>'); } return 0; }
/** * Execute command * * @param InputInterface $input Input instance * @param OutputInterface $output Output instance * * @return int|null|void */ public function execute(InputInterface $input, OutputInterface $output) { $this->elevateProcess($input, $output); $dockerInterface = $this->getApplication()->getConfigValue('docker', 'interface'); $output->writeln('<h2>Starting network sniffing</h2>'); $protocol = $this->getProtocol(); $command = new CommandBuilder(); switch ($protocol) { // ############################################ // OSI LEVEL 2 // ############################################ // ############## // ARP // ############## case 'arp': $output->writeln('<p>Using protocol "arp"</p>'); $command->setCommand('tshark'); $command->addArgument('arp'); break; // ############################################ // OSI LEVEL 3 // ############################################ // ############## // ICMP // ############## // ############################################ // OSI LEVEL 3 // ############################################ // ############## // ICMP // ############## case 'icmp': $output->writeln('<p>Using protocol "icmp"</p>'); $command->setCommand('tshark'); $command->addArgument('icmp'); break; // ############################################ // OSI LEVEL 4 // ############################################ // ############## // TCP connections // ############## // ############################################ // OSI LEVEL 4 // ############################################ // ############## // TCP connections // ############## case 'con': case 'tcp': $output->writeln('<p>Using protocol "tcp"</p>'); $command->setCommand('tshark'); $command->addArgumentRaw('-R "tcp.flags.syn==1 && tcp.flags.ack==0"'); break; // ############################################ // OSI LEVEL 5-7 // ############################################ // ############## // HTTP // ############## // ############################################ // OSI LEVEL 5-7 // ############################################ // ############## // HTTP // ############## case 'http': $output->writeln('<p>Using protocol "http"</p>'); $command->setCommand('tshark'); $command->addArgumentRaw('tcp port 80 or tcp port 443 -2 -V -R "http.request" -Tfields -e ip.dst -e http.request.method -e http.request.full_uri'); break; // ############## // HTTP (full) // ############## // ############## // HTTP (full) // ############## case 'http-full': $output->writeln('<p>Using protocol "http" (full mode)</p>'); $command->setCommand('tshark'); $command->addArgumentRaw('tcp port 80 or tcp port 443 -2 -V -R "http.request || http.response"'); break; // ############## // SOLR // ############## // ############## // SOLR // ############## case 'solr': $output->writeln('<p>Using protocol "solr"</p>'); $command->setCommand('tcpdump'); $command->addArgumentRaw('-nl -s0 -w- port 8983'); $pipeCommand = new CommandBuilder('strings', '-n -8'); $command->addPipeCommand($pipeCommand); break; // ############## // ELASTICSEARCH // ############## // ############## // ELASTICSEARCH // ############## case 'elasticsearch': $output->writeln('<p>Using protocol "elasticsearch"</p>'); $command->setCommand('tcpdump'); $command->addArgumentRaw('-A -nn -s 0 \'tcp dst port 9200 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)\''); break; // ############## // MEMCACHE // ############## // ############## // MEMCACHE // ############## case 'memcache': case 'memcached': $output->writeln('<p>Using protocol "memcache"</p>'); $command->setCommand('tcpdump'); $command->addArgumentRaw('-s 65535 -A -ttt port 11211| cut -c 9- | grep -i \'^get\\|set\''); break; // ############## // REDIS // ############## // ############## // REDIS // ############## case 'redis': $output->writeln('<p>Using protocol "redis"</p>'); $command->setCommand('tcpdump'); $command->addArgumentRaw('-s 65535 tcp port 6379'); break; // ############## // SMTP // ############## // ############## // SMTP // ############## case 'smtp': case 'mail': $output->writeln('<p>Using protocol "smtp"</p>'); $command->setCommand('tshark'); $command->addArgumentRaw('tcp -f "port 25" -R "smtp"'); break; // ############## // MYSQL // ############## // ############## // MYSQL // ############## case 'mysql': $output->writeln('<p>Using protocol "mysql"</p>'); $command->setCommand('tshark'); $command->addArgumentRaw('tcp -d tcp.port==3306,mysql -T fields -e mysql.query "port 3306"'); break; // ############## // DNS // ############## // ############## // DNS // ############## case 'dns': $output->writeln('<p>Using protocol "dns"</p>'); $command->setCommand('tshark'); $command->addArgumentRaw('-nn -e ip.src -e dns.qry.name -E separator=" " -T fields port 53'); break; // ############## // HELP // ############## // ############## // HELP // ############## default: $output->writeln('<p-error>Protocol not supported:</p-error>'); $output->writeln('<p-error> OSI layer 7: http, solr, elasticsearch, memcache, redis, smtp, mysql, dns</p-error>'); $output->writeln('<p-error> OSI layer 4: tcp</p-error>'); $output->writeln('<p-error> OSI layer 3: icmp</p-error>'); $output->writeln('<p-error> OSI layer 2: arp</p-error>'); return 1; break; } switch ($command->getCommand()) { case 'tshark': $output->writeln('<p>Using sniffer "tshark"</p>'); $command->addArgumentTemplate('-i %s', $dockerInterface); break; case 'tcpdump': $output->writeln('<p>Using sniffer "tcpdump"</p>'); $command->addArgumentTemplate('-i %s', $dockerInterface); break; case 'ngrep': $output->writeln('<p>Using sniffer "ngrep"</p>'); $command->addArgumentTemplate('-d %s', $dockerInterface); break; } $this->setTerminalTitle('sniffer', $protocol, '(' . $command->getCommand() . ')'); $command->executeInteractive(); return 0; }
/** * Execute docker compose run * * @param string $containerName Container name * @param CommandBuilderInterface $command Command * * @return int|null|void */ protected function executeDockerComposeRun($containerName, CommandBuilderInterface $command) { // Search updir for docker-compose.yml $path = $this->getDockerPath(); if (!empty($path)) { // Switch to directory of docker-compose.yml PhpUtility::chdir($path); $this->output->writeln('<info>Executing "' . $command->getCommand() . '" in docker container "' . $containerName . '" ...</info>'); $dockerCommand = new CommandBuilder('docker-compose', 'run --rm %s', array($containerName)); $dockerCommand->append($command, false); $dockerCommand->executeInteractive(); } else { $this->output->writeln('<p-error>No docker-compose.yml found in tree</p-error>'); return 1; } return 0; }
/** * Check if docker exists * * @throws \CliTools\Exception\StopException */ protected function checkIfDockerExists() { $dockerPath = \CliTools\Utility\DockerUtility::searchDockerDirectoryRecursive(); if (!empty($dockerPath)) { $this->output->writeln('<info>Running docker containers:</info>'); // Docker instance found $docker = new CommandBuilder('docker', 'ps'); $docker->executeInteractive(); $answer = ConsoleUtility::questionYesNo('Are these running containers the right ones?', 'no'); if (!$answer) { throw new \CliTools\Exception\StopException(1); } } }
/** * Execute command * * @param InputInterface $input Input instance * @param OutputInterface $output Output instance * * @return int|null|void */ public function execute(InputInterface $input, OutputInterface $output) { $runningCallback = function ($process, $status) { static $domainFound = false; if ($domainFound) { return; } $pid = $status['pid']; exec('pgrep -P ' . (int) $pid . ' | xargs ps -o command=', $output); if (!empty($output)) { foreach ($output as $line) { if (preg_match('/register\\.vagrantshare\\.com/', $line)) { if (preg_match('/-name ([^\\s]+)/', $line, $matches)) { $domainName = $matches[1]; $typo3Domain = new SelfCommandBuilder(); $typo3Domain->addArgument('typo3:domain')->addArgumentTemplate('--remove=%s', '*.vagrantshare.com')->addArgumentTemplate('--duplicate=%s', $domainName . '.vagrantshare.com')->execute(); $domainFound = true; } } } } }; $cleanupCallback = function () { $typo3Domain = new SelfCommandBuilder(); $typo3Domain->addArgument('typo3:domain')->addArgumentTemplate('--remove=%s', '*.vagrantshare.com')->execute(); }; $this->getApplication()->registerTearDown($cleanupCallback); $opts = array('runningCallback' => $runningCallback); $vagrant = new CommandBuilder('vagrant', 'share'); // Share name if ($input->getOption('name')) { $vagrant->addArgumentTemplate('--name %s', $input->getOption('name')); } elseif ($input->getArgument('name')) { $vagrant->addArgumentTemplate('--name %s', $input->getArgument('name')); } // HTTP port if ($input->getOption('http')) { $vagrant->addArgumentTemplate('--http %s', $input->getOption('http')); } else { $vagrant->addArgumentTemplate('--http %s', 80); } // HTTPS port if ($input->getOption('https')) { $vagrant->addArgumentTemplate('--http %s', $input->getOption('https')); } else { $vagrant->addArgumentTemplate('--https %s', 443); } // SSH stuff if ($input->getOption('ssh')) { $vagrant->addArgument('--ssh'); } if ($input->getOption('ssh-no-password')) { $vagrant->addArgument('--ssh-no-password'); } if ($input->getOption('ssh-port')) { $vagrant->addArgumentTemplate('--ssh-port %s', $input->getOption('ssh-port')); } if ($input->getOption('ssh-once')) { $vagrant->addArgument('--ssh-once'); } $vagrant->executeInteractive($opts); }
/** * Execute command * * @param InputInterface $input Input instance * @param OutputInterface $output Output instance * * @return int|null|void */ public function execute(InputInterface $input, OutputInterface $output) { $database = $input->getArgument('db'); $dumpFile = $input->getArgument('file'); if (!is_file($dumpFile) || !is_readable($dumpFile)) { $output->writeln('<p-error>File is not readable</p-error>'); return 1; } $dumpFileType = PhpUtility::getMimeType($dumpFile); $output->writeln('<h2>Restoring dump "' . $dumpFile . '" into database "' . $database . '"</h2>'); if (DatabaseConnection::databaseExists($database)) { // Dropping $output->writeln('<p>Dropping database</p>'); $query = 'DROP DATABASE IF EXISTS ' . DatabaseConnection::sanitizeSqlDatabase($database); DatabaseConnection::exec($query); } // Creating $output->writeln('<p>Creating database</p>'); $query = 'CREATE DATABASE ' . DatabaseConnection::sanitizeSqlDatabase($database); DatabaseConnection::exec($query); // Inserting putenv('USER='******'MYSQL_PWD=' . DatabaseConnection::getDbPassword()); $commandMysql = new CommandBuilder('mysql', '--user=%s %s --one-database', array(DatabaseConnection::getDbUsername(), $database)); // Set server connection details if ($input->getOption('host')) { $commandMysql->addArgumentTemplate('-h %s', $input->getOption('host')); } if ($input->getOption('port')) { $commandMysql->addArgumentTemplate('-P %s', $input->getOption('port')); } $commandFile = new CommandBuilder(); $commandFile->addArgument($dumpFile); $commandFile->addPipeCommand($commandMysql); switch ($dumpFileType) { case 'application/x-bzip2': $output->writeln('<p>Using BZIP2 decompression</p>'); $commandFile->setCommand('bzcat'); break; case 'application/gzip': case 'application/x-gzip': $output->writeln('<p>Using GZIP decompression</p>'); $commandFile->setCommand('gzcat'); break; case 'application/x-lzma': case 'application/x-xz': $output->writeln('<p>Using LZMA decompression</p>'); $commandFile->setCommand('xzcat'); break; default: $output->writeln('<p>Using plaintext (no decompression)</p>'); $commandFile->setCommand('cat'); break; } $output->writeln('<p>Reading dump</p>'); $commandFile->executeInteractive(); $output->writeln('<h2>Database "' . $database . '" restored</h2>'); return 0; }
/** * Execute command * * @param InputInterface $input Input instance * @param OutputInterface $output Output instance * * @return int|null|void */ public function execute(InputInterface $input, OutputInterface $output) { $this->elevateProcess($input, $output); $pid = null; $grep = $input->getArgument('grep'); $command = new CommandBuilder('strace', '-f'); $command->setOutputRedirect(CommandBuilder::OUTPUT_REDIRECT_ALL_STDOUT); $output->writeln('<h2>Starting process stracing</h2>'); if (empty($pid)) { list($pidList, $processList) = $this->buildProcessList(); if ($input->getOption('all')) { $pid = 'all'; } else { try { $question = new ChoiceQuestion('Please choose process for tracing', $processList); $question->setMaxAttempts(1); $questionDialog = new QuestionHelper(); $pid = $questionDialog->ask($input, $output, $question); } catch (\InvalidArgumentException $e) { // Invalid value, just stop here throw new \CliTools\Exception\StopException(1); } } } if (!empty($pid)) { switch ($pid) { case 'all': $command->addArgumentTemplate('-p %s', implode(',', $pidList)); break; default: $command->addArgumentTemplate('-p %s', $pid); break; } // Stats if ($input->getOption('c')) { $command->addArgument('-c'); } // Relative time if ($input->getOption('r')) { $command->addArgument('-r'); } else { $command->addArgument('-tt'); } // System trace filter if ($input->getOption('e')) { $command->addArgumentTemplate('-e %s', $input->getOption('e')); } // Add grep if (!empty($grep)) { $grepCommand = new CommandBuilder('grep'); $grepCommand->addArgument('--color=auto')->addArgument($grep); $command->addPipeCommand($grepCommand); } $command->executeInteractive(); } return 0; }
/** * Create docker instance from git repository * * @param string $path Path * @param string $repo Repository */ protected function initCode($path, $repo) { $this->setTerminalTitle('Cloning code'); $path .= '/code'; $this->output->writeln('<comment>Initialize new code instance in "' . $path . '"</comment>'); if (is_dir($path)) { if (file_exists($path . '/.gitkeep')) { // Remove gitkeep PhpUtility::unlink($path . '/.gitkeep'); } // Remove code directory $command = new CommandBuilder('rmdir'); $command->addArgumentSeparator()->addArgument($path)->executeInteractive(); } $command = new CommandBuilder('git', 'clone --branch=master --recursive %s %s', array($repo, $path)); $command->executeInteractive(); }
/** * Show log, passthru multitail * * @param array $logList List of log files * @param InputInterface $input Input instance * @param OutputInterface $output Output instance * @param string $grep Grep value * @param array $optionList Additional option list for multitail * * @return int|null|void * @throws \Exception */ protected function showLog($logList, $input, $output, $grep = null, $optionList = null) { $this->elevateProcess($input, $output); // check if logfiles are accessable foreach ($logList as $log) { if (!is_readable($log)) { $output->writeln('<p-error>Can\'t read ' . $log . '</p-error>'); return 1; } } $output->writeln('<p>Reading logfile with multitail</p>'); $command = new CommandBuilder('multitail', '--follow-all'); // Add grep if ($grep !== null) { $command->addArgumentTemplate('-E %s', $grep); } // Add log $command->addArgumentList($logList); $command->executeInteractive(); return 0; }