/** * 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); $procList = array(); $openFilesTotal = 0; $command = new CommandBuilder('lsof', '-n'); $command->addPipeCommand(new CommandBuilder('grep', '-oE \'^[a-z]+\''))->addPipeCommand(new CommandBuilder('sort'))->addPipeCommand(new CommandBuilder('uniq', '-c'))->addPipeCommand(new CommandBuilder('sort', '-n'))->setOutputRedirect(CommandBuilder::OUTPUT_REDIRECT_NO_STDERR); $execOutput = $command->execute()->getOutput(); foreach ($execOutput as $execOutputLine) { // get open files and proc name from output list($procOpenFiles, $procName) = explode(' ', trim($execOutputLine), 2); // add to total stats $openFilesTotal += $procOpenFiles; $procList[] = array('name' => $procName, 'open_files' => $procOpenFiles); } // ######################## // Output // ######################## /** @var \Symfony\Component\Console\Helper\Table $table */ $table = new Table($output); $table->setHeaders(array('Process', 'Open Files')); foreach ($procList as $procRow) { $procRow['open_files'] = FormatUtility::number($procRow['open_files']); $table->addRow(array_values($procRow)); } // Stats: average $table->addRow(new TableSeparator()); $statsRow = array(); $statsRow['name'] = 'Total'; $statsRow['open_files'] = FormatUtility::number($openFilesTotal); $table->addRow(array_values($statsRow)); $table->render(); 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'); 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); $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; }
/** * Reload tty */ public static function reloadTtyBanner($ttyName) { // Check if we can reload tty try { $who = new CommandBuilder('who'); $who->addPipeCommand(new CommandBuilder('grep', '%s', array($ttyName))); $who->execute(); // if there is no exception -> there is a logged in user } catch (\Exception $e) { // if there is an exception -> there is NO logged in user try { $ps = new CommandBuilder('ps', 'h -o pid,comm,args -C getty'); $ps->addPipeCommand(new CommandBuilder('grep', '%s', array($ttyName))); $output = $ps->execute()->getOutput(); if (!empty($output)) { $outputLine = trim(reset($output)); $outputLineParts = preg_split('/[\\s]+/', $outputLine); list($pid) = $outputLineParts; posix_kill($pid, SIGHUP); } } catch (\Exception $e) { } } }
/** * 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; }