bin/flapjack-populator in flapjack-0.5.5 vs bin/flapjack-populator in flapjack-0.6.23
- old
+ new
@@ -1,29 +1,146 @@
#!/usr/bin/env ruby
-require 'rubygems'
require 'yajl'
-require 'beanstalk-client'
+require 'redis'
+require 'yaml'
+require 'optparse'
+require 'ostruct'
+require 'flapjack/data/entity_check'
-command = ARGV[0]
+options = OpenStruct.new
+options.config = File.join('etc', 'flapjack_config.yaml')
+options.daemonize = nil
-case command
-when "deploy"
- options = ARGV[1..-1]
- options = Hash[options.map {|o| o.scan(/--(.+)=(.+)/).flatten }]
+command = ARGV.shift
- @queue = Beanstalk::Connection.new('localhost:11300', 'checks')
+banner = "Usage: flapjack-populator command [options]\n"
+banner += "\n"
+banner += " commands:\n"
+banner += " - import-entities\n"
+banner += " - import-contacts\n"
+banner += " - purge-events (purge queued monitoring events)\n"
- filename = options["from"]
+OptionParser.new do |opts|
+ opts.banner = "Usage: flapjack-populator command [options]"
+
+ opts.on("-c", "--config [PATH]", String, "PATH to the config file to use") do |c|
+ options.config = c
+ end
+
+ opts.on("-f", "--from [FILE]", String, "path to the FILE to import") do |f|
+ options.from = f
+ end
+
+end.parse!(ARGV)
+
+FLAPJACK_ENV = ENV['FLAPJACK_ENV'] || 'development'
+
+# load the config hash for the current environment
+
+if File.file?(options.config)
+ config = YAML::load(File.open(options.config))
+else
+ puts "Could not find config file at '#{options.config}', you may want to specify one with the --config option"
+ exit(false)
+end
+
+config_env = config[FLAPJACK_ENV]
+
+if config_env.nil? || config_env.empty?
+ puts "No config data for environment '#{FLAPJACK_ENV}' found in '#{options.config}'"
+ exit(false)
+end
+
+if options.from
+ filename = options.from
file = File.new(filename)
- parser = Yajl::Parser.new
- batch = parser.parse(file)
- batch_id = batch["batch"]["id"]
+end
- batch["checks"].each do |check|
- job = check.merge({"batch_id" => batch_id})
- @queue.yput(job)
+parser = Yajl::Parser.new
+
+@redis_host = config_env['redis']['host'] || 'localhost'
+@redis_port = config_env['redis']['port'] || '6379'
+@redis_path = config_env['redis']['path'] || nil
+@redis_db = config_env['redis']['db'] || 0
+
+# add lib to the default include path
+unless $:.include?(File.dirname(__FILE__) + '/../lib/')
+ $: << File.dirname(__FILE__) + '/../lib'
+end
+
+def get_redis_connection
+ if @redis_path
+ redis = Redis.new(:db => @redis_db, :path => @redis_path)
+ else
+ redis = Redis.new(:db => @redis_db, :host => @redis_host, :port => @redis_port)
end
+ redis
+end
- puts "Deployed batch #{batch_id}"
+case command
+when "import-contacts"
+ @persistence = get_redis_connection
+ contacts = parser.parse(file)
+ contacts.each {|contact|
+ if not contact['id']
+ puts "Contact not imported as it has no id: " + contact.inspect
+ next
+ end
+ @persistence.multi
+ @persistence.del("contact:#{contact['id']}")
+ @persistence.del("contact_media:#{contact['id']}")
+ @persistence.del("contact_pagerduty:#{contact['id']}")
+ @persistence.hset("contact:#{contact['id']}", 'first_name', contact['first_name'])
+ @persistence.hset("contact:#{contact['id']}", 'last_name', contact['last_name'])
+ @persistence.hset("contact:#{contact['id']}", 'email', contact['email'])
+ contact['media'].each_pair {|medium, address|
+ case medium
+ when 'pagerduty'
+ @persistence.hset("contact_media:#{contact['id']}", medium, address['service_key'])
+ @persistence.hset("contact_pagerduty:#{contact['id']}", 'subdomain', address['subdomain'])
+ @persistence.hset("contact_pagerduty:#{contact['id']}", 'username', address['username'])
+ @persistence.hset("contact_pagerduty:#{contact['id']}", 'password', address['password'])
+ else
+ @persistence.hset("contact_media:#{contact['id']}", medium, address)
+ end
+ }
+ @persistence.exec
+ }
+
+when "import-entities"
+ @persistence = get_redis_connection
+ entities = parser.parse(file)
+ entities.each {|entity|
+ if not entity['id']
+ puts "Entity not imported as it has no id: " + entity.inspect
+ next
+ end
+ @persistence.multi
+ existing_name = @persistence.hget("entity:#{entity['id']}", 'name')
+ @persistence.del("entity_id:#{existing_name}") unless existing_name == entity['name']
+ @persistence.set("entity_id:#{entity['name']}", entity['id'])
+ @persistence.hset("entity:#{entity['id']}", 'name', entity['name'])
+
+ @persistence.del("contacts_for:#{entity['id']}")
+ entity['contacts'].each {|contact|
+ @persistence.sadd("contacts_for:#{entity['id']}", contact)
+ }
+ @persistence.exec
+
+ }
+
+when "purge-events"
+ @persistence = get_redis_connection
+ events_size = @persistence.llen('events')
+ puts "purging #{events_size} events..."
+ timestamp = Time.now.to_i
+ puts "renaming events to events.#{timestamp}"
+ @persistence.rename('events', "events.#{timestamp}")
+ puts "setting expiry of events.#{timestamp} to 8 hours"
+ @persistence.expire("events.#{timestamp}", (60 * 60 * 8))
+
+else
+ puts "you need to give me something to do, eg a command like 'import-entities' or 'import-clients' etc"
+ raise ArgumentError
end