class Proxy::Dns::Menandmice::Record

Attributes

password[R]
server[R]
ssl[R]
username[R]
verify_ssl[R]

Public Class Methods

new(server, username, password, dns_ttl = nil, ssl = false, verify_ssl = false, mock_login = false) click to toggle source
Calls superclass method
# File lib/smart_proxy_dns_menandmice/dns_menandmice_main.rb, line 10
def initialize(server, username, password, dns_ttl = nil, ssl = false, verify_ssl = false, mock_login = false)
  @server = server
  @username = username
  @password = password
  @ssl =  ssl
  @verify_ssl = verify_ssl

  @client = MmJsonClient::Client.new(server: @server,
                                     username: @username,
                                     password: @password,
                                     ssl: @ssl,
                                     verify_ssl: @verify_ssl
                                    )

  @client.login unless mock_login

  super(server, dns_ttl)
end

Public Instance Methods

do_create(name, value, type) click to toggle source
# File lib/smart_proxy_dns_menandmice/dns_menandmice_main.rb, line 29
def do_create(name, value, type)
  zone = match_zone(name, enum_zones)
  record = MmJsonClient::DNSRecord.new(name: "#{name}.", type: type, ttl: @dns_ttl,
                                       data: value, enabled: true,
                                       dns_zone_ref: zone.ref)
  response = @client.add_dns_record(dns_record: record)
  raise Proxy::Dns::Error.new("Failed to point #{name} to #{value} with type #{type}") unless response
  response
end
do_remove(name, type) click to toggle source
# File lib/smart_proxy_dns_menandmice/dns_menandmice_main.rb, line 39
def do_remove(name, type)
  zone = match_zone(name, enum_zones)
  record_filter = "name:^#{name.split(".").first}$ type:#{type}"
  response = @client.get_dns_records(filter: record_filter, dns_zone_ref: zone.ref)
  if response.total_results == 0
    raise Proxy::Dns::NotFound.new("Failed to remove #{name} of type #{type}")
  end
  record = response.dns_records.first
  @client.remove_object(ref: record.ref, obj_type: 'DNSRecord')
end
enum_zones() click to toggle source
# File lib/smart_proxy_dns_menandmice/dns_menandmice_main.rb, line 69
def enum_zones
  zones = []
  response = @client.get_dns_zones
  response.dns_zones.each do |zone|
    if zone.type == "Master"
      zones << zone
    end
  end
  zones
end
match_zone(record, zone_list) click to toggle source
# File lib/smart_proxy_dns_menandmice/dns_menandmice_main.rb, line 50
def match_zone(record, zone_list)
  weight = 0 # sub zones might be independent from similar named parent zones; use weight for longest suffix match
  matched_zone = nil
  zone_list.each do |zone|
    zone_labels = zone.name.downcase.split(".").reverse
    zone_weight = zone_labels.length
    fqdn_labels = record.downcase.split(".")
    fqdn_labels.shift
    is_match = zone_labels.all? { |zone_label| zone_label == fqdn_labels.pop }
    # match only the longest zone suffix
    if is_match && zone_weight >= weight
      matched_zone = zone
      weight = zone_weight
    end
  end
  raise Proxy::Dns::NotFound.new("The DNS server has no authoritative zone for #{record}") unless matched_zone
  matched_zone
end