Skip to content

Instantly share code, notes, and snippets.

@cabecada
Last active October 20, 2016 04:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cabecada/f344dd67751626da96bf9adfd8d6b513 to your computer and use it in GitHub Desktop.
Save cabecada/f344dd67751626da96bf9adfd8d6b513 to your computer and use it in GitHub Desktop.
update client subscriptions
#!/opt/sensu/embedded/bin/ruby
require 'net/http'
require 'json'
require 'optparse'
module Sensu
class Api
attr_reader :server, :port
def initialize(server='localhost', port=4567)
@server = server
@port = port
@http = Net::HTTP.new(@server, @port)
@http.set_debug_output($stdout) if $DEBUG
end
def headers
{'api-proxy' => 'true', 'Content-Type' => 'application/json'}
end
def http
@http ||= Net::HTTP.new(@server, @port)
@http.set_debug_output($stdout) if $DEBUG
@http
end
def make_request(action, path, headers, content=false)
if action == "get"
req = Net::HTTP::Get.new(URI.encode(path), headers)
elsif action == "post"
req = Net::HTTP::Post.new(URI.encode(path), headers)
req.body = content.to_json
elsif action == "delete"
req = Net::HTTP::Delete.new(URI.encode(path), headers)
else
raise 'Invalid Request'
end
begin
http.request(req)
rescue Timeout::Error
puts 'HTTP request has timed out.'
exit 1
rescue StandardError => e
puts 'An HTTP error occurred'
puts e
exit 1
end
end
def get_request(path)
make_request('get', path, headers)
end
def post_request(path, content)
make_request('post', path, headers, content)
end
def delete_request(path)
make_request('delete', path, headers)
end
def parse_response(res)
JSON.parse(res.body)
end
def clients
res = get_request('/clients')
if res.code == '200'
parse_response(res)
else
puts "Failed with #{res.code}, #{res.body}"
exit 1
end
end
def update_client_subscriptions
clients.each do |c|
if c['keepalives'] == false && c['subscriptions'].empty?
c['subscriptions'] = ["client:#{c['name']}"]
p c
post_request('/clients', c)
end
end
end
def run
update_client_subscriptions
end
end
end
def parse_options
options = {:server => 'localhost'}
parser = OptionParser.new do |opts|
opts.banner = "Usage: migrate.rb [options]"
opts.on("-s", "--server server", "Sensu Server") do |server|
options[:server] = server
end
opts.on("-h", "--help", "Help") do |server|
puts opts
exit 1
end
opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
options[:verbose] = v
end
end
parser.parse!
options
end
def do_update
options = parse_options
$DEBUG = options[:verbose]
Sensu::Api.new(options[:server]).run
end
do_update
#usage in prod
# while :; do for i in sensu-api-prod-sc.otenv.com sensu-api-prod-usw1.otenv.com sensu-api-prod-usw2.otenv.com sensu-api-prod-euw1.otenv.com; do ruby update.rb -s $i done; echo ; done; sleep 5; done
#in qa
# while :; do for i in sensu-api-pp-usw2.otenv.com sensu-api-pp-sf.otenv.com; do ruby update.rb -s $i done; echo ; done; sleep 5; done
#i used tmux, poor mans cron
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment