protected function execute(InputInterface $input, OutputInterface $output) { $regions = ['eu-west-1', 'us-east-1']; /** @var QuestionHelper $helper */ $helper = $this->getHelper('question'); $required = function ($value) { if (!trim($value)) { throw new \Exception('Must not be empty'); } return $value; }; $validRegion = function ($value) use($regions) { if (!in_array($value, $regions)) { throw new \Exception('Not a valid region'); } return $value; }; $question = (new Question('Access Key: '))->setValidator($required); $accessKey = $helper->ask($input, $output, $question); $question = (new Question('Secret Key: '))->setValidator($required)->setHidden(true)->setHiddenFallback(true); $secretKey = $helper->ask($input, $output, $question); $question = (new Question('Default Region: '))->setValidator($validRegion)->setAutocompleterValues($regions); $region = $helper->ask($input, $output, $question); $this->configuration->write(compact('accessKey', 'secretKey', 'region')); $output->writeln('Credentials Saved.'); return 1; // stops the runner from continuing }
protected function execute(InputInterface $input, OutputInterface $output) { $configuration = $this->configuration->read(); if (!$configuration) { $output->writeln('<error>No credentials stored. Run "ec2ssh config" first.</error>'); return 1; // stops the runner from continuing } $client = new Ec2Client(['credentials' => ['key' => $configuration['accessKey'], 'secret' => $configuration['secretKey']], 'region' => $configuration['region'], 'version' => 'latest']); $response = $client->describeInstances(); $instances = []; foreach ($response['Reservations'] as $reservation) { foreach ($reservation['Instances'] as $instance) { $key = $instance['KeyName']; $id = $instance['InstanceId']; $dns = $instance['PublicDnsName']; $zone = $instance['Placement']['AvailabilityZone']; $type = $instance['InstanceType']; $name = ''; $role = ''; $system = ''; foreach ($instance['Tags'] as $tag) { if ($tag['Key'] === 'System') { $system = $tag['Value']; } if ($tag['Key'] === 'Name') { $name = $tag['Value']; } if ($tag['Key'] === 'Role') { $role = $tag['Value']; } } $instances[$role . ' ' . $id] = compact('key', 'id', 'dns', 'zone', 'type', 'name', 'role', 'system'); } } ksort($instances); $instances = array_values($instances); $table = new Table($output); $table->setHeaders(['', 'Role', 'ID', 'Size', 'DNS']); $lastRole = null; foreach ($instances as $i => $instance) { if ($instance['role'] !== $lastRole && $lastRole !== null) { $table->addRow(new TableSeparator()); } $table->addRow([$i + 1, '<options=bold>' . $instance['role'] . '</>', $instance['id'], $instance['type'], $instance['dns']]); $lastRole = $instance['role']; } $table->render(); $range = range(1, count($instances)); $question = (new Question('Which box to SSH to? '))->setAutocompleterValues($range)->setValidator(function ($value) use($range) { if (!in_array($value, $range)) { throw new \Exception('Invalid choice'); } return $value; }); $choice = $this->getHelper('question')->ask($input, $output, $question); $instance = $instances[$choice - 1]; $name = $instance['role'] . ' (' . $instance['id'] . ')'; file_put_contents('/tmp/ec2ssh-tmp-server', 'ubuntu@' . $instance['dns']); $output->writeln(''); $output->writeln('<info>Connecting to ' . $name . '...</info>'); }