#!/usr/bin/ruby
require 'fog'
require 'csv'
require 'optparse'
require 'pp'

options = {}
OptionParser.new do |opts|
  opts.banner = "Usage: aws2sshconfig [options]"

  opts.on("-p", "--prefix PREFIX", "Prepend PREFIX to Host lines") do |prefix|
    options[:prefix] = prefix
  end

  opts.on("-i", "--id", "Append instance ID to Host lines") do |id|
    options[:id] = id
  end

  opts.on("-r", "--private-ip", "Use private IP instead of public") do |private_ip|
    options[:private_ip] = private_ip
  end

  opts.on("-c", "--credentials FILE", "Load credentials from csv-formatted credentials file") do |file|
    options[:credentials] = file
  end
end.parse!

if options[:credentials]
  creds = CSV.parse(File.read(options[:credentials]), :headers => true)
  compute = Fog::Compute.new(:provider => 'AWS', :aws_access_key_id => creds.first["Access Key Id"], :aws_secret_access_key => creds.first["Secret Access Key"])
else
  puts "Access Key Id:"
  access_key = STDIN.readline.gsub("\n","")
  puts "Secret Access Key:"
  secret_key = STDIN.readline.gsub("\n","")
  compute = Fog::Compute.new(:provider => 'AWS', :aws_access_key_id => access_key, :aws_secret_access_key => secret_key)
end

compute.servers.each do |server|
  next if server.state != 'running'
  puts "Host #{options[:prefix] ? options[:prefix] + '-' : ''}#{server.tags["Name"]}#{options[:id] ? '-' + server.id : ''}"
  puts "  HostName #{options[:private_ip] ? server.private_ip_address : server.public_ip_address}"
  puts
end
