Created
September 28, 2011 23:14
-
-
Save blt/1249542 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env ruby | |
require 'rubygems' | |
require 'optparse' | |
require 'net/ssh' | |
require 'json' | |
require 'yaml' | |
require 'amqp' | |
require 'logger' | |
trap(:INT) { puts; exit } | |
options = { | |
:logs => 'kili.log', | |
:amqp => { | |
:host => 'localhost', | |
:port => '5672', | |
}, | |
:ssh => { | |
:host => 'localhost', | |
:port => '22', | |
:user => 'nobody', | |
:keys => '~/.ssh/id_rsa', | |
} | |
} | |
optparse = OptionParser.new do|opts| | |
opts.banner = "Usage: kili [options]" | |
opts.on( '--amqp_host HOST', 'The AMQP host kili will connect to.') do |a| | |
options[:amqp][:host] = a | |
end | |
opts.on( '--amqp_port PORT', 'The port for the AMQP host.') do |ap| | |
options[:amqp][:port] = ap | |
end | |
opts.on( '--ssh_host HOST', 'The SSH host kili will connect to.') do |s| | |
options[:ssh][:host] = s | |
end | |
opts.on( '--ssh_port PORT', 'The SSH port kili will connect on.') do |sp| | |
options[:ssh][:port] = sp | |
end | |
opts.on( '--ssh_keys KEYS', 'Comma delimeted SSH keys for user.') do |sk| | |
options[:ssh][:keys] = sk | |
end | |
opts.on( '--ssh_user USER', 'SSH user for host.') do |su| | |
options[:ssh][:user] = su | |
end | |
opts.on( '--command CMD', 'Command to run through SSH exec.') do |cmd| | |
options[:ssh][:command] = cmd | |
end | |
opts.on( '-l', '--log LOG', 'The log location of Kili') do |log| | |
options[:logs] = log | |
end | |
opts.on( '-h', '--help', 'Display this screen' ) do | |
puts opts | |
exit | |
end | |
end | |
optparse.parse! | |
log = Logger.new(options[:logs]) | |
log.level = Logger::INFO | |
amqp = options[:amqp] | |
sshd = options[:ssh] | |
queue= EM::Queue.new | |
Thread.abort_on_exception = true | |
amqp_thread = Thread.new do | |
EventMachine.run do | |
queue.pop do |msg| | |
puts msg | |
end | |
end | |
end | |
ssh_thread = Thread.new do | |
Net::SSH.start(sshd[:host], sshd[:user], | |
:port => sshd[:port], :keys => sshd[:keys].split(',')) do |ssh| | |
log.info "SSH connection to #{sshd[:host]}:#{sshd[:port]} as #{sshd[:user]\ | |
} made." | |
channel = ssh.open_channel do |ch| | |
ch.exec sshd[:command] do |ch, success| | |
abort "could not stream #{sshd[:command]}" unless success | |
# "on_data" is called when the process writes something to | |
# stdout | |
ch.on_data do |c, data| | |
json = JSON.parse(data) | |
if json['type'] == 'change-merged' | |
project = json['change']['project'] | |
route = "com.carepilot.event.code.review.#{project}" | |
msg = {:data => data, :route => route} | |
queue.push(msg) | |
log.info("Pushed #{msg} into queue; now of size #{queue.size}.") | |
else | |
log.info("Ignoring event of type #{json['type']}") | |
end | |
end | |
# "on_extended_data" is called when the process writes | |
# something to stderr | |
ch.on_extended_data do |c, type, data| | |
log.error(data) | |
end | |
ch.on_close { log.info('Connection closed') } | |
end | |
end | |
channel.wait | |
end | |
end | |
amqp_thread.join | |
ssh_thread.join |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment