Page MenuHomeGRNET

No OneTemporary

File Metadata

Created
Sun, May 18, 7:21 PM
diff --git a/app/helpers/records_helper.rb b/app/helpers/records_helper.rb
new file mode 100644
index 0000000..98283f0
--- /dev/null
+++ b/app/helpers/records_helper.rb
@@ -0,0 +1,8 @@
+module RecordsHelper
+
+ def name_field_append(record)
+ return ".#{record.domain.name}" if not record.domain.reverse?
+
+ ".#{record.domain.name} (#{record.domain.subnet})"
+ end
+end
diff --git a/app/models/domain.rb b/app/models/domain.rb
index 6829f81..512f582 100644
--- a/app/models/domain.rb
+++ b/app/models/domain.rb
@@ -1,37 +1,73 @@
class Domain < ActiveRecord::Base
self.inheritance_column = :nx
def self.domain_types
[
'NATIVE',
'MASTER',
'SLAVE',
]
end
has_many :records
has_one :soa, class_name: SOA
validates :name, uniqueness: true, presence: true
validates :type, presence: true, inclusion: { in: domain_types }
after_create :generate_soa
attr_writer :serial_strategy
def serial_strategy
@serial_strategy ||= WebDNS.settings[:serial_strategy]
end
def reverse?
name.end_with?('.in-addr.arpa') || name.end_with?('.ip6.arpa')
end
+ # Compute subnet for reverse records
+ def subnet
+ return if not reverse?
+
+ if name.end_with?('.in-addr.arpa')
+ subnet_v4
+ elsif name.end_with?('.ip6.arpa')
+ subnet_v6
+ end
+ end
+
private
+ def subnet_v4
+ # get ip octets (remove .in-addr.arpa)
+ octets = name.split('.')[0...-2].reverse
+ return if octets.any? { |_| false }
+
+ mask = 8 * octets.size
+ octets += [0, 0, 0, 0]
+
+ ip = IPAddr.new octets[0, 4].join('.')
+
+ [ip, mask].join('/')
+ end
+
+ def subnet_v6
+ nibbles = name.split('.')[0...-2].reverse
+ return if nibbles.any? { |_| false }
+
+ mask = 4 * nibbles.size
+ nibbles += [0] * 32
+
+ ip = IPAddr.new nibbles[0, 32].in_groups_of(4).map(&:join).join(':')
+
+ [ip, mask].join('/')
+ end
+
# Hooks
def generate_soa
soa_record = SOA.new(domain: self)
soa_record.save
end
end
diff --git a/app/views/records/_form.html.erb b/app/views/records/_form.html.erb
index c5ef837..418f2ba 100644
--- a/app/views/records/_form.html.erb
+++ b/app/views/records/_form.html.erb
@@ -1,14 +1,14 @@
-<%= bootstrap_form_for([@domain, @record], layout: :horizontal, label_col: 'col-sm-2', control_col: 'col-sm-4') do |f| %>
+<%= bootstrap_form_for([@domain, @record], layout: :horizontal, label_col: 'col-sm-2', control_col: 'col-sm-8') do |f| %>
- <%= f.text_field :name, value: @record.short, label: 'Record', append: ".#{@domain.name}" %>
+ <%= f.text_field :name, value: @record.short, label: 'Record', append: name_field_append(@record) %>
<% if @record.persisted? %>
<%= f.static_control :type %>
<% else %>
<%= f.select :type, Record.record_types %>
<% end %>
<%= f.text_field :prio, placeholder: 10, wrapper_class: @record.supports_prio? ? '' : 'hidden' %>
<%= f.text_field :content %>
<%= f.submit 'Save', class: 'btn btn-primary col-sm-offset-2' %>
<% end %>

Event Timeline