Last active
October 20, 2016 04:44
-
-
Save cabecada/f344dd67751626da96bf9adfd8d6b513 to your computer and use it in GitHub Desktop.
update client subscriptions
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
#!/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