class Squab::Client

Attributes

api_url[RW]
api_version_prefix[RW]
events_prefix[RW]
source[RW]
ssl_verify[RW]
uid[RW]

Public Class Methods

new(opts={}) click to toggle source

Opts accepts api => The API URL to hit user => The user to report source => the source to report

# File lib/squab-client.rb, line 19
def initialize(opts={})
  @source = get_my_source(opts[:source])
  @uid = get_my_user(opts[:user])
  parse_config
  @api_url = get_api(opts[:api] || @config[:api])
  @ssl_verify = @config['ssl_verify'] || true
  @api_version_prefix = @config['api_prefix'] || '/api/v1'
  @events_prefix = [@api_version_prefix, 'events'].join('/')
end

Public Instance Methods

get(max=5, since=nil) click to toggle source
# File lib/squab-client.rb, line 65
def get(max=5, since=nil)
  req = if since
    make_event_request("since/#{since.to_i}")
  else
    make_event_request("limit/#{max}")
  end
  get_req(req)
end
get_api(url) click to toggle source
# File lib/squab-client.rb, line 100
def get_api(url)
  url ? URI.parse(url) :  URI.parse(
    "http://squab/"
  )
end
get_from_event(event_num) click to toggle source
# File lib/squab-client.rb, line 74
def get_from_event(event_num)
  req = make_event_request("starting/#{event_num}")
  get_req(req)
end
get_from_source(source) click to toggle source
# File lib/squab-client.rb, line 84
def get_from_source(source)
  req = make_event_request("source/#{source}")
  get_req(req)
end
get_from_user(username) click to toggle source
# File lib/squab-client.rb, line 79
def get_from_user(username)
  req = make_event_request("user/#{username}")
  get_req(req)
end
get_my_source(source=nil) click to toggle source
# File lib/squab-client.rb, line 117
def get_my_source(source=nil)
  source || File.basename($PROGRAM_NAME)
end
get_my_user(username=nil) click to toggle source
# File lib/squab-client.rb, line 121
def get_my_user(username=nil)
  username || Etc.getpwuid(Process.uid).name
end
list_sources() click to toggle source
# File lib/squab-client.rb, line 50
def list_sources
  req = make_request('sources')
  get_req(req)
end
list_urls() click to toggle source
# File lib/squab-client.rb, line 60
def list_urls
  req = make_request('urls')
  get_req(req)
end
list_users() click to toggle source
# File lib/squab-client.rb, line 55
def list_users
  req = make_request('users')
  get_req(req)
end
parse_config(file=nil) click to toggle source
# File lib/squab-client.rb, line 106
def parse_config(file=nil)
  # Default
  config_file = file || '/etc/squab.yaml'
  # Instance override
  if File.exist?(config_file)
    @config = YAML.load(File.open(config_file).read)
  else
    @config = {}
  end
end
send(event, url=nil) click to toggle source
# File lib/squab-client.rb, line 29
def send(event, url=nil)
  payload = {
    "uid" => @uid,
    "source" => @source,
    "value" => event,
    "url" => url,
  }.to_json
  header = {'Content-Type' => 'application/json'}
  req = Net::HTTP::Post.new(@events_prefix, initheader = header)
  req.body = payload
  try_count = 1
  begin
    http = Net::HTTP.new(@api_url.host, @api_url.port)
    http = setup_ssl(http) if @api_url.scheme == "https"
    response = http.request(req)
  rescue EOFError, Errno::ECONNREFUSED => e
    raise SendEventFailed, "Could not reach the Squab server"
  end
  response
end

Private Instance Methods

get_req(req, full_req=false) click to toggle source
# File lib/squab-client.rb, line 140
def get_req(req, full_req=false)
  http = Net::HTTP.new(@api_url.host, @api_url.port)
  http = setup_ssl(http) if @api_url.scheme == "https"
  resp = http.start { |h| h.request(req) }
  if full_req
    resp
  else
    resp.body
  end
end
make_event_request(to) click to toggle source
# File lib/squab-client.rb, line 151
def make_event_request(to)
  Net::HTTP::Get.new([ @events_prefix, to ].join('/'))
end
make_request(to) click to toggle source
# File lib/squab-client.rb, line 155
def make_request(to)
  Net::HTTP::Get.new([ @api_version_prefix, to ].join('/'))
end
setup_ssl(http) click to toggle source
# File lib/squab-client.rb, line 126
def setup_ssl(http)
  http.use_ssl = true
  http.ca_file = OpenSSL::X509::DEFAULT_CERT_FILE 
  if @ssl_verify
    http.verify_mode = OpenSSL::SSL::VERIFY_PEER
  else
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    $stderr.puts("Bypassing SSL verification, this should only happen "+
                 "during testing and development")
  end
  http.verify_depth = 5
  http
end