/** * 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; }
/** * 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'); $filter = $input->getOption('filter'); if (!DatabaseConnection::databaseExists($database)) { $output->writeln('<p-error>Database "' . $database . '" does not exists</p-error>'); return 1; } $output->writeln('<h2>Dumping database "' . $database . '" into file "' . $dumpFile . '"</h2>'); $fileExt = pathinfo($dumpFile, PATHINFO_EXTENSION); // Inserting putenv('USER='******'MYSQL_PWD=' . DatabaseConnection::getDbPassword()); $commandCompressor = null; switch ($fileExt) { case 'bz': case 'bz2': case 'bzip2': $output->writeln('<p>Using BZIP2 compression</p>'); $commandCompressor = new CommandBuilder('bzip2'); break; case 'gz': case 'gzip': $output->writeln('<p>Using GZIP compression</p>'); $commandCompressor = new CommandBuilder('gzip'); break; case 'lzma': case 'lz': case 'xz': $output->writeln('<p>Using LZMA compression</p>'); $commandCompressor = new CommandBuilder('xz'); $commandCompressor->addArgument('--compress')->addArgument('--stdout'); break; } $command = new CommandBuilder('mysqldump', '--user=%s %s --single-transaction', array(DatabaseConnection::getDbUsername(), $database)); // Set server connection details if ($input->getOption('host')) { $command->addArgumentTemplate('-h %s', $input->getOption('host')); } if ($input->getOption('port')) { $command->addArgumentTemplate('-P %s', $input->getOption('port')); } if (!empty($filter)) { $command = $this->addFilterArguments($command, $database, $filter); } if (!empty($commandCompressor)) { $command->addPipeCommand($commandCompressor); $commandCompressor->setOutputRedirectToFile($dumpFile); } else { $output->writeln('<p>Using no compression</p>'); $command->setOutputRedirectToFile($dumpFile); } $command->executeInteractive(); $output->writeln('<h2>Database "' . $database . '" stored to "' . $dumpFile . '"</h2>'); }
/** * 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; }
/** * Add exclude (pattern) list to rsync command * * @param CommandBuilder $command Rsync Command * @param array $list List of excludes */ protected function rsyncAddExcludeList(CommandBuilder $command, $list) { $rsyncFilter = $this->tempDir . '/.rsync-exclude'; PhpUtility::filePutContents($rsyncFilter, implode("\n", $list)); $command->addArgumentTemplate('--exclude-from=%s', $rsyncFilter); // cleanup rsync file $command->getExecutor()->addFinisherCallback(function () use($rsyncFilter) { unlink($rsyncFilter); }); }
/** * 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); }
/** * 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; }