Page Menu
Home
GRNET
Search
Configure Global Search
Log In
Files
F461963
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Sun, May 18, 7:21 PM
Size
2 KB
Mime Type
text/x-diff
Expires
Tue, May 20, 7:21 PM (1 d, 4 h)
Engine
blob
Format
Raw Data
Handle
220483
Attached To
rWEBDNS WebDNS (edet4)
View Options
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
Log In to Comment