Class: Homebase

Inherits:
Object
  • Object
show all
Defined in:
lib/homebase.rb,
lib/homebase/version.rb

Defined Under Namespace

Classes: Error, ParseError, RequestError

Constant Summary collapse

API_PREFIX =
'https://api.digitalocean.com/v2'
PUBLIC_IP_URI =
URI('https://api.ipify.org/?format=text')
DOMAIN_RECORDS_FORMAT =
"#{API_PREFIX}/domains/%<domain_name>s/records"
DOMAIN_RECORD_FORMAT =
"#{API_PREFIX}/domains/%<domain_name>s/records/%<record_id>d"
VERSION =
'0.1.1'

Instance Method Summary collapse

Instance Method Details

#get_record_by_name(domain_name, record_name, token) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/homebase.rb', line 31

def get_record_by_name(domain_name, record_name, token)
  uri = URI(DOMAIN_RECORDS_FORMAT % {domain_name: domain_name})

  req = Net::HTTP::Get.new(uri)
  req['Content-Type'] = 'application/json'
  req['Authorization'] = "Bearer #{token}"
  body = Net::HTTP.start(uri.host, uri.port,
                         use_ssl: uri.scheme == 'https') do |http|
    res = http.request req
    raise RequestError, "Error - #{res.code}", caller if res.code != '200'
    res.body
  end
  begin
    records = JSON.parse(body, symbolize_names: true)[:domain_records]
  rescue JSON::ParserError
    raise ParseError, 'Invalid JSON Response', caller
  end
  records.find { |record| record[:name] == record_name }
end

#public_ip(opts = {}) ⇒ Object

Raises:



17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/homebase.rb', line 17

def public_ip(opts = {})
  return @public_ip if @public_ip && !opts[:force]
  res = Net::HTTP.get_response(PUBLIC_IP_URI)
  raise(RequestError, "Invalid IP response #{res.code}",
        caller) if res.code != '200'
  ip = res.body.strip
  begin
    IPAddr.new(ip)
  rescue IPAddr::InvalidAddressError
    raise ParseError, 'Invalid Public IP', caller
  end
  @public_ip = ip
end

#update_record(domain_name, record_id, data, token) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/homebase.rb', line 51

def update_record(domain_name, record_id, data, token)
  uri = URI(DOMAIN_RECORD_FORMAT % {domain_name: domain_name,
                                    record_id: record_id})
  req = Net::HTTP::Put.new(uri)
  req['Content-Type'] = 'application/json'
  req['Authorization'] = "Bearer #{token}"
  req.body = { data: data }.to_json
  Net::HTTP.start(uri.host, uri.port,
                  use_ssl: uri.scheme == 'https') do |http|
    res = http.request req
    raise RequestError, "Error - #{res.code}", caller if res.code != '200'
    res
  end
end

#update_record_with_public_ip(domain_name, record_name, token) ⇒ Object



66
67
68
69
70
# File 'lib/homebase.rb', line 66

def update_record_with_public_ip(domain_name, record_name, token)
  record = get_record_by_name(domain_name, record_name, token)
  result = update_record(domain_name, record[:id], public_ip, token)
  { result: result, ip: public_ip }
end