Class: RecordStore::Record

Inherits:
Object
  • Object
show all
Includes:
ActiveModel::Validations
Defined in:
lib/record_store/record.rb

Direct Known Subclasses

A, AAAA, ALIAS, CAA, CNAME, MX, NS, PTR, SRV, SSHFP, TXT

Defined Under Namespace

Classes: A, AAAA, ALIAS, CAA, CNAME, MX, NS, PTR, SPF, SRV, SSHFP, TXT

Constant Summary collapse

FQDN_REGEX =
/\A(\*\.)?([a-z0-9_]+(-[a-z0-9]+)*\._?)+[a-z]{2,}\.\Z/i
CNAME_REGEX =
/\A(\*\.)?([a-z0-9_]+((-|--)?[a-z0-9]+)*\._?)+[a-z]{2,}\.\Z/i

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(record) ⇒ Record

Returns a new instance of Record.



58
59
60
61
62
# File 'lib/record_store/record.rb', line 58

def initialize(record)
  @fqdn = Record.ensure_ends_with_dot(record.fetch(:fqdn)).downcase
  @ttl  = record.fetch(:ttl)
  @id   = record.fetch(:record_id, nil)
end

Instance Attribute Details

#fqdnObject

Returns the value of attribute fqdn.



8
9
10
# File 'lib/record_store/record.rb', line 8

def fqdn
  @fqdn
end

#idObject

Returns the value of attribute id.



8
9
10
# File 'lib/record_store/record.rb', line 8

def id
  @id
end

#ttlObject

Returns the value of attribute ttl.



8
9
10
# File 'lib/record_store/record.rb', line 8

def ttl
  @ttl
end

Class Method Details

.build_from_yaml_definition(yaml_definition) ⇒ Object



64
65
66
67
# File 'lib/record_store/record.rb', line 64

def self.build_from_yaml_definition(yaml_definition)
  record_type = yaml_definition.fetch(:type)
  Record.const_get(record_type).new(yaml_definition)
end

.ensure_ends_with_dot(fqdn) ⇒ Object



45
46
47
# File 'lib/record_store/record.rb', line 45

def ensure_ends_with_dot(fqdn)
  fqdn.end_with?(".") ? fqdn : "#{fqdn}."
end

.ensure_ends_without_dot(fqdn) ⇒ Object



49
50
51
# File 'lib/record_store/record.rb', line 49

def ensure_ends_without_dot(fqdn)
  fqdn.sub(/\.$/, '')
end

.escape(value) ⇒ Object



15
16
17
# File 'lib/record_store/record.rb', line 15

def escape(value)
  value.gsub('"', '\"')
end

.long_quote(value) ⇒ Object



24
25
26
27
28
29
30
31
# File 'lib/record_store/record.rb', line 24

def long_quote(value)
  result = value
  if needs_long_quotes?(value)
    result = unquote(value).scan(/.{1,255}/).join('" "')
    result = %("#{result}")
  end
  result
end

.needs_long_quotes?(value) ⇒ Boolean

Returns:

  • (Boolean)


53
54
55
# File 'lib/record_store/record.rb', line 53

def needs_long_quotes?(value)
  value.length > 255 && value !~ /^((\\)?"((\\"|[^"])){1,255}(\\)?"\s*)+$/
end

.quote(value) ⇒ Object



19
20
21
22
# File 'lib/record_store/record.rb', line 19

def quote(value)
  result = escape(value)
  %("#{result}")
end

.unescape(value) ⇒ Object



37
38
39
# File 'lib/record_store/record.rb', line 37

def unescape(value)
  value.gsub('\"', '"')
end

.unlong_quote(value) ⇒ Object



33
34
35
# File 'lib/record_store/record.rb', line 33

def unlong_quote(value)
  value.length > 255 ? value.scan(/.{1,258}/).map { |x| x.sub(/^\"/, "").sub(/\" ?$/, "") }.join : unquote(value)
end

.unquote(value) ⇒ Object



41
42
43
# File 'lib/record_store/record.rb', line 41

def unquote(value)
  unescape(value.sub(/\A"(.*)"\z/, '\1'))
end

Instance Method Details

#==(other) ⇒ Object Also known as: eql?



85
86
87
# File 'lib/record_store/record.rb', line 85

def ==(other)
  other.class == self.class && other.to_hash == to_hash
end

#hashObject



91
92
93
# File 'lib/record_store/record.rb', line 91

def hash
  to_hash.hash
end

#keyObject



99
100
101
# File 'lib/record_store/record.rb', line 99

def key
  "#{type},#{fqdn}"
end

#log!(logger = STDOUT) ⇒ Object



69
70
71
# File 'lib/record_store/record.rb', line 69

def log!(logger = STDOUT)
  logger.puts to_s
end

#rdataObject

Raises:

  • (NotImplementedError)


103
104
105
# File 'lib/record_store/record.rb', line 103

def rdata
  raise NotImplementedError
end

#rdata_txtObject

Raises:

  • (NotImplementedError)


107
108
109
# File 'lib/record_store/record.rb', line 107

def rdata_txt
  raise NotImplementedError
end

#to_hashObject



73
74
75
76
77
78
79
# File 'lib/record_store/record.rb', line 73

def to_hash
  {
    type: type,
    fqdn: fqdn,
    ttl: ttl,
  }.merge(rdata)
end

#to_jsonObject



95
96
97
# File 'lib/record_store/record.rb', line 95

def to_json
  { ttl: ttl, rdata: rdata }
end

#to_sObject



111
112
113
# File 'lib/record_store/record.rb', line 111

def to_s
  "[#{type}Record] #{fqdn} #{ttl} IN #{type} #{rdata_txt}"
end

#typeObject



81
82
83
# File 'lib/record_store/record.rb', line 81

def type
  self.class.name.demodulize
end